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: 22526x
|
Komentáře
Nebyly přidány žádné komentáře.