Excel VBA - Zeile löschen wenn Datum kleiner oder größer

jerry0110

Erfahrenes Mitglied
Hi brauche hier mal Hilfe:

Ich habe in 2 Felder (Sheet Makros) 2 Datumsfelder. 01.06.16 und 01.08.16.
Jetzt möchte ich aus einer Datei (Sheet Tabelle1) die Überschrift Datum suchen und wenn diese gefunden wird, soll dann im Feld geschaut werden ob das Datum kleiner 01.06 oder größer 01.08 ist. Wenn das der Fall ist, dann soll die Zeile gelöscht werden.

Hier mein Code:

Visual Basic:
Sub Zeilen_löschen()
Dim i As Long
Dim source As Worksheet
Dim source2 As Worksheet
Dim lastCol As Long
Dim lastRow As Long

Set source = ActiveWorkbook.Worksheets("Tabelle1")
Set source2 = ThisWorkbook.Worksheets("Makros")

'letzte Zeile & Spalte im Ziel berechnen
lastRow = xlsGetLastRow(source)
lastCol = xlsGetLastCol(source)

For i = lastRowNr(source) To 2 Step -1
    With Columns(Application.Match("Datum", Rows(1), i))
        If source.Cells(i, 10) < source2.Range("J3") Or source.Cells(i, 10) > source.Range("J4") Then
            Rows(i).Delete shift:=xlUp
        End If
    End With
Next i

End Sub

Mein Fehler ist, das sehe ich ja schon selber, dass ich angeben das er in Spalte 10 gucken soll. Aber ich weiß ja gar nicht ob es 10 ist. Habe gerade ein Blackout.
 

HonniCilest

Erfahrenes Mitglied
Visual Basic:
Cells.Find(What:="Datum").Column

Sowas? Du brauchst dann halt eine 2. Variabel (z.B. 'j') welcher du das Ergebnis zuweist. Anstatt 10 steht dann dort j. Was bezweckt dein With-Block?
 

Yaslaw

n/a
Moderator
Etwa so.
Nicht vergessen. bei allen Objekten das Worksheet angeben. Nicht einfach Rows schreiben. Sondern wsData.Rows etc.
Visual Basic:
Dim colNrDate As Long
Dim dateFrom As date
Dim dateTo As date
Dim rowNr As Long
Dim wsData As Worksheet
Dim wsMacro As Worksheet
 
Set wsData = ActiveWorkbook.Worksheets("Tabelle1")
Set wsMacro = ActiveWorkbook.Worksheets("Makros")
 
'Datumsspalte suchen
colNrDate = wsData.Cells.Find(What:="Datum").Column

'Datumsrange auslesen
dateFrom = wsMacro.Range("J3")
dateTo = wsMacro.Range("J4")

For rowNr = xlsGetLastRow(wsData) To 2 Step -1
    If wsData.Cells(rowNr, colNrDate) < dateFrom Or wsData.Cells(rowNr, colNrDate) > dateTo Then
        wsData.Rows(rowNr).Delete shift:=xlUp
    End If
Next rowNr
 

jerry0110

Erfahrenes Mitglied
Danke!! Mal wieder :)

Das einzige was ich jetzt noch anpassen musste ist

Set wsMacro = ActiveWorkbook.Worksheets("Makros")

in

Set wsMacro = ThisWorkbook.Worksheets("Makros")

ändern. Weil Die Makros in einem anderen Arbeitsblatt sind als die Tabelle1
 

Yaslaw

n/a
Moderator
Ich empfehle dir nicht mit activeWorkbook und ThisWorkbook zu arbeiten. Ist zu undefiniert. Immer gezielt mit dem Objekt arbeiten
Visual Basic:
Dim wbData As Workbook
Dim wbMacro As Workbook
Dim wsData As Worksheet
Dim wsMacro As Worksheet

Set wbData = Workbooks("datenbook.xlsx")
'oder hier erst das Data-Workbook öffnen
Set wbData = Workbooks.open("c:\temp\datenbook.xlsx")
Set wsData = wbData.Worksheets("Tabelle1")


Set wbData = Workbooks("makro.xlsx")
Set wsMacro = wbMacro.Worksheets("Makros")
...
wbData.save
wbData.close
 

jerry0110

Erfahrenes Mitglied
Ok. Dann passe ich das im ganzen Makro an.
Hab es in mehrere Teile aufgeteilt und füge dann alles zusammen mit dem Hinweis.
 

jerry0110

Erfahrenes Mitglied
Ich empfehle dir nicht mit activeWorkbook und ThisWorkbook zu arbeiten. Ist zu undefiniert. Immer gezielt mit dem Objekt arbeiten
Visual Basic:
Dim wbData As Workbook
Dim wbMacro As Workbook
Dim wsData As Worksheet
Dim wsMacro As Worksheet

Set wbData = Workbooks("datenbook.xlsx")
'oder hier erst das Data-Workbook öffnen
Set wbData = Workbooks.open("c:\temp\datenbook.xlsx")
Set wsData = wbData.Worksheets("Tabelle1")


Set wbData = Workbooks("makro.xlsx")
Set wsMacro = wbMacro.Worksheets("Makros")
...
wbData.save
wbData.close

Muss ich denn bei der Arbeitsmappe mit dem Makro (ThisWorkbook bei mir) dann auch den ganzen Pfad angeben?
Oder erkennt er das, dass es die Mappe ist, die ich auf habe?
 

Yaslaw

n/a
Moderator
Keine Ahnung. Probieren.....
Oder ganz am Anfang halt aus ThisWorkbook nehmen. ABer einfach nachher mit den eindeutgen Namen weiterarbeiten. Gibt weniger Verwirring
Visual Basic:
'Weiss grad nicht, ob thisWorkbook das Makro oder die Daten sind. Also noch anpassen
Set wbMacro = ThisWorkbook
 

jerry0110

Erfahrenes Mitglied
Also ich habe jetzt folgendes gemacht.

Das Makro startet mit:

Visual Basic:
Set wbMacro = ThisWorkbook
Set wsMacro = wbMacro.Worksheets("Makros")
Set source = ThisWorkbook.Worksheets("Kunden")

Dann wird die Datei erstellt und gespeichert. Dann kommt die Datei zum öffnen.

Visual Basic:
Set wbData = source.Range("B2") & source.Range("G" & f) & Format(source.Range("E1"), "YYYYMMDD") & "_" & Format(source.Range("G1"), "YYYYMMDD") & source.Range("I" & f)
Set wbData = Workbooks.Open(source.Range("B2") & source.Range("G" & f) & Format(source.Range("E1"), "YYYYMMDD") & "_" & Format(source.Range("G1"), "YYYYMMDD") & source.Range("I" & f))
Set wsData = wbData.Worksheets("Tabelle1")

Jetzt bekomme ich aber bei dem Seiteneinrichten folgende Fehlermeldung:

Visual Basic:
With wsData.PageSetup

Laufzeitfehler 91: Objektvariable oder With......
 

Yaslaw

n/a
Moderator
Visual Basic:
Set wbData = source.Range("B2") & source.Range("G" & f) & Format(source.Range("E1"), "YYYYMMDD") & "_" & Format(source.Range("G1"), "YYYYMMDD") & source.Range("I" & f)
Was soll das bewirken? wbData ist ein Workbook
Was du da übertragen willst ist aber ein String.

Die Fehlermeldung besagt, dass wsData nicht gesetzt ist.
Hast du die PageSetup-Zeile in derselben Funktion wie der obere Code?
Unterdrückst du irgendwo vorher Fehlermeldungen?
Überschreibst du wsData zwischendurch?
 

Neue Beiträge