Microsoft Excel

Herbers Excel/VBA-Archiv

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

Frage zu Range.Find

Betrifft: Frage zu Range.Find von: Barbara
Geschrieben am: 01.04.2020 14:14:12

Hallo
Frage zu Range.Find

B3:B6="abc"

In folgendem Beispiel suche ich nach der nächsten freien Zelle nach einer bestimmten Zelle innerhalb Spalte B.

Warum ist das Ergebnis c nicht B15, sondern B1?

Sub Finden()
    Dim a, b, c
    
    With ActiveSheet
        .Columns("B").Clear
        .Range("B3:B6").Value = "abc"
        a = .Columns("B").Find(What:="", After:=Range("B3")).Address
        'a="$B$7" ist OK
        b = .Columns("B").Find(What:="", After:=Range("B8")).Address
        'b="$B$9" ist OK
        c = .Columns("B").Find(What:="", After:=Range("B14")).Address
        'c="$B$1" Warum nicht B15 ???
    End With
End Sub

LG

Betrifft: AW: Frage zu Range.Find
von: Daniel
Geschrieben am: 01.04.2020 15:57:19

Hi

Excel und VBA arbeiten häufig nicht mit dem gesamten Zellbereich des Tabellenblatts, sondern nur mit der UsedRang, dass ist der Zellbereich, in dem sich tatsächlich Inhalte (Werte, Formeln, Formatierungen) befinden.

Es wäre also möglich, dass B15 schon außerhalb der UsedRange liegt.
Schreibe mal in C16 einen Wert und probiere es nochmal. Wenn B15 jetzt gefunden wird, liegt es daran.

Betrifft: AW: Frage zu Range.Find
von: Barbara
Geschrieben am: 01.04.2020 16:53:32

OK, seltsam.

Bei folgendem Code kommr B1 raus, wenn ich ihn in einer unbefleckten neuen Datei ausführe.
Sub Finden()
    With ActiveSheet
        .Columns("B").Clear
        .Range("B3:B6").Value = "abc"
        .Range("B13:B16").Value = "abc"
        .Columns("B").Find(What:="", After:=.Range("B2")).Select
    End With
End Sub
Da müsste doch die die erste freie Zelle nach dem Block gefunden werden. Und die liegt sicher im UsedRange.

LG

Betrifft: AW: Frage zu Range.Find
von: Firmus
Geschrieben am: 01.04.2020 19:31:56

Hi Barbara,

was usedRange ist bestimmt Excel.

Deine Beschreibung war nachvollziehbar. active Zelle bleibt auf B1 stehen.
Ich habe als 1. und 2. Zeile eingefügt,
anzZe = ActiveSheet.UsedRange.Rows.Count
anzSP = ActiveSheet.UsedRange.Columns.Count

1. Test
Makro laufen lassen, anzZe und anzSP im Direktfenster anzeigen
Ergebnis:
Anzeige anzZe = 1, anzSP = 1
active Zelle bleibt auf B1 stehen

2. Test
In die Zellen A1:A3 einen '.' eingesetzt.
Erneuter Test:
1. anzZe = 14, anzSP = 2
2. Test durchlaufen lassen,
Ergebnis: active Zelle bleibt auf B7 stehen (wie erwartet, denn das ist die erste leere Zelle)

3. Test
Selbst wenn ich die Punkte in A1:A3 wieder lösche,
- reagiert xls erneut mit Anzze=1 und AnzSP=1,
- bleibt nach dem Makro die aktive Zelle wieder auf B1 stehen.

Vllt hilft dir das weiter,

Gruß
Firmus

Betrifft: AW: Frage zu Range.Find
von: Barbara
Geschrieben am: 01.04.2020 19:56:16

Hi Firmus,

ich verstehe nicht, was Du damit sagen willst, und in welcher Weise mir das weiterhelfen könnte.

Findest Du nicht auch, dass Range.find in meinem Beispiel unerwartete Ergebnisse liefert?

