VBA: Array-Übergabeparameter
29.09.2017 16:16:14
Martin
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