VBA: Gültigkeit der .Find-Methode

Informationen und Beispiele zu den hier genannten Dialog-Elementen:
MsgBox
Bild

Betrifft: VBA: Gültigkeit der .Find-Methode
von: Mumbaba
Geschrieben am: 20.11.2015 15:01:44

Hallo liebe Experten,
ich suche nun schon seit einigen Stunden nach der Ursache der Fehlermeldung im Code:

Sub Find_Peak()
Dim Peak As String
Dim MaxCell, SearchColumn As Range
Dim n, NumberOfColumns As Integer
Worksheets("Tabelle1").Activate
With Worksheets("Tabelle1")
NumberOfColumns = .Range(Cells(21, 23), Cells(21, 23).End(xlToRight)).Columns.Count
    For n = 1 To NumberOfColumns
        Set SearchColumn = Worksheets("Tabelle1").Range(Cells(22, 22 + n), Cells(22, 22 + n). _
End(xlDown))
        Peak = WorksheetFunction.Max(SearchColumn)
        MsgBox "Peak = " & Peak
        Set MaxCell = SearchColumn.Find(Peak, LookIn:=xlValues, LookAt:=xlWhole)
        MaxCell.Select
    Next n
End With
End Sub
Der VBA-Code hängt in der Zeile fest, in der ich "MaxCell" selektieren will, weil angeblich diese Zelle nicht vorhanden wäre.
Die zugehörige Fehlermeldung lautet "Objekt- oder With-Blockvariable nicht festgelegt."
Ich habe natürlich auch schon probiert, den zu suchenden Wert (Peak)zu Beginn in verschiedenster Form zu deklarieren, was aber nicht zum gewünschten Ergebnis geführt hat.
In der MsgBox wird ja auch der richtige Wert angezeigt.
Das Problem hängt jedoch offensichtlich an den Werten, die in der entsprechenden Tabelle stehen. Wenn es sich nur um gerade Zahlen handelt, funktioniert der Code, nur bei Kommazahlen fängt er an zu streiken.
Ich freue mich über jeden Lösungsansatz!

Bild

Betrifft: AW: VBA: Gültigkeit der .Find-Methode
von: Daniel
Geschrieben am: 20.11.2015 16:19:16
Hi
Dein Fehler ist:
Dim Peak As String
da du mit Zahlen arbeitest, ist besser
Dim Peak As Double
das Problem ist die Excelianische Sprachverwirrung.
wenn du eine Zahl in eine String-Variable schreibst, dann muss VBA die Zahl in einen Text (String) wandeln.
Hierbei wendest es das lokale und damit deutsche Schema mit dem Komma als Dezimalzeichen an, so dass aus der Kommazahl 1,2 der Text "1,2" wird.
die Suchfunktion vergleicht aber nun die internationalen Zellinhalte mit dem Suchbegriff und in der internationalen Schreibeise ist nun mal der Punkt das Dezimalzeichen und damit stimmt dann dein Suchbegriff "1,2" nicht mehr mit der Zahl "1.2" überein.
Die Lösung ist, wie schon gesagt die Variable Peak als Zahlenvariable zu deklarieren und nicht als Text, damit entfällt die Umwandlungsprobelmatik
Gruß Daniel

Bild

Betrifft: AW: VBA: Gültigkeit der .Find-Methode
von: Mumbaba
Geschrieben am: 23.11.2015 11:29:00
Hallo Daniel,
vielen Dank für die schnelle Antwort.
Jedoch hatte ich schon auf diesen Fehler hin geprüft - Der Maximalwert (Peak) wird ja auch erkannt, egal, ob ich ihn als Double oder als String suche.
Der Wert wird auch in der richtigen Spalte gesucht, aber irgendwas ist immernoch faul...
LG, Mumbaba

Bild

Betrifft: AW: VBA: Gültigkeit der .Find-Methode
von: Daniel
Geschrieben am: 25.11.2015 18:04:11
Hi
naja, wie Luc schon erkannt hat, hat dein Code noch ein paar mehr Macken, aber prinzipell funktioniert er auch mit Kommazahlen, wenn ich Peak als Double formatiere.
Gruß Daniel

Bild

Betrifft: Außerdem sind noch mehr Fehler gemacht ...
von: Luc:-?
Geschrieben am: 20.11.2015 18:24:03
…worden, Mumbaba,
zB der gerade erst wieder mal anderswo aufgetretene triviale VBA-Anfänger-Fehler, bei vorangestelltem With Worksheets(…) zwar .Range, aber nicht auch .Cells zu schreiben, was hier allerdings irrelevant ist, weil das Blatt zuvor aktiviert wurde. Dann kann allerdings auch die With-Konstruktion und somit der Pkt vor Range entfallen.
Ein weiterer Fehler besteht in dem häufig zu beobachtenden VBA-Anfänger-Fehler, zu glauben, dass bspw As Range für alle Variablen nach dem führenden Dim der Zeile gilt. Dem ist mitnichten so! Komma-getrennt können grdsätzlich alle Variablen nach nur einem Dim aufgeführt wdn. D.h., dass jeder Variable ein As … zugeordnet wdn muss (dafür gibt's auch Kurzschreibungen und global Einstellbares zur Namensform). Alles ohne das ist grdsätzlich Variant!
Der 3. weitere Fehler besteht idR (hier nur nötig, falls die Peak-Zelle ausgeblendet ist) darin, die per .Find gesetzte Objekt-Variable nicht auf Nothing zu überprüfen, bevor ihr eine Objekt-Methode oder -Eigenschaft zugeordnet wird.
Gruß, Luc :-?

Besser informiert mit …

 Bild

Beiträge aus den Excel-Beispielen zum Thema "VBA: Gültigkeit der .Find-Methode"