VBA - Function Do While Loop Error #91

Zalatschenko

Cadet 2nd Year
Registriert
Dez. 2019
Beiträge
24
Hallo zusammen

Ich komme trotz Google nicht mehr weiter....
Ich bekomme den Error 91 in eine Do While Schlaufe. Ich habe jedoch alle Variabeln klar deffiniert zu beginn.

Ausgeführt wird über einen Sub gestartet welcher einen Namen sowie die Persöhnliche Spalte auf mitübergibt.
Danach soll folgende Funktionen ausgeführt werden.

Code:
Sub CREATE_PRIV_TAB(PName As String)
        Dim test As Boolean
        Dim d As Integer
        Dim Number As Integer
        Dim b As Integer
        Dim c As Integer
        Dim i As Integer
        Dim i2 As Integer
        Dim WERT2 As String
        Dim Wert3 As String
        Dim WERT As String
        Dim NextRow As String
        Dim SPALTE_PERSON As Integer
        'd = Tabelle11.Range([TechnPlatzBezeichng                     ]).End(xlUp).Row
        WERT = "TEST"
        SPALTE_PERSON = CInt(PERS_ZU_NUMM(PName))
        d = 10
        test = ERSTELLEN_DER_PERSONEN(SPALTE_PERSON, PName)
End Sub

Function ERSTELLEN_DER_PERSONEN(SPALTE_PERSON As Integer, PName As String) As Boolean
    ' DEFFINIERUNG DER VARIABELN
    Dim test As Boolean
    Dim i As Integer
    Dim i2 As Integer
    Dim d As Integer
    Dim WERT As String
    Dim SPALTE_P As Integer
    
    ' DEFFINIEREN DER STARTVARIABELN
    i = 2
    d = 11
    WERT = "go"
    SPALTE_P = SPALTE_PERSON
        
    ' FUNKTION
    Do Until i >= d
    WERT = Tabelle3.Cells(i, SPALTE_P).Value
    If Not WERT = "" Then
        test = SUCHEN_GESAMT(WERT, PName)
    End If
    i = i + 1
    Loop
    ERSTELLEN_DER_PERSONEN = True
End Function


Function SUCHEN_GESAMT(WERT As String, PName As String) As Boolean
            ' DEFFINIERUNG DER VARIABELN
            Dim test As Boolean
            Dim SUCH_GRUND As Variant
            Dim SUCHEN_WAS As String
            Dim i2 As Integer
            Dim firstAddress2 As String
            Dim SPALTETECH As Integer
            
            ' DEFFINIEREN DER STARTVARIABELN

            
            ' FUNKTION
            With Tabelle4.Columns(2)
            Set SUCH_GRUND = .Find(What:=WERT, LookIn:=xlValues) ', LookAt:=xlWhole
            If Not SUCH_GRUND Is Nothing Then
            firstAddress2 = SUCH_GRUND.Address
                Do
                    i2 = CInt(SUCH_GRUND.Row)
                    SUCHEN_WAS = Tabelle4.Cells(i2, 1).Value
                    ' MsgBox (SUCHEN_WAS)
                    test = SUCHEN_EINZELN(SUCHEN_WAS, PName)
                    Set SUCH_GRUND = .FindNext(after:=SUCH_GRUND)
                    ' MsgBox (CStr(SUCH_GRUND.Address))
                Loop While Not SUCH_GRUND Is Nothing And SUCH_GRUND.Address <> firstAddress2
            End If
            End With
            SUCHEN_GESAMT = True
End Function



Function SUCHEN_EINZELN(SUCHEN_WAS As String, Optional PName As String) As Boolean
    Dim test As Boolean
    Dim c As Integer
    Dim SPALTENBEREICH As Range
    Dim firstAddress3 As String
    With Tabelle11.Columns(5)
    Set SEARCH2 = .Find(What:=SUCHEN_WAS, LookIn:=xlValues, LookAt:=xlWhole)
                    If Not SEARCH2 Is Nothing Then
                    firstAddress3 = SEARCH2.Address
                    Do
                        c = SEARCH2.Row
                        ' MsgBox (c)
                        test = KOPIEREN_DER_SPALTEN(c, PName)
                        Set SEARCH2 = .FindNext(after:=SEARCH2)
                        
                        ' If SEARCH2 Is Nothing Then Exit Do
                    Loop While Not SEARCH2 Is Nothing And SEARCH2.Address <> firstAddress3
                    End If
                    End With
                    SUCHEN_EINZELN = True
End Function


Function KOPIEREN_DER_SPALTEN(c As Integer, PName As String) As Boolean
                        NextRow = Sheets(PName).Range("B" & Rows.Count).End(xlUp).Row + 1
                        Tabelle11.Rows(c).Copy Destination:=Sheets(PName).Rows(NextRow)
End Function

Dieser Loop im Loop im Loop läuft einmalig fehlerfrei ab. Ich konnte auch die einzelnen Funktionen über Message Boxen testen und es scheint auch alles zu funktionieren (bis auf den folgenden Teil).

Das ganze schlägt nach dem ersten Durchlauf fehl und dies in folgender Funktion:

Code:
Function SUCHEN_GESAMT(WERT As String, PName As String) As Boolean
            ' DEFFINIERUNG DER VARIABELN
            Dim test As Boolean
            Dim SUCH_GRUND As Variant
            Dim SUCHEN_WAS As String
            Dim i2 As Integer
            Dim firstAddress2 As String
            Dim SPALTETECH As Integer
            
            ' DEFFINIEREN DER STARTVARIABELN

            
            ' FUNKTION
            With Tabelle4.Columns(2)
            Set SUCH_GRUND = .Find(What:=WERT, LookIn:=xlValues) ', LookAt:=xlWhole
            If Not SUCH_GRUND Is Nothing Then
            firstAddress2 = SUCH_GRUND.Address
                Do
                    i2 = CInt(SUCH_GRUND.Row)
                    SUCHEN_WAS = Tabelle4.Cells(i2, 1).Value
                    ' MsgBox (SUCHEN_WAS)
                    test = SUCHEN_EINZELN(SUCHEN_WAS, PName)
                    Set SUCH_GRUND = .FindNext(after:=SUCH_GRUND)
                    ' MsgBox (CStr(SUCH_GRUND.Address))
                Loop While Not SUCH_GRUND Is Nothing And SUCH_GRUND.Address <> firstAddress2
            End If
            End With
            SUCHEN_GESAMT = True
End Function

Code:
 Loop While Not SUCH_GRUND Is Nothing And SUCH_GRUND.Address <> firstAddress2
Diese Zeile ist Markiert.
Der Fehlercode ist #91 Object-Variabel oder With- Blockvariabel nicht deffiniert. Jedoch habe ich meiner Meinung nach alles deffiniert. Ebenfalls ist der SUCH_GRUND Leer obwohl er weitere ergebnisse finden sollte.
Ich versteh aber nicht wieso. Alle Variabeln sind deffiniert. Die anderen Loops funktionieren ohne Probleme. Wieso also nicht der. Er ist genau gleich.....

Hoffe jemand sieht was ich falsch mache.

Danke schon im vorraus.
 
Bist du dir bei Zeile 22 sicher, dass da so korrekt ist und er auch etwas findet?

Code:
Set SUCH_GRUND = .FindNext(after:=SUCH_GRUND)

Kannst du ansonsten ein Minimal-Beispiel mal hochladen?
 
Die Funktion ist ja schlussentlich dass eine neues Blatt generiert wird in welchem alle zugewiesenen Daten gesammelt werden.

SUCHEN_GESAMT wird gefunden. Anschliessend werden auch alle spalten unter SEARCH2 gefunden.
Diese werden kopiert.
In dem moment wo der SEARCH 2 Loop beendet wird kommt der ERROR. Da nicht der äusserste oder innerste Loop den Fehler aufweist bzw. zurückmeldet. Gehe ich davon aus dass nicht der Loop ansich sondern nur dieser eine Fehlerhaft ist.

Das mit der Beispielsdatei ist so eine Sache. Da ich die Daten Faken müsste bedeutet das relativ viel aufwand. Die 2 Funktionen welche ich nicht hier reingestellt habe sind jedoch einzig zur rückmeldung einer Spaltennummer in der Config Tabelle.

Ablauf:
Name der Person generiert neue Tabelle
Sucht nach den Aufgabenfeldern der Person
Sucht in der Übersichtstabelle die untergruppen der Aufgabengebiete
Sucht in der Hauptübersicht nach den Untergruppen.
Jede gefundene Untergruppenspalte wird in die neue Tabelle kopiert.
Je nach hinterlegten Daten sind das mehr oder weniger objekte.


Über weitere Eingabeobjekte können Standort, Arbeitsplätze und Gruppen deffiniert werden.

Das ganze soll möglichst adaptiv auf diverse SAP exporte sein, desswegen die vielen Variabeln.

PS:
Bei Zeile 15 habe ich schon beides probiert:
Code:
Set SUCH_GRUND = .Find(What:=WERT, LookIn:=xlValues) ', LookAt:=xlWhole
Code:
Set SUCH_GRUND = .Find(What:=WERT, LookIn:=xlValues, LookAt:=xlWhole)
Dies ist natürlich ein unterschied zum letzten Loop. Ist aber leider nicht der Grund.
 
Zuletzt bearbeitet:
Sry, ich seh keinen Fehler ...
Ich wuerde jetzt schrittweise durchgehen, um zu schauen, wann SUCH_GRUND nicht mehr definiert ist.
 
Der Fehler tritt direkt nach dem ersten SUCH_GRUND auf so wie ich das sehe wird nachdem findnext kein wert in SUCH_GRUND geschrieben. Die Variabel enthält in diesem moment nothing. Dies dürfte aber ja auch kein problem sein da der loop ja in diesem moment sich selbst beenden sollte (while not SUCH_GRUND isnothing). Ich habe aber gehofft dass es ein anderer fehler ist da ja auch error 91 und nicht 1004 oder so kommt. Bei 1004 wäre ja im loop die falschen variableln verwemdet...
 
Ohne diesen Code zu testen und ohne Nachschauen, würde ich sagen es liegt and deiner Abbruchbedingung, oder besser Bedingungen.

Loop While Not SUCH_GRUND Is Nothing And SUCH_GRUND.Address <> firstAddress2

In VBA gibt es kein Conditional AND. Das heist, dass IMMER beide Bedingungen geprüft werden. Also selbst wenn SUCH_GRUND Nothing ist, wird nochmal geschaut ob .Addresse <> firstAddress2 ist. Vielleicht musst du hier ein extra Absprung einbauen. Ist nicht schön, aber könnte funktionieren.

Sowas wie: If SUCH_GRUND IsNothing then Exit Do
 
Das mit dem abbruchkriterium funktioniert. Jedoch wird dadurch nur ein wert gefunden...
Wenn ich denn loop nur mit einer message box lauffen lasse läuft er auch ohne extra absprung komplett durch auch in den unteren loops desshalb hab ich ihn wieder rausgenommen.
Ist der aufbau wie ich ihn mach corupt durch die aufrufe oder irgend was so?
 
Zurück
Oben