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