Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1216to1220
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Code funktioniert erst ab dem zweiten Aufruf

Code funktioniert erst ab dem zweiten Aufruf
Reinhard
Hallo Wissende,
in einem anderen Forum hat jmd. das Problem daß da bei seinem Code der Fehler 91 kommt, also Objektvariable nicht festgelegt usw.
Ich habe mir den Code "test1" angeschaut, gekürzt auf "test2" und dann mit Testdaten ausprobiert.
Also mit Tabellenblätter wo da im gewünschetn Bereich von E mal die Suchwörter drin standen oder halt nicht.
Kam nie so eine Fehlermeldung.
Obwohl, zugeb, sie kam schon ein-zweimal aber irgendwie nicht reprozudierbar.
Hier ist die Mappe um die es geht: https://www.herber.de/bbs/user/75442.xlsm
Nachfolgend die Codes.
Ich komme einfach nicht darauf was da der Unterschied ist ob ich Code erstmalig nach Mappenöffnung aufrufe oder dann danach nochmal denn beim zweiten mal kommt ja kein Fehler.
Ich sehe auch daß beim ersten Codeaufruf trotz Fehlermeldung in der tabelle so geändert wie gewünscht wird.
Ergo ist höchstwahrscheinlich der Fehler bei der Durchführung des zweiten Durchgangs durch die For Schleife zu suchen, aber ich seh/find da nix :-(((
Danke ^ Gruß
Reinhard
Sub test1()
Dim a As Integer
a = 1
Do
Select Case a
Case 1
With Range("E17:E517")
Set rangeSuche = .Find(What:="solia", LookIn:=xlFormulas, LookAt:=xlPart)
If Not rangeSuche Is Nothing Then
strAdresse = rangeSuche.Address
Do
rangeSuche.Value = "Tray with"
Set rangeSuche = .FindNext(rangeSuche)
Loop While Not rangeSuche Is Nothing And rangeSuche.Address  strAdresse
End If
End With
Case 2
With Range("E17:E517")
Set rangeSuche = .Find(What:="foil", LookIn:=xlFormulas, LookAt:=xlPart)
If Not rangeSuche Is Nothing Then
strAdresse = rangeSuche.Address
Do
rangeSuche.Value = "Foil with"
Set rangeSuche = .FindNext(rangeSuche)
Loop While Not rangeSuche Is Nothing And rangeSuche.Address  strAdresse
End If
End With
End Select
a = a + 1
Loop Until a > 2
End Sub
Sub test2()
Dim a As Byte, rangeSuche As Range, strAdresse As String
For a = 1 To 2
With Range("E17:E517")
Set rangeSuche = .Find(What:=IIf(a = 1, "solia", "foil"), LookIn:=xlFormulas, LookAt:= _
xlPart)
If Not rangeSuche Is Nothing Then
strAdresse = rangeSuche.Address
Do
rangeSuche.Value = IIf(a = 1, "Tray with", "Foil with")
Set rangeSuche = .FindNext(rangeSuche)
Loop While Not rangeSuche Is Nothing And rangeSuche.Address  strAdresse
End If
End With
Next a
End Sub

3
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: Code funktioniert erst ab dem zweiten Aufruf
25.06.2011 01:23:40
Nepumuk
Hallo,
um den Fehler auszulösen muss in Spalte E wenigstens einmal "solia" vorkommen. Du suchst im 1. Durchgang nach diesem Wert und änderst ihn in "Tray with" sind alle "solia"-Werte geändert findet natürlich FindNext diesen Wert nicht mehr und setzt rangeSuche auf Nothing. Im Loop:
Loop While Not rangeSuche Is Nothing And rangeSuche.Address strAdresse
versuchst du die Address-Eigenschaft eines Range-Objektes abzufragen welches keinen Range (Nothing) enthält. Das löst den Fehler aus.
Beim Wert "foil" passiert das nicht da dieser ja in "Foil with" geändert wird, also das Wort "foil" immer noch enthält. Da wird irgendwann die Bedingung "rangeSuche.Address strAdresse" False und die Schleife verlassen.
Du musst bei der Find-Methode daher aufpassen. Wird der gesuchte Wert so geändert das er von der Methode nicht mehr gefunden werden kann, muss die Abbruchsbedingung so lauten:
Loop Until rangeSuche Is Nothing
Wird er zwar geändert, aber wird immer noch gefunden da der ursprünglich gesuchte Wert immer noch enthalten ist (natürlich nur bei LookAt:=xlPart) dann muss die Abbruchsbedingung so lauten:
Loop Until rangeSuche.Address = strAdresse
Die Kombination aus beiden macht keinen Sinn da im ersten Fall keine Adresse mehr abgefragt werden kann, im zweiten Fall weil das Objekt nie Nothing wird.
Jetzt klar?
Deine Kombination (test2) ist daher tötlich. Die erste Prozedur (test1) ist in dem Fall besser, nur die Abbruchsbedingung der 2. Do-Loop Schleife muss geändert werden.
Wie du siehst benutze ich an Stelle von While Until da der Vergleich mit = schneller ist als der Verleich mit .
Gruß
Nepumuk
Anzeige
AW: Code funktioniert erst ab dem zweiten Aufruf
25.06.2011 02:27:01
Reinhard
Hallo Nepumuk,
como siempre bedanke ich mich :-)
Entsprechende Codeabänderung bekomme ich hin jetzt wo ich weiß auf was ich achten muß.
Gruß
Reinhard
AW: Code funktioniert erst ab dem zweiten Aufruf
25.06.2011 10:31:12
Nepumuk
Hallo Reinhard,
ich würde innerhalb eines Find-Findnext keine Werte ändern, sondern die Adressen sammeln und diese dann auf einen Schlag ändern. Hab ich gestern vergessen zu schreiben. War auch schon spät.
Gruß
Nepumuk

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige