Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1800to1804
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Range.Find-Methode mit zwei Variablen

Range.Find-Methode mit zwei Variablen
28.12.2020 18:23:12
Andl
Hallo Zusammen,
ich habe folgenden VBA-Code:
Set Treffer = Tabelle3.Range("E:E").Find _
(what:=.Cells(Zeile, "E").Value, lookAt:=xlWhole)
If Treffer Is Nothing Then
'Nr muss neu angelegt werden
ZeileFrei = Tabelle3.Range("E" & Tabelle3.Rows.Count).End(xlUp).Row + 1
Tabelle3.Cells(ZeileFrei, "A").Value = .Cells(Zeile, "A").Value
Tabelle3.Cells(ZeileFrei, "B").Value = .Cells(Zeile, "B").Value
Tabelle3.Cells(ZeileFrei, "C").Value = .Cells(Zeile, "C").Value
Tabelle3.Cells(ZeileFrei, "D").Value = .Cells(Zeile, "D").Value
Tabelle3.Cells(ZeileFrei, "E").Value = .Cells(Zeile, "E").Value
Tabelle3.Cells(ZeileFrei, "F").Value = .Cells(Zeile, "F").Value
Tabelle3.Cells(ZeileFrei, "G").Value = .Cells(Zeile, "G").Value
Tabelle3.Cells(ZeileFrei, "H").Value = .Cells(Zeile, "H").Value
Tabelle3.Cells(ZeileFrei, "I").Value = .Cells(Zeile, "I").Value
Tabelle3.Cells(ZeileFrei, "J").Value = .Cells(Zeile, "J").Value
Tabelle3.Cells(ZeileFrei, "K").Value = .Cells(Zeile, "K").Value
Tabelle3.Cells(ZeileFrei, "L").Value = .Cells(Zeile, "L").Value
Tabelle3.Cells(ZeileFrei, "E").Interior.ColorIndex = 4
Else
Tabelle3.Cells(Treffer.Row, "E").Value = .Cells(Zeile, "E").Value
End If
Nun habe ich das Problem, dass Werte in Spalte E (Rechnungsnummer) doppelt vorkommen können, diese allerdings nur einen Wertz in Spalte C ("R" oder "G") unterschieden werden können.
Kann ich hier die Range.Treffer Methode erweitern?
Vielen Dank
Beste Grüße
Andl

27
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Range.Find-Methode mit zwei Variablen
28.12.2020 18:30:56
Nepumuk
Hallo Andl,
was soll passieren wenn eine Rechnungsnummer 2x vorkommt?
Gruß
Nepumuk
AW: Range.Find-Methode mit zwei Variablen
28.12.2020 18:44:01
Andl
Hallo Nepomuk,
sollte die Rechnungnummer zweimal vorkommen, sich aber in Spalte C unterscheiden (1. Rechnungnummer hat in ein R zweite Rechungsnummer hat ein G) - soll die zweite Rechungsnummer in der aktiven Tabelle hinzugefügt werden.
Das Markro vergleicht eine sich dauernd ändernde Grunddatei und schreibt in die aktuelle Datei die Daten, welche noch nicht vorhanden sind.
Gruß
Andl
AW: Range.Find-Methode mit zwei Variablen
28.12.2020 19:07:26
Nepumuk
Hallo Andl,
so?
Set Treffer = Tabelle3.Columns(5).Find( _
    What:=.Cells(Zeile, 5).Value, LookIn:=xlValues, LookAt:=xlWhole)

If Treffer Is Nothing Then
    
    'Nr muss neu angelegt werden
    Call CopyValues(.Cells(Zeile, 1))
    
Else
    
    If .Cells(Zeile, 3).Value <> Treffer.Offset(0, -2).Value Then
        
        'Nr muss neu angelegt werden
        Call CopyValues(.Cells(Zeile, 1))
        
    Else
        
        Tabelle3.Cells(Treffer.Row, 5).Value = .Cells(Zeile, 5).Value
        
    End If
End If

Private Sub CopyValues(Zelle As Range)
    Dim ZeileFrei As Long
    ZeileFrei = Tabelle3.Cells(Tabelle3.Rows.Count, 5).End(xlUp).Row + 1
    Tabelle3.Cells(ZeileFrei, 1).Resize(1, 12).Value = Zelle.Resize(1, 12).Value
    Tabelle3.Cells(ZeileFrei, 5).Interior.Color = vbGreen
End Sub

Gruß
Nepumuk
Anzeige
AW: Range.Find-Methode mit zwei Variablen
28.12.2020 19:22:39
Nepumuk
Hallo Andl,
da ist noch ein Denkfehler drin.
Dim Treffer1 As Range, Treffer2 As Range

Set Treffer1 = Tabelle3.Columns(5).Find( _
    What:=.Cells(Zeile, 5).Value, LookIn:=xlValues, LookAt:=xlWhole)

If Treffer1 Is Nothing Then
    
    'Nr muss neu angelegt werden
    Call CopyValues(.Cells(Zeile, 1))
    
Else
    
    If .Cells(Zeile, 3).Value <> Treffer1.Offset(0, -2).Value Then
        
        Set Treffer1 = Tabelle3.Columns(5).Find(What:=.Cells(Zeile, 5).Value, _
            after:=Treffer2, LookIn:=xlValues, LookAt:=xlWhole)
        
        If Treffer2 Is Nothing Then
            
            'Nr muss neu angelegt werden
            Call CopyValues(.Cells(Zeile, 1))
            
        Else
            
            If .Cells(Zeile, 3).Value <> Treffer2.Offset(0, -2).Value Then
                
                'Nr muss neu angelegt werden
                Call CopyValues(.Cells(Zeile, 1))
                
            End If
        End If
    Else
        
        Tabelle3.Cells(Treffer1.Row, 5).Value = .Cells(Zeile, 5).Value
        
    End If
End If

Gruß
Nepumuk
Anzeige
AW: Range.Find-Methode mit zwei Variablen
28.12.2020 19:24:34
Nepumuk
Oooooooooooops,
die zweite Suchzeile muss so lauten:
Set Treffer2 = Tabelle3.Columns(5).Find(What:=.Cells(Zeile, 5).Value, _
    after:=Treffer1, LookIn:=xlValues, LookAt:=xlWhole)

Gruß
Nepumuk
AW: Range.Find-Methode mit zwei Variablen
29.12.2020 09:33:31
Nepumuk
Hallo Andl,
war gestern nicht mehr so ganz fit. Daher:
Dim Treffer1 As Range, Treffer2 As Range
Dim strFirsAddress As String

Set Treffer1 = Tabelle3.Columns(5).Find( _
    What:=.Cells(Zeile, 5).Value, LookIn:=xlValues, LookAt:=xlWhole)

If Treffer1 Is Nothing Then
    
    'Nr muss neu angelegt werden
    Call CopyValues(.Cells(Zeile, 1))
    
Else
    
    strFirsAddress = Treffer1.Address
    
    If .Cells(Zeile, 3).Value <> Treffer1.Offset(0, -2).Value Then
        
        Set Treffer2 = Tabelle3.Columns(5).FindNext(After:=Treffer1)
        
        If Treffer2.Address = strFirsAddress Then
            
            'Nr muss neu angelegt werden
            Call CopyValues(.Cells(Zeile, 1))
            
        Else
            
            Tabelle3.Cells(Treffer2.Row, 5).Value = .Cells(Zeile, 5).Value
            
        End If
    Else
        
        Tabelle3.Cells(Treffer1.Row, 5).Value = .Cells(Zeile, 5).Value
        
    End If
End If

Private Sub CopyValues(Zelle As Range)
    Dim ZeileFrei As Long
    ZeileFrei = Tabelle3.Cells(Tabelle3.Rows.Count, 5).End(xlUp).Row + 1
    Tabelle3.Cells(ZeileFrei, 1).Resize(1, 12).Value = Zelle.Resize(1, 12).Value
    Tabelle3.Cells(ZeileFrei, 5).Interior.Color = vbGreen
End Sub

Gruß
Nepumuk
Anzeige
AW: Range.Find-Methode mit zwei Variablen
29.12.2020 15:26:48
Andl
Hallo Nepomuk,
vielen Dank für die Hilfe - allerdings habe ich Probleme diesen Code nun in meinen geschriebenen Code einzubauen. Irgendwie bleibt es immer stehen...
Hier nochmals mein kompletter Code, welcher auch sehr gut funktioniert. Den Ansatz von gestern Abend habe ich noch irgendwie verstanden - :-)
Sub datenHolenAusRechnungjournal()
Dim Zeile As Long
Dim ZeileMax As Long
Dim ZeileFrei As Long
Dim Treffer As Range
Dim QName As String
Dim LetzteZeileEinspieldaten As Long
Dim LetzteZeileQuelle As Long
Dim QPartnernummer As String
Dim QListennummer As String
Dim QMonatsreferenz As String
Dim QSumme As Single
Dim Quelle As Workbook
Set Quelle = Workbooks.Open(ThisWorkbook.Path & "\202010_333_000360.xlsx")
With Quelle.Worksheets(1)
ZeileMax = .Range("E" & .Rows.Count).End(xlUp).Row
Debug.Print ZeileMax
For Zeile = 7 To ZeileMax
'Wo wird gesucht nach was? Wie? Nur Eindeutige Nummern
Set Treffer = Tabelle3.Range("E:E").Find _
(What:=.Cells(Zeile, "E").Value, LookAt:=xlWhole)
If Treffer Is Nothing Then
'Nr muss neu angelegt werden
ZeileFrei = Tabelle3.Range("E" & Tabelle3.Rows.Count).End(xlUp).Row + 1
Tabelle3.Cells(ZeileFrei, "A").Value = .Cells(Zeile, "A").Value
Tabelle3.Cells(ZeileFrei, "B").Value = .Cells(Zeile, "B").Value
Tabelle3.Cells(ZeileFrei, "C").Value = .Cells(Zeile, "C").Value
Tabelle3.Cells(ZeileFrei, "D").Value = .Cells(Zeile, "D").Value
Tabelle3.Cells(ZeileFrei, "E").Value = .Cells(Zeile, "E").Value
Tabelle3.Cells(ZeileFrei, "F").Value = .Cells(Zeile, "F").Value
Tabelle3.Cells(ZeileFrei, "G").Value = .Cells(Zeile, "G").Value
Tabelle3.Cells(ZeileFrei, "H").Value = .Cells(Zeile, "H").Value
Tabelle3.Cells(ZeileFrei, "I").Value = .Cells(Zeile, "I").Value
Tabelle3.Cells(ZeileFrei, "J").Value = .Cells(Zeile, "J").Value
Tabelle3.Cells(ZeileFrei, "K").Value = .Cells(Zeile, "K").Value
Tabelle3.Cells(ZeileFrei, "L").Value = .Cells(Zeile, "L").Value
Tabelle3.Cells(ZeileFrei, "E").Interior.ColorIndex = 4
Else
Tabelle3.Cells(Treffer.Row, "E").Value = .Cells(Zeile, "E").Value
End If
Next Zeile
'Abschließendes Sortieren
Tabelle3.Range("A:L").Sort _
Key1:=Tabelle3.Range("E1"), Order1:=xlAscending, Header:=xlYes
'End With
' Eingeleser Quelldateiname wird in nachfolgende Zeile geschrieben
QName = Quelle.Name
QListennummer = Left(Right(QName, 11), 6)
QPartnernummer = Right(Left(QName, 10), 3)
QMonatsreferenz = Left(QName, 6)
LetzteZeileQuelle = .Cells(1048576, 11).End(xlUp).Row
QSumme = .Cells(LetzteZeileQuelle, 11).Value
LetzteZeileEinspieldaten = Tabelle2.Cells(1048576, 1).End(xlUp).Row + 1
Tabelle2.Range("A" & LetzteZeileEinspieldaten).Value = QName
Tabelle2.Range("B" & LetzteZeileEinspieldaten).Value = QPartnernummer
Tabelle2.Range("C" & LetzteZeileEinspieldaten).Value = QListennummer
Tabelle2.Range("D" & LetzteZeileEinspieldaten).Value = QMonatsreferenz
Tabelle2.Range("E" & LetzteZeileEinspieldaten).Value = QSumme
Tabelle2.Range("F" & LetzteZeileEinspieldaten).Value = Date
End With
Quelle.Close savechanges:=False
End Sub
Vielen Dank
Andl
Anzeige
AW: Range.Find-Methode mit zwei Variablen
29.12.2020 15:36:25
Nepumuk
Hallo Andl,
ich hab noch ein paar Kommentare dazu geschrieben:
Sub datenHolenAusRechnungjournal()
    
    Dim Zeile As Long
    Dim ZeileMax As Long
    Dim ZeileFrei As Long
    Dim Treffer1 As Range
    Dim Treffer2 As Range
    Dim strFirsAddress As String
    Dim QName As String
    Dim LetzteZeileEinspieldaten As Long
    Dim LetzteZeileQuelle As Long
    Dim QPartnernummer As String
    Dim QListennummer As String
    Dim QMonatsreferenz As String
    Dim QSumme As Single
    
    
    Dim Quelle As Workbook
    
    Set Quelle = Workbooks.Open(ThisWorkbook.Path & "\202010_333_000360.xlsx")
    
    With Quelle.Worksheets(1)
        
        ZeileMax = .Range("E" & .Rows.Count).End(xlUp).Row
        
        Debug.Print ZeileMax
        
        For Zeile = 7 To ZeileMax
            
            'Wo wird gesucht nach was? Wie? Nur Eindeutige Nummern
            Set Treffer1 = Tabelle3.Columns(5).Find( _
                What:=.Cells(Zeile, 5).Value, LookIn:=xlValues, LookAt:=xlWhole)
            
            If Treffer1 Is Nothing Then
                
                'Nr muss neu angelegt werden
                Call CopyValues(.Cells(Zeile, 1))
                
            Else
                
                'erste Fundstelle merken
                strFirsAddress = Treffer1.Address
                
                'wenn in Spalte C ein anderer Wert steht
                If .Cells(Zeile, 3).Value <> Treffer1.Offset(0, -2).Value Then
                    
                    'Zweite Artikelnummer suchen
                    Set Treffer2 = Tabelle3.Columns(5).FindNext(After:=Treffer1)
                    
                    'wenn keine weitere Fundstelle
                    If Treffer2.Address = strFirsAddress Then
                        
                        'Nr muss zusätzlich angelegt werden
                        Call CopyValues(.Cells(Zeile, 1))
                        
                    Else
                        
                        'zweite Artikelnummer gefunden Spalte E ändern
                        Tabelle3.Cells(Treffer2.Row, 5).Value = .Cells(Zeile, 5).Value
                        
                    End If
                Else
                    
                    'erste Artikelnummer gefunden Spalte E ändern
                    Tabelle3.Cells(Treffer1.Row, 5).Value = .Cells(Zeile, 5).Value
                    
                End If
            End If
        Next Zeile
        
        'Abschließendes Sortieren
        Tabelle3.Range("A:L").Sort _
            Key1:=Tabelle3.Range("E1"), Order1:=xlAscending, Header:=xlYes
        
        'End With
        
        ' Eingeleser Quelldateiname wird in nachfolgende Zeile geschrieben
        QName = Quelle.Name
        QListennummer = Left(Right(QName, 11), 6)
        QPartnernummer = Right(Left(QName, 10), 3)
        QMonatsreferenz = Left(QName, 6)
        
        LetzteZeileQuelle = .Cells(1048576, 11).End(xlUp).Row
        QSumme = .Cells(LetzteZeileQuelle, 11).Value
        
        
        LetzteZeileEinspieldaten = Tabelle2.Cells(1048576, 1).End(xlUp).Row + 1
        Tabelle2.Range("A" & LetzteZeileEinspieldaten).Value = QName
        Tabelle2.Range("B" & LetzteZeileEinspieldaten).Value = QPartnernummer
        Tabelle2.Range("C" & LetzteZeileEinspieldaten).Value = QListennummer
        Tabelle2.Range("D" & LetzteZeileEinspieldaten).Value = QMonatsreferenz
        Tabelle2.Range("E" & LetzteZeileEinspieldaten).Value = QSumme
        Tabelle2.Range("F" & LetzteZeileEinspieldaten).Value = Date
    End With
    
    Quelle.Close savechanges:=False
    
End Sub

Private Sub CopyValues(Zelle As Range)
    Dim ZeileFrei As Long
    ZeileFrei = Tabelle3.Cells(Tabelle3.Rows.Count, 5).End(xlUp).Row + 1
    Tabelle3.Cells(ZeileFrei, 1).Resize(1, 12).Value = Zelle.Resize(1, 12).Value
    Tabelle3.Cells(ZeileFrei, 5).Interior.Color = vbGreen
End Sub

Gruß
Nepumuk
Anzeige
AW: Range.Find-Methode mit zwei Variablen
29.12.2020 19:42:12
Andl
Hallo Nepomuk,
vielen Dank. Mit Hilfe der Kommentaren konnte ich den Code sehr gut nachvollziehen. Habe Ihn gerade getestet - funktioniert einwandfrei.
Beste Grüße
Andl
AW: Range.Find-Methode mit zwei Variablen
02.01.2021 19:19:54
Andl
Hallo Nepumuk,
habe hier leider nochmals eine Frage. Wollte gerade den in der Testumgebung funktionierenden Code in mein finales Worksheet kopieren. Dabei traten folgende Thematiken auf:
1. In meinem finalen Worksheet steht die Überschrift in Zeile 2 anstatt Zeile 1 - nun wird mir beim Import der Datei immer die Überschrift überschrieben - kann man das irgendwo hinterlegen, dass er erst ab Zeile 3 schreiben soll?
2. Ich hatte das Modul in meine finales Workbook importiert - In meinem Finalen Workbook habe ich eine Vielzahl an Tabellenblättern - (Änderung von Tabelle3) - hierzu hatte ich "ActiveWorksheet" angegeben - leider hat er dann die datenn nicht mehr gezogen - Nun weiß ich, dass Tabellen in bestehende fixe Namensgebung und diese, welche man am tabellenblatt ändern kann unterscheidet. Ich vermute dass "ActiveWorksheet" aus dem variablen Tabellennamen zielt - wie ist dies allerdings bei dem fixen?
3. Ist nun dies geschafft - muss ich meine Zeile bspw. L100:M100 markieren und mittels Doppelklick die darin befindlichen Formeln nach unten schreiben - bis ich wieder in zeile incl der neu importieren daten bin - lässt sich dies einfach mit VBA lösen? Der Makrorekorder gibt hier folegdnes an?
Selection.End(xlDown).Select
Range(Selection, Selection.End(xlToRight)).Select
Selection.AutoFill Destination:=Range("M21:W31")
Range("M21:W31").Select
Sorry - dachte ich pack jetzt alles einfach mal in eine Frage.
Vielen Dank.
Beste Grüße
Andl
Anzeige
AW: Range.Find-Methode mit zwei Variablen
03.01.2021 12:57:42
Nepumuk
Hallo Andl,
kannst du eine Mustermappe hochladen?
Gruß
Nepumuk
AW: Range.Find-Methode mit zwei Variablen
04.01.2021 13:45:13
Nepumuk
Hallo Andl,
speichere die Zeile in einem ausgeblendeten Tabellenblatt kopiere sie daraus und füge sie in dem Tabellenbereich ein. Ich habe es dir mal in deine Mappe eingebaut. Und ich habe dein Makro so umgebaut dass es in der aktiven Tabelle arbeitet.
Teste mal: https://www.herber.de/bbs/user/142742.xlsm
Gruß
Nepumuk
Anzeige
AW: Range.Find-Methode mit zwei Variablen
04.01.2021 16:16:19
Andl
Hallo Nepumuk,
folgende Fehlermeldung tritt auf:
Dateiname oder Klassenname bei Automatisierungsvorgang nicht gefunden (Fehler 432)
Set Quelle = GetObject(PathName:="W:\Projekt Fact" & "\" & "*_" & strName & "_" & NächsteListenNummer6stellig & ".xlsx")
Habe den Dateipfad wie zuvor bei Workboos.Open verwendet. Muss ich hier irgendwas anders schreiben?
BG
Andl
AW: Range.Find-Methode mit zwei Variablen
04.01.2021 16:27:48
Nepumuk
Hallo Andl,
hast Recht, GetObject mag keine Wildcards. Daher:
Public Sub DatenHolenAusRechnungsjournal()
    
    Const FOLDER_PATH As String = "W:\Projekt Fact\"
    
    Dim Zeile As Long
    Dim ZeileMax As Long
    Dim ZeileFrei As Long
    Dim Treffer1 As Range
    Dim Treffer2 As Range
    Dim strFirsAddress As String
    Dim QName As String
    Dim LetzteZeileEinspieldaten As Long
    Dim QPartnernummer As String
    Dim QListennummer As String
    Dim QMonatsreferenz As String
    Dim QSumme As Single
    Dim strName As String
    Dim objCell1 As Range, objCell2 As Range
    Dim ListenNummer As Long
    Dim NächsteListenNummer As Long
    Dim NächsteListenNummer6stellig As String
    Dim LetzterFakturaMonat As Long
    Dim Quelle As Workbook
    Dim strFilename As String
    
    Application.ScreenUpdating = False 'Das "Flackern" ausstellen
    
    strName = ActiveSheet.Name
    
    With Tabelle13
        
        Set objCell1 = Tabelle13.Columns(2).Find(What:=strName, LookIn:=xlValues, _
            LookAt:=xlWhole, SearchDirection:=xlNext, MatchCase:=True)
        
        Set objCell2 = Tabelle13.Columns(2).Find(What:=strName, LookIn:=xlValues, _
            LookAt:=xlWhole, SearchDirection:=xlPrevious, MatchCase:=True)
        
        ListenNummer = Application.Max(.Range(objCell1.Offset(0, 1), objCell2.Offset(0, 1)))
        LetzterFakturaMonat = Application.Max(.Range(objCell1.Offset(0, 2), objCell2.Offset(0, 2)))
        
    End With
    
    NächsteListenNummer = ListenNummer + 1
    NächsteListenNummer6stellig = Format$(NächsteListenNummer, "000000")
    
    'Debug.Print objCell1
    'Debug.Print NächsteListenNummer
    'Debug.Print NächsteListenNummer6stellig
    'Debug.Print LetzterFakturaMonat
    
    Do
        
        strFilename = Dir$(FOLDER_PATH & "*_" & strName & "_" & NächsteListenNummer6stellig & ".xlsx")
        
        If strFilename <> vbNullString Then
            
            'Bei erstmaligem anlegen eines neuen Partners, muss die EinspielDatei manuell definiert werden
            'Set Quelle = Workbooks.Open(ThisWorkbook.Path & "\202010_333_000360.xlsx")
            
            'Bei bereits bestehenden Einspieldateien aktivieren
            Set Quelle = GetObject(PathName:=FOLDER_PATH & strFilename)
            
            With Quelle.Worksheets(1)
                
                For Zeile = 7 To .Cells(.Rows.Count, 5).End(xlUp).Row
                    
                    'Wo wird gesucht nach was? Wie? Nur Eindeutige Nummern
                    Set Treffer1 = Columns(5).Find( _
                        What:=.Cells(Zeile, 5).Value, LookIn:=xlValues, LookAt:=xlWhole)
                    
                    If Treffer1 Is Nothing Then
                        
                        'Nr muss neu angelegt werden
                        Call CopyValues(.Cells(Zeile, 1))
                        
                    Else
                        
                        'erste Fundstelle merken
                        strFirsAddress = Treffer1.Address
                        
                        'wenn in Spalte C ein anderer Wert steht
                        If .Cells(Zeile, 3).Value <> Treffer1.Offset(0, -2).Value Then
                            
                            'Zweite Artikelnummer suchen
                            Set Treffer2 = Columns(5).FindNext(After:=Treffer1)
                            
                            'wenn keine weitere Fundstelle
                            If Treffer2.Address = strFirsAddress Then
                                
                                'Nr muss zusätzlich angelegt werden
                                Call CopyValues(.Cells(Zeile, 1))
                                
                            Else
                                
                                'zweite Artikelnummer gefunden Spalte E ändern
                                Cells(Treffer2.Row, 5).Value = .Cells(Zeile, 5).Value
                                
                            End If
                        Else
                            
                            'erste Artikelnummer gefunden Spalte E ändern
                            Cells(Treffer1.Row, 5).Value = .Cells(Zeile, 5).Value
                            
                        End If
                    End If
                Next Zeile
                
                'Abschließendes Sortieren
                Range("A:AB").Sort Key1:=Range("E1"), Order1:=xlAscending, Header:=xlYes
                
                'End With
                
                ' Eingeleser Quelldateiname wird in nachfolgende Zeile geschrieben
                QName = Quelle.Name
                QListennummer = Left$(Right$(QName, 11), 6)
                QPartnernummer = Right$(Left$(QName, 10), 3)
                QMonatsreferenz = Left$(QName, 6)
                
                QSumme = .Cells(.Rows.Count, 11).End(xlUp).Value
                
                With Tabelle13
                    
                    LetzteZeileEinspieldaten = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
                    
                    .Range("A" & LetzteZeileEinspieldaten).Value = QName
                    .Range("B" & LetzteZeileEinspieldaten).Value = QPartnernummer
                    .Range("C" & LetzteZeileEinspieldaten).Value = QListennummer
                    .Range("D" & LetzteZeileEinspieldaten).Value = QMonatsreferenz
                    .Range("E" & LetzteZeileEinspieldaten).Value = QSumme
                    .Range("F" & LetzteZeileEinspieldaten).Value = Date
                    
                End With
            End With
            
            Quelle.Close SaveChanges:=False
            
            With Tabelle13
                
                Set objCell1 = .Columns(2).Find(What:=strName, LookIn:=xlValues, _
                    LookAt:=xlWhole, SearchDirection:=xlNext, MatchCase:=True)
                
                Set objCell2 = .Columns(2).Find(What:=strName, LookIn:=xlValues, _
                    LookAt:=xlWhole, SearchDirection:=xlPrevious, MatchCase:=True)
                
                ListenNummer = Application.Max(.Range(objCell1.Offset(0, 1), objCell2.Offset(0, 1)))
                LetzterFakturaMonat = Application.Max(.Range(objCell1.Offset(0, 2), objCell2.Offset(0, 2)))
                
            End With
            
            NächsteListenNummer = ListenNummer + 1
            NächsteListenNummer6stellig = Format(NächsteListenNummer, "000000")
            
        Else
            Exit Do
        End If
    Loop
    
    Call CopyFormulas
    
    'Formatierung Tabelle2
    With Tabelle13
        .Columns(1).HorizontalAlignment = xlLeft
        .Columns(2).NumberFormat = "#,##0"
        .Columns(2).HorizontalAlignment = xlCenter
        .Columns(3).NumberFormat = "#,##0"
        .Columns(3).HorizontalAlignment = xlCenter
        .Columns(4).NumberFormat = "00000"
        .Columns(4).HorizontalAlignment = xlCenter
        .Columns(5).NumberFormat = "#,##0.00"
        .Columns(5).HorizontalAlignment = xlRight
        .Columns(6).HorizontalAlignment = xlRight
    End With
    
    Application.ScreenUpdating = True 'Das Bildschirm-Aktualisieren wieder einschalten
    
    MsgBox "Es wurden alle neuen Rechnungen von Partner ''" & _
        strName & "'' eingelesen", vbInformation, "Rechnungsaktualisierung"
    
End Sub

Gruß
Nepumuk
Anzeige
AW: Range.Find-Methode mit zwei Variablen
04.01.2021 17:11:30
Andl
Hallo Nepumuk,
so, Daten werden nun mal je Tabellenblatt eingelesen.:-)
Thema noch in der Sortierung und Formatierung der letzten Zeile - diese hat das Format der Überschrift:
Überschrift ist in Zeile 2 und soll nach Spalte E sortiert werden.
Range("A2:AC").Sort Key1:=Range("E2"), Order1:=xlAscending, Header:=xlYes
Gruß
Andl
AW: Range.Find-Methode mit zwei Variablen
04.01.2021 17:33:13
Nepumuk
Hallo Andl,
so ok?
Option Explicit

Public Sub DatenHolenAusRechnungsjournal()
    
    Const FOLDER_PATH As String = "W:\Projekt Fact\"
    
    Dim Zeile As Long
    Dim Treffer1 As Range
    Dim Treffer2 As Range
    Dim strFirsAddress As String
    Dim QName As String
    Dim LetzteZeileEinspieldaten As Long
    Dim QPartnernummer As String
    Dim QListennummer As String
    Dim QMonatsreferenz As String
    Dim QSumme As Single
    Dim strName As String
    Dim objCell1 As Range, objCell2 As Range
    Dim ListenNummer As Long
    Dim NächsteListenNummer As Long
    Dim NächsteListenNummer6stellig As String
    Dim LetzterFakturaMonat As Long
    Dim Quelle As Workbook
    Dim strFilename As String
    
    Application.ScreenUpdating = False 'Das "Flackern" ausstellen
    
    strName = ActiveSheet.Name
    
    With Tabelle13
        
        Set objCell1 = Tabelle13.Columns(2).Find(What:=strName, LookIn:=xlValues, _
            LookAt:=xlWhole, SearchDirection:=xlNext, MatchCase:=True)
        
        Set objCell2 = Tabelle13.Columns(2).Find(What:=strName, LookIn:=xlValues, _
            LookAt:=xlWhole, SearchDirection:=xlPrevious, MatchCase:=True)
        
        ListenNummer = Application.Max(.Range(objCell1.Offset(0, 1), objCell2.Offset(0, 1)))
        LetzterFakturaMonat = Application.Max(.Range(objCell1.Offset(0, 2), objCell2.Offset(0, 2)))
        
    End With
    
    Set objCell1 = Nothing
    Set objCell2 = Nothing
    
    NächsteListenNummer = ListenNummer + 1
    NächsteListenNummer6stellig = Format$(NächsteListenNummer, "000000")
    
    'Debug.Print objCell1
    'Debug.Print NächsteListenNummer
    'Debug.Print NächsteListenNummer6stellig
    'Debug.Print LetzterFakturaMonat
    
    Do
        
        strFilename = Dir$(FOLDER_PATH & "*_" & strName & "_" & NächsteListenNummer6stellig & ".xlsx")
        
        If strFilename <> vbNullString Then
            
            'Bei erstmaligem anlegen eines neuen Partners, muss die EinspielDatei manuell definiert werden
            'Set Quelle = Workbooks.Open(ThisWorkbook.Path & "\202010_333_000360.xlsx")
            
            'Bei bereits bestehenden Einspieldateien aktivieren
            Set Quelle = GetObject(PathName:=FOLDER_PATH & strFilename)
            
            With Quelle.Worksheets(1)
                
                For Zeile = 7 To .Cells(.Rows.Count, 5).End(xlUp).Row
                    
                    'Wo wird gesucht nach was? Wie? Nur Eindeutige Nummern
                    Set Treffer1 = Columns(5).Find( _
                        What:=.Cells(Zeile, 5).Value, LookIn:=xlValues, LookAt:=xlWhole)
                    
                    If Treffer1 Is Nothing Then
                        
                        'Nr muss neu angelegt werden
                        Call CopyValues(.Cells(Zeile, 1))
                        
                    Else
                        
                        'erste Fundstelle merken
                        strFirsAddress = Treffer1.Address
                        
                        'wenn in Spalte C ein anderer Wert steht
                        If .Cells(Zeile, 3).Value <> Treffer1.Offset(0, -2).Value Then
                            
                            'Zweite Artikelnummer suchen
                            Set Treffer2 = Columns(5).FindNext(After:=Treffer1)
                            
                            'wenn keine weitere Fundstelle
                            If Treffer2.Address = strFirsAddress Then
                                
                                'Nr muss zusätzlich angelegt werden
                                Call CopyValues(.Cells(Zeile, 1))
                                
                            Else
                                
                                'zweite Artikelnummer gefunden Spalte E ändern
                                Cells(Treffer2.Row, 5).Value = .Cells(Zeile, 5).Value
                                
                            End If
                        Else
                            
                            'erste Artikelnummer gefunden Spalte E ändern
                            Cells(Treffer1.Row, 5).Value = .Cells(Zeile, 5).Value
                            
                        End If
                    End If
                Next Zeile
                
                ' Eingeleser Quelldateiname wird in nachfolgende Zeile geschrieben
                QName = Quelle.Name
                QListennummer = Left$(Right$(QName, 11), 6)
                QPartnernummer = Right$(Left$(QName, 10), 3)
                QMonatsreferenz = Left$(QName, 6)
                
                QSumme = .Cells(.Rows.Count, 11).End(xlUp).Value
                
                With Tabelle13
                    
                    LetzteZeileEinspieldaten = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
                    
                    .Range("A" & LetzteZeileEinspieldaten).Value = QName
                    .Range("B" & LetzteZeileEinspieldaten).Value = QPartnernummer
                    .Range("C" & LetzteZeileEinspieldaten).Value = QListennummer
                    .Range("D" & LetzteZeileEinspieldaten).Value = QMonatsreferenz
                    .Range("E" & LetzteZeileEinspieldaten).Value = QSumme
                    .Range("F" & LetzteZeileEinspieldaten).Value = Date
                    
                End With
            End With
            
            Quelle.Close SaveChanges:=False
            
            Set Quelle = Nothing
            Set Treffer1 = Nothing
            Set Treffer2 = Nothing
            
            With Tabelle13
                
                Set objCell1 = .Columns(2).Find(What:=strName, LookIn:=xlValues, _
                    LookAt:=xlWhole, SearchDirection:=xlNext, MatchCase:=True)
                
                Set objCell2 = .Columns(2).Find(What:=strName, LookIn:=xlValues, _
                    LookAt:=xlWhole, SearchDirection:=xlPrevious, MatchCase:=True)
                
                ListenNummer = Application.Max(.Range(objCell1.Offset(0, 1), objCell2.Offset(0, 1)))
                LetzterFakturaMonat = Application.Max(.Range(objCell1.Offset(0, 2), objCell2.Offset(0, 2)))
                
            End With
            
            NächsteListenNummer = ListenNummer + 1
            NächsteListenNummer6stellig = Format(NächsteListenNummer, "000000")
            
        Else
            Exit Do
        End If
    Loop
    
    Call CopyFormulas
    
    'Abschließendes Sortieren
    Range(Cells(2, 1), Cells(Rows.Count, 29)).Sort Key1:=Range("E2"), Order1:=xlAscending, Header:=xlYes
    
    'Format der Überschrift in letzte Zeile kopieren
    Call Range("A2:AC2").Copy
    Call Cells(Rows.Count, 1).End(xlUp).PasteSpecial(Paste:=xlPasteFormats)
    
    'Formatierung Tabelle2
    With Tabelle13
        .Columns(1).HorizontalAlignment = xlLeft
        .Columns(2).NumberFormat = "#,##0"
        .Columns(2).HorizontalAlignment = xlCenter
        .Columns(3).NumberFormat = "#,##0"
        .Columns(3).HorizontalAlignment = xlCenter
        .Columns(4).NumberFormat = "00000"
        .Columns(4).HorizontalAlignment = xlCenter
        .Columns(5).NumberFormat = "#,##0.00"
        .Columns(5).HorizontalAlignment = xlRight
        .Columns(6).HorizontalAlignment = xlRight
    End With
    
    Application.ScreenUpdating = True 'Das Bildschirm-Aktualisieren wieder einschalten
    
    MsgBox "Es wurden alle neuen Rechnungen von Partner ''" & _
        strName & "'' eingelesen", vbInformation, "Rechnungsaktualisierung"
    
End Sub

Gruß
Nepumuk
Anzeige
AW: Range.Find-Methode mit zwei Variablen
05.01.2021 15:26:39
Andl
Hallo Nepumuk,
So, hab nun alles eingebaut.
Bisher hatte die Schleife immer gut funktioniert - irgendwas bleibt allerdings hängen:
Eingespielt werden Dateien, welche sich anhang der 6-stelligen, nach oben zählender Listennummer unterscheidet.
Dies funktioniert nun nicht mehr, und zwar nur bei den kleiner 1000 - siehe anbei.
Hast Du hier eine Idee?
https://www.herber.de/bbs/user/142776.xlsx
Beste Grüße
Andl
AW: Range.Find-Methode mit zwei Variablen
05.01.2021 16:00:10
Nepumuk
Hallo Andl,
kannst du mir den genauen Ablauf schildern damit ich das nachvollziehen kann? Z.B. ist die Listennummer immer fortlaufend? Die Ermittlung der nächsten Listennummer erscheint mir nämlich etwas fragwürdig.
Gruß
Nepumuk
AW: Range.Find-Methode mit zwei Variablen
05.01.2021 17:08:54
Andl
Hallo Nepumuk,
die .xlsx Dateien werden auf einem Laufwerk bereitgestellt und sind im Dateinamen immer gleich aufgebaut.
Siehe Dateinamen Spalte A: https://www.herber.de/bbs/user/142776.xlsx
Die Listennummer ist pro Partner immer fortlaufend aufsteigend - als Startwert habe ich in der Liste manuell die Listennummern eingegeben. Bspw. für Partner 311 - die 001094 - damit er ab 001095 anfängt diese einzuspielen.
Anhand der Historie sieht man dass er bspw. bei Partnernummer 221 oder 331 nur die nächsthöhere (000026 bzw. 000688) gefunden hat.
Bei Partner 311 hat er bis zur höchsten im Verzeichnis liegenden Datei eingelesen.
Beste Grüße
Andl
AW: Range.Find-Methode mit zwei Variablen
05.01.2021 17:40:08
Nepumuk
Hallo Andl,
das Makro arbeitet korrekt. Kann es sein, dass die laufende Nummerierung unterbrochen ist?
Ich habe dir mal eine Meldung eingebaut. Zudem sortiere ich vor dem Suchen nach der nächsten Nummer die Tabelle "Einspielhistorie" nach Spalte B damit die Nummern en bloc stehen.
Option Explicit

