Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Array in Array speichern

Array in Array speichern
Andreas
Hallo Herber Fans,
ich bin auf ein Problem gestoßen, welches ich bisher weder durch Probieren, noch durch Forums-/ Internetrecherche lösen konnte. Ich möchte ein Array in einem Array speichern.
Ich habe drei einzelne Arrays „arrSearchReferences1“ (1-3), in denen Suchbegriffe als Textstrings gespeichert werden. Diese drei Arrays sollen in einem globalen Array gespeichert werden. Dieses globale Array wird dann durchlaufen. In diesem Durchlauf trifft der Code dann auf ein im Array gespeichertes Array, welches die Strings enthält, nach denen gesucht werden soll. Wenn ein String gefunden wurde, wird ein Long Counter um eins erhöht und die lokale Schleife verlassen. Dann kommt das nächste Teilarray mit den nächsten Strings. Innerhalb eines Arrays mit Search Referenzen herrscht eine „ODER“ Logik. Innerhalb des globalen Arrays „arrSearch“ jedoch eine UND Logik. D.h. bei 3 Teilarrays muß ich drei Fund- Vorkommnisse gehabt haben, ansonsten wird die Zelle NICHT rot eingefärbt.
Die Suchlogik ist nicht das Problem. Das Problem ist, Array in Array zu speichern. Da habe ich derzeit überhaupt keine Idee ob und wie das gehen könnte.
Ich würde mich freuen, wenn das Thema bei anderen, erfahreneren Forumsteilnehmern auf Interesse stößt und sie sich die Sache einmal ansehen. (Der bisherige Code steht in „modSearch“)
https://www.herber.de/bbs/user/67942.xls
Vielen Dank und einen schönen Abend allen Excel Freunden noch,
Andreas Hanisch.
Anzeige
AW: Array in Array speichern
11.02.2010 19:51:47
Gerd
Hallo Andreas!
'Muß ich es als Variant deklarieren?
Ja, das empfiehlt sich für solche Fälle, alles als Variant zu deklarieren.
Gruß Gerd
AW: Array in Array speichern
11.02.2010 20:09:40
Andreas
Hallo Gerd,
ich habe es testweise mal als Variant deklariert. Funktioniert leider nicht. Es scheint komplexer zu sein, als eine Umdeklaration.
Grüße, Andreas
Anzeige
Du musst es natürlich auch noch richtig...
12.02.2010 03:26:24
Luc:-?
...füllen, Andreas...!
Wenn du das getan hast, sollte es fktn!
Dim varFeld As Variant
varFeld = Array(Array(1, 2, 3), Array(4, 5, 6), Array(7, 8, 9))
Referenzieren musst du das dann so...
varFeld(1)(2) liefert 6
Solche Felder setzt man vornehmlich dann ein, wenn die Anzahl der Elemente der Unterfelder (SubArrays) unterschiedlich sein kann, denn dann bekäme man keine reguläre Matrix zustande, es sei denn, man füllte die überzähligen Elemente mit 0 bzw "".
In deinem Fall würde es aber auch eine reguläre oder teilreguläre Matrix tun, also...
Dim strFeld(2, 2) As String und dann alle Elemente einzeln bzw...
Dim varFeld(2) As Variant und dann varFeld(0)...(2) mit den jeweiligen Feldern füllen.
Ansprache: strFeld(1, 2) liefert "6" — varFeld(1)(2) liefert 6
Noch idealer ist es, wenn man deine Vglsbegriffe, falls sie konstant sind, als...
Const varText As String = "alpha beta gamma/delta epsilon vau/zeta eta theta" *
deklariert und dann die Zuweisung wie folgt vornimmt...
varFeld = Array(Split(Split(varText, "/")(0), " "), Split(Split(varText, "/")(1), " "), Split(Split(varText, "/")(2), " ")
Der Vorteil ist, man hat alle signifikanten Suchbegriffe als eine Konstante am PgmAnfang und kann so sehr schnell und leicht einen ggf erforderlichen Austausch vornehmen.
Der Durchlauf einer solchen Variable ist bei gleicher Elementanzahl mittels 2er, ineinander­geschachtelter Zyklen vom For laufvar = anfangswert To endwert-Typ möglich. Bei unterschiedl Elementeanzahl der VglBegriff-Vektoren verwendet man besser den For Each element In feld-Typ, zumindest für den inneren Zyklus (ist ohnehin schneller).
Ein anderer Aspekt des Ganzen ist, dass du wohl einen Wahrheitswert erhalten möchtest. Die einzelnen, sich aus den Vgll ergebenden Boole'schen Werte könntest du natürlich auch in einem udTyp (benutzerdefinierter Variablentyp) zusammenfassen, dessen 3 Elemente einzeln per Or-Operation ermittelt und miteinander per And-Operation verknüpft stets True ergeben müssen. Wenn eines dieser 3 Elemente bei seiner Ermittlung schon False ergibt, können eigentlich sofort alle diesbzgl PgmZyklen abgebrochen wdn (Exit For-Bedingung!).
* Das sind die Namen der altgriech Symbole für die oben verwendeten Zahlen.
Viel Erfolg! Gruß Luc :-?
Anzeige
AW: Array in Array speichern
11.02.2010 20:10:14
Uduuh
Hallo,
erst mal arrSearch als Variant deklarieren.
Dim arrSearch(1 to 3)
Das mit der Zuweisungsschleife geht nicht. Musst du einzeln machen. Variablennamen kannst du nicht zusammenbasteln.
arrSearch(1)=arrSearchReferences1
arrSearch(2)=arrSearchReferences2
arrSearch(3)=arrSearchReferences3
Und arrSearchRefs nicht Seten!
For i = 1 To UBound(arrSearch, 1)
arrSearchRefs = arrSearch(i)
.......
Gruß aus’m Pott
Udo

Anzeige
AW: Array in Array speichern
11.02.2010 21:22:54
Andreas
Hallo Gerd L und Udo,
Vielen Dank Euch beiden für Eure Antworten. Es läuft nun astrein!!! Den Durchbruch haben Udos Hinweise gebracht, daß ich nicht mit 'SET' agieren kann und auch das die Zuweisungsschleife nicht geht. Nun werde ich noch ein wenig basteln, um die Werte vollflexibel von einem Worksheet einzulesen, so daß sich die Arraygrößen anpassen.
Tja, Array in Array erscheint mir dank Eurer Hilfe nun irgendwie "ganz logisch"... Wäre es ohne Euch aber nicht!
Habt Dank und noch einen schönen Abend,
Grüße aus Berlin, Andreas Hanisch
Anzeige
Hatte Udos AW leider übersehen,...
12.02.2010 03:31:34
Luc:-?
...Andreas,
aber viell nutzt dir mein Text doch auch noch... ;-)
Gruß Luc :-?
PS: Stammst du auch aus Berlin oder viell aus TF...?
AW: Hatte Udos AW leider übersehen,...
12.02.2010 08:21:00
Andreas
Hallo Luc :-?,
Da Dein Text sehr umfangreich und - wie ich es bei diesem Urheber auch kaum anders erwartet hätte - sehr fundiert ist, wird er sicher auch Berücksichtigung finden! Aber dazu muß ich ihn in Ruhe inhalieren und verstehen. Das wird schon. Wenn ich es heute schaffe, noch mit 'Array in Array' weiter zu experimentieren, werde ich morgen vermutlich schon das Wissen aus Deinem Text benötigen :). Also schon einmal Danke vorab und ein schönes Wochenende!
Grüße, Andreas
PS: Ja ich bin aus Berlin, derzeit bei leichtem Schneefall. Was ist denn 'TF'?
Anzeige
Findest du südlich direkt vor den Toren,...
12.02.2010 12:44:35
Luc:-?
...Andreas,
also nicht Teneriffa! Da hast du dann wohl einen Voll-Namensvetter...
Naja, die Bewohner des Spreewalds (sein Vorfeld gehört zu TF), denn da ist dein Familienname wohl her — auch als Hanusch, sind eben auch nicht alle zuhause sitzen geblieben... ;-)
Gruß Luc :-?
PS: Hier schneit's genauso!
Anzeige
;

Forumthreads zu verwandten Themen

Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

Array in Array speichern in VBA


Schritt-für-Schritt-Anleitung

Um ein Array in einem Array in VBA zu speichern, solltest du folgende Schritte befolgen:

  1. Deklaration: Deklariere dein globales Array als Variant. Dies ist notwendig, da ein Array of Array in VBA nur als Variant funktionieren kann.

    Dim arrSearch As Variant
  2. Initialisierung: Fülle dein Array mit den Teilarrays. Hier ein Beispiel mit drei Suchbegriffen:

    arrSearch = Array(Array("Suchbegriff1", "Suchbegriff2", "Suchbegriff3"), _
                     Array("Suchbegriff4", "Suchbegriff5"), _
                     Array("Suchbegriff6", "Suchbegriff7", "Suchbegriff8"))
  3. Zugriff auf die Elemente: Um auf die Elemente zuzugreifen, kannst du die Syntax arrSearch(i)(j) verwenden. Zum Beispiel:

    MsgBox arrSearch(0)(1) ' Gibt "Suchbegriff2" aus
  4. Durchlauf: Verwende Schleifen, um durch die Arrays zu iterieren. Hier ein Beispiel für eine For Each Schleife:

    Dim i As Integer, j As Integer
    For i = LBound(arrSearch) To UBound(arrSearch)
       For j = LBound(arrSearch(i)) To UBound(arrSearch(i))
           Debug.Print arrSearch(i)(j)
       Next j
    Next i

Häufige Fehler und Lösungen

  • Fehler: "Typ nicht übereinstimmend"
    Lösung: Stelle sicher, dass du das Array als Variant deklariert hast. Wenn du versuchst, ein Array of Array als String oder Integer zu deklarieren, wird dieser Fehler auftreten.

  • Fehler: UBound gibt einen Fehler zurück
    Lösung: Überprüfe, ob das Array korrekt initialisiert wurde. Wenn das Array leer ist, kann UBound nicht korrekt arbeiten.

  • Fehler: "Set" für Arrays verwenden
    Lösung: Du solltest Set nicht verwenden, wenn du ein Array zuweist. Das ist nur für Objekte erforderlich.


Alternative Methoden

Einige Alternativen zur Speicherung von Arrays in Arrays sind:

  1. Reguläre Matrix: Wenn die Anzahl der Elemente in den Unterarrays konstant ist, kannst du eine reguläre Matrix verwenden:

    Dim strFeld(2, 2) As String
    strFeld(0, 0) = "Suchbegriff1"
    strFeld(0, 1) = "Suchbegriff2"
  2. Benutzerdefinierte Datentypen: Du kannst auch einen benutzerdefinierten Typ erstellen, um mehrere Werte zu speichern:

    Type SearchTerms
       Term1 As String
       Term2 As String
    End Type
    
    Dim terms(1 To 3) As SearchTerms
    terms(1).Term1 = "Suchbegriff1"

Praktische Beispiele

Hier sind einige praktische Beispiele, wie du ein vba array in array effektiv nutzen kannst:

  • Beispiel: Zählen von Suchbegriffen
    Wenn du ein Array von Suchbegriffen hast und zählen möchtest, wie viele Begriffe vorhanden sind:

    Dim count As Integer
    count = UBound(arrSearch) + 1 ' Anzahl der Teilarrays
    MsgBox "Anzahl der Suchbegriffe: " & count
  • Beispiel: Suche nach einem bestimmten Begriff
    Du kannst eine Funktion erstellen, die überprüft, ob ein bestimmter Suchbegriff in den Arrays vorhanden ist:

    Function IsTermFound(searchTerm As String) As Boolean
      Dim found As Boolean
      found = False
    
      Dim i As Integer, j As Integer
      For i = LBound(arrSearch) To UBound(arrSearch)
          For j = LBound(arrSearch(i)) To UBound(arrSearch(i))
              If arrSearch(i)(j) = searchTerm Then
                  found = True
                  Exit For
              End If
          Next j
          If found Then Exit For
      Next i
    
      IsTermFound = found
    End Function

Tipps für Profis

  • Verwende Const, um Suchbegriffe zu deklarieren, die sich nicht ändern, um die Wartbarkeit des Codes zu erhöhen.
  • Nutze For Each Schleifen für eine einfachere und lesbarere Iteration über die Elemente in einem vba array of array.
  • Achte darauf, dass die Anzahl der Elemente in den Unterarrays variieren kann; das ist der Hauptvorteil der Verwendung von Variant Arrays anstelle von regulären Matrizen.

FAQ: Häufige Fragen

1. Kann ich ein Array in einem Array ohne Variant verwenden?
Nein, um ein vba array of array zu erstellen, muss es als Variant deklariert werden.

2. Was ist der Unterschied zwischen einer regulären Matrix und einem Array of Arrays?
Eine reguläre Matrix hat feste Dimensionen, während ein Array of Arrays unterschiedliche Dimensionen und Längen haben kann.

3. Wie kann ich die Größe eines Arrays dynamisch ändern?
Verwende die ReDim Anweisung, um die Größe deines Arrays zur Laufzeit anzupassen. Achte darauf, Preserve zu verwenden, wenn du die vorhandenen Daten behalten möchtest.

4. Wie kann ich ein Array in ein Worksheet einlesen?
Du kannst die Werte eines Arrays direkt in ein Worksheet übertragen, indem du die Range-Eigenschaft nutzt, z.B.:

Sheets("Sheet1").Range("A1").Resize(UBound(arrSearch, 1) + 1, UBound(arrSearch(0), 1) + 1).Value = arrSearch

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