LGB

Betrifft: AW: Frage zu Range.Find
von: Firmus
Geschrieben am: 01.04.2020 22:14:45

Hi Barbara,

es gibt m. E. hier zwei Aspekte.
1. Das Verhalten das Excel in deinem Code zeigt ist irritierend, genau betrachtet sehe ich als
als Fehler in der Funktionalität an.
2. Du bist auf der Suche nach einer Lösung. Mit dem Eintragen der Punkte sieht du einen Bypass.
(man kann sagen um den Fehler herum programmiert).
Ob dieser Ansatz dir in deiner Aufgabe weiterhilft, das kann ich nicht beurteilen.

Sicher scheint mir aber, dass der Fehler - wenn er überhaupt als solcher angesehen wird - nicht
sehr schnell behoben wird.

Gruß,
Firmus

Betrifft: AW: Frage zu Range.Find
von: Barbara
Geschrieben am: 01.04.2020 22:28:43

OK, Du siehst das als Fehler. Oder doch nicht? Keine Beschreibung in der Hilfe erklärt das. Seltsam nur, dass ich von diesem Fehler noch nie was gelesen habe.

Meine Aufgabenstellung ist Folgende:
Ich soll eine Wert in die Zelle B5 oder die erste freie Zelle darunter schreiben. Deshalb suche ich die erste freie Zelle, beginnend bei B5. Dafür bietet sich Range.Find als Lösung ohne Schleifenkonstruktion an, dachte ich. Ich finde, Bestimmen der ersten freien Zelle ist eine Standardsituation.

Betrifft: AW: Frage zu Range.Find
von: Firmus
Geschrieben am: 02.04.2020 14:09:31

Hi Barbara,

die Diskussion ist eher philosophisch.
Software wird nie fehlerfrei sein, sondern nur immer besser benutzbar - wenn Korrekturen gemacht werden.
Doku zu Software deckt nie alle Konstellationen ab, sondern nur den Mainstream und vllt. ein bisschen mehr.
Die beschriebenen Symptome fallen einfach raus aus dem Doku-Umfang.
Deshalb kann ich es nicht als "das ist ein Bug" bezeichnen, sondern nur als "nach der allgemeinen Erwartung würde man das als Bug betrachten".
Streit zwischen Support-Team und Entwickler-Team: It's not a bug, it's a feature.
Und das gilt so lange bis der verantwortliche SW-Produktmanager BUG oder Feature sagt.
Bei Bug: Software nachbessern.
Bei Feature: Doku nachbessern.

Mehr kann ich dazu nicht mehr beitragen, und obiges kommt aus jahrelanger Erfahrung in beiden Bereichen - Support und Development.

Gruß,
Firmus

Betrifft: AW: Frage zu Range.Find
von: GerdL
Geschrieben am: 01.04.2020 23:53:10

Moin Barbara,
den Grund hat dir Daniel schon genannt. Eine Alternative:
Sub test()

    Dim Zeile As Long
    
    If IsEmpty(Range("B5")) Then
        Zeile = 5
    ElseIf IsEmpty(Range("B6")) Then
        Zeile = 6
    Else
        Zeile = Range("B5").End(xlDown).Row
    End If
    MsgBox Zeile

End Sub

Gruß Gerd

Betrifft: AW: Frage zu Range.Find
von: Barbara
Geschrieben am: 02.04.2020 00:22:55

Danke Gerd, das ist mir bekannt. Sicher, so geht es auch. Besser gesagt, so geht es.

Daniel hat mE keinen Grund genannt.

Dass das mit der Festlegung des UsedRange in einer konkreten Situation zusammenhängt, und diese allein dem Programm Excel überlassen sei, und dass dieses daraus nicht nachvollziehbare Verhalten von Range.Find nicht als Fehler gesehen werden muss, ist für mich keine Benennung eines Grundes.

Oder vielleicht habe ich Dich jetzt missverstanden.