Public Sub DatenHolenAusRechnungsjournal()
    
    Const FOLDER_PATH As String = "W:\Projekt Fact\"
    
    Dim Zeile As Long
    Dim Treffer1 As Range
    Dim Treffer2 As Range
    Dim strFirsAddress As String
    Dim QName As String
    Dim LetzteZeileEinspieldaten As Long
    Dim QPartnernummer As String
    Dim QListennummer As String
    Dim QMonatsreferenz As String
    Dim QSumme As Single
    Dim strName As String
    Dim objCell1 As Range, objCell2 As Range
    Dim ListenNummer As Long
    Dim NächsteListenNummer As Long
    Dim NächsteListenNummer6stellig As String
    Dim Quelle As Workbook
    Dim strFilename As String
    
    Application.ScreenUpdating = False 'Das "Flackern" ausstellen
    
    strName = ActiveSheet.Name
    
    With Tabelle13
        
        .Columns("A:F").Sort Key1:=Range("B1"), Order1:=xlAscending, Header:=xlYes
        
        Set objCell1 = .Columns(2).Find(What:=strName, LookIn:=xlValues, _
            LookAt:=xlWhole, SearchDirection:=xlNext, MatchCase:=True)
        
        Set objCell2 = .Columns(2).Find(What:=strName, LookIn:=xlValues, _
            LookAt:=xlWhole, SearchDirection:=xlPrevious, MatchCase:=True)
        
        ListenNummer = Application.Max(.Range(objCell1.Offset(0, 1), objCell2.Offset(0, 1)))
        
    End With
    
    Set objCell1 = Nothing
    Set objCell2 = Nothing
    
    NächsteListenNummer = ListenNummer + 1
    NächsteListenNummer6stellig = Format$(NächsteListenNummer, "000000")
    
    'Debug.Print objCell1
    'Debug.Print NächsteListenNummer
    'Debug.Print NächsteListenNummer6stellig
    'Debug.Print LetzterFakturaMonat
    
    Do
        
        strFilename = Dir$(FOLDER_PATH & "*_" & strName & "_" & NächsteListenNummer6stellig & ".xlsx")
        
        If strFilename <> vbNullString Then
            
            'Bei erstmaligem anlegen eines neuen Partners, muss die EinspielDatei manuell definiert werden
            'Set Quelle = Workbooks.Open(ThisWorkbook.Path & "\202010_333_000360.xlsx")
            
            'Bei bereits bestehenden Einspieldateien aktivieren
            Set Quelle = GetObject(PathName:=FOLDER_PATH & strFilename)
            
            With Quelle.Worksheets(1)
                
                For Zeile = 7 To .Cells(.Rows.Count, 5).End(xlUp).Row
                    
                    'Wo wird gesucht nach was? Wie? Nur Eindeutige Nummern
                    Set Treffer1 = Columns(5).Find( _
                        What:=.Cells(Zeile, 5).Value, LookIn:=xlValues, LookAt:=xlWhole)
                    
                    If Treffer1 Is Nothing Then
                        
                        'Nr muss neu angelegt werden
                        Call CopyValues(.Cells(Zeile, 1))
                        
                    Else
                        
                        'erste Fundstelle merken
                        strFirsAddress = Treffer1.Address
                        
                        'wenn in Spalte C ein anderer Wert steht
                        If .Cells(Zeile, 3).Value <> Treffer1.Offset(0, -2).Value Then
                            
                            'Zweite Artikelnummer suchen
                            Set Treffer2 = Columns(5).FindNext(After:=Treffer1)
                            
                            'wenn keine weitere Fundstelle
                            If Treffer2.Address = strFirsAddress Then
                                
                                'Nr muss zusätzlich angelegt werden
                                Call CopyValues(.Cells(Zeile, 1))
                                
                            Else
                                
                                'zweite Artikelnummer gefunden Spalte E ändern
                                Cells(Treffer2.Row, 5).Value = .Cells(Zeile, 5).Value
                                
                            End If
                        Else
                            
                            'erste Artikelnummer gefunden Spalte E ändern
                            Cells(Treffer1.Row, 5).Value = .Cells(Zeile, 5).Value
                            
                        End If
                    End If
                Next Zeile
                
                ' Eingeleser Quelldateiname wird in nachfolgende Zeile geschrieben
                QName = Quelle.Name
                QListennummer = Left$(Right$(QName, 11), 6)
                QPartnernummer = Right$(Left$(QName, 10), 3)
                QMonatsreferenz = Left$(QName, 6)
                
                QSumme = .Cells(.Rows.Count, 11).End(xlUp).Value
                
                With Tabelle13
                    
                    LetzteZeileEinspieldaten = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
                    
                    .Range("A" & LetzteZeileEinspieldaten).Value = QName
                    .Range("B" & LetzteZeileEinspieldaten).Value = QPartnernummer
                    .Range("C" & LetzteZeileEinspieldaten).Value = QListennummer
                    .Range("D" & LetzteZeileEinspieldaten).Value = QMonatsreferenz
                    .Range("E" & LetzteZeileEinspieldaten).Value = QSumme
                    .Range("F" & LetzteZeileEinspieldaten).Value = Date
                    
                End With
            End With
            
            Quelle.Close SaveChanges:=False
            
            Set Quelle = Nothing
            Set Treffer1 = Nothing
            Set Treffer2 = Nothing
            
            With Tabelle13
                
                .Columns("A:F").Sort Key1:=Range("B1"), Order1:=xlAscending, Header:=xlYes
                
                Set objCell1 = .Columns(2).Find(What:=strName, LookIn:=xlValues, _
                    LookAt:=xlWhole, SearchDirection:=xlNext, MatchCase:=True)
                
                Set objCell2 = .Columns(2).Find(What:=strName, LookIn:=xlValues, _
                    LookAt:=xlWhole, SearchDirection:=xlPrevious, MatchCase:=True)
                
                ListenNummer = Application.Max(.Range(objCell1.Offset(0, 1), objCell2.Offset(0, 1)))
                
            End With
            
            Set objCell1 = Nothing
            Set objCell2 = Nothing
            
            NächsteListenNummer = ListenNummer + 1
            NächsteListenNummer6stellig = Format(NächsteListenNummer, "000000")
            
        Else
            MsgBox "Nummer: " & NächsteListenNummer6stellig & " nicht gefunden"
            Exit Do
        End If
    Loop
    
    Call CopyFormulas
    
    'Abschließendes Sortieren
    Range(Cells(2, 1), Cells(Rows.Count, 29)).Sort Key1:=Range("E2"), Order1:=xlAscending, Header:=xlYes
    
    'Format der Überschrift in letzte Zeile kopieren
    Call Range("A2:AC2").Copy
    Call Cells(Rows.Count, 1).End(xlUp).PasteSpecial(Paste:=xlPasteFormats)
    
    'Formatierung Tabelle2
    With Tabelle13
        .Columns(1).HorizontalAlignment = xlLeft
        .Columns(2).NumberFormat = "#,##0"
        .Columns(2).HorizontalAlignment = xlCenter
        .Columns(3).NumberFormat = "#,##0"
        .Columns(3).HorizontalAlignment = xlCenter
        .Columns(4).NumberFormat = "00000"
        .Columns(4).HorizontalAlignment = xlCenter
        .Columns(5).NumberFormat = "#,##0.00"
        .Columns(5).HorizontalAlignment = xlRight
        .Columns(6).HorizontalAlignment = xlRight
    End With
    
    Application.ScreenUpdating = True 'Das Bildschirm-Aktualisieren wieder einschalten
    
    MsgBox "Es wurden alle neuen Rechnungen von Partner ''" & _
        strName & "'' eingelesen", vbInformation, "Rechnungsaktualisierung"
    
