Name aus zwei Variablen zusammesetzen

Hey,
Ich habe folgenden Code:

If PlayerID1.Text > 0 Then PI1 = PlayerID1.Text & " "
If PlayerID2.Text > 0 Then PI2 = PlayerID2.Text & " "

Nun wollte ich das durch ein Schleife ersetzen, da es bis ID10 so weiter geht und das enorm Platz sparen würde. Allerdings weiß ich nicht, wie man den Namen aus zwei Variablen, in diesem Falle „PlayerID“ und 1-10, zusammensetzen kann.

  1. Frage:

Private Sub Befehl1_Change()
Hauptmenü.WaffenID1.Enabled = False
If Hauptmenü.Befehl1.Text = „equip“ Then
Hauptmenü.WaffenID1.Enabled = True
End Sub

Dort eigentlich genau das gleiche Problem, allerdings sind das 10 verschiedene Subs und das kann ich ja in keine Schleife packen. Gibt es dort eine andere Möglichkeit? Das er in einem Sub 10 verschiedene Textboxen überwacht?

Gruß
GURKE

wenn Du aus PlayerID1.text ein Steuerelement machst kannst du es wie folgt machen.

Dim I As Integer
For I = 1 to 10
If PlayerID(I).Text > 0 Then PI(I) = PlayerID(I).Text & " "
next I

mfg jonny

Hey,

wenn Du aus PlayerID1.text ein Steuerelement machst kannst du
es wie folgt machen.

Sind bei mir Textboxen.

Dim I As Integer
For I = 1 to 10
If PlayerID(I).Text > 0 Then PI(I) = PlayerID(I).Text & "
"
next I

Fehler beim Kompilieren:
Falsche Anzahl an Argumenten oder ungültige Zuweisung zu einer Eigenschaft

Was kann jetzt noch falsch sein? Ich habe I als Integer gedimt, Die
TextBoxen gehen von PlayerID1 bis PlayerID10.

Trotzdem danke für deine Antwort :wink:

mfg jonny

gruß
GURKE

Halt halt :stuck_out_tongue:
Versuch mal folgendes. Nimm ein neues Projekt und ziehe eine TExtbox auf die Form. Nun kopierst du sie und drückst irgendwo auf der form auf einfügen. nun wirst du gefragt ob du ein steuerelement erstellen möchstest, JA. nun hast du 2 Textboxen die wie behandeln kannst.
Text1(0).text = „neuer text“ oder die anderer TExt1(1).text = „text“
damit funktioniert nun auch die For i schleife.

Nun wollte ich das durch ein Schleife ersetzen, da es bis ID10
so weiter geht und das enorm Platz sparen würde.

Dort eigentlich genau das gleiche Problem, allerdings sind das
10 verschiedene Subs und das kann ich ja in keine Schleife
packen. Gibt es dort eine andere Möglichkeit? Das er in einem
Sub 10 verschiedene Textboxen überwacht?

Hallo Gurke,

zur frage2, das müßte mit Klassenmosul lösbar sein, dummerweise klappt das in meinem Code nicht.
Ich fand bei VB-Fun.de Code zu klassenmoulen wo „MSForms.TextBox“ benutzt wurde, dies kennt mein Vb5.0 nicht :frowning:

Theoretisch müßte bei jeder Textboxänderung eine Msgbox kommen, es kommt aber nix.

Gruß
Reinhard

in die Form:

Option Explicit
Dim txtBoxes(1 To 10) As New Class1
'
Private Sub Command1\_Click()
Dim N As Integer, PI(10) As String
For N = 1 To 10
 With Me.Controls("PlayerID" & N)
 If .Text "" Then PI(N) = .Text & " "
 End With
Next N
End Sub
'
Private Sub UserForm\_Initialize()
Dim N As Integer
For N = 1 To 2
 Set txtBoxes(N).TxtGroup = Me.Controls("PlayerID" & N)
Next N
End Sub

in ein Klassenmodul mit Namen Class1

Option Explicit
'
Public WithEvents TxtGroup As TextBox 'MSForms.TextBox klappt nicht???
'
Private Sub TxtGroup\_Change()
MsgBox TxtGroup.Name & " change"
End Sub
'
Private Sub TxtGroup\_Click()
MsgBox TxtGroup.Name & " click"
End Sub

Nachtrag

Hallo Gurke,

okay, ich hatte VBA-Code erwischt bei Vb-Fun.de, daran liegts also nicht.

Hier ist jetzt ein Klassenmodul in VB für Textboxen:

http://www.vb-fun.de/cgi-bin/loadframe.pl?ID=vb/tipp…

Vielleicht kriegste es ja selbst hin.

Gruß
Reinhrad

Ich meinte diesen:

http://www.vb-fun.de/cgi-bin/forumarchiv.pl?ID=1&act…

Das Klassenmodul muß den Namen ctextbox haben!

Gruß
Reinhard

Moin, :wink:

Irgendwie steh ich gerade vollkommen auf dem Schlauch :wink:

Versuch mal folgendes. Nimm ein neues Projekt und ziehe eine
TExtbox auf die Form. Nun kopierst du sie und drückst irgendwo
auf der form auf einfügen. nun wirst du gefragt ob du ein
steuerelement erstellen möchstest,

Nein werde ich nicht, er fügt es einfach ein und heißt dann „TextBox2“ statt „TextBox1“

JA. nun hast du 2 Textboxen
die wie behandeln kannst.
Text1(0).text = „neuer text“ oder die anderer TExt1(1).text =
„text“

Ähm, was?^^ Soll ich die Textboxen bei ihren Namen belassen? Doch eigentlich nicht, aber ich kann dir nicht gleich benennen und Klammern gehen auch nicht ;(
Also heißen sie dann „Text11“ und „Text12“?

Und die For i Schleife sähe dann so aus?:

Sub UserForm_Click()
For I = 1 To 2
If Text1(I).Text > 0 Then Text1(I) = „Richtig“
Next I
End Sub

Dann sagt er mir aber, das die Sub oder Function nicht definiert sei und makiert: „Text1“?

damit funktioniert nun auch die For i schleife.

Sorry wenn ich jetzt hier gerade Stuss von mir gebe, kapiers aber echt nicht ;(

Gruß
GURKE

Moin,
Werds mal versuchen, bei Problemen frag ich einfach :wink:

Ich meinte diesen:

http://www.vb-fun.de/cgi-bin/forumarchiv.pl?ID=1&act…

Das Klassenmodul muß den Namen ctextbox haben!

Gruß
GURKE

Hallo,

Doch eigentlich nicht, aber ich kann dir nicht gleich benennen
und Klammern gehen auch nicht ;(
Also heißen sie dann „Text11“ und „Text12“?

reden wir von VB5 oder VB6?

Dann trag mal in den Eigenschaften bei Index eine Null ein.
Dann geht:

For i = 1 to 10
 Text1(i).Text = "Test " & Cstr(i)
Next

und wenn Du flexibel bleiben willst:

For i = Text1.LBound to Text1.Ubound
 Text1(i).Text = "Test " & Cstr(i)
Next

Das macht da Selbe, aber Du kannst noch Text1(11) hinzufügen und musst den Code nicht ändern.

Die Prozedur für das Klick-Ereignis sieht dann so aus:

Private Sub Text1\_Change(Index As Integer)

End Sub

Alle Textfelder von Text1(n) haben nur ein gemeinsames Klickereignis, in der Variablen ‚Index‘ wird zurückgegeben, welche Textbox angeklickt wurde.

Gruß Rainer

Nachtrag
Hi,

was ich vergessen habe.

Deine Textboxen kannst Du alle Text1 oder wie auch immer nennen, Du musst nur den Index hoch zählen.

Wenn Du Text1(0) kopierst und wieder einfügst, dann fügt VB für Dich Text1(1) ein, danach Text1(2) … Du muss die Indizes nicht selbst vergeben. Was Du dann hast, ist ein Steuerelementefeld.

Das geht aber nur mit VB4, VB5 und VB6. Mit VBA nicht und mit VB.NET auch nicht mehr.

Gruß Rainer

Das geht aber nur mit VB4, VB5 und VB6. Mit VBA nicht und mit
VB.NET auch nicht mehr.

Hallo Rainer,

ich weiß jetzt nicht genau, kannst du wieder Vb6.0 auf Windows testen?

Wenn ja, und du magst, teste mal bitte meinen Klassenmodulcode.

In meinem Vb5.0 kommt keine Msgbox.

Aber ich habe ihn umgeschrieben für Excel-Vba, dort funktioniert er bei Excel2000 und Excel97.

Nun dachte ich immer Excel2000 beruht auf Vb6.0 und Excel97 auf VB5.0.
Das passt aber nicht, dann dürfte er ihn Excel97 nicht funktionieren.

Zusatzproblem ist, wenn ich im VB-Editor die Version anschaue so kommt bei Excel2000 seltsamerweise jetzt VB6.5.
Ich bin brettsicher daß ich da schon Vb6.0 gelesen habe.

Okay, wahrscheinliche Ursache ist daß ich auch Excel2007 installiert habe und das beruht auf VB6.5. Irgendwie liest da Excel2000 was Falsches aus.

Und bei Excel97 wird nur angezeigt VB und dann Copyright 1987-1996.

Okay2, alles nur Excelinterna, wichtig wäre es mir daß du netterweise testet ob mein Klassenmodulcode unter Vb6.0 läuft oder nicht, Danke.

@Gurke
Ist eigentlich das Change-Ereignis das richtige Ereignis? Es wird ja bei jedem Zeichen ausgeführt was du in die Textbox eingibst.
Wie wäre es mit dem Ereignis LostFocus?
Und, es ist glaube ich noch unklar von welchem VB du sprichst, also welche Version.

Gruß
Reinhard

Moin,

Doch eigentlich nicht, aber ich kann dir nicht gleich benennen
und Klammern gehen auch nicht ;(
Also heißen sie dann „Text11“ und „Text12“?

reden wir von VB5 oder VB6?

Version: 6.5

Dann trag mal in den Eigenschaften bei Index eine Null ein.

Index? Gibts bei mir nicht :wink:

Dann geht:

For i = 1 to 10
Text1(i).Text = "Test " & Cstr(i)
Next

Also steht dann da:

Private Sub TextBox1\_Change()
 For I = 1 To 10
 TextBox1(I).Text = "Test " & CStr(I)
 Next
End Sub

und wenn Du flexibel bleiben willst:

For i = Text1.LBound to Text1.Ubound
Text1(i).Text = "Test " & Cstr(i)
Next

Wenn das andere klappt, dann dies :wink:

Die Prozedur für das Klick-Ereignis sieht dann so aus:

Private Sub Text1_Change(Index As Integer)

End Sub

Alle Textfelder von Text1(n) haben nur ein gemeinsames
Klickereignis, in der Variablen ‚Index‘ wird zurückgegeben,
welche Textbox angeklickt wurde.

Ich glaube daran liegts:

Formular- und Steuerelementnamen müssen mit einem Buchstaben beginnen und können maximal 40 Zeichen lang sein - einschließlich <u>Buchstaben, Zahlen und Unterstrichen</u> (\_).

Gruß
GURKE

Hallo Reinhard,

ich weiß jetzt nicht genau, kannst du wieder Vb6.0 auf Windows
testen?

nur im Betrieb.

Wenn ja, und du magst, teste mal bitte meinen
Klassenmodulcode.

Mach ich morgen in der Pause, wenn ich dazu komme.

In meinem Vb5.0 kommt keine Msgbox.

Aber ich habe ihn umgeschrieben für Excel-Vba, dort
funktioniert er bei Excel2000 und Excel97.

Ist doch gut! In VB5/5 gibt’s doch Steuerelementefelder. Dann muss man die doch nicht nachempfinden. In VB6 wird das nicht gebraucht, oder habe ich etwas falsch verstanden?

Nun dachte ich immer Excel2000 beruht auf Vb6.0 und Excel97
auf VB5.0.

ähmmmm, die Syntax ist ähnlich. Das war’s aber auch schon fast.
VBA ist nicht VB. In VBA gibt es keine Steuerelementefelder, die gibt es aber in VB5 und VB6. In VB haben die Steuerelemente Handles, in VBA nicht. Das macht beim Arbeiten mit API einen erheblichen Unterschied.

Das passt aber nicht, dann dürfte er ihn Excel97 nicht
funktionieren.

Zusatzproblem ist, wenn ich im VB-Editor die Version anschaue
so kommt bei Excel2000 seltsamerweise jetzt VB6.5.
Ich bin brettsicher daß ich da schon Vb6.0 gelesen habe.

Das glaibe ich nicht. :smile: VBA ist kein VB und 6.0 ist die Bezeichnung für VB6. Das kann eigentlich an keinem VBA stehen.

Okay, wahrscheinliche Ursache ist daß ich auch Excel2007
installiert habe und das beruht auf VB6.5. Irgendwie liest da
Excel2000 was Falsches aus.

Und bei Excel97 wird nur angezeigt VB und dann Copyright
1987-1996.

Okay2, alles nur Excelinterna, wichtig wäre es mir daß du
netterweise testet ob mein Klassenmodulcode unter Vb6.0 läuft
oder nicht, Danke.

Mach’ ich morgen, wenn es klappt.

@Gurke
Ist eigentlich das Change-Ereignis das richtige Ereignis? Es
wird ja bei jedem Zeichen ausgeführt was du in die Textbox
eingibst.
Wie wäre es mit dem Ereignis LostFocus?

Nein, Wenn da jetzt Change ist, und Du möchtest erst nach Ende der Eingabe prüfen, dann Validate. Das wird vor LostFocus ausgeführt.

Gruß Rainer

Hallo,

reden wir von VB5 oder VB6?

Version: 6.5

VBA. :frowning: Da gibt es keine Steuerelementefelder. Das wäre ja auch zu leicht gewesen. :smile:

Dann trag mal in den Eigenschaften bei Index eine Null ein.

Index? Gibts bei mir nicht :wink:

Ja ist klar. Mit VBA geht es so nicht. Der Code war für VB5 oder VB6.

Also steht dann da:

Private Sub TextBox1_Change()
For I = 1 To 10
TextBox1(I).Text = "Test " & CStr(I)
Next
End Sub

Geht bei Dir nicht. Das geht nur mir ‚richtigem‘ VB. :smile:

Ich glaube daran liegts:

Formular- und Steuerelementnamen müssen mit einem
Buchstaben beginnen und können maximal 40 Zeichen lang sein -
einschließlich Buchstaben, Zahlen und Unterstrichen
(_).

Es liegt daran, daß Du mit VBA arbeitest, das kann keine Steuerelementefelder.

Wenn Du nur mehrere Steuerelemente in einer Prozedur bearbeiten möchtest, kannst Du das so machen:

Dim Ctrl As Control
For Each Ctrl in Controls
 If Left(Ctrl.Name, 4) = "Text" Then
 Ctrl.Text = "gefunden"
 End If
Next

Die Strings musst Du natürlich an Deine Namen anpassen.
ACHTUNG! Code ungetestet, da können sich Tippfehler verstecken.

Daß Du für die Ereignisse aller Steuerelemente eine gemeinsame Prozedur hast, wie bei den Steuerelementefeldern in VB6, geht mit VBA so nicht. Wie man das nachbauen kann hat Dir aber Reinhard geschrieben, einfacher geht es nicht.

Gruß Rainer