Das Archiv des Excel-Forums

change-ereignis bei dynamisch erstellten Controls

Informationen und Beispiele zu den hier genannten Dialog-Elementen:
ComboBox Frame Label ScrollBar TextBox UserForm
Bild

Betrifft: change-ereignis bei dynamisch erstellten Controls
von: Thomas

Geschrieben am: 17.03.2008 14:32:53

Hallo,
leider bin ich wieder einmal an meine Grenzen gestoßen, dabei fing's ganz gut an.
Folgendes Problem:
Sobald die Anzahl der Positionen einer Rechnung größer als eins ist, sollen diese in einer neuen UserForm aufgelistet werden und bei Bedarf geändert werden können.
Dazu habe ich eine UserForm namens 'Positionen' erstellt, auf welcher sich lediglich das Frame100 mit vertikalem Scrollbar befindet. In dieses Frame100 hinein werden nun gemäß der Anzahl der Positionen weitere Frames erzeugt. In jedes dieser Frames kommen dann Text- und ComboBoxen mit den Angaben für die jeweilige Position.
Um das zu erreichen habe ich in einem Modul Namens 'n_Positionen' folgendes stehen:
Option Explicit
Dim new_ctl As MSForms.Control '
Dim ctl_Rah(98) As Variant ' Frame Nr
Dim Oben_Rah(98) As Variant ' Frame Top
Dim ctl_Art(98, 8) As Variant ' Control Art u. Nr
Dim Höhe_Box As Variant ' Text- und Combo-Box Height
Dim Links_Box As Variant ' Text- " Left
Dim Oben_Box As Variant ' Text- " Top
Dim Breite_Box As Variant ' Text- " Width
Dim Höhe_Lbl As Variant ' Label Height
Dim Links_Lbl As Variant ' Label Left
Dim Oben_Lbl As Variant ' Label Top
Dim Breite_Lbl As Variant ' Width Width
Dim Lbl_Cap As Variant ' Label Caption


Sub multi_Positionen_erstellen()
Dim m As Integer
Dim n As Integer
For m = 0 To (Anz_Pos - 1)
' Rahmen-Name analog der Positions-Nr.
ctl_Rah(m) = "Frame" & Str(100 + (m + 1) * 10)
' Positionierung der Rahmen
Oben_Rah(m) = (6 + (m * 102))
' Controls-Art Text- oder ComboBox
For n = 0 To 8
If ((n = 4) Or (n = 6)) Then
ctl_Art(m, n) = "ComboBox" & Str(100 + (m + 1) * 10) + (n)
Else
ctl_Art(m, n) = "TextBox" & Str(100 + (m + 1) * 10) + (n)
End If
Next n
Next m
' Positionierung der Text- und Combo-Boxen
Höhe_Box = Array(18, 18, 54, 18, 18, 18, 18, 18, 18)
Links_Box = Array(5, 30, 82, 386, 453, 493, 82, 386, 493)
Oben_Box = Array(15, 15, 15, 15, 15, 15, 72, 72, 72)
Breite_Box = Array(22, 48, 300, 63, 36, 63, 300, 63, 63)
' Positionierung und Beschriftung der Labels
Höhe_Lbl = Array(9, 9, 9, 9, 9, 9, 15, 9, 9)
Links_Lbl = Array(5, 30, 82, 386, 453, 493, 6, 386, 493)
Oben_Lbl = Array(4, 4, 4, 4, 4, 4, 74, 60, 60)
Breite_Lbl = Array(22, 29, 76, 42, 30, 55, 72, 54, 66)
Lbl_Cap = Array("Pos.", "Menge", "Warenbezeichnung", _
"Einzelpreis", "Einheit", "Gesatpreis", _
"Ergänzungszeile", "Einzelpreis EZ", "Gesamtpreis EZ")
' Gesamt-Rahmen Scroll-Bereich festlegen
Positionen.Frame100.ScrollHeight = 103 * Anz_Pos
For m = 0 To (Anz_Pos - 1)
' Positions-Rahmen erstellen
Set new_ctl = Positionen.Controls("Frame100") _
.Controls.Add("Forms.Frame.1", ctl_Rah(m), True)
new_ctl.Move Left:=6, Top:=Oben_Rah(m), Width:=564, Height:=96
' Control Text- bzw. Combo-Box erstellen und positionieren
For n = 0 To 8
If ((n = 4) Or (n = 6)) Then
Set new_ctl = Positionen.Controls(ctl_Rah(m)) _
.Controls.Add("Forms.ComboBox.1", ctl_Art(m, n), True)
Else
Set new_ctl = Positionen.Controls(ctl_Rah(m)) _
.Controls.Add("Forms.TextBox.1", ctl_Art(m, n), True)
End If
new_ctl.Move Left:=Links_Box(n), Top:=Oben_Box(n), _
Width:=Breite_Box(n), Height:=Höhe_Box(n)
With new_ctl
.Font.Size = 10
.Text = ctl_Art(m, n)
If n = 0 Then
.Text = Format((m + 1), "0#")
.Enabled = False
End If
End With
' Control Label erstellen, positionieren und beschriften
Set new_ctl = Positionen.Controls(ctl_Rah(m)) _
.Controls.Add("Forms.Label.1", "Label" & n, True)
new_ctl.Move Left:=Links_Lbl(n), Top:=Oben_Lbl(n), _
Width:=Breite_Lbl(n), Height:=Höhe_Lbl(n)
With new_ctl
.Caption = Lbl_Cap(n)
If n = 6 Then
.SpecialEffect = fmSpecialEffectEtched
.TextAlign = fmTextAlignCenter
End If
End With
Next n
Next m
End Sub


Nun werden in die einzelnen Text- und Combobexen Werte eingetragen:


Sub multi_Positionen_eintragen()  ' Werte in Text- und Combo-Boxen eintragen
Dim m As Integer
Dim n As Integer
Dim Zeile As Integer
Zeile = DatenZeile1
For m = 0 To (Anz_Pos - 1)
For n = 1 To 8
Positionen.Controls(ctl_Art(m, n)).Text = Cells(Zeile, n + 21)
Next n
Zeile = Zeile + 1
Next m
End Sub


Wie kann ich aber jetzt für jede Text- oder ComboBox, sofern diese verändert wurde, ein Change-Ereignis erzeugen um die Daten entsprechend neu zu berechnen und wieder in die Tabelle zu schreiben?
Das Ganze soll wie gesagt nicht am Ende durch einen Button "neu berechnen" o.ä. erfolgen, sondern fortlaufend bei jeder Änderung in der UserForm neu dargestellt und gegebenen Falls auch neu berechnet werden.
Das einzige was mir dazu einfällt ist ein Change_Ereignis, aber dies habe ich nicht hinbekommen.
Viele Grüße
Thomas

Bild

Betrifft: AW: change-ereignis bei dynamisch erstellten Contr
von: Rudi Maintaire
Geschrieben am: 17.03.2008 14:36:32
Hallo,
dazu musst du eine eigene Klasse für die Elemente erstellen.
guter Einstieg: http://www.online-excel.de/excel/grusel_vba.php?f=7
Gruß
Rudi
Eine Kuh macht Muh, viele Kühe machen Mühe

Bild

Betrifft: AW: change-ereignis bei dynamisch erstellten Controls
von: Heiko S.

Geschrieben am: 17.03.2008 14:38:07
Hallo Thomas,
da hilft es dann wohl nichts, du mußt dich weiterentwickeln und eine eigene Klasse dafür erstellen.
Alles weitere dazu findest du hier http://www.online-excel.de/excel/grusel_vba.php?f=7
Wenn du da durch bist klappt es auch mit dem Change !!!
Gruß Heiko

PS: Rückmeldung wäre nett !

Bild

Betrifft: AW: change-ereignis bei dynamisch erstellten Controls
von: Thomas
Geschrieben am: 17.03.2008 14:57:42
Hallo Rudi,
Hallo Heiko,
vielen Dank für Eure schnell Antworten.
Ihr habt damit meine schlimmsten Befürchtungen erfüllt. :-(
Von Klassen weiß ich gerade mal, daß es sie geben soll.
Viele Grüße
Thomas

Bild

Betrifft: AW: change-ereignis bei dynamisch erstellten Controls
von: Renee

Geschrieben am: 17.03.2008 15:04:55
Hi Thomas,
Ihr habt damit meine schlimmsten Befürchtungen erfüllt. :-(
Du musst es nur positiv sehen:
Ihr habt damit meine besten Chancen bestätigt. :-)
Aber offen lassen der Frage nützt nix, da es keine andere Lösung gibt!
GreetZ Renée

 Bild

Excel-Beispiele zum Thema "change-ereignis bei dynamisch erstellten Controls"

Im Change-Ereignis Eingabe in oder Leeren von Zellen erkennen download Makroverzweigung im Change-Ereignis download
Beispiele zum Einsatz des SelectionChange-Ereignisses download Dynamischen Dialog erstellen download
Dynamische Postleitzahldatenbank download Dynamischer Monatsarbeitsplan download
Summe über dynamischen Bereich bilden download Dynamisches Diagramm download
Dynamische Generierung von Programmteilen download Dynamischer Blattname in SVERWEIS-Formel download
Dynamischer Hyperlink download Dynamischer Kalender mit Jahr, Quartal und Monaten download
Diagramm dynamisch erstellen download Dynamische Gültigkeitsliste download
Symbolleiste beim Öffnen erstellen und dynamisch halten download Einen Trainingsplan dynamisch gestalten download
Dynamisch Blatt-ComboBoxes download Dynamische Abschlußlinie unter benutzten Bereich ziehen download
Dynamische Tabelle mit Tages, Wochen- und Monatsbereichen download Name der zuletzt erstellten CheckBox auslesen download