End Sub

Gruß
Nepumuk
AW: Range.Find-Methode mit zwei Variablen
05.01.2021 18:31:11
Andl
Hallo Nepumuk,
nein, keine Lücken in den Nummern. Habe gerade manuell aus einer 000688 eine 001688 im Dateinamen usw geändert. Hat einwandfrei funktioniert.
Irgendwas muss mit der Formatierung nicht stimmen...
Gruß
Andl
AW: Range.Find-Methode mit zwei Variablen
05.01.2021 18:38:40
Nepumuk
Hallo Andl,
da musst du selber durch, denn ohne die Dateien kann ich das natürlich nicht testen.
Gruß
Nepumuk
AW: Range.Find-Methode mit zwei Variablen
06.01.2021 09:11:05
Nepumuk
Hallo Andl,
mir ist noch was eingefallen. Die Suche nach der nächsten Nummer innerhalb der Schleife ist Unsinn, du musst ja nur die Variable "NächsteListenNummer" um eins erhöhen.
Option Explicit

Public Sub DatenHolenAusRechnungsjournal()
    
    Const FOLDER_PATH As String = "W:\Projekt Fact\"
    
    Dim Zeile As Long
    Dim Treffer1 As Range
    Dim Treffer2 As Range
    Dim strFirsAddress As String
    Dim QName As String
    Dim LetzteZeileEinspieldaten As Long
    Dim QPartnernummer As String
    Dim QListennummer As String
    Dim QMonatsreferenz As String
    Dim QSumme As Single
    Dim strName As String
    Dim objCell1 As Range, objCell2 As Range
    Dim ListenNummer As Long
    Dim NächsteListenNummer As Long
    Dim NächsteListenNummer6stellig As String
    Dim Quelle As Workbook
    Dim strFilename As String
    
    Application.ScreenUpdating = False 'Das "Flackern" ausstellen
    
    strName = ActiveSheet.Name
    
    With Tabelle13
        
        .Columns("A:F").Sort Key1:=Range("B1"), Order1:=xlAscending, Header:=xlYes
        
        Set objCell1 = .Columns(2).Find(What:=strName, LookIn:=xlValues, _
            LookAt:=xlWhole, SearchDirection:=xlNext, MatchCase:=True)
        
        Set objCell2 = .Columns(2).Find(What:=strName, LookIn:=xlValues, _
            LookAt:=xlWhole, SearchDirection:=xlPrevious, MatchCase:=True)
        
        ListenNummer = Application.Max(.Range(objCell1.Offset(0, 1), objCell2.Offset(0, 1)))
        
    End With
    
    Set objCell1 = Nothing
    Set objCell2 = Nothing
    
    NächsteListenNummer = ListenNummer + 1
    NächsteListenNummer6stellig = Format$(NächsteListenNummer, "000000")
    
    'Debug.Print objCell1
    'Debug.Print NächsteListenNummer
    'Debug.Print NächsteListenNummer6stellig
    'Debug.Print LetzterFakturaMonat
    
    Do
        
        strFilename = Dir$(FOLDER_PATH & "*_" & strName & "_" & NächsteListenNummer6stellig & ".xlsx")
        
        If strFilename <> vbNullString Then
            
            'Bei erstmaligem anlegen eines neuen Partners, muss die EinspielDatei manuell definiert werden
            'Set Quelle = Workbooks.Open(ThisWorkbook.Path & "\202010_333_000360.xlsx")
            
            'Bei bereits bestehenden Einspieldateien aktivieren
            Set Quelle = GetObject(PathName:=FOLDER_PATH & strFilename)
            
            With Quelle.Worksheets(1)
                
                For Zeile = 7 To .Cells(.Rows.Count, 5).End(xlUp).Row
                    
                    'Wo wird gesucht nach was? Wie? Nur Eindeutige Nummern
                    Set Treffer1 = Columns(5).Find( _
                        What:=.Cells(Zeile, 5).Value, LookIn:=xlValues, LookAt:=xlWhole)
                    
                    If Treffer1 Is Nothing Then
                        
                        'Nr muss neu angelegt werden
                        Call CopyValues(.Cells(Zeile, 1))
                        
                    Else
                        
                        'erste Fundstelle merken
                        strFirsAddress = Treffer1.Address
                        
                        'wenn in Spalte C ein anderer Wert steht
                        If .Cells(Zeile, 3).Value <> Treffer1.Offset(0, -2).Value Then
                            
                            'Zweite Artikelnummer suchen
                            Set Treffer2 = Columns(5).FindNext(After:=Treffer1)
                            
                            'wenn keine weitere Fundstelle
                            If Treffer2.Address = strFirsAddress Then
                                
                                'Nr muss zusätzlich angelegt werden
                                Call CopyValues(.Cells(Zeile, 1))
                                
                            Else
                                
                                'zweite Artikelnummer gefunden Spalte E ändern
                                Cells(Treffer2.Row, 5).Value = .Cells(Zeile, 5).Value
                                
                            End If
                        Else
                            
                            'erste Artikelnummer gefunden Spalte E ändern
                            Cells(Treffer1.Row, 5).Value = .Cells(Zeile, 5).Value
                            
                        End If
                    End If
                Next Zeile
                
                ' Eingeleser Quelldateiname wird in nachfolgende Zeile geschrieben
                QName = Quelle.Name
                QListennummer = Left$(Right$(QName, 11), 6)
                QPartnernummer = Right$(Left$(QName, 10), 3)
                QMonatsreferenz = Left$(QName, 6)
                
                QSumme = .Cells(.Rows.Count, 11).End(xlUp).Value
                
                With Tabelle13
                    
                    LetzteZeileEinspieldaten = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
                    
                    .Range("A" & LetzteZeileEinspieldaten).Value = QName
                    .Range("B" & LetzteZeileEinspieldaten).Value = QPartnernummer
                    .Range("C" & LetzteZeileEinspieldaten).Value = QListennummer
                    .Range("D" & LetzteZeileEinspieldaten).Value = QMonatsreferenz
                    .Range("E" & LetzteZeileEinspieldaten).Value = QSumme
                    .Range("F" & LetzteZeileEinspieldaten).Value = Date
                    
                End With
            End With
            
            Quelle.Close SaveChanges:=False
            
            Set Quelle = Nothing
            Set Treffer1 = Nothing
            Set Treffer2 = Nothing
            
            NächsteListenNummer = NächsteListenNummer + 1
            NächsteListenNummer6stellig = Format(NächsteListenNummer, "000000")
            
        Else
            MsgBox "Nummer: " & NächsteListenNummer6stellig & " nicht gefunden"
            Exit Do
        End If
    Loop
    
    Call CopyFormulas
    
    'Abschließendes Sortieren
    Range(Cells(2, 1), Cells(Rows.Count, 29)).Sort Key1:=Range("E2"), Order1:=xlAscending, Header:=xlYes
    
    'Format der Überschrift in letzte Zeile kopieren
    Call Range("A2:AC2").Copy
    Call Cells(Rows.Count, 1).End(xlUp).PasteSpecial(Paste:=xlPasteFormats)
    
    'Formatierung Tabelle2
    With Tabelle13
        .Columns(1).HorizontalAlignment = xlLeft
        .Columns(2).NumberFormat = "#,##0"
        .Columns(2).HorizontalAlignment = xlCenter
        .Columns(3).NumberFormat = "#,##0"
        .Columns(3).HorizontalAlignment = xlCenter
        .Columns(4).NumberFormat = "000000"
        .Columns(4).HorizontalAlignment = xlCenter
        .Columns(5).NumberFormat = "#,##0.00"
        .Columns(5).HorizontalAlignment = xlRight
        .Columns(6).HorizontalAlignment = xlRight
    End With
    
    Application.ScreenUpdating = True 'Das Bildschirm-Aktualisieren wieder einschalten
    
    MsgBox "Es wurden alle neuen Rechnungen von Partner ''" & _
        strName & "'' eingelesen", vbInformation, "Rechnungsaktualisierung"
    
End Sub

Gruß
Nepumuk
AW: Range.Find-Methode mit zwei Variablen
06.01.2021 10:37:02
Andl
Hallo Nepumuk,
mir ist soeben auch was aufgefallen:
Application.ScreenUpdating = False 'Das "Flackern" ausstellen
strName = ActiveSheet.Name
With Tabelle13
.Columns("A:F").Sort Key1:=Range("B1"), Order1:=xlAscending, Header:=xlYes HIER KOMMT EINE FEHLERMELDUNG - der Sortierbezug ist ungültig - kann aber auch keinen Fehler feststellen - brauche ich aber eigentlich nicht, oder sortierung am Ende wieder nach DATUM
Set objCell1 = .Columns(2).Find(What:=strName, LookIn:=xlValues, _
LookAt:=xlWhole, SearchDirection:=xlNext, MatchCase:=True)
Set objCell2 = .Columns(2).Find(What:=strName, LookIn:=xlValues, _
LookAt:=xlWhole, SearchDirection:=xlPrevious, MatchCase:=True)
ListenNummer = Application.Max(.Range(objCell1.Offset(0, 1), objCell2.Offset(0, 1)))
End With
Set objCell1 = Nothing
Set objCell2 = Nothing
NächsteListenNummer = ListenNummer + 1
NächsteListenNummer6stellig = Format$(NächsteListenNummer, "000000")
'Debug.Print objCell1
'Debug.Print NächsteListenNummer
'Debug.Print NächsteListenNummer6stellig
'Debug.Print LetzterFakturaMonat
Wenn ich bis hierher im Direktbereich schaue, habe ich soeben festgestellt - dass Partnernummer und höchste Listennummer innerhalb eines Partners nicht stimmen. Es gibt pro Partner einen eigenen Listennummernkreis.
Die Formel müsste lauten: Suche in Spalte B (Tabelle13) nach dem aktuellen Tabellenblattnamen, und der höchsten Listennummer - erhöhe diese um 1 = Nächstelistennummer
Gruß
Andl
AW: Range.Find-Methode mit zwei Variablen
06.01.2021 10:41:43
Nepumuk
Hallo Andl,
da fehlt der Bezugspunkt vor Range.
.Columns("A:F").Sort Key1:=.Range("B1"), Order1:=xlAscending, Header:=xlYes
Das Sortieren nach Datum kannst du in den Block einsetzen in dem due die Liste formatierst.
Gruß
Nepumuk
AW: Range.Find-Methode mit zwei Variablen
06.01.2021 11:11:16
Andl
Hallo Nepumuk,
es hat an der Sortierung oben gefehlt. Dachte die wäre nur zur Übersicht...sorry
Nun läuft es einwandfrei und ich kann an meinem Tool weiterarbeiten.
Vielen, vielen Dank.
beste Grüße
Andl

306 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige