Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
504to508
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
504to508
504to508
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Verschachtelte Suche funktioniert nicht ?!?!?

Verschachtelte Suche funktioniert nicht ?!?!?
23.10.2004 17:03:21
otto-mueller
Hallo allerseits,
ich habe folgendes Anliegen:
Ich habe 3 Tabellen
- Alt
- Neu
- Alt-Neu
In der Tabelle Alt sind alte Produktnummern mit zugeordneten MaterialNr. + Menge des Materials
In der Tabelle Neu sind alte Produktnummern, die durch neue ProdNr aus der Tabelle "Alt-Neu" zugeordnet werden.
Dazu habe ich einen

Sub und eine Function.
Die Funktion ist die Suchfunktion.
Die Suchfunktion wird innerhalb einer anderen Suchfunktions aufgerufen. Sobald die innere Suchfunktion ausgeführt ist und die äußere Suchfunktion für die nächste Suche initialisiert wird, bekomme ich Fehlermeldung 91, "Objektvariable oder With-Blockvariable nicht festgelegt"
Wenn ich die innere Suchfunktion auskommentiere, dann gehts ?!?!?
Hat jemand eine Idee, woran es liegen könnte?
Die Datei findet Ihr hier
<a href="https://www.herber.de/bbs/user/12564.zip">https://www.herber.de/bbs/user/12564.zip</a>
Und hier mein Code:

Sub Konvert()
Dim tbl1 As Worksheet
Dim tbl2 As Worksheet
Dim tbl3 As Worksheet
Set tbl1 = Worksheets("Neu")
Set tbl2 = Worksheets("Alt")
Set tbl3 = Worksheets("Alt-Neu")
'Vars für Produkte
Const tbl1ProdCol = 1
Dim Prod As String
Dim ProdNrNeu As String
Dim ProdNrFind As Range
Dim ProdNrFindRow As Integer
Dim ProdNrFirstAddress As String
'Vars für Materialien
Dim MatNr As String
Dim MatNrSuche As String
Dim Menge As Double
'Vars in Tabelle1
Dim tbl1MatNr  As Integer
Dim tbl1MengeCol As Integer
tbl1MatNr = 2    'B
tbl1MengeCol = 3 'C
'Const in Tabelle2
Const tbl2ProdCol = 1
Const tbl2MatNrCol = 2
Const tbl2MengeCol = 3
Const tbl3ProdNrAltCol = 1 'A
Const tbl3ProdNrNeuCol = 2 'B
Const fDataRow = 9
lDataRow = tbl1.Cells(65536, tbl1ProdCol).End(xlUp).Row
For r = fDataRow To lDataRow
ProdNr = tbl1.Cells(r, tbl1ProdCol)
With tbl2.Columns(tbl2ProdCol)
.EntireColumn.Hidden = False
Set ProdNrFind = .Find(ProdNr, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows)
If Not ProdNrFind Is Nothing Then
ProdNrFirstAddress = ProdNrFind.Address
Do
ProdNrFindRow = ProdNrFind.Row
MatNr = tbl2.Cells(ProdNrFindRow, tbl2MatNrCol)
MatNrSuche = Suche(MatNr, tbl3, tbl3ProdNrAltCol, tbl3ProdNrNeuCol)
If MatNrSuche <> "" Then
MatNr = MatNrSuche
Menge = tbl2.Cells(ProdNrFindRow, tbl2MengeCol)
With tbl1
.Cells(r, tbl1MatNr) = MatNr
.Cells(r, tbl1MengeCol) = Menge
End With
tbl1MatNr = tbl1MatNr + 5
tbl1MengeCol = tbl1MengeCol + 5
End If
'Hier kommt es zum beschriebenen Problem
Set ProdNrFind = tbl2.Columns(tbl2ProdCol).FindNext(ProdNrFind)
Loop While Not ProdNrFind Is Nothing And ProdNrFirstAddress <> ProdNrFind.Address
ProdNrNeu = Suche(Prod, tbl3, tbl3ProdNrAltCol, tbl3ProdNrNeuCol)
If ProdNrNeu <> "" Then
tbl1.Cells(r, tbl1ProdCol + 0) = ProdNrNeu
End If
End If
End With
tbl1MatNr = 2    'B
tbl1MengeCol = 3 'C
Next
End Sub


Function Suche(Key As String, Wks As Worksheet, SearchCol As Integer, OutputCol As Integer)
Dim KeyFind As Range
Dim KeyFindRow As Integer
With Wks.Columns(SearchCol)
.EntireColumn.Hidden = False
Set KeyFind = .Find(Key, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows)
If Not KeyFind Is Nothing Then
KeyFindRow = KeyFind.Row
Key = Wks.Cells(KeyFindRow, OutputCol)
Suche = Key
End If
End With
End Function

