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:

Yaslaw

alter Rempler
Moderator
.Cells ist ein Range-Objekt
Visual Basic:
If .Cells(lngZeile, zielspalte).Value >= 10 Then
 

josef24

Erfahrenes Mitglied
Danke erstmal. Ist noch etwas mehr Unterstützung möglich? Ich komm nicht so recht weiter. Gruß Josef
 

Yaslaw

alter Rempler
Moderator
Was geht den nicht? Das ist doch die Zeile mit dem Fehler? Oder habe ich dein Rext falsch vertanden.
 

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

alter Rempler
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