Hallo zusammen, nach 5 Zeichen in meiner TextBox soll automatisch ein Button betätigt werden... (ohne Enter zu drücken)?

3 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

Sowas wie PerformClick gibt es scheinbar nicht in VBA aber folgendes geht:

Private Sub CommandButton1_Click()
MsgBox "Geklickt!"
End Sub

Private Sub TextBox1_Change()
If Len(TextBox1.Text) = 5 Then
CommandButton1_Click
End If
End Sub

Woher ich das weiß:Berufserfahrung – Softwareentewickler / Unternehmensberater bei CSDIT iR

Iamiam  03.12.2016, 13:20

DH! wobei man hier auch das Ganze auf ein einzeiliges if (ohne endif) reduzieren könnte (es gibt ja keinen Befehl für eine Else-Alternative):

If Len(TextBox1.Text) = 5 Then CommandButton1_Click
1
geri3d  03.12.2016, 14:40
@Iamiam

ja, habe ich auch gedacht wobei End If ist etwas übersichtlicher

1
Iamiam  03.12.2016, 15:20
@geri3d

"onCellChange": so nicht aber als Worksheet_Change und Einschränkung des Bereichs auf Zelle(n):

  • Sub Worksheet_Change(ByVal Target As Range)
  • If not intersect(Target, Range("A1:D3") is Nothing then
  • gewünschte Aktion(en)
  • Exit Sub
  • Else: "das gleiche nochmal mit einem anderen Bereich und anderen Aktionen"
  • End if: 
  • End Sub ' das not intersect() is nothing deshalb, damit bei zB ausgewähltem Objekt kein störender Fehler auftritt.
0

Nur um es noch mal zu bekräftigen:
Ohne Enter zu drücken, also ohne die Eingabe zu beenden, wird kein Ereignis ausgelöst und es gibt somit auch keine Möglichkeit mit VBA darauf zu reagieren.
Ich denke, dass ist in vielen anderen Programmiersprachen aber auch nicht anders.

Woher ich das weiß:Berufserfahrung – IT-Administrator (i.R.)

geri3d  03.12.2016, 14:43

es ging ja auch um eine Textbox bei VBA Userformen und keine Zelle, wobei gibt es nicht auch onCellCange?

0
Oubyi, UserMod Light  03.12.2016, 14:46
@geri3d

Dass es um eine Textbox geht, war mir klar, aber auch da wird, meines Erachtens erst ein Ereignis ausgelöst, wenn man die Eingabe abschließt.

0

so, mal konkret nachgestellt: Die Lösung von geri3d funktioniert in dieser Form. TextBox_change reagiert auf jede Eingabe. Allerdings ist die Frage, ob man denn ein Button_click auslösen soll oder nicht einfach direkt den Code ablaufen lässt, der vorgesehen ist, wenn 5 Stellen gefüllt sind. Egal.

Bei dieser Art der Überwachung der TextBox ist ggf. eher relevant, dass nicht ständig das TextBox_change zu weiteren Anweisungen führt. Dafür wäre eine public variable notwendig, um zu identifizieren, wann erstmalig ein 5stelliger Eintrag gemacht wurde 


Michi19756 
Beitragsersteller
 03.12.2016, 21:37

Ich glaube, ich sollte mich erstmal als absoluten Anfänger outen... Die bisherigen Funktionen habe ich nur mit sehr viel Hilfe aus der Community bewältigt und stehe jetzt halt vor diesem letzten Problem. Ich zeige euch einfach mal den bisherigen Code. Für die Antworten bedanke ich mich schon mal, ich habe es trotzdem noch nicht hin bekommen...

Verzeiht mir bitte, falls ich irgendeinen Schmarrn da rein geballert habe, aber es funktioniert bisher ganz gut, bis auf diese eine Funktion, welche ich eben in der Frage beschrieben habe.

Private Sub CommandButton1_Click()
Dim wo_log As Long
Dim wo_zutritt As Long
Dim zutritt As Long
Dim logbuch As String
Dim zutritte As String
Dim firmen As String
logbuch = "Logbuch"
zutritte = "Zutritte"
firmendaten = "Firmen"
Dim fa_name As String
If InStr(TextBox1.Value, "A:A") > 0 Then fa_name = Left(TextBox1.Value, InStr(TextBox1.Value, "A:A") - 1) Else: fa_name = TextBox1.Value
If WorksheetFunction.CountIf(Sheets(firmendaten).Range("A:A"), fa_name) = 0 Then
Label2.Caption = "ACHTUNG - KEIN ZUTRITT!"
Beep
Exit Sub
End If
wo_log = Sheets(logbuch).Cells(Rows.Count, 1).End(xlUp).Row + 1
Sheets(logbuch).Cells(wo_log, 1).Value = TextBox1.Value
Sheets(logbuch).Cells(wo_log, 2).Value = Now()
wo_zutritt = Sheets(zutritte).Cells(Rows.Count, 1).End(xlUp).Row + 1
If WorksheetFunction.CountIf(Sheets(zutritte).Range("A:A"), TextBox1.Value) = 0 Then
Sheets(zutritte).Cells(wo_zutritt, 1).Value = TextBox1.Value
Sheets(zutritte).Cells(wo_zutritt, 4).Value = Now()
On Error Resume Next
Sheets(zutritte).Cells(wo_zutritt, 2).Value = WorksheetFunction.VLookup(TextBox1.Value, Sheets(firmendaten).Range("A:B"), 2, False)
Sheets(zutritte).Cells(wo_zutritt, 3).Value = WorksheetFunction.VLookup(TextBox1.Value, Sheets(firmendaten).Range("A:C"), 3, False)
TextBox1.Value = ""
Exit Sub
End If
For i = wo_zutritt To 2 Step -1
If Sheets(zutritte).Cells(i, 1).Value = TextBox1.Value And Sheets(zutritte).Cells(i, 5).Value = "" Then
Sheets(zutritte).Cells(i, 5).Value = Now()
TextBox1.Value = ""
Exit Sub
End If
If Sheets(zutritte).Cells(i, 1).Value = TextBox1.Value Then
Sheets(zutritte).Cells(wo_zutritt, 1).Value = TextBox1.Value
Sheets(zutritte).Cells(wo_zutritt, 4).Value = Now()
On Error Resume Next
Sheets(zutritte).Cells(wo_zutritt, 2).Value = WorksheetFunction.VLookup(TextBox1.Value, Sheets(firmendaten).Range("A:B"), 2, False)
Sheets(zutritte).Cells(wo_zutritt, 3).Value = WorksheetFunction.VLookup(TextBox1.Value, Sheets(firmendaten).Range("A:C"), 3, False)
TextBox1.Value = ""
Exit Sub
End If
Next
End Sub

Private Sub TextBox1_Change()
Dim fa_name As String
If InStr(TextBox1.Value, "/") > 0 Then fa_name = Left(TextBox1.Value, InStr(TextBox1.Value, "/") - 1) Else: fa_name = TextBox1.Value
If Len(TextBox1.Value) < 2 Then
Label1.Caption = ""
Label2.Caption = ""
Exit Sub
End If
On Error Resume Next
Label1.Caption = WorksheetFunction.VLookup(fa_name, Sheets("Firmen").Range("A:B"), 2, False) & " " & WorksheetFunction.VLookup(TextBox1.Value, Sheets("Firmen").Range("A:C"), 3, False)
Exit Sub
End Sub

Private Sub TextBox1_GotFocus()

End Sub

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 13 Then
CommandButton1_Click
End If
End Sub

0
Ninombre  04.12.2016, 08:46
@Michi19756

der erste Teil kommt mir bekannt vor...funktioniert das wie gewünscht? Was ich nicht mehr ganz im Kopf habe, ist was hiermit erreicht werden soll:

If InStr(TextBox1.Value, "A:A") > 0 Then fa_name =
Left(TextBox1.Value, InStr(TextBox1.Value, "A:A") - 1) Else: fa_name = TextBox1.Value

Wenn es funktioniert, ist es aber egal. Mir ist nur aufgefallen, dass Du im sub textbox1_change auf ein / abfragst.

Wenn Du wirklich einfach nur den Klick auf den Button umgehen willst, ist der Ansatz von geri3d schon richtig. Dann gehört da auch nicht mehr Logik rein, als dass man das textbox1_change abfragt und bei 5 Stellen das andere Makro aufruft. Das heißt aber, dass man auch nicht mehr als 5 Stellen eingeben kann, den bei 5 läuft es los.

Was brauchst Du noch an Abfragen in dieser Prüfung?

1
Michi19756 
Beitragsersteller
 05.12.2016, 03:18
@Ninombre

Es funktioniert einwandfrei :-) danke nochmals! Ich habe es dank euch jetzt auch endlich hinbekommen... jetzt stehe ich nur vor dem nächsten Problem. Und zwar haben wir ja ein Label eingefügt auf dem der Name des Mitarbeiters und der Firma angezeigt wird. Dieser wird ja nach betätigen des Buttons wieder geleert. Das bedeutet in dem Fall, dass ich in dem Label nach der Eingabe der fünf Zeichen jetzt diese Informationen auch nicht mehr angezeigt bekomme. Ist es möglich, dass das Label z.B. erst nach ein paar Sekunden geleert wird oder dass die letzten Informationen einfach bis zur nächsten Eingabe drin stehen bleiben?

Ich hoffe, ich nerve nicht mit der vielen Fragerei aber Ihr habt mir schon sehr weiter geholfen! Ach und zu dem anderen habe ich ehrlich gesagt selbst keine Ahnung mehr, wofür das mal gedacht war... wie gesagt, funktioniert halt :-)

0
Ninombre  05.12.2016, 10:42
@Michi19756

wie sieht es denn genau aus? In dem ursprünglichen Makro (button_click) wird nur einmal das Label 2 verwendet, nämlich wenn nichts gefunden wurde. Verwendest Du das Makro genau in dieser Form wie oben reinkopiert oder hast Du für die Frage hier schon etwas geändert? In dem Entwurf von textbox1_change hast Du nämlich label1 und label2 erwähnt.

Die Textbox muss man aus meiner Sicht schon leeren, sonst läuft das Makro für textbox_change mit einem falschen Wert los (also wenn man die erste Stelle überschreibt und der bisherige Wert noch drin steht, findet das Makro eine Länge = 5 und läuft mit falschem Wert los).

Den bisherigen Wert könnte man in eines der Label schreiben oder ein zusätzliches Label einfügen

0
Michi19756 
Beitragsersteller
 06.12.2016, 04:44
@Ninombre

Also das jetzige Makro sieht folgendermaßen aus:

Private Sub CommandButton1_Click()
Dim wo_log As Long
Dim wo_zutritt As Long
Dim zutritt As Long
Dim logbuch As String
Dim zutritte As String
Dim firmen As String
logbuch = "Logbuch"
zutritte = "Zutritte"
firmendaten = "Firmen"
Dim fa_name As String
If InStr(TextBox1.Value, "A:A") > 0 Then fa_name = Left(TextBox1.Value, InStr(TextBox1.Value, "A:A") - 1) Else: fa_name = TextBox1.Value
If WorksheetFunction.CountIf(Sheets(firmendaten).Range("A:A"), fa_name) = 0 Then
Label2.Caption = "ACHTUNG - KEIN ZUTRITT!"
Beep
Exit Sub
End If
wo_log = Sheets(logbuch).Cells(Rows.Count, 1).End(xlUp).Row + 1
Sheets(logbuch).Cells(wo_log, 1).Value = TextBox1.Value
Sheets(logbuch).Cells(wo_log, 2).Value = Now()
wo_zutritt = Sheets(zutritte).Cells(Rows.Count, 1).End(xlUp).Row + 1
If WorksheetFunction.CountIf(Sheets(zutritte).Range("A:A"), TextBox1.Value) = 0 Then
Sheets(zutritte).Cells(wo_zutritt, 1).Value = TextBox1.Value
Sheets(zutritte).Cells(wo_zutritt, 4).Value = Now()
On Error Resume Next
Sheets(zutritte).Cells(wo_zutritt, 2).Value = WorksheetFunction.VLookup(TextBox1.Value, Sheets(firmendaten).Range("A:B"), 2, False)
Sheets(zutritte).Cells(wo_zutritt, 3).Value = WorksheetFunction.VLookup(TextBox1.Value, Sheets(firmendaten).Range("A:C"), 3, False)
TextBox1.Value = ""
Exit Sub
End If
For i = wo_zutritt To 2 Step -1
If Sheets(zutritte).Cells(i, 1).Value = TextBox1.Value And Sheets(zutritte).Cells(i, 5).Value = "" Then
Sheets(zutritte).Cells(i, 5).Value = Now()
TextBox1.Value = ""
Exit Sub
End If
If Sheets(zutritte).Cells(i, 1).Value = TextBox1.Value Then
Sheets(zutritte).Cells(wo_zutritt, 1).Value = TextBox1.Value
Sheets(zutritte).Cells(wo_zutritt, 4).Value = Now()
On Error Resume Next
Sheets(zutritte).Cells(wo_zutritt, 2).Value = WorksheetFunction.VLookup(TextBox1.Value, Sheets(firmendaten).Range("A:B"), 2, False)
Sheets(zutritte).Cells(wo_zutritt, 3).Value = WorksheetFunction.VLookup(TextBox1.Value, Sheets(firmendaten).Range("A:C"), 3, False)
TextBox1.Value = ""
Exit Sub
End If
Next
End Sub

Private Sub TextBox1_Change()
Dim fa_name As String
If InStr(TextBox1.Value, "/") > 0 Then fa_name = Left(TextBox1.Value, InStr(TextBox1.Value, "/") - 1) Else: fa_name = TextBox1.Value
If Len(TextBox1.Value) < 2 Then
Label1.Caption = ""
Label2.Caption = ""
Exit Sub
End If
On Error Resume Next
Label1.Caption = WorksheetFunction.VLookup(fa_name, Sheets("Firmen").Range("A:B"), 2, False) & " " & WorksheetFunction.VLookup(TextBox1.Value, Sheets("Firmen").Range("A:C"), 3, False)
If Len(TextBox1.Text) = 6 Then
CommandButton1_Click
End If
Exit Sub
End Sub

Private Sub TextBox1_GotFocus()

End Sub

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 13 Then
CommandButton1_Click
End If
End Sub

Wir hatten 2 Label, da in dem einen der Mitarbeiter und die Firma erscheinen sollte und in dem anderen, falls nichts gefunden wurde, die Meldung "Achtung - kein Zutritt". Die Sache mit dem MA und der Firma wäre halt schön, wenn die zumindest für kurze Zeit sichtbar wären... bei "Achtung - Kein Zutritt" ist das ganze kein Problem, da dann sowieso der Inhalt der Textbox manuell gelöscht werden muss.

0