Nacházíte se: 
WALL.cz › 
Excel návod › Jak dynamicky přidávat ovládací prvky na formulář pomocí VBA a přiřazení událostí
Pro tento příklad použiji pojmenovaný seznam "userlist", který je uveden na listě (seznam měsíců v roce) ve vzorovém souboru. V našem generovaném formuláři budeme generovat ovládací prvky Label, TextBox a CommandButton a to n-krát dle seznamu.
V editoru VBA (Alt+F11) vytvořte formulář frmLauncher, do kterého vložíte Frame. Rámu nastavte vlastnost ScrollBars na 2 - frmScrollBarsVertical, který zajistí, že vložené prvky nebudou mimo formulář.
 

Hlavní a jediný kód na formuláři bude při načítání formuláře UserForm_Initialize. Ten zajistí vygenerování všech ovládacích prvků.
Příklad kódu pro generování Labelu
    
    Dim cLbl As MSForms.Label
            
        Set cLbl = Me.Frame1.Controls.Add("Forms.Label.1")
        With cLbl
           .Name = "Label" & id
           .Caption = Bunka
           .Width = 60
           .Height = 18
           .Left = 15
           .top = TopPos
           .Tag = id     
        End With
 
Kódu pro zachycení události, který ukončuje generování Labelu
             
      'Nastavení vytvořeného labelu jako Label ve třídě.
      Set cEvent.Label = cLbl
      'Přidání třídy do Collection, takže není ztracena.
      collControls.Add cEvent
Kód pro ostatní prvky je shodný. Liší se jen pojmenováním proměnných a nastavení vlastností prvků. Zde je potřeba si dát pozor na nastavení vlastnosti prvku .Top. Tuto vlastnost je potřeba měnit proměnnou, aby se prvky generovaly rovnoměrně pod sebou. Nakonec je potřeba kód na formuláři zabalit do cyklu For Each Bunka In Range("userlist").
Kód na formuláři
Private Sub UserForm_Initialize()
'
    Dim Bunka As Range
    Dim TopPos As Integer
    Dim id As Integer
    
    Dim cLbl As MSForms.Label
    Dim cTexb As MSForms.TextBox
    Dim cCmd As MSForms.CommandButton
    
    Dim cEvent As clsEventCatcher
    
    Set collControls = New Collection
    TopPos = 4
    id = 1
    For Each Bunka In Range("userlist")
    
        'Vytvoření nové instance událostní třídy clsEventCatcher.
        Set cEvent = New clsEventCatcher
            
        'Label
        Set cLbl = Me.Frame1.Controls.Add("Forms.Label.1")
        With cLbl
           .Name = "Label" & id
           .Caption = Bunka
           .Width = 60
           .Height = 18
           .Left = 15
           .top = TopPos
           .Tag = id
           
            'Nastavení vytvořeného labelu jako Label ve třídě.
            Set cEvent.Label = cLbl
            'Přidání třídy do Collection, takže není ztracena.
            collControls.Add cEvent
            
        End With
        
        'TextBox
        Set cTexb = Me.Frame1.Controls.Add("Forms.TextBox.1")
        With cTexb
           .Name = "TextBox" & id
           .Width = 70
           .Height = 20
           .Left = 60
           .top = TopPos
           .ControlSource = "List1!$C$" & id + 2           
           .Tag = id
            Set cEvent.Text = cTexb
            collControls.Add cEvent
        End With
        
        'CommandButton
        Set cCmd = Me.Frame1.Controls.Add("Forms.CommandButton.1")
        With cCmd
           .Name = "TextBox" & id
           .Caption = Bunka
           .Width = 60
           .Height = 20
           .Left = 140
           .top = TopPos
           .Tag = id
            Set cEvent.Command = cCmd
            collControls.Add cEvent
        End With
        
        id = id + 1
        TopPos = TopPos + 20
        Me.Frame1.ScrollHeight = TopPos + 3
    Next Bunka
End Sub
Pokračujeme dále vytvořením třídy. Ve VBA editoru vytvořte prázdný modul třídy s názvem clsEventCatcher. Kód je jednoduchý. Níže je příklad pro událost Click prvku CommandButton.
Public WithEvents Command As MSForms.CommandButton
Private Sub Command_Click()
    MsgBox "CommandButton - Click"
End Sub
Na objektu v poli Procedura je náhled dostupných událostí.

Kód třídy
Public WithEvents Label As MSForms.Label
Public WithEvents Text As MSForms.TextBox
Public WithEvents Command As MSForms.CommandButton
Private Sub Label_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    frmLauncher.Caption = "Launcher - " & Label.Caption
    'MsgBox "Právě jsi přejel myší na " & Label.Name
End Sub
Private Sub Text_Change()
    Dim Ctrl As Control
    Dim index As Integer
    
    index = Text.Tag
    MsgBox "TextBox" & Text.Tag & " - Change. Hodnota: " & Text.Text
    
    For Each Ctrl In frmLauncher.Frame1.Controls
        If TypeName(Ctrl) = "TextBox" Then
            If Ctrl.Tag = index + 1 And frmLauncher.Frame1.Controls.Count < > index Then
                Ctrl.SetFocus
            End If
        End If
    Next Ctrl
    
End Sub
Private Sub Command_Click()
    MsgBox "CommandButton" & Command.Tag & ": " & Command.Caption & " - Click"
End Sub
Náhled vygenerovaného formuláře.

Vzorový soubor můžete stáhnout a vyzkoušet Nejste přihlášen(a).
 
| Autor:  admin Vydáno: 19.7.2015 21:00
 Přečteno: 23784x
 | 
Komentáře
Nebyly přidány žádné komentáře.