Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

ARRAY schnell durchsuchen

Forumthread: ARRAY schnell durchsuchen

ARRAY schnell durchsuchen
23.05.2003 11:21:42
Dietmar
Hi

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

Anzeige

17
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Re: ARRAY schnell durchsuchen
23.05.2003 11:25:20
Umbratus

Hallo 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

Re: ARRAY schnell durchsuchen
23.05.2003 11:38:38
Dietmar

Hi Umbratus
Hier z.B.: in verküzter Form mein Code

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

Anzeige
Re: ARRAY schnell durchsuchen
23.05.2003 11:50:32
Umbratus

Hmm, ich glaub net, das die Funktion Application.Match schneller is, als deine Schleife. Die Funktion kann ja auch nur die Tabelle Zelle für Zelle durchsuchen.

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.



Anzeige
Re: ARRAY schnell durchsuchen
23.05.2003 11:55:25
Dietmar

Ich habe es mit einer einspaltigen ARRAY probiert und es schien als wäre der andere Code deutlich schneller.

Gruß Dietmar
PS fals ich noch was finde werde ich es hier posten.

Re: ARRAY schnell durchsuchen
23.05.2003 12:06:53
Nepumuk

Hallo Dietmar,
und warum machst du das nicht mit der Find - Anweisung?
Gruß
Nepumuk

Anzeige
Re: ARRAY schnell durchsuchen
23.05.2003 12:17:37
Dietmar

kannst du mir eventuell ein Beispiel Code posten

Gruß Dietmar

Re: ARRAY schnell durchsuchen
23.05.2003 12:34:35
Nepumuk

Hallo Dietmar,
das Programm durchsucht die Splate B Von Zeile 1 bis zur Zeile in der der letzte Eintrag steht. Es werden nur genaue Übereinstimmungen gezählt sowie Groß- und Kleinschreibung beachtet. Das kannst du in den Parameter der Find-Methode einstellen.

Gruß
Nepumuk

Anzeige
Re: ARRAY schnell durchsuchen
23.05.2003 12:46:04
Dietmar

Hi Nepumuk

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

Re: ARRAY schnell durchsuchen
23.05.2003 13:06:54
Nepumuk

Hallo Dietmar,
das kommt davon, dass viele von Array sprechen, wenn sie einen Bereich in der Tabelle meinen. Also, wenn du ein echtes Array durchsuchen willst, gibt es mehrere Möglichkeiten. Da brauche ich aber noch ein paar Angaben. Wie viele Dimensionen hat das Array und sind die Daten darin sortiert, wenn ja in welcher Reihenfolge? Können Daten im Array doppelt vorkommen? Wird das Arrray nur einmal durchsucht, oder laufen mehrere Suchläufe darin nacheinander ab?
Gruß
Nepumuk


Anzeige
Re: ARRAY schnell durchsuchen
23.05.2003 13:23:47
Dietmar

zu
1. dies ist das ARRAY Array(3, maxZeilen)
2. nein die daten sind unsortiert
3. Spalte (1) kommen die daten wiederholt vor
Spalte (2) sind die daten nur einmal vorhanden diese soll auch durchsucht werden
Spalte (4) kommen die daten wiederholt vor
4. es sind mehrere Suchläufe (es können schonmal 200 sein)
ausdiesem grund ist mir auch die ARRAY mit einer Schleife zudurchsuchen zulangsam.

Gruß Dietmar

Anzeige
Re: ARRAY schnell durchsuchen
23.05.2003 14:20:08
Nepumuk

Hallo Dietmar,
du hast im Programm die Option Base nicht auf eins gestellt. D.h. die Spalte 1 hat den Spaltenindex 0 oder?
Ist maxZeilen eine als Public deklarierte Variable?
Gruß
Nepumuk

Re: ARRAY schnell durchsuchen
23.05.2003 14:46:12
Dietmar

Was ist die Option Base ??
maxZeilen ist ein Variable

Gruß Dietmar

Anzeige
Re: ARRAY schnell durchsuchen
23.05.2003 14:53:48
Nepumuk

Hallo Dietmar,
kannst du den Code mal an meine Adresse schicken, damit ich mir das genauer anschauen kann? Es brauchen keine Daten in der Tabelle sein.
Gruß
Nepumuk

Re: ARRAY schnell durchsuchen
23.05.2003 15:16:58
Dietmar

An Nepumuk
ich muß jetzt leider los,
hier noch die komplette SUB um die es geht. (Bin Montag wieder hier)
die TEST.xls ist diese Datei
in der WGT.txt sind Artikel Bez. + Nr + WGT
die TRAN*.*" sind sogenannte Transportbelege beinhaltet nur eine Artikel Nr und Kundendaten
Produkt.dat hier sollen die Daten gespeichertwerden


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)

Anzeige
Re: ARRAY schnell durchsuchen
23.05.2003 16:15:46
Nepumuk

Hallo Dietmar,
jetzt weiß ich zumindest wo maxZeilen herkommt und das Array heißt anscheinend WGT_Array aber das hat nur drei Spalten. Du hast geschrieben: "Spalte (4) kommen die daten wiederholt vor".
Was nun?
Gruß
Nepumuk
P.S.: Kann aber erst Montag nachmittag.

Re: ARRAY schnell durchsuchen
27.05.2003 08:02:04
Dietmar

Hi Nepumuk
Sorry konnte gestern leider nicht
und nochmal sorry habe mich wohl verschrieben meinte Spalte 3 und nicht Spalte 4

Gruß dietmar

Anzeige
Re: ARRAY schnell durchsuchen
27.05.2003 16:13:25
Nepumuk

Hallo Dietmar,
das Programm soll wie ich mich erinnere nach Bestellnummern suchen. Sind das nummerische Werte?
Gruß
Nepumuk

;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige

Infobox / Tutorial

ARRAY effizient durchsuchen mit VBA


Schritt-für-Schritt-Anleitung

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:

  1. 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
  2. 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
  3. 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.


Häufige Fehler und Lösungen

Fehler: Laufzeitfehler 424

  • Dieser Fehler tritt häufig auf, wenn die 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.


Alternative Methoden

Wenn die Verwendung einer Schleife zu langsam ist, gibt es einige alternative Methoden:

  1. Sortieren des Arrays: Wenn das Array sortiert ist, kannst du eine binäre Suche implementieren, um die Suche zu beschleunigen.

  2. 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

Praktische Beispiele

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

Tipps für Profis

  • Verwende die Option Base Anweisung, um den Startindex deines Arrays zu definieren.
  • Bei mehrfachen Suchläufen in großen Arrays kann das Vorverarbeiten und Speichern der Suchergebnisse in einem Dictionary die Effizienz steigern.
  • Achte darauf, dass die Datenstruktur deines Arrays optimal ist, um die Suche zu verbessern.

FAQ: Häufige Fragen

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.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige