Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema MsgBox
BildScreenshot zu MsgBox MsgBox-Seite mit Beispielarbeitsmappe aufrufen

If Not Funktion


Betrifft: If Not Funktion von: Lisa
Geschrieben am: 18.07.2017 12:40:28

Hallo,

folgenden Code habe ich benutzt, um alle Zeilen zu löschen, in denen nicht eine der vier Bedinungen erfüllt ist.
Leider funktioniert es nicht - ist was mit dem Code falsch oder kann es auch daran liegen, dass die Datei sehr groß ist?


Sub DelRows()
   
Dim lngLastRow As Long
Dim i As Long
lngLastRow = ActiveCell.SpecialCells(xlLastCell).Row
For i = lngLastRow To 1 Step -1
  
If Not (Cells(i, 3) = 67760 Or Cells(i, 3) = 10108939 Or Cells(i, 1).Value = "APO"
Or Cells(i, 1).Value = "HST") 
Then
Cells(i, 1).EntireRow.Delete
End If
Next

End Sub

  

Betrifft: AW: If Not Funktion von: mmat
Geschrieben am: 18.07.2017 12:52:42

Hallo,

was funktioniert nicht?
- Löscht keine Zeilen
- Löscht die falschen Zeilen
- Stürzt ab
- Bringt die Tastatur zum schmelzen :-)

Das hier würde ich so nicht schreiben, steht da bei dir die richtige Zeile drin?

lngLastRow = ActiveCell.SpecialCells(xlLastCell).Row
vg, MM


  

Betrifft: AW: If Not Funktion von: Lisa
Geschrieben am: 18.07.2017 13:06:52

Hallo MM,

lngLastRow = ActiveCell.SpecialCells(xlLastCell).Row

steht bei mir auch, da die Datei immer verschieden groß ist und es keine feste lezte Zeile gibt.
Der Bildschrim flackert nur, aber passieren tut nichts.


LG


  

Betrifft: AW: If Not Funktion von: mmat
Geschrieben am: 18.07.2017 13:17:28

Hallo Lisa,

ja klar, vermutlich liegt es daran

Füge eine Zeile hinzu:

msgbox cstr(lngLastRow)
Die Msgbox sollte nun eine Zahl ausspucken, die deiner letzten Zeile entspricht.

Ich würde das Thema mit der letzten Zeile so lösen:
Irgendwo muß es eine Spalte geben, in der immer etwas drinsteht. Meistens ist dies die Spalte A

Dann würde mein Code lauten:
lngLastRow = cells (65500, 1).end(xlup).Row
Falls du mehr Zeilen hat wie 65500 dann muß hier natürlich ein größerer Wert stehen.

vg, MM


  

Betrifft: AW: If Not Funktion von: Lisa
Geschrieben am: 18.07.2017 13:46:51

Hallo MM,

habe deinen Rat befolgt, meine letzte Zeile ist 275693. Aber außer flackern passiert immer noch nichts.... liegt es vielleicht wirklich an der Datei-Größe?


  

Betrifft: Textzahlen ? von: Werner
Geschrieben am: 18.07.2017 13:53:12

Hallo Lisa,

mal eine Frage, hast du auch echte Zahlen in deinen Zellen stehen und nicht Text, der nur wie Zahlen aussieht?
Prüfe mal mit:=ISTZAHL(A1)

A1 musst du halt mit der entsprechenden Zelle ersetzen. Wenn da eine echte Zahl drin steht sollte das Ergebnis WAHR sein.

Gruß Werner


  

Betrifft: AW: If Not Funktion von: mmat
Geschrieben am: 18.07.2017 14:04:34

Hallo Lisa

den folgenden Code hab ich bei mir getestet, alle Zeilen mit den genannten Werten bleiben stehen. Beachte bitte, dass dieser in einem allgemeinen Modul stehen muß, nicht im Code eines Arbeitsblatts.

Sub DelRows()
Dim lngLastRow As Long
Dim i As Long
   
lngLastRow = Cells(1000000, 1).End(xlUp).Row
For i = lngLastRow To 1 Step -1
  If Not (Cells(i, 3) = 67760 Or Cells(i, 3) = 10108939 Or Cells(i, 1).Value = "APO" Or Cells(i, _
 1).Value = "HST") Then Rows(i).Delete
Next
End Sub
vg, MM


  

Betrifft: AW: If Not Funktion von: Lisa
Geschrieben am: 18.07.2017 14:28:23

Hallo MM

Achso, das ändert natürlich einiges :-)

Ich lass es jetzt mal durchrattern! Vielen Dank für deine Hilfe!

LG


  

Betrifft: Autofilter wäre ja viel schneller ... von: lupo1
Geschrieben am: 18.07.2017 14:34:09

... mal eben angemerkt. Bei den Mengen!

Oder auch Spezialfilter.


  

Betrifft: AW: If Not Funktion von: mmat
Geschrieben am: 18.07.2017 14:48:00

Hallo Lisa,

sach mal ob's geklappt hat.

Wenn irgendwas von deinen Bedingungen schiefgeht ("APO" und "Apo" ist was anderes), dann muß am Ende ein "zuviele Zeilen gelöscht" rauskommen, aber net "ich mach garnix"

vg, MM


  

Betrifft: Einzelschrittmodus von: lupo1
Geschrieben am: 18.07.2017 12:54:40

MsgBox (Cells(i, 3) = 67760 Or Cells(i, 3) = 10108939 Or Cells(i, 1).Value = "APO"
Or Cells(i, 1).Value = "HST")

mal statt If testen


  

Betrifft: AW: Einzelschrittmodus von: Peter (hpo)
Geschrieben am: 18.07.2017 13:34:02

Hallo Lisa

Probier mal:

Dim lngLastRow As Long
Dim i As Long
lngLastRow = ActiveCell.SpecialCells(xlLastCell).Row
MsgBox lngLastRow
For i = lngLastRow To 1 Step -1
If Not (Cells(i, 3) = 67760 Or Cells(i, 3) = 10108939 Or Cells(i, 1).Value = "APO" _
Or Cells(i, 1).Value = "HST") Then Rows(i & ":" & i).Delete

End If
Next

Viele Grüße
Peter (hpo)


  

Betrifft: AW: If Not Funktion von: Daniel
Geschrieben am: 18.07.2017 18:00:49

Hi

bei der genannten Datenmenge ist es nicht mehr sinnvoll, jede Zeile einzeln zu löschen.
Das dauert sehr lange, weil das Zeilenlöschen ein sehr komplexer Vorgang für Excel ist.
Auch das Löschen über den Autofilter würde nur dann eine zufriedenstellende Laufzeit erbringen, wenn du die Datei vor dem Löschen nach den Filterspalten sortierst, so dass die zu löschenden Zeilen möglichst lückenlos bei einander stehen.

ohne Umsortieren wäre wahrscheinlich folgendes die beste lösung:

1. markiere in einer Hilfsspalte per Formel alle Zellen, die gelöscht werden sollen mit 0 und alle Zeilen, die stehen bleiben müssen, mit der aktuellen Zeilennummer.
in deinem Fall wäre die Formel
=Wenn(Oder(A1="APO";A1="HST";C1=67760;C1=10108939);Zeile();0)
2. Schreibe in die Überschriftenzeile ebenfalls die 0
3. Wende auf die Ganze Tabelle die Funktion Daten - Datentools - Duplikate entfernen an, mit der Hilfsspalte als Kriterium und der Option "keine Überschrift"
4. lösche die Hilfsspalte

das ganze geht natürlich auch als Makro:

Sub löschen()
With ActiveSheet.UsedRange
    With .Columns(.Columns.Count + 1)
        .FormulaR1C1 = "=IF(Or(RC1=""APO"",RC1=""HST"",RC3=67760,RC3=10108939),Row(),0)"
        .Cells(1, 1).Value = 0
        .EntireRow.RemoveDuplicates .Column, xlNo
        .ClearContents
    End With
End With
End Sub
Gruß Daniel


Beiträge aus den Excel-Beispielen zum Thema "If Not Funktion"