VBA Suche nach Leerstring mit range.find
25.02.2020 10:21:31
Heribert
Vor das Problem gestellt, Strings in die erste freie Zelle eines Bereichs zu schreiben, habe ich frisch von der Leber weg einfach ein range.find ("") eingesetzt. Leider zeigte sich, dass die Methode nicht immer das erwartete Ergebnis liefert. Ich hab noch was rumgeprockelt und schließlich eine klassische/unelegante und vermutlich ineffiziente Lösung mit Abfragen in Schleifen verwendet, aber damit ist das Problem natürlich nicht vom Tisch.
Nachdem ich mich jetzt mal isoliert damit befasst habe, stehe ich eigentlich vor zwei Problemen:
1) Die Suche nach einem Leerstring in einer völlig leeren Tabelle liefert überhaupt kein Ergebnis (Nothing).
2) Die Suche nach dem ersten Leerstring in einem Bereich liefert ein falsches Ergebnis, wenn die erste Zelle bereits einmal einen Wert hatte und wieder auf einen Leerstring gesetzt wurde.
Zur Illustration ein -- hoffentlich selbsterklärendes -- Stückchen Code, das ein leeres Tabellenblatt öffnet, an diesem verschiedene simple Änderungen vornimmt und nach jeder dieser Änderungen wieder die find-Methode aufruft.
Option Explicit
Sub FindTest()
Dim x As Range
Application.ThisWorkbook.Worksheets.Add.Name = "FindTest"
' Ausgangssituation: Neues, absolut leeres Tabellenblatt
With Application.ThisWorkbook.Worksheets("FindTest")
' 1. Suche in leerem Tabellenblatt liefert kein Ergebnis
Set x = .Range("A1:D4").Find("", LookIn:=xlValues, lookat:=xlWhole)
If x Is Nothing Then
Debug.Print "1. Kein Suchergebnis bei absolut leerem Tabellenblatt"
End If
Debug.Print
' 2. Suche in mit Leerstrings 'initialiertem' Tabellenblatt liefert kein Ergebnis
.Range("a1:x10").Value = ""
Set x = .Range("A1:D4").Find("", LookIn:=xlValues, lookat:=xlWhole)
If x Is Nothing Then
Debug.Print "2. Kein Suchergebnis, nachdem A1:X10 mit Leerstrings gefüllt wurde"
End If
Debug.Print
' 3. Suche in mit beliebigem Wert in irgendeiner Zelle 'initialisiertem'
' Tabellenblatt liefert das richtige Ergebnis
.Cells(1000, 1000).Value = " "
Set x = .Range("A1:D4").Find("", LookIn:=xlValues, lookat:=xlWhole)
Debug.Print "3. Leerstring in " + x.Address + " gefunden, nachdem "
Debug.Print " eine beliebige Zelle einen 'echten' Inhalt bekommen hat"
Debug.Print
' 4. Suche liefert das richtige Ergebnis, nachdem die Zelle A1 keinen
' Leerstring mehr enthält
.Cells(1, 1).Value = "A"
Set x = .Range("A1:D4").Find("", LookIn:=xlValues, lookat:=xlWhole)
Debug.Print "4. Leerstring in " + x.Address + " gefunden, nachdem "
Debug.Print " ein Buchstabe in Zelle A1 geschrieben wurde"
Debug.Print
' 5. Suche liefert das falsche Ergebnis, nachdem die Zelle A1 wieder
' einen Leerstring enthält
.Cells(1, 1).Value = ""
Set x = .Range("A1:D4").Find("", LookIn:=xlValues, lookat:=xlWhole)
Debug.Print "5. Leerstring in " + x.Address + " gefunden, nachdem der "
Debug.Print " Inhalt von Zelle A1 mit Leerstring überschrieben wurde"
Debug.Print
' 6. Suche liefert bei Wiederholung dasselbe falsche Ergebnis
Set x = .Range("A1:D4").Find("", LookIn:=xlValues, lookat:=xlWhole)
Debug.Print "6. Leerstring in " + x.Address + " gefunden, nachdem die Suche "
Debug.Print " unverändert wiederholt wurde (d.h. kein implizites FindNext)"
Debug.Print
' 7. Suche liefert das richtige Ergebnis, wenn sie explizit
' bei der letzten Zelle gestartet wird
Set x = .Range("A1:D4").Find("", after:=.Cells(4, 4), LookIn:=xlValues, lookat:=xlWhole)
Debug.Print "7. Leerstring in " + x.Address + " gefunden, nachdem die letzte Zelle des "
Debug.Print " Bereichs als 'After' spezifiziert wurde"
Application.DisplayAlerts = False
.Delete
Application.DisplayAlerts = True
End With
End Sub
Das Ganze ist unabhängig von SearchOrder, SearchDirection und SearchFormat, und das beschriebene Verhalten ist bei Excel 2010 und Excel 2016 zu beobachten: 1. Kein Suchergebnis bei absolut leerem Tabellenblatt
2. Kein Suchergebnis, nachdem A1:X10 mit Leerstrings gefüllt wurde
3. Leerstring in $A$1 gefunden, nachdem
eine beliebige Zelle einen 'echten' Inhalt bekommen hat
4. Leerstring in $A$2 gefunden, nachdem
ein Buchstabe in Zelle A1 geschrieben wurde
5. Leerstring in $A$2 gefunden, nachdem der
Inhalt von Zelle A1 mit Leerstring überschrieben wurde
6. Leerstring in $A$2 gefunden, nachdem die Suche
unverändert wiederholt wurde (d.h. kein implizites FindNext)
7. Leerstring in $A$1 gefunden, nachdem die letzte Zelle des
Bereichs als 'After' spezifiziert wurde
Hab ich irgendwas übersehen, mache ich irgendwas falsch?Gruß
Heribert