-------------------------------------------------------------------------
Ich habe es jetzt vorläufig mit einer Do Loop Schleife statt der innere Suchfunktion gelöst, aber würde mich trotzdem intresserien, woran es liegt.
Danke vielmals vorab
Viele Grüße
Otto

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Verschachtelte Suche funktioniert nicht ?!?!?
23.10.2004 17:49:45
Nepumuk
Hallo Otto,
weil du durch das anwenden einer zweiten Find - Methode die Bezüge der ersten zu ihren Parametern zerstörst. Du müsstest also die Suche jedes mal neu aufsetzen und als zusätzlichen Parameter After:=ProdNrFind einführen. damit das beim ersten mal nicht zu einem Fehler führt, weist du vor beginn der Schleife der Objektvariablen ProdNrFind in einer Set - Anweisung die letzte Zelle deines Suchbereichs zu. Für die zweite Find - Methode benötigst du deshalb eine zusätzliche Objektvariable. Soll ich mal ein einfaches Beispiel machen?
Gruß
Nepumuk
AW: Verschachtelte Suche funktioniert nicht ?!?!?
23.10.2004 17:57:56
otto-mueller
Hallo Nepumuk,
danke dir erstmal für die schnelle Hilfe.
Wenn du ein kleines Beispiel - also nichts aufwendieges hast - gerne.
Danke nochmal
Gruß
Otto
Anzeige
AW: Verschachtelte Suche funktioniert nicht ?!?!?
23.10.2004 18:11:15
otto-mueller
Hallo Nepumuk,
vielen vielen Dank.
Nach deiner Anleitung habe ich es gelöst:
'Set ProdNrFind = tbl2.Columns(tbl2ProdCol).FindNext(ProdNrFind)
'Ersetzt durch:
Set ProdNrFind = .Find(ProdNr, After:=ProdNrFind, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows)
"Für die zweite Find - Methode benötigst du deshalb eine zusätzliche Objektvariable."
Es geht auch ohne zusätzliche Variable.
Viele Grüße
Otto
AW: Verschachtelte Suche funktioniert nicht ?!?!?
23.10.2004 18:38:49
Nepumuk
Hallo Otto,
ich denke, das du damit böse Überraschungen erleben kannst, da die Variable auf ein Objekt in einer anderen Tabelle verweist. So lange es nur eine Fundstelle gibt, kann das klappen. Wenn es aber mehrere sind, dann werden sicher nicht alle gefunden. Bleib lieber auf der sicheren Seite und trenne die Variablen.


Public Sub OTTO_Beispiel()
    Dim myRange1 As Range, myRange2 As Range
    Dim strAddress1 As String, strAddress2 As String
    Dim intIndex As Integer
    For intIndex = 1 To 10
        Set myRange1 = Worksheets(1).Columns(1).Find(What:=intIndex, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows)
        If Not myRange1 Is Nothing Then
            strAddress1 = myRange1.Address
            Do
                Set myRange2 = Worksheets(2).Columns(1).Find(What:=intIndex, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows)
                If Not myRange2 Is Nothing Then
                    strAddress2 = myRange2.Address
                    Do
'                        Code für Schleife 2
    
                        Set myRange2 = Worksheets(2).Columns(1).FindNext(myRange2)
                    Loop While Not myRange2 Is Nothing And strAddress2 <> myRange2.Address
                End If
                
'                hier kommt an Stelle von Findnext eine neue Find - Methode.
                Set myRange1 = Worksheets(1).Columns(1).Find(What:=intIndex, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, After:=myRange1)
            Loop While Not myRange1 Is Nothing And strAddress1 <> myRange1.Address
        End If
    Next
End Sub


Gruß
Nepumuk
Anzeige
AW: Verschachtelte Suche funktioniert nicht ?!?!?
23.10.2004 19:38:02
otto-mueller
Hallo Nepumuk,
herzlichen Dank für den Code.
Da hast du wieder recht ;-)
Aber jetzt sehe ich, daß ich es eigentlich auch getrennte Vars habe, ProdNrFind und KeyFind.
Damit sollte es doch getan sein oder übersehe ich was?
Danke nochmal und Gruß
Otto
AW: Verschachtelte Suche funktioniert nicht ?!?!?
23.10.2004 19:46:50
Nepumuk
Hallo Otto,
das soll nur ein Beispiel sein, wie verschachtelte Find - Methoden fehlerfrei funktionieren. Das musst du dir schon auf deine Bedürfnisse anpassen. Wenn ich deinen Code so ansehe, dann bin ich auch zuversichtlich, dass du das schaffst.
Userbild
Gruß
Nepumuk
Anzeige
Thema erfolgreich abgeschlossen
23.10.2004 22:57:13
otto-mueller
Hallo Nepumuk,
vielen Dank für das Kompliment. Muß aber dennoch ab und an die Hilfe solcher Profis wie du in Anspruch nehmen ;-)
Nochmal ganz herzlichen Dank
Gruß
Otto

157 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige