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: 23770x
|
Pokud máte ve svém mobilu nainstalovanou čtečku QR kódů, načtením tohoto kódu přenesete článek do prohlížeče svého mobilního telefenu.

Komentáře
Nebyly přidány žádné komentáře.