Nacházíte se: WALL.czExcel návod › Jak dynamicky přidávat ovládací prvky na formulář pomocí VBA a přiřazení událostí
Kategorie: Excel návod

Jak dynamicky přidávat ovládací prvky na formulář pomocí VBA a přiřazení událostí

ExcelDynamické generování ovládacích prvků na formuláři je velmi užitečné, pokud nevíte, kolik takových prvků bude. Zpravidla se vždy jedná o velké mmnožství prvků z definovaného seznamu.

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ář.

Dynamicky generované ovládací prvky na formuláři a události

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í.
Dynamicky generované ovládací prvky na formuláři a události

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.
Dynamicky generované ovládací prvky na formuláři a události

Vzorový soubor můžete stáhnout a vyzkoušet Nejste přihlášen(a).

print Formát pro tisk

Sdílet článek:

Komentáře rss

Přidat komentář >

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

Uživatelské menu

Nejste přihlášen(a)
avatar\n

Menu

Formulář Faktura

Formulář Faktura IV

Oblíbený formulář Faktura byl vylepšen a rozšířen.
Více se dočtete zde.

Helios iNuvio

Používáte podnikový systém Helios iNuvio? Potřebujete pomoci se správou nebo vyvinout SQL proceduru? Více informací naleznete na stránce Helios iNuvio.

On-line nástroje