Zusammengesetzte Variablen VBA

Hallo

Ich habe in einem Makro eine Liste von Namen und wähle aus diesen Namen jeweils einen bestimmten aus. Bisher mache ich es so:

Option Base 1
Sub test\_vorname()
Vorname = Array( \_
"Hans", \_
"Otto", \_
"Heinrich", \_
"Markus" \_
)
Z = 1   ' Z ist eine Zahl 1 bis 4
MsgBox Vorname(Z)
End Sub

Die Namensliste muss immer wieder geändert (vor allem erweitert) werden, und das wird mit diesem Makro schwierig. Als Lösung schwebt mir folgendes vor:

Sub neu\_vorname()
Vorname1 = "Hans"
Vorname2 = "Otto\*"
Vorname3 = "Heinrich"
Vorname4 = "Markus"
Z = 1   ' Z ist eine Zahl 1 bis 4
MsgBox Vorname & Z
End Sub

In diesem Fall soll mit Msgbox also „Hans“ ausgegeben werden. Die Variable, die Msgbox liefern soll, wäre also eine „zusammengesetzte“ Variable. So wie ich es hier versuche, geht es keineswegs, das ist mir bewusst. Gibt es andere Möglichkeiten, Variablen-Namen zusammenzusetzen?

Vielen Dank für Eure Hilfe Niclaus

Hallo

Hallo Niclaus,

Ich habe in einem Makro eine Liste von Namen und wähle aus
diesen Namen jeweils einen bestimmten aus. Bisher mache ich es
so:

Option Base 1
Sub test_vorname()
Vorname = Array( _
„Hans“, _
„Otto“, _
„Heinrich“, _
„Markus“ _
)
Z = 1   ’ Z ist eine Zahl 1 bis 4

Warum geht Z von 1 bis 4? Weil du momentan 4 Namen hast?

MsgBox Vorname(Z)
End Sub

Wie meinst du das mit dem Auswählen? Änderst du jedes mal den Code, damit die MsgBox einen anderen Namen anzeigt? und was hast du davon, dass der Name angezeigt wird?

Die Namensliste muss immer wieder geändert (vor allem
erweitert) werden, und das wird mit diesem Makro
schwierig. Als Lösung schwebt mir folgendes vor:

Sub neu_vorname()
Vorname1 = „Hans“
Vorname2 = „Otto*“
Vorname3 = „Heinrich“
Vorname4 = „Markus“
Z = 1   ’ Z ist eine Zahl 1 bis 4
MsgBox Vorname & Z
End Sub

In diesem Fall soll mit Msgbox also „Hans“ ausgegeben werden.
Die Variable, die Msgbox liefern soll, wäre also eine
„zusammengesetzte“ Variable. So wie ich es hier versuche, geht
es keineswegs, das ist mir bewusst. Gibt es andere
Möglichkeiten, Variablen-Namen zusammenzusetzen?

Ich glaube, ich habe dein Problem noch nicht verstanden. Wenn du doch jedes Mal den Code ändern musst, um Z zu ändern, dann kannst du im Code doch auch neue Namen in das Array Vorname eintragen.
Bitte versuche es noch mal etwas genauer zu erklären.

Vielen Dank für Eure Hilfe Niclaus

Schaun wir mal.

Gruß, Andreas

Hallo Andreas

Vorname = Array( _
„Hans“, _
„Otto“, _
„Heinrich“, _
„Markus“ _
)
Z = 1   ’ Z ist eine Zahl 1 bis 4

Warum geht Z von 1 bis 4? Weil du momentan 4 Namen hast?

Ganz genau

Wie meinst du das mit dem Auswählen? Änderst du jedes mal den
Code, damit die MsgBox einen anderen Namen anzeigt?

Der Code (Z) wird durch eine Inputbox generiert. - Das Makro, das ich hier gezeigt habe, ist Teil eines Buchhaltungs-Debitoren-„Programmes“, an dem ich seit mehreren Jahren bastle. Ganz genau geht es in diesem Teil auch nicht um Vornamen sondern um Produkte:

Option Base 1
Sub neu\_produkt()
Produkt1 = "Bleistift"
Produkt2 = "Kugelschreiber"
Produkt3 = "Briefumschlag"
Produkt4 = "Briefpapier"
z=Inputbox("bitte eine zahl eingeben")
Msgbox Produkt & z
End Sub

Wenn ich in der Inputbox „4“ eingebe, dann hätte ich gern, dass eine Variable Produkt4 gebildet wird, sodass mir die
Msgbox Produkt&z
„Briefpapier“ ausgibt.

und was hast du davon, dass der Name angezeigt wird?

Das Anzeigen des Namens bzw. Produktes ist Nebensache. Das Produkt wird schlussendlich für einen Buchungssatz in einem Debitoren-Nebenbuch und im Finanz-Hauptbuch eines Buchhaltungsprogrammes benötigt. Das Produkt bzw. die Variable ändert selbstverständlich bei jedem Buchungssatz. Ausser der Input-Box für das Produkt gibt es noch x andere Input-Boxen: Betrag, Datum usw.

Meine eigentliche Frage ist nach wie vor: Kann man in VBA eine Variablen-Bezeichnung zusammensetzen? Also z. B.
NeueVariable=Produkt&1
Diese NeueVariable wäre dann Produkt1 und hätte den Inhalt „Bleistift“.

Ich hoffe, mein Problem ist jetzt etwas deutlicher geworden.
Vielen Dank und viele Grüsse
Niclaus

Hi Niclaus,

warum machst du das ganze denn nicht mit einem Array?:

Dim produkte As Variant
produkte = Array("Beistift", "Kugelschreiber", "Briefumschlag", "Briefpapier")
MsgBox produkte(1)

Alternativ könntest du die Produkte in Zellen schreiben und mit einer Schleife ins Array einlesen. Dann musst du nicht immer im Code rumfummeln, wenn sich das Sortiment ändert.
Ich hoffe, ich hatte das jetzt richtig verstanden.

Gruß, Andreas

Grüezi Niclaus,

Option Base 1

warum das? Was hast du gegen Index 0?

Z = 1   ’ Z ist eine Zahl 1 bis 4
MsgBox Vorname(Z)

Die Namensliste muss immer wieder geändert (vor allem
erweitert) werden, und das wird mit diesem Makro
schwierig. 

Erkläre bitte genau was da schwierig wird.

Die Variable, die Msgbox liefern soll, wäre also eine
„zusammengesetzte“ Variable. So wie ich es hier versuche, geht
es keineswegs, das ist mir bewusst. Gibt es andere
Möglichkeiten, Variablen-Namen zusammenzusetzen?

Mir nicht bekannt und ich glaube es gibt da keine Möglichkeit.

Gruß
Reinhard

Alternativ könntest du die Produkte in Zellen schreiben und
mit einer Schleife ins Array einlesen. Dann musst du nicht
immer im Code rumfummeln, wenn sich das Sortiment ändert.
Ich hoffe, ich hatte das jetzt richtig verstanden.

Hallo Andreas

Ja, Du hast mich richtig verstanden. - Die Produkte in Zellen schreiben und von dort einlesen: Das klappt auch.
Mich hat der Hafer gestochen: Zusammengesetzte oder dynamische Variablen. Ich habe im Netz gefunden: „Man kann in ‚normalem‘ VBA zur Laufzeit keine Variablennamen zusammenbauen. Man nimmt für so was ein Array, eine Collection oder auch ein Dictionary-Objekt.“ - Array ist mir geläufig. Collection und Dictionary: das sind Fremdwörter für mich. Und die entsprechenden Seiten dazu: da steh ich wie ein Ochs am Berg.

In der Zwischenzeit habe ich doch noch eine Lösung gefunden, die für meine Zwecke ideal ist. Falls es Dich interessiert:

Sub neu\_produkt()
Dim Produkt(100)
'Der Zahlenwert bei Dim muss \>= Anzahl Produkte sein
Produkt(1) = "Bleistift"
Produkt(2) = "Kugelschreiber"
Produkt(3) = "Briefumschlag"
Produkt(4) = "Briefpapier"
Z = InputBox("bitte eine zahl eingeben")
MsgBox (Produkt(Z))
End Sub

Vielen Dank für Deine Bemühungen und viele Grüsse
Niclaus

Grüezi Reinhard

Option Base 1

warum das? Was hast du gegen Index 0?

Lache! Ja, da hab ich was dagegen. Vor allem in diesem Fall:

Z = 1   ’ Z ist eine Zahl 1 bis 4

müsste ja dann heissen: Z ist eine Zahl von 0 bis 3
Oder ich müsste definieren: Z = Z - 1
Da ist es doch viel einfacher mit meiner Cousine - ähh Base - zu arbeiten.

Die Namensliste muss immer wieder geändert (vor allem
erweitert) werden, und das wird mit diesem Makro schwierig. 

Erkläre bitte genau was da schwierig wird.

„Schwierig“ ist nicht der richtige Ausdruck. „Umständlich“ müsste es wohl heissen. - Du siehst an diesem simplen Beispiel, welche Sprachschwierigkeiten ein Schweizer hat, dessen Muttersprache halt nicht Schrift- oder Hochdeutsch ist.

Möglichkeiten, Variablen-Namen zusammenzusetzen?

Mir nicht bekannt und ich glaube es gibt da keine Möglichkeit.

Vgl. dazu meine Antwort an Andreas von 18:07.

Vielen Dank für Deine Bemühungen und viele Grüsse
Niclaus

Hallo Andreas

Hi Niclaus,

In der Zwischenzeit habe ich doch noch eine Lösung gefunden,
die für meine Zwecke ideal ist. Falls es Dich interessiert:

Sub neu_produkt()
Dim Produkt(100)
'Der Zahlenwert bei Dim muss >= Anzahl Produkte sein
Produkt(1) = „Bleistift“
Produkt(2) = „Kugelschreiber“
Produkt(3) = „Briefumschlag“
Produkt(4) = „Briefpapier“
Z = InputBox(„bitte eine zahl eingeben“)
MsgBox (Produkt(Z))
End Sub

Ich glaub, wir habe da etwas aneinander vorbeigerdet: Der Code den du hier zeigst, arbeitet doch mit einem Array (zu deutsch Datenfeld). Nur hast du im Gegensatz zu meinem Code nicht die Array-Funktion benutzt, um das Feld zu belegen.
Und du musst halt immer drauf achten, dass du das Feld groß genug dimensionierst. Mit Dim…As Variant und der Array-Funktion brauchst du das nicht.

Gruß, Andreas