Zeilen löschen und gleichzeitig Formeln einfügen


josef24

Erfahrenes Mitglied
Hallo zusammen. Komme nochmal mit einer Frage zu VBA Code. Ich will einer Spalte eine Formel zuweisen. Gleichzeitig sollen Datensätze (Zeilen) gelöscht werden die einen gewissen Wert übersteigen. Mein Problem ist nun "Formel einfügen" und "Zeile löschen wenn Bedingung erfüllt ist", in Einklang zu bringen. Das mit der Zeile separat löschen wenn die Bedingung erfüllt ist, funktioniert, wenn ich aber versuche die Formel (egal welche) mitzuberücksichtigen, geht der Code nicht mehr.
Danke für Unterstützung und Gruß Josef

Fehler bei:
Code:
If .Cells(lngZeile, zielspalte) >= 10 Then
, gelb markiert. Laufzeitfehler 13, Typen unverträglich

Mein Code:
Visual Basic:
 Private Sub Worksheet_Activate() ' Zeileentfernen()
Dim lngZeile As Long
'   Dim i As Long
      zielspalte = 6
        With Info
          lngZeileMax = .Cells(Rows.Count, zielspalte).End(xlUp).Row
        For lngZeile = lngZeileMax To 2 Step -1
    If .Cells(lngZeile, zielspalte) >= 10 Then .Rows(lngZeile).Delete ' Löscht Daten älter 10 Tage
    Next '  lngZeile
   
        ' .Range("F2").FormulaLocal = "=WENN(($E$1:$E$= """";"""";DATEDIF(E2;HEUTE();""D""))"
       
     .Range("F2").FormulaLocal = "=WENN(E2="""";"""";DATEDIF(E2:E;HEUTE();""D""))"
   
        ' Worksheets("TabStat").Range("b21").FormulaLocal = "=MIN((ArbTab!$R$1:$R$" & letztezeile & "))"
       
            ' .Range("F2").FormulaLocal = "=MIN((ArbTab!$R$1:$R$" & letztezeile & "))"

        End With
    Application.CutCopyMode = False '  Beendet den Copiervorgang
End
End Sub
 
Zuletzt bearbeitet von einem Moderator:

josef24

Erfahrenes Mitglied
Hallo, muss so glaube ich, noch etwas ergänzen. Zum einen soll die Zeile gelöscht werden, die größer 10 in Spalte 6(F) ist. Im gleichen wollte ich für die Spalte "F" eine Formel eintragen lassen. Meine Frage ging dahin, ob und wie die beiden Aufgaben im Code vereinbar, also gleichzeitig erfüllt werden können? Gruß Josef
 

Yaslaw

n/a
Moderator
Ich habe mal in deinem Beitrag den Code-Tag auf VB gestellt.
Sorry, ich kann den Code nicht lesen ohne ihn vorher zu formatieren. DIe Anzahl der Tabulatoren ist kein Zufallsprinzip.

Hier mal dein Code in lesbarer formatierung. Wozu das END in der zweitletzten Ziel. Zudem sind diverse Variabeln nicht deklariert
Visual Basic:
Private Sub Worksheet_Activate() ' Zeileentfernen()
    Dim lngZeile As Long, zielspalte As Long, lngZeileMax As Long
    zielspalte = 6
    With Info
        lngZeileMax = .Cells(Rows.Count, zielspalte).End(xlUp).Row
        For lngZeile = lngZeileMax To 2 Step -1
            If .Cells(lngZeile, zielspalte) >= 10 Then .Rows(lngZeile).Delete ' Löscht Daten älter 10 Tage
        Next
        .Range("F2").FormulaLocal = "=WENN(E2="""";"""";DATEDIF(E2:E;HEUTE();""D""))"
    End With
    Application.CutCopyMode = False '  Beendet den Copiervorgang
    'End !!!!! Dieses End passt nirgends hin.
End Sub
Man erkennt, dass du die Zeilen rückwärts durchgehst id ggf löscht. Das ist gut so. Am Ende setzt du die Formel in F2. Ev. sollte dies auch in die Schleife und nur wenn das Feld < als 10 ist?
Visual Basic:
    With Info
        For lngZeile = lngZeileMax To 2 Step -1
            If .Cells(lngZeile, zielspalte) >= 10 Then 
                .Rows(lngZeile).Delete ' Löscht Daten älter 10 Tage
            ELse
                .Cells(lngZeile, zielspalte).FormulaLocal = "=WENN(E" & lngZeile & "="""";"""";DATEDIF(E" & lngZeile & ":E;HEUTE();""D""))"
            End If
        Next
    End With
 

josef24

Erfahrenes Mitglied
Danke für deine Unterstützung. Es funktioniert leider nicht wie erhofft. Weder das Löschen von Zeilen noch das rein Kopieren der Formel ist in Funktion. Anmerkung: Die Formel sollte in die Spalte "F" reinkopiert werden. Gruß Josef

Hab den Code mal so zusammen geführt:
Code:
 Private Sub Worksheet_Activate() ' Zeileentfernen()
Dim lngZeile As Long
   Dim i As Long
      zielspalte = 6
      
       With Info
        For lngZeile = lngZeileMax To 2 Step -1
            If .Range(lngZeile, zielspalte) >= 30 Then
                .Rows(lngZeile).Delete ' Löscht Daten älter 10 Tage
            Else
                .Cells(lngZeile, zielspalte).FormulaLocal = "=WENN(E" & lngZeile & "="""";"""";DATEDIF(E" & lngZeile & ":E;HEUTE();""D""))"
            End If
        Next
    End With
 Application.CutCopyMode = False '  Beendet den Copiervorgang
 
End Sub
 

Zvoni

Erfahrenes Mitglied
Das hier ist falsch:
DATEDIF(E2:E;HEUTE();""D"")

E2:E
Du gibst eine unvollendete Range an, wobei bei der DateDif eh keine MultiCell-Range angegeben wird
Muss wohl eher heissen: DATEDIF(E2:HEUTE();""D"")

Näxtes:
"=WENN(E2="""";"""";DATEDIF(E2:E;HEUTE();""D""))"

Mal das ganze Konstrukt......
E2:E siehe oben.
Du hast da Zellbezüge, welche im Code gar nicht verändert werden. Wieso willst du die Formel per VBA einfügen?
Gib sie direkt im Blatt ein (kann man so übrigens viel besser testen, ob das richtige herauskommt)
 

josef24

Erfahrenes Mitglied
Hallo nochmal. Die Schreibweise der Formel in der Spalte "F" sieht bei mir so aus und macht auch das was ich will. Formel ist: =WENN(E2="";"";DATEDIF(E2;HEUTE();"D")). Da aber ständig Zeilen wegen etwaiger Aktualisierungen gelöscht bzw. dazu kommen (Es sind mehrere die in der Tabelle arbeiten), wäre es aus meiner Sicht einfacher gewesen die Formel in der Spalte "F" immer aktuell rein zu kopieren. Ohne die gesamte Spalte mit der Formel zu belegen wüste ich keine geeignetere Lösung, wie die Formel immer nach Bedarf per Code einzufügen. Gruß Josef
 

josef24

Erfahrenes Mitglied
Ja, so hatte ich es mir vorgestellt. Die Formel jeweils rein kopieren wenn ein Datum in Spalte "E" geschrieben wird. Gruß Josef
 

josef24

Erfahrenes Mitglied
Danke, dass mit der Formel kopieren passt perfekt. Leider löscht er aber nicht die Daten/Zeilen wo die Bedingung erfüllt wäre. Könnte man da nochmal schauen? Gruß Josef
 

Zvoni

Erfahrenes Mitglied
Weil du dein Lösch-Kriterium eben nicht VORHER drin hast, wenn die Prüfung stattfindet.
Unabhängig von deiner Vorgehensweise, würde ich es eher so machen:
2 Schleifen!
1. Schleife füllt deine Formel in Spalte F
2. Schleife (rückwärts) prüft auf dein Kriterium, falls erfüllt, delete
In der Reihenfolge. Zuerst deine Formel füllen, dann aufräumen
 

josef24

Erfahrenes Mitglied
Danke, die Reihenfolge mit Formel einfügen und Zeilen löschen in gewisser Reihenfolge hatte ich auch in meiner Überlegung. Kann es mangels Kenntnis leider nicht umsetzen. Könnte vielleicht noch jemand helfen? Gruß Josef
 

Zvoni

Erfahrenes Mitglied
Aircode! Ungetestet
Code:
With Info
For lngZeile = lngZeileMax To 2 Step -1
    .Cells(lngZeile, zielspalte).FormulaLocal = "=WENN(E" & lngZeile & "="""";"""";DATEDIF(E" & lngZeile & ";HEUTE();""D""))"
Next

For lngZeile = lngZeileMax To 2 Step -1
    If .Range(lngZeile, zielspalte) >= 30 Then .Rows(lngZeile).Delete ' Löscht Daten älter 30 Tage
Next
End With
 

josef24

Erfahrenes Mitglied
Danke, der Code läuft, Formel einfügen ist aktiv, löschen ist aber so nicht aktiv. Auch die Funktion löschen als eigenständiger Code macht nichts???? Es gibt in keinster Weise einen Fehlerhinweis. Gruß Josef
 

Zvoni

Erfahrenes Mitglied
Arggghh...ich sehe gerade in der Lösche-Routine ist es ".Range(Zeile,Spalte)"
Änder das mal ab auf ".Cells(Zeile,Spalte)"

P.S.: Du kannst auch beide Schleifen zusammenlegen:
Code:
With Info
For lngZeile = lngZeileMax To 2 Step -1
    .Cells(lngZeile, zielspalte).FormulaLocal = "=WENN(E" & lngZeile & "="""";"""";DATEDIF(E" & lngZeile & ";HEUTE();""D""))"
    If .Cells(lngZeile, zielspalte) >= 30 Then .Rows(lngZeile).Delete ' Löscht Daten älter 30 Tage
Next
End With
Falls es immer noch nicht will, kann es an der Formatierung der Zelle liegen.
Schau dir mal im Einzelschritt an, ob es als Zahl oder Text angezeigt wird.

EDIT: Ich geh mal schwer davon aus, dass "Info" ein Worksheet-Objekt ist?
 

josef24

Erfahrenes Mitglied
Danke, habe gerade mal geschaut. "Info" ist ein Worksheet. Die Spalte 6 oder "F" wo der Wert der Formel stehen soll hatte ich als Standard wie auch als Zahl formatiert. Text funktioniert auch nicht. Sorry, aber mit dem Code aus #18 bewegt sich gar nichts. Erlaube mir mal die Datei anzuhängen. Gruß Josef
 

Anhänge

Neue Beiträge