Wie kann ich ein ARRAY mit "drei" Spalten schnell nach einem Wert durch suchen?
Zuzeit wird es Zeile für Zeile (mit einer FOR NEXT Schleife) durchsucht, dies dauert aber sehr lange.
Gruß und Dank an alle
Dietmar
Wie kann ich ein ARRAY mit "drei" Spalten schnell nach einem Wert durch suchen?
Zuzeit wird es Zeile für Zeile (mit einer FOR NEXT Schleife) durchsucht, dies dauert aber sehr lange.
Gruß und Dank an alle
Dietmar
grundsätzlich merkt man keinen Unterschied, ob es jetzt ne gezählte, ne Kopf- oder ne Fußgesteuerte Schleife is.
Poste mal den Code, dann wird sich zeigen, ob man was dran optimieren kann.
Grüßli
For w = 1 To 500
If Array(2, w) = "Irgendwas" Then
MsgBox "An " & w & " .Stelle gefunden"
Exit For
Next w
Ich würde gern folgenden Code gern verwenden, aber dieser scheint nur bei einem einspaltingem ARRAY zufunktionieren
Sub Durchsuchen()
Dim arrBereich As Variant
Dim intRow As Integer
arrBereich = Range("A1:A16")
On Error Resume Next
intRow = Application.Match("Irgendwas", arrBereich, 0)
If Err > 0 Then
MsgBox "Nicht gefunden"
Else
MsgBox "An " & intRow & " .Stelle gefunden"
End If
End Sub
Gruß Dietmar
Das wird nicht schneller gehen, es sei denn, du sortierst die Tabelle in einer Form, das du an je nach Suchwert den Bereich der durchforstet wird einschränkst.
Ansonsten seh ich keine Möglichkeit.
Gruß Dietmar
PS fals ich noch was finde werde ich es hier posten.
Gruß Dietmar
dein Code habe ich probiert er funktioniert im Sheet gut aber wenn ich ihn bei einem ARRAY anwende, kommt ein Laufzeit Fehler (424) in der Zeile "Set zellen = .FIND ...."
Gruß Dietmar
Gruß Dietmar
Gruß Dietmar
Sub TestCreateFile()
Dim iFile As Integer, iCounter As Integer
Dim sFileA As String 'für WGT ARRAY
Dim sFileB As String
Dim sFile As String, sTxt As String
Dim WGTOK As Boolean
XLSDatei = "TEST.xls"
Ordner = CODESRV & "\went-trans$\"
Extension = "TRAN*.*"
dName = Dir(Ordner & Extension)
iFile = FreeFile
sFileA = "S:\WGT.txt"
maxZeilen = 0
Zeile = 1
Open sFileA For Input As iFile
Do Until EOF(iFile)
Line Input #iFile, sTxt
maxZeilen = maxZeilen + 1
Loop
Close
iFile = FreeFile
Open sFileA For Input As iFile
ReDim WGT_Array(3, maxZeilen)
Do Until EOF(iFile)
Line Input #iFile, sTxt
WGT_Array(1, WGT_Zeilen) = CStr(Left(sTxt, 3)) 'WGT
WGT_Array(2, WGT_Zeilen) = CStr(Mid(sTxt, 5, 6)) 'BestellNr
WGT_Array(3, WGT_Zeilen) = CStr(Right(sTxt, Len(sTxt) - 11)) 'Bezeichnung
WGT_Zeilen = WGT_Zeilen + 1
Loop
Close
iCounter = 1
iFile = FreeFile
sFile = Application.Path & "\Produkt.dat"
Open sFile For Output As iFile
Do While dName <> ""
n = n + 1
If dName = Workbooks(XLSDatei).Sheets("TRANS-Dateien").Range("A" & n) Then GoTo Weiter
sFileB = Ordner & dName
AnzahlTrans = 0
Zeile = 1
Open sFileB For Input As iFile + 1
Do Until EOF(iFile + 1)
Line Input #iFile + 1, sTxt
AnzahlTrans = AnzahlTrans + 1
Loop
Close iFile + 1
Open sFileB For Input As iFile + 1
Do Until EOF(iFile + 1)
Line Input #iFile + 1, sTxt
'Zähler = 4 +1
'Gedruckt = 1 +1
'Dateiname = 20 +1 dName
'Datum = 10 +1 CStr(Mid(sTxt, 62, 10))
' = 3 +1 CStr(Mid(sTxt, 46, 3))
'TRANS ID = 12 CStr(Mid(sTxt, 12, 12))
'BestellNr. = 6 +1 CStr(Mid(sTxt, 24, 6))
'WGT = 3 +1
'Bezeichn. = offen
'Auftrag ID CStr(Mid(sTxt, 49, 13)) nichtverwendet
For Zeile = 1 To AnzahlTrans
WGTOK = False
x = iCounter
For w = 2 To WGT_Zeilen - 1
If WGT_Array(2, w) = CStr(Mid(sTxt, 24, 6)) Then
Print #iFile, iCounter & Space(4 - Len(x)) & "0" & Space(1) & dName & Space(1) & _
CStr(Mid(sTxt, 62, 10)) & Space(1) & _
CStr(Mid(sTxt, 46, 3)) & Space(1) & _
CStr(Mid(sTxt, 12, 12)) & Space(1) & _
CStr(Mid(sTxt, 24, 6)) & Space(1) & _
WGT_Array(1, w) & Space(1) & WGT_Array(3, w)
WGTOK = True
Exit For
End If
Next w
If WGTOK = False Then
Print #iFile, iCounter & Space(4 - Len(x)) & "0" & Space(1) & dName & Space(1) & _
CStr(Mid(sTxt, 62, 10)) & Space(1) & _
CStr(Mid(sTxt, 46, 3)) & Space(1) & _
CStr(Mid(sTxt, 12, 12)) & Space(1) & _
CStr(Mid(sTxt, 24, 6)) & Space(1)
End If
iCounter = iCounter + 1
Next Zeile
Schliessen:
Loop
Close iFile + 1
Weiter:
dName = Dir()
'Call refreshPB
Loop
Close iFile
Workbooks.OpenText _
Filename:=sFile, _
DataType:=xlDelimited, _
Tab:=False, _
semicolon:=False, _
comma:=False, _
Space:=False, _
other:=False
MsgBox "Weiter"
ActiveWorkbook.Close savechanges:=False
End Sub
Gruß Dietmar
PS (Bin Montag wieder hier)
Gruß dietmar
Um ein Array in VBA effizient nach einem Wert zu durchsuchen, kannst du die Find
-Methode oder eine optimierte Schleife verwenden. Hier ist eine einfache Schritt-für-Schritt-Anleitung:
Definiere das Array: Zunächst musst du das Array deklarieren und mit Werten füllen.
Dim WGT_Array(1 To 3, 1 To maxZeilen) As Variant
' Fülle das Array mit Werten
Nutze eine Schleife oder die Find
-Methode: Wenn du ein mehrdimensionales Array hast, kannst du eine Schleife verwenden, um durch die Werte zu iterieren.
Dim w As Integer
For w = 1 To maxZeilen
If WGT_Array(2, w) = "Irgendwas" Then
MsgBox "An " & w & " .Stelle gefunden"
Exit For
End If
Next w
Anwenden von Find
: Wenn du die Find
-Methode verwenden möchtest, stelle sicher, dass du sie auf einem Bereich anwendest, nicht auf einem Array. Die Find
-Methode funktioniert nicht direkt mit Arrays.
Fehler: Laufzeitfehler 424
Find
-Methode direkt auf ein Array angewendet wird. Stelle sicher, dass du die Find
-Methode auf einen Range-Objekt anwendest.Lösung:
Verwende Find
nur bei Zellbereichen, nicht bei Arrays. Für Arrays nutze Schleifen, um Werte zu vergleichen.
Wenn die Verwendung einer Schleife zu langsam ist, gibt es einige alternative Methoden:
Sortieren des Arrays: Wenn das Array sortiert ist, kannst du eine binäre Suche implementieren, um die Suche zu beschleunigen.
Dictionary-Objekt verwenden: Du kannst ein Dictionary verwenden, um Werte schneller zu finden. Das Dictionary ermöglicht eine O(1) Suche.
Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")
' Fülle das Dictionary mit Werten aus dem Array
Hier ein kurzes Beispiel, wie du ein Array mit drei Spalten nach einem bestimmten Wert durchsuchen kannst:
Sub ArrayDurchsuchen()
Dim WGT_Array(1 To 3, 1 To 5) As Variant
Dim i As Integer
' Beispielwerte ins Array einfügen
WGT_Array(1, 1) = "A"
WGT_Array(2, 1) = "Irgendwas"
WGT_Array(1, 2) = "B"
WGT_Array(2, 2) = "Etwas"
WGT_Array(1, 3) = "C"
WGT_Array(2, 3) = "Irgendwas"
' Nach dem Wert "Irgendwas" suchen
For i = 1 To 5
If WGT_Array(2, i) = "Irgendwas" Then
MsgBox "Gefunden in Zeile: " & i
End If
Next i
End Sub
Option Base
Anweisung, um den Startindex deines Arrays zu definieren.1. Wie kann ich ein mehrdimensionales Array in VBA durchsuchen? Verwende eine Schleife, um durch die Dimensionen des Arrays zu iterieren und die gewünschten Werte zu vergleichen.
2. Was ist der Unterschied zwischen Find
und Schleifen in VBA?
Die Find
-Methode ist schneller für Zellen, während Schleifen effektiver für Arrays sind.
3. Kann ich ein Array mit Find
durchsuchen?
Nein, die Find
-Methode funktioniert nur mit Range-Objekten, nicht mit Arrays.
4. Wie kann ich die Suche in einem Array beschleunigen? Sortiere das Array oder verwende ein Dictionary, um die Suche effizienter zu gestalten.
Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden
Suche nach den besten AntwortenEntdecke unsere meistgeklickten Beiträge in der Google Suche
Top 100 Threads jetzt ansehen