Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1580to1584
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
Inhaltsverzeichnis

VBA: Array-Übergabeparameter

VBA: Array-Übergabeparameter
29.09.2017 16:16:14
Martin
Hallo Community
Ich habe eine Eingabemaske mit - der Einfachheit halber - 3 Feldern, txtboxName, txtboxVorname und txtboxOrt, mit der ich übereinstimmende Zeilen aus bestehenden Excel-Tabellen herausfiltern will. Nehmen wir an, ich habe nur die Felder txtboxName und txtboxVorname ausgefüllt. Alle gefundenen Übereinstimmungen in der Excel-Tabelle mit dem Feld txtboxName trage ich in ein Array ein: arrTrefferName. Dito mit arrTrefferVorname. Beide sind als Array deklariert.
Nun möchte ich diese zwei Arrays einer Prozedur übergeben, damit diese in den Excel-Dateien die richtigen Zeilen herausfiltert, welche mit beiden Vorgaben in der Eingabemaske übereinstimmen.
Die Prozedur heisst Sub TrefferSuche(Wert_1() as String, Wert_2() as String), und der Prozeduraufruf heisst in meinem Fall: Call TrefferSuche(arrTrefferName, arrTrefferVorname). Das funktioniert so auch (die beiden Übergabeparameter sind Arrays) und die geforderten Übereinstimmungen liefern.
Da ich jedoch nicht weiss, welche Felder der Eingabemaske benutzt wurden, muss ich das zuerst herausfinden, damit ich dann die richtigen Bezeichnungen der beiden Übergabeparameter (Arrays) für die Prozedur Treffersuche zusammenstellen kann. Das geschieht wie folgt:
Dim Feld as Variant
Dim FeldCounter as Integer
Dim arrParameter() as String 'NB: auch mit Variant funktioniert es nicht
For Each Feld In Me.Controls 'Me ist die Eingabemaske-Userform
If TypeName(Feld) = "TextBox" Then 'falls es eine TextBox ist ...
If Feld.Value "" Then '... und sie nicht leer ist (müssen zwei getrennte Zeilen sein)
ReDim Preserve arrParameter(FeldCounter) 'beim ersten Durchgang ist FeldCounter = 0
arrParameter(FeldCounter) = "arrTreffer" & Mid(Feld.Name, 7)
'der Feldname ist z. B.: "TxtBoxName", also muss das "TxtBox" weg,
'dafür "arrTreffer" davor gesetzt werden, damit der Array-Name stimmt
FeldCounter = FeldCounter + 1
End If
End If
Next Feld
Weil die Felder Name und Vorname ausgefüllt waren, stehen nun im Array arrParameter die beiden Einträge "arrTrefferName" und "arrTrefferVorname".
Wenn ich nun die Prozedur aufrufe mit Call TrefferSuche(arrParameter(0), arrParameter(1)) würde theoretisch die "korrekte" Zeile Call Treffersuche(arrTrefferName, arrTrefferVorname) ausgegeben, aber es erscheint eine Meldung "Unverträglicher Typ: Datenfeld oder benutzerdefinierter Typ erwartet", vermutlich weil bereits der erste Übergabeparameter arrParameter(0) kein (erwartetes) Array, sondern ein String ist.
Wie muss der Call-Aufruf geschrieben werden, damit arrParameter(0), also hier arrTrefferName, als Array übergeben wird? Dito natürlich auch für arrParameter(1), also arrTrefferVorname.
Besten Dank für eure Mithilfe
Martin

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA: Array-Übergabeparameter
29.09.2017 16:41:14
Nepumuk
Hallo Martin,
so kannst du den Namen einer Variablen nicht zusammenbasteln. Ist das Array aber als Eigenschaft definiert dann könntest du per CallByName darauf zugreifen.
Lade eine Mustermappe hoch dann kann ich dir zeigen wie ich das meine.
Gruß
Nepumuk
AW: VBA: Array-Übergabeparameter
29.09.2017 23:37:55
Martin
Hallo Nepumuk
Danke für deine schnelle Antwort. Ich habe das File auf das nötigste reduziert. Starten bitte im Excel-File mit der Schaltfläche "Info..." im Feld A1 (dazu müssen die beiden Excel-Dateien Datei1 und Datei2 in einem Unterverzeichnis "Excel-Listen" vom Arbeitsverzeichnis - wo sich das Excel-File befindet - stehen. Dies wegen der Kontrollen in DieseArbeitsmappe.Workbook_Open).
Der Eintrag "*u*" im Feld Nachname und der Eintrag "*e*" im Feld Vorname sollte nacheinander 4 Übereinstimmungen zeigen, nachdem du auf die Schaltfläche "OK" geklickt hast.
Der Eintrag "*t*" im Feld Nachname und der Eintrag "*x*" im Feld Vorname sollte keine Übereinstimmung zeigen.
Aber: Es funktioniert nur, weil im Teil 2 des Subs frmInfoSuche.cmdOK die Zeile steht "Call TrefferSuche_2(arrTrefferVorname, arrTrefferNachname)". Die beiden Array-Übergabevariablen müssen im Normalbetrieb zuerst noch eruiert werden, so wie ich es im bereits geposteten Code versucht habe (der Code steht auch im Teil 2 des Subs frmInfoSuche.cmdOK, reichlich auskommentiert). Ich denke, an dieser Stelle des Codes geht es nun darum, CallByName einzusetzen, damit die Prozedur TrefferSuche_2 mit den richtigen Array-Übergabeparameter - wie sie auch immer heissen - aufgerufen werden kann.
Die Arrays sind am Anfang des Subs frmInfoSuche.cmdOK als lokale Variablen deklariert.
Ich bin gespannt auf den Lösungsweg
Martin
https://www.herber.de/bbs/user/116645.xlsm
https://www.herber.de/bbs/user/116646.xlsx
https://www.herber.de/bbs/user/116647.xlsx
Anzeige
CallByName erwartet als 1.Parameter ein Objekt, …
30.09.2017 01:52:58
Luc:-?
…Martin,
und als 2. dann den Namen einer primären Eigenschaft genau dieses Objekts als String, den man dann natürlich auch zusam­men­setzen kann. Deshalb muss eine Array- oder sonstige Variable, deren Name so gebildet wdn soll, stets auch einem Objekt zuge­ord­net sein. In einem allgemeinen Modul wäre sie das auch als globale Variable nicht, in einem KlassenModul aber schon (auch in dem von Workbook, Worksheet, UserForm).
Morrn, Luc :-?
Besser informiert mit …
Anzeige
AW: Variablenname zusammenbasteln - > Dictionary
30.09.2017 02:32:33
Daniel
Hi
wenn du Variablennamen später im Code "berechnen" willst, könntest du ein Dictionary verwenden.
ein Dictionary ist im Prinzip ein Eindimensionales Variant-Array mit einem Freitext-Index, dh du kannst jeden beliebigen Text als Index nehmen und über diesen auf die Inhalte zugreifen.
dieser Text kann natürlich beliebig erstellt werden.
die einzelnen Werte so eines Dictionarys sind Variant und können somit auch Arrays sein.
das ganze würde dann im Prinzip so ausschauen.
1. das dictionary muss deklariert und erstellt werden
dim dicTreffer as object
Set dicTreffer = CreateObject("Scripting.Dictionary")
2. wenn du deine Arrays erstellt hast, kannst du sie dem Dictionary zuweisen:
dicTreffer("Ort") = arrTrefferOrt
dicTreffer("Name") = arrTrefferName
dicTreffer("Nachname") = arrTrefferNachname
und dann die verwendung als Übergabeparameter
arrParameter(FeldCounter) = dicTreffer(Mid(Feld.Name, 7))
Gruß Daniel
Anzeige
AW: Variablenname zusammenbasteln - > Dictionary
01.10.2017 00:01:22
Martin
Hallo Daniel
Ich fahre mal mit deinem Vorschlag weiter, weil ich ihn am besten verstanden habe. Hier also der betreffende Codeabschnitt:
Dim dicTreffer As Object
Set dicTreffer = CreateObject("Scripting.Dictionary")
dicTreffer("Nachname") = arrTrefferNachname
dicTreffer("Vorname") = arrTrefferVorname
dicTreffer("Ort") = arrTrefferOrt
For Each Feld In Me.Controls
If TypeName(Feld) = "TextBox" Then 'falls es eine TextBox ist ...
If Feld.Value "" Then '... und sie nicht leer ist (müssen zwei getrennte Zeilen sein)
ReDim Preserve arrParameter(FeldCounter)
arrParameter(FeldCounter) = dicTreffer(Mid(Feld.Name, 7)) 'der Feldname ist z. B.: "TxtBoxTelPrivat", also muss das "TxtBox" weg
FeldCounter = FeldCounter + 1
End If
End If
Next Feld
Call TrefferSuche_2(arrParameter(0), arrParameter(1))
Dabei stelle ich zwei Fehler fest.
Wenn ich kompilieren lasse, wird auf der Zeile "Call TrefferSuche_2(arrParameter(0), arrParameter(1))" das erste "arrParameter" markiert und die Fehlermeldung "Unverträglicher Typ: Datenfeld oder benutzerdefinierter Typ erwartet" angezeigt, egal ob die Array-Variable als String (Dim arrParameter() as String) oder als Variant (Dim arrParameter() as Variant)deklariert wird. Wie korrigieren? (Nun, vorerst also diese Zeile auskommentieren ...)
Wenn ich in der If-Schlaufe einen Haltepunkt auf die Zeile "arrParameter(FeldCounter) = dicTreffer(Mid(Feld.Name, 7))" setze, sieht man, dass der Ausdruck "Mid(Feld.Name, 7)" zwar den Wert "Nachname" hat, aber der Ausdruck "dicTreffer(Mid(Feld.Name, 7))" gibt - im Direktfenster ausgewertet - den Fehler "Typen unverträglich". Mit der Korrektur "dicTreffer("Mid(Feld.Name, 7)")" steht im Direktfenster eine Leerzeile. Auch mit der korrigierten Variante wird jedoch nichts in die Variable arrParameter(FeldCounter), die hier arrParamter(0) heisst, geschrieben.
Hast du für diese beiden Fehler eine Erklärung, bzw. eine Lösung?
Hier noch das aktualisierte Excel-File.
https://www.herber.de/bbs/user/116663.xlsm
Besten Dank
Martin
Anzeige
AW: Variablenname zusammenbasteln - > Dictionary
01.10.2017 23:14:35
Daniel
ist jetzt schwer zu sagen, weil der ganze Code bei mir nicht läuft,
aber du solltest alle da betroffenen Datenfelder erstmal als echtes Variant deklarieren, dh nur:
dim arrTrefferOrt

und auch in der aufgerufenen Sub die Übergabeparameter als echtes Variant setzen
auch solltest du die Übergabe ByVal machen und nicht ByRef.
Mit ByRef müssen die Variablentypen ganz genau aufeinander passen und das kann dir hier Probleme machen.
ByRef brauchst du eigentlich nur, wenn du die Inhalte der übergebenen Variable verändern willst und sich diese Änderung auch im aufrufenden Makro auswirken soll.
Private Sub TrefferSuche_2(ByVal arrWert_1 as Variant, ByVal arrWert_2 as Variant)
weiterhin hast du im Code die Mid-Funktion in Anführungszeichen gesetzt:
arrParameter(FeldCounter) = dicTreffer("Mid(Feld.Name, 7)")

das ist natürlich Unfung!, denn so hast du ja nicht die Funktion, sondern eben genau diesen Text.
das ist ein kleines Problem bei den Dictionarys. Wenn du versuchst ein nicht vorhandenes Element anzusprechen, dann legt VBA dieses sofort als neues Element an und dieses ist dann zunächst leer.
Gruß Daniel
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige