Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema Frame
BildScreenshot zu Frame Frame-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema Label
BildScreenshot zu Label Label-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema TextBox
BildScreenshot zu TextBox TextBox-Seite mit Beispielarbeitsmappe aufrufen

change-ereignis bei dynamisch erstellten Controls

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

  

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


  

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 !


  

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


  

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


 

Beiträge aus den Excel-Beispielen zum Thema "change-ereignis bei dynamisch erstellten Controls"