Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: durch vba erstellte textbox ansprechen

durch vba erstellte textbox ansprechen
Jürgen
Hallo zusammen,
ich habe mir eine Art dynamisches Formular erstellt (siehe Anhang).
Dort läuft eine Schleife und nimmt für jede Zeile in der Tabelle eine Textbox und schreibt den Inhalt der aktuellen Zelle in diese Textbox.
Nun möchte ich aber auf das ändern dieser Textbox reagieren, wenn ein Nutzer nach dem Anzeigen dort ggf. neue Daten einträgt, dann sollen diese wieder in die Tabelle zurückgeschrieben werden. Im Regelfall leicht umzusetzen. Wie mache ich das aber, wenn ich gar nicht weiß, wie viele Textboxen entstehen. Es können ja je nach Tabelle mal 10 oder 20 oder auch nur 5 sein. Wie kann ich hier das Exit Ereignis oder das AfterUpdate Ereignis abfangen?
Vielen Dank für Eure Hilfe!
Hier die Datei
https://www.herber.de/bbs/user/75558.xls
Viele Grüße
Jürgen
Anzeige
AW: durch vba erstellte textbox ansprechen
01.07.2011 18:46:25
Beverly
Hi Jürgen,
der einfachste Weg: schreibe die Zelle in die Tag-Eigenschaft der TextBox:
    UserForm1.Controls(aktuellerBoxName).Tag = Cells(Zeile, 2).Address(False, False)

und erstelle auf dem UserForm fest einen CommandButton mit folgendem Code:
Private Sub CommandButton1_Click()
Dim ctrElement As Control
For Each ctrElement In Me.Controls
If TypeName(ctrElement) = "TextBox" Then Worksheets("Tabelle1").Range(ctrElement.Tag) =  _
ctrElement
Next ctrElement
End Sub

Andere Möglichkeit: verwende Klassenprogrammierung.


Anzeige
z. Bsp. mit 'nem Klassenmodul
01.07.2011 19:15:50
Christian
Hallo Jürgen,
In deinem Userform:
Option Explicit
Dim colTxt As New Collection
Private Sub UserForm_Initialize()
Dim objCls As clsTxt
Dim sngTop As Single
Dim i As Long
Const sngDIST As Single = 25
sngTop = sngDIST
For i = 2 To Tabelle1.Cells(Rows.Count, 1).End(xlUp).Row
Set objCls = New clsTxt
Set objCls.cntrTxt = Me.Controls.Add("forms.TextBox.1", "txt_" & i, True)
With objCls.cntrTxt
.Left = 15
.Top = sngTop
.Height = 18
.Width = 60
.Value = Tabelle1.Cells(i, 2)
End With
sngTop = sngTop + sngDIST
colTxt.Add objCls
Next
Me.Height = sngTop + sngDIST
Set objCls = Nothing
End Sub
des Weiteren in einem Klassenmodul (mit dem Namen "clsTxt"). Hier stehen dir die Events zur Verfügung. Diese gelten dann für alle Textboxes.
Option Explicit
Public WithEvents cntrTxt As MSForms.TextBox
achja, und der Code zum Aufrufen des Userforms im Klassenmodul der Tabelle1:
Option Explicit
Private Sub cmdFrmAufrufen_Click()
UserForm1.Show
End Sub
Gruß
Christian
Anzeige
Änderungen werden nicht übernommen
04.07.2011 09:31:56
Jürgen
Hallo Christian,
ich habe alles so eingetragen, wie du geschrieben hast.
Das Userform öffnet sich genauso wie vorher, aber eine Änderung in den Werten wird nicht in die Tabelle zurückgeschrieben.
https://www.herber.de/bbs/user/75577.xls
Kann sich das nochmal jemand ansehen?
Danke!
Viele Grüße
Jürgen
Anzeige
AW: Änderungen werden nicht übernommen
04.07.2011 14:33:35
Heiko
Hallo Jürgen,
da mußt du wohl noch ein wenig mehr tun, die Ereignisüberwachung hast du z.B. noch garnicht drin.
Aber das ganze Thema Klassen ist eh nicht ohne, hier bei Online-Excel ist dazu eine gute Einführung.
http://www.online-excel.de/excel/grusel_vba.php?f=7
Kämpf dich da mal durch, dann solltest du dein Problem auch gelöst kriegen.
Und vor allem gib nicht auf bevor du "Klassen [5] - Events [1] - Steuerelemente" erreicht hast,
da ist nämlich das drin was dich interessiert.
Gruß Heiko
Anzeige
AW: Änderungen werden nicht übernommen
04.07.2011 20:12:00
Beverly
Hi Jürgen,
im UserForm:
Option Explicit
Dim colTxt() As New clsTxt
Private Sub UserForm_Initialize()
Dim objCls As clsTxt
Dim sngTop As Single
Dim i As Long
Const sngDIST As Single = 25
sngTop = sngDIST
For i = 2 To Tabelle1.Cells(Rows.Count, 1).End(xlUp).Row
Set objCls = New clsTxt
Set objCls.cntrTxt = Me.Controls.Add("forms.TextBox.1", "txt_" & i, True)
With objCls.cntrTxt
.Left = 15
.Top = sngTop
.Height = 18
.Width = 60
.Tag = Cells(i, 2).Address
.Value = Tabelle1.Cells(i, 2)
End With
sngTop = sngTop + sngDIST
ReDim Preserve colTxt(1 To i - 1)
Set colTxt(i - 1).cntrTxt = objCls.cntrTxt
Next
Me.Height = sngTop + sngDIST
End Sub
Im Klassenmodul:

Option Explicit
Public WithEvents cntrTxt As MSForms.TextBox
Private Sub cntrTxt_Change()
Worksheets("Tabelle1").Range(cntrTxt.Tag) = CDbl(cntrTxt)
End Sub


Anzeige
Danke Berverly; Klappt! Danke Heiko für Hinweis
05.07.2011 11:36:14
Jürgen
Danke Euch beiden. Ich werds versuchen
04.07.2011 09:21:38
Jürgen
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Textfeld in Excel VBA ansprechen und bearbeiten


Schritt-für-Schritt-Anleitung

  1. UserForm erstellen:

    • Öffne Excel und drücke ALT + F11, um den VBA-Editor zu starten.
    • Füge ein neues UserForm hinzu, indem du im Projekt-Explorer mit der rechten Maustaste auf dein Projekt klickst und Einfügen > UserForm wählst.
  2. TextBox hinzufügen:

    • Ziehe eine TextBox aus der Toolbox auf das UserForm. Du kannst auch mehrere TextBoxen dynamisch erstellen, wie im Forum beschrieben.
    • Verwende den folgenden Code, um mehrere TextBoxen basierend auf den Werten in einer Excel-Tabelle zu erstellen:
      Dim objCls As clsTxt
      Dim sngTop As Single
      Dim i As Long
      Const sngDIST As Single = 25
      sngTop = sngDIST
      For i = 2 To Tabelle1.Cells(Rows.Count, 1).End(xlUp).Row
      Set objCls = New clsTxt
      Set objCls.cntrTxt = Me.Controls.Add("forms.TextBox.1", "txt_" & i, True)
      With objCls.cntrTxt
         .Left = 15
         .Top = sngTop
         .Height = 18
         .Width = 60
         .Value = Tabelle1.Cells(i, 2)
      End With
      sngTop = sngTop + sngDIST
      Next
  3. Tag-Eigenschaft nutzen:

    • Setze die Tag-Eigenschaft der TextBox auf die Adresse der Zelle, um später auf diese zuzugreifen:
      UserForm1.Controls(aktuellerBoxName).Tag = Cells(Zeile, 2).Address(False, False)
  4. Ereignisse abfangen:

    • Verwende das Change-Ereignis, um Änderungen in der TextBox zu überwachen und die neuen Werte in die Tabelle zurückzuschreiben:
      Private Sub cntrTxt_Change()
      Worksheets("Tabelle1").Range(cntrTxt.Tag) = CDbl(cntrTxt)
      End Sub
  5. UserForm anzeigen:

    • Füge einen Button hinzu, um die UserForm anzuzeigen:
      Private Sub cmdFrmAufrufen_Click()
      UserForm1.Show
      End Sub

Häufige Fehler und Lösungen

  • Änderungen werden nicht übernommen:

    • Stelle sicher, dass du das Change-Ereignis in deinem Klassenmodul implementiert hast. Wenn du die TextBoxen dynamisch erstellst, achte darauf, dass die Referenz korrekt gesetzt ist.
  • TextBox bleibt leer:

    • Überprüfe, ob du den richtigen Wert in der TextBox gesetzt hast. Wenn die Zelle leer ist, bleibt auch die TextBox leer.
  • UserForm öffnet sich nicht:

    • Vergewissere dich, dass du den richtigen Code zum Anzeigen des UserForms verwendest und dass keine Fehler im Code vorhanden sind.

Alternative Methoden

  • Klassenprogrammierung:

    • Eine der robustesten Methoden ist die Verwendung von Klassenmodulen. Definiere ein Klassenmodul wie clsTxt, um die TextBoxen zu verwalten und deren Eigenschaften und Ereignisse sauber zu kapseln.
  • Direktes Ansprechen von TextBoxen:

    • Du kannst auch direkt auf die TextBoxen zugreifen, indem du deren Namen in Code verwendest. Dies ist jedoch weniger flexibel, wenn die Anzahl der TextBoxen variieren kann.

Praktische Beispiele

Hier ein Beispiel, wie du mit dem Change-Ereignis arbeiten kannst, um Werte zurück in die Excel-Tabelle zu schreiben:

Private Sub cntrTxt_Change()
    Worksheets("Tabelle1").Range(cntrTxt.Tag) = cntrTxt.Value
End Sub

Wenn die TextBox mit dem Namen txt_2 beispielsweise verändert wird, wird der neue Wert in die Zelle geschrieben, die in der Tag-Eigenschaft der TextBox gespeichert ist.


Tipps für Profis

  • Verwende die WithEvents-Anweisung: Dadurch kannst du Ereignisse für die dynamisch erstellten TextBoxen nutzen, was den Code übersichtlicher und leichter wartbar macht.

  • Ereignisprozeduren optimieren: Versuche, die Logik in den Ereignisprozeduren minimal zu halten, um die Performance zu erhöhen.

  • Verwendung von Option Explicit: Dies hilft dir, Fehler bei der Variablenverwendung zu vermeiden, da du alle Variablen deklarieren musst.


FAQ: Häufige Fragen

1. Wie viele TextBoxen kann ich erstellen? Du kannst beliebig viele TextBoxen erstellen, solange dein Code und die Ressourcen deines Systems dies zulassen.

2. Gibt es einen Unterschied zwischen einer TextBox und einer InputBox? Ja, eine TextBox ist ein Steuerelement auf einem UserForm, während eine InputBox eine einfache Eingabemethode ist, die eine Eingabeaufforderung anzeigt.

3. Wie kann ich TextBoxen nach dem Erstellen anpassen? Du kannst die Eigenschaften der TextBoxen direkt im Code anpassen, wie z.B. Größe, Position und Formatierung.

4. Kann ich die gleichen Methoden auch in Word VBA verwenden? Ja, die Konzepte sind ähnlich, aber die spezifischen Objekte und Methoden können variieren.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige