Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1220to1224
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
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

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
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
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

300 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige