Microsoft Excel

Herbers Excel/VBA-Archiv

Begriff in mehrdimensionalem Array finden


Betrifft: Begriff in mehrdimensionalem Array finden von: Werner Perouse
Geschrieben am: 17.09.2019 14:06:43

Hallo Forum,

ich habe die Spalten 1 bis 3 einer Tabelle (ca. 100 Zeilen) in eine Array geladen, und bin im nächsten Schritt an der zeilenweisen Abarbeitung einer zweiten Tabelle (ca. 5000 Zeilen).

Jetzt möchte ich herausfinden, ob es in der 1. Tabelle einen Begriff in Spalte 2 mit demselben Wert gibt, wie in meiner 2. Tabelle. Dazu habe ich die 2. Tabelle aufsteigend nach dem Begriff sortiert. So kann ich mir bei mehrfachem Auftreten desselben Begriffs in Tabelle 2 die Suchfunktion sparen.

Jetzt hakt es nur noch an einer Stelle: wie finde ich die Zeile mit meinem gesuchten Begriff im Array?

so geht es nicht:

           Sub ForumAnfrage()
           Dim MaxRow  As Integer
           Dim MyArray As Variant
           MaxRow = 30
           MyArray = Range(Cells(1, 1), Cells(MaxRow, 3))
           Debug.Print UBound(MyArray)
           Debug.Print LBound(MyArray)
           Debug.Print MyArray(3, 1)
           Debug.Print MyArray(3, 2)
           Debug.Print MyArray(3, 3)
           Debug.Print WorksheetFunction.Match("gesucht", MyArray)
           End Sub

Beim letzten Debug.Print erhalte ich einen Laufzeitfehler 1004.

Die Array-Debugs zeigen mir, dass der gesuchte Begriff in Zeile 17 zu finden wäre; es wird also nicht nach einem "nicht vorhandenen" Begriff gesucht.

Wie wäre es richtig?

Gruß

Werner
  

Betrifft: AW: Begriff in mehrdimensionalem Array finden von: 1713526.html
Geschrieben am: 17.09.2019 17:50:15

Moin!
Match geht in deinem Fall nicht, da du einmehrspaltiges Array hast. Entweder du durchläufst es in einer Spalte oder du machst es so wie hier:
https://www.ms-office-forum.net/forum/showthread.php?t=288635
Da wird aus dem mehrspatigen Array eine Spalte an match übergeben.
VG

  

Betrifft: AW: Begriff in mehrdimensionalem Array finden von: 1713528.html
Geschrieben am: 17.09.2019 18:03:00

Hallo Matthias,

Danke für Deinen Hinweis.

Ich werde mich für die Lösung entscheiden, jede Spalte in einen eigenen Array zu laden.

Inzwischen habe ich einen Test mit einer eindimensionalen Struktur gemacht; er war erfolgreich.

Mein Problem ist damit erledigt.

Gruß

Werner

  

Betrifft: Es muss doch nur in d.2.Spalte d.Tab1 gesucht ... von: 1713530.html
Geschrieben am: 17.09.2019 18:14:56

…wdn, Werner,
nicht im ganzen myArray. Dann solltest du auch nur die isoliert verwenden, wenn du .Match anwenden willst (Mattis Anmerkung lt Xl-Hilfe). Das kann man mit einem anderen Typ von Gesamt-Array oder einem Extra-Array nur für diese erreichen.
Anderenfalls müssten zeilenweise alle Spalten zu einem Begriff* zusammengefasst und Joker ("*gesucht*") verwendet wdn, da es ja nur auf die Zeile ankommt.
* Das geht auch besser mit einem anderen Array-Typ, ein (vertikaler Spalten-)Vektor, dessen Elemente aus (horizontalen Zeilen-)Kovektoren bestehen.
Gruß, Luc :-?

„Der beste Beweis für intelligentes Leben im Universum ist, dass noch niemand versucht hat, Kontakt mit uns aufzunehmen.“ H.Lesch, 2018, Sonneberg
Deshalb Intelligenz steigern mit …

  

Betrifft: AW: Es muss doch nur in d.2.Spalte d.Tab1 gesucht ... von: 1713553.html
Geschrieben am: 17.09.2019 21:37:55

Hallo Luc:-?,

auch Dir "Danke". Wie Du aus den anderen Antworten erkennst, habe ich inzwischen eine brauchbare Lösung gefunden.

Gruß

Werner

  

Betrifft: AW: Begriff in mehrdimensionalem Array finden von: 1713536.html
Geschrieben am: 17.09.2019 19:09:00

Verstehe ich das richtig? Du willst Spalte 2 des 2.Blattes nach allen Werten der Spalte 2 im 1. Blatt durchsuchen und den Wert bzw Position ausgeben lassen?
Was ist denn, wenn 2 verschiedene Begriffe aus Blatt 1 ebenso auch auf Blatt 2 existieren?

  

Betrifft: AW: Begriff in mehrdimensionalem Array finden von: 1713552.html
Geschrieben am: 17.09.2019 21:35:33

Hallo onur,

auch Dir Danke für Deine Antwort.

In Spalte 2 der Tabelle 1 gibt es hunderte verschiedener Begriffe. Es ist aber durchaus möglich, dass ein bestimmter Begriff mehrfach vorkommt.

Tabelle 2 enthält die Namen, die mich interessieren; alle anderen Zeilen in Tabelle 1 sind uninteressant.

Sowohl in Tabelle1 als auch in Tabelle 2 steht in Spalte 3 - nennen wir es - eine Versionsnummer. Und jetzt will ich prüfen, ob bei gefundenen Einträgen diese Information identisch ist. Wenn ich einen Eintrag finde, werde ich die Zelle in Spalte 1 der Tabelle 1 grün einfärben. Wenn dann noch die Versionsnummer identisch ist, werde ich - wieder in Tabelle 1 - auch diese Information grün einfärben.

Mit einem Farbfilter werde ich dann die gefundenen Einträge ausfiltern. Die Farbe in Spalte 3 läßt mich dann erkennen, ob hier die gültige Version vorhanden ist. Dabei interessieren mich nur grüne Zellen in Spalte 2 und nicht eingefärbte Zellen in Spalte 3. Beide in grün bedeuted: alles in Ordnung.

Ich hoffe, ich habe das verständlih beschrieben.

Noch erledigen muss ich das Einfärben und den Autofilter setzen. Der Rest ist - mehr schlecht als recht - bereits lauffähig.

Gruß

Werner

  

Betrifft: AW: Begriff in mehrdimensionalem Array finden von: 1713542.html
Geschrieben am: 17.09.2019 20:06:24

Hi
wenn für deinen sonstigen Code ein zweidimensionales Arry mit mehreren Spalten günstiger ist als die Verwendung von mehreren einspaltigen Arrays, dann kannst du auch mit INDEX das Array auf die benötigte Spalte reduzieren um so Application.Match einsetzen zu können (was bei deiner Aufgabenstellung die schnellste Suchmethode ist)

Debug.Print WorksheetFunction.Match("gesucht", Worksheetfunction.Index(MyArray,0, 2))
Gruß Daniel
  

Betrifft: AW: Begriff in mehrdimensionalem Array finden von: 1713549.html
Geschrieben am: 17.09.2019 21:20:59

Hallo Daniel,

Danke für Deinen Hinweis mit Beispiel.

Ich habe keine Probleme damit, mit 2 Arrays zu arbeiten. Habe den Code inzwischen schon umgestellt. Lade jetzt die beiden Spalten in zwei Arrays. Dann funktioniert meine Suche auch. Wenn ich dann nach einem Begriff in Array1 suche und gefunden habe, finde ich die zugehörige Information in Array2 an derselben Position.

Mit einem Problem kämpfe ich derzeit noch:

MacIndex = WorksheetFunction.Match(suchbegriff, ImpArrayN)

bringt einen Laufzeitfehler 11004, wenn der Begriff nicht vorhanden ist.

Mit einem "on Error resume next" kann ich das Problem umgehen.

Gibt es eine bessere Lösung?

Gruß

Werner

  

Betrifft: AW: Begriff in mehrdimensionalem Array finden von: 1713564.html
Geschrieben am: 17.09.2019 22:12:25

Hi

MacIndex als Variant deklarieren und Application.Match verwenden.
dann gibt es keinen Fehlerabbruch, sondern der Fehlerwert wird in die Variable geschrieben, was du im Nachgang IsError oder VarType überprüfen kannst.

Gruß Daniel

  

Betrifft: wobei ich dir empfehlen würde, bei MATCH oder von: 1713568.html
Geschrieben am: 17.09.2019 22:46:04

auch VLookUP den letzten Parameter immer mit anzugeben (auch wenn dieser Optional ist), damit du dir darüber im klaren bist, welche Suchvariante gerade verwendet werden soll.
wenn du den letzten Paramter weg lässt, verwendest du die Suchvariante für sortierte Listen und da dürftest du nur dann eine Fehlermeldung bekommen, wenn der Suchwert kleiner ist, als der erste Wert in der Liste.
Den Fall könntest du auch mit einer einfachen vorangestellen Abfrage abfangen:

if suchbegriff < ImpArrayN(1, 1) then
Gruß Daniel
  

Betrifft: AW: Begriff in mehrdimensionalem Array finden von: 1713716.html
Geschrieben am: 18.09.2019 17:25:12

Hallo Daniel,

Danke für Deinen Nachtrag.

Inzwischen habe ich MacIndex als Variant definiert:

Dim MacIndex As Variant

Auch den Aufruf habe ich geändert:

MacIndex = Application.Match(MacName, ImpArrayN, 0)
If Not IsError(MacIndex) Then ......


"On errror" habe ich entfernt; alles läuft bestens.

Gruß

Werner

Beiträge aus dem Excel-Forum zum Thema "Begriff in mehrdimensionalem Array finden"