voorbeeldbestand
VBA-objecten met VBA-code maken/wijzigen



1 Workbook en VBProject

2 Modules

2.1 Module benaderen

2.2 Alle modulenamen

2.3 Modulenaam wijzigen
2.3.1 Werkboeknaam
2.3.2 Werkbladnaam
2.3.3 Userformnaam
2.3.4 Macromodulenaam
2.3.5 Klassemodulenaam

2.4 Module toevoegen
2.4.1 Werkbladmodule
2.4.2 Macromodule
2.4.3 Userform
2.4.4 Klassemodule

2.5 Module exporteren
2.5.1 Macromodule
2.5.2 Userform
2.5.3 Werkblad
2.5.4 Klassemodule
2.5.5 Werkboek
2.5.6 Alle modules

2.6 Module importeren
2.6.1 Werkblad
2.6.2 Macromodule
2.6.3 Userform
2.6.4 Klassemodule
2.6.5 Werkboek

2.7 Module verwijderen
2.7.1 Werkblad
2.7.2 Macromodule
2.7.3 Userform
2.7.4 Klassemodule
2.7.5 Alle modules

2.8 Module kopiŽren
2.8.1 Werkblad
2.8.2 Macromodule
2.8.3 Userform
2.8.4 Klassemodule
2.8.5 Alle macromodules

2.9 Module verplaatsen
2.9.1 Werkblad binnen werkboek
2.9.2 Werkblad ander werkboek
2.9.3 Userform
2.9.4 Macromodule
2.9.5 Klassemodule

3 De inhoud van een module
3.1 Codemodule
3.1.1 Volledige VBA-code lezen
3.1.2 Deel VBA-code lezen
3.1.3 Alle code verwijderen

3.2 Macromodule
3.2.1 Macro
3.2.1.1 Alle macro's
3.2.1.2 zoeken
3.2.1.3 toevoegen
3.2.1.4 code lezen
3.2.1.5 kopiŽren
3.2.1.6 code vervangen
3.2.1.7 hernoemen
3.2.1.8 verwijderen
3.2.1.9 verplaatsen

3.2.2 Functie
3.2.2.1 Alle functies
3.2.2.2 zoeken
3.2.2.3 toevoegen
3.2.2.4 code lezen
3.2.2.5 kopiŽren
3.2.2.6 code vervangen
3.2.2.7 hernoemen
3.2.2.8 verwijderen
3.2.2.9 verplaatsen

3.3 Werkboek
3.3.1 Macro's
3.3.2 Functies
3.3.3 Gebeurtenisprocedures
3.3.3.1 Alle gebeurteniscode
3.3.3.2 zoeken
3.3.3.3 lezen
3.3.3.4 verwijderen
3.3.3.5 toevoegen
3.3.3.6 kopiŽren
3.3.3.7 verplaatsen

3.4 Werkblad
3.4.1 Macro's
3.4.2 Functies
3.4.3 Gebeurteniscode
3.4.3.1 Alle gebeurteniscode
3.4.3.2 zoeken
3.4.3.3 lezen
3.4.3.4 verwijderen
3.4.3.5 toevoegen
3.4.3.6 kopiŽren
3.4.3.7 verplaatsen

4 ActiveX-controls
4.1 Alle ActiveX-controls
4.2 control toevoegen
4.2.1 tekstvak: TextBox
4.2.2 keuzerondje: OptionButton
4.2.3 selectievak: CheckBox
4.2.4 bijschrift: Label
4.2.5 knop: CommandButton
4.2.6 wisselknop: ToggleButton
4.2.7 kringveld: SpinButton
4.2.8 lijst met invoer: ComboBox
4.2.9 lijst: ListBox
4.2.10 groepsvak: Frame
4.2.11 tabstrook: Tabstrip
4.2.12 multipage: MultipPage
4.2.13 schuifbalk: ScrollBar
4.2.14 afbeelding: Image
4.3 control kopiŽren
4.4 control hernoemen
4.5 control verwijderen
4.6 control gebeurteniscode
4.6.1 zoeken
4.6.2 lezen
4.6.3 toevoegen
4.6.4 kopiŽren
4.6.5 verplaatsen
4.6.6 vervangen
4.6.7 verwijderen

5 Userform
5.1 Macro's
5.2 Functies
5.3 Gebeurteniscode
5.3.1 Alle gebeurteniscode
5.3.2 zoeken
5.3.3 lezen
5.3.4 verwijderen
5.3.5 toevoegen
5.3.6 kopiŽren
5.3.7 verplaatsen

5.4 Controls in Userform
5.4.1 Alle controls
5.4.2 Control toevoegen
5.4.2.1 tekstvak: TextBox
5.4.2.2 keuze: OptionButton
5.4.2.3 selectievak: CheckBox
5.4.2.4 bijschrift: Label
5.4.2.5 knop: CommandButton
5.4.2.6 wisselknop: ToggleButton
5.4.2.7 kringveld: SpinButton
5.4.2.8 lijst met invoer: ComboBox
5.4.2.9 lijst: ListBox
5.4.2.10 groepsvak: Frame
5.4.2.11 tabstrook: Tabstrip
5.4.2.12 multipage: MultiPage
5.4.2.13 schuifbalk: ScrollBar
5.4.2.14 afbeelding: Image
5.4.3 Control kopiŽren
5.4.4 Control hernoemen
5.4.5 Control verwijderen
5.4.6 Control gebeurtenissen
5.4.6.1 Alle gebeurteniscode
5.4.6.2 zoeken
5.4.6.3 lezen
5.4.6.4 toevoegen.
5.4.6.5 kopiŽren
5.4.6.6 vervangen
5.4.6.7 aanpassen
5.4.6.8 verwijderen

VBA-objecten met VBA-code maken/wijzigen

Met VBA kun je macro's schrijven die macro's, funkties of userforms maken en beheren.
Tijdens de uitvoering van een macro kun je daarmee nieuwe macro's, funkties of userforms maken, wijzigen, kopiŽren of verwijderen.
Hieronder gaan we uit van een Exceltoepassing. Daarom wordt steeds uitgegaan van het Excelbestand dat de code bevat : ThisWorkbook.
Alle groen gemarkeerde tekst is voorbeeldtekst die de gebruiker aan de eigen situatie kan aanpassen.

1 Workbook en VBProject

Een Excelbestand heet in VBA-taal een Workbook.
Het Workbook kan VBA-code bevatten; in VBA-taal het VBproject.
ThisWorkbook.VBproject

2 Modules

VBA-code maakt altijd deel uit van een bestand en is geen bestand op zich.
VBA-code bevindt zich altijd in een 'module'.

Een Excelbestand kent 5 soorten modules (in VBA-taal VBComponents):
o ThisWorkbook: met de eigenschappen van het bestand
o Blad of Sheet: een werkblad
o Module: een module die macro's en/of funkties kan bevatten
o Userform: een gebruikersscherm dat macro's en/of funkties kan bevatten
o Classmodule: macro's en funkties die vanuit een andere module kunnen worden aangeroepen
ThisWorkbook.VBProject.VBComponents
Een Workbook bevat minimaal 2 VBA-modules: ThisWorkbook en 1 werkblad (Blad1 of Sheet1).
Een Workbook bevat maximaal 1 exemplaar van de module ThisWorkbook.
Het aantal overige modulen kan naar wens uitgebreid worden.

Alle modules kunnen VBA-code bevatten.
Er zijn verschillende soorten VBA-code:
- declaraties van variabelen
- macro's (beginnend met Sub ...End Sub
- functies (beginnend met Function ... End Function
- gebeurtenissen
- ActiveX-controls met gebeurtenissen
- Userformcontrols met gebeurtenissen

Niet alle modules kunnen alle verschillende soorten VBA bevatten:
 declaratiesmodule
gebeurteniscode
macrofunktieActiveX
gebeurteniscode
Userformcontrol
gebeurteniscode
werkboekxxxx  
werkbladxxxxx 
userformxxxx x
macromodulex x x  
klassemodulexxx x  

2.1 Module benaderen

Een module kan in VBA benaderd worden met de naam van de module of met de index.
De index van ThisWorkbook is altijd 1, de index van het eerste werkblad is 2.
ThisWorkbook.VBProject.VBComponents(1)
of
ThisWorkbook.VBProject.VBComponents("ThisWorkbook")

2.2 Achterhaal alle modulenamen

Alle modules hebben een 'VBA-naam'. Dat is de naam waarmee ze als uniek object te benaderen zijn.
Het werkboek en de werkbladen hebben ook nog een 'gewone' naam:
het werkboek: de naam waaronder het bestand is opgeslagen,
het werkblad: de naam die op het tabblad staat.

De modules van een VBproject vormen de verzameling VBComponents.
Sub Modules_namen()
For j= 1 to ThisWorkbook.VbProject.VBComponents.Count
msgbox ThisWorkbook.VBProject.VBComponents(j).Name
Next
End Sub
of
Sub Modules_namen2()
For each cp in ThisWorkbook.VbProject.VBcomponents
msgbox cp.Name
Next
End Sub
De VBA-naam van het werkboek of van een werkblad is ook te achterhalen met de eigenschap CodeName
Sub Module_werkboek_codenaam()
msgbox=ThisWorkbook.CodeName
End Sub
Sub module_werkblad_codenamen()
For each sh in ThisWorkbook.Sheets
msgbox sh.CodeName
Next
End Sub

2.3 Modulenaam wijzigen

2.3.1 Werkboeknaam wijzigen

De VBA-naam van het werkboek kan uitgelezen worden met de eigenschap CodeName.
Omdat dit een alleen-lezen eigenschap is, kan die daarom niet gebruikt worden om de VBA-naam te wijzigen.
Daarvoor moeten we de volgende methode gebruiken:
Sub modulenaam_werkboek_wijzigen()
ThisWorkbook.VbProject.VBcomponents("ThisWorkbook").Name ="hoofdbestand"
End Sub
NB. VBA van Word bevat hiervoor een aparte opdrachtApplication.OrganizerRename.

2.3.2 Werkbladnaam wijzigen

Ook voor een werkblad kan de 'alleen-lezen' eigenschap CodeName niet gebruikt worden om de VBA-naam te wijzigen.
Sub Modulenaam_werkblad_wijzigen()
ThisWorkbook.VbProject.VBcomponents(2).Name ="werkblad overzicht"
End Sub

2.3.3 Userformnaam wijzigen

Sub Modulenaam_userform_wijzigen()
ThisWorkbook.VbProject.VBcomponents("Userform1").Name ="invoer"
End Sub

2.3.4 Macromodulenaam wijzigen

Sub Modulenaam_macromodule_wijzigen()
ThisWorkbook.VbProject.VBcomponents("Module1").Name ="macroos"
End Sub

2.3.5 Klassemodulenaam wijzigen

Sub Modulenaam_klassemodule_wijzigen()
ThisWorkbook.VbProject.VBcomponents("Klasse1").Name ="Klas_I"
End Sub

2.4 Module toevoegen

Met VBA kunnen de volgende modules worden toegevoegd:
- een werkblad
- een macro module (vbext_ct_StdModule)
- een gebruikersformulier/Userform (vbext_ct_MSForm)
- een classmodule (vbext_ct_ClassModule)

2.4.1 Werkbladmodule toevoegen

Sub Werkbladmodule_toevoegen()
ThisWorkbook.Sheets.Add
End Sub

2.4.2 Macromodule toevoegen

Sub Macromodule_toevoegen1()
ThisWorkbook.VBProject.VBComponents.Add vbext_ct_StdModule
End Sub
of
Sub Macromodule_toevoegen2()
ThisWorkbook.VBProject.VBComponents.Add 1
End Sub
Deze module krijgt automatisch de naam Module1, Module2, Module3, etc.
Als die nieuwe module een andere naam moet hebben:

Macromodule met specifieke naam toevoegen
Sub Macromodule_toevoegen_naam1()
ThisWorkbook.VBProject.VBComponents.Add(vbext_ct_StdModule).Name ="Macroos"
End Sub
of
Sub Macromodule_toevoegen_naam2()
ThisWorkbook.VBProject.VBComponents.Add(1).Name ="Macroos"
End Sub

2.4.3 Userform toevoegen

Sub Userform_toevoegen1()
ThisWorkbook.VBProject.VBComponents.Add vbext_ct_MSForm
End Sub
of
Sub Userform_toevoegen2()
ThisWorkbook.VBProject.VBComponents.Add 3
End Sub
Deze module krijgt automatisch de naam Userform1, Userform2, Userform3, etc.
Als dit nieuwe Userform een andere naam moet hebben:

Userform met specifieke naam toevoegen
Sub Userform_toevoegen_naam1()
ThisWorkbook.VBProject.VBComponents.Add(vbext_ct_MSForm).Name="invoer"
End Sub
of
Sub Userform_toevoegen_naam2()
ThisWorkbook.VBProject.VBComponents.Add(3).Name ="invoer"
End Sub

2.4.4 Klassemodule toevoegen

Sub Klassemodule_toevoegen1()
ThisWorkbook.VBProject.VBComponents.Add vbext_ct_ClassModule
End Sub
of
Sub Klassemodule_toevoegen2()
ThisWorkbook.VBProject.VBComponents.Add 2
End Sub
Deze module krijgt automatisch de naam Klasse1, Klasse2, etc.
Als deze nieuwe klassemodule een andere naam moet hebben:

Klassemodule met specifieke naam toevoegen
Sub Klassemodule_toevoegen_naam1()
With ThisWorkbook.VBProject.VBComponents.Add(vbext_ct_MSForm).Name="Klassenaam"
End Sub
of
Sub Klassemodule_toevoegen_naam2()
ThisWorkbook.VBProject.VBComponents.Add(2).Name ="Klassenaam"
End Sub

2.5 Module exporteren

Iedere module kan opgeslagen worden als een afzonderlijk bestand, met een voor het moduletype specifieke extensie.
Extensies:
- .bas voor een macromodule
- .frm voor een userform
- .cls voor een werkboek, werkblad of klassemodule
De geŽxporteerde modules kunnen eenvoudig gedistribueerd worden en geÔmporteerd in andere Excel-bestanden.

2.5.1 Macromodule exporteren

Sub Macromodule_exporteren()
With ThisWorkbook.VBProject.VBComponents("Macroos")
.export"E:\OF\"&.Name & ".bas"
End With
End Sub

2.5.2 Userform exporteren

Sub Userform_exporteren()
With ThisWorkbook.VBProject.VBComponents("invoer")
.export"E:\OF\"&.Name & ".frm"
End With
End Sub

2.5.3 Werkblad exporteren

Sub Werkblad_exporteren()
With ThisWorkbook.VBProject.VBComponents("Blad1")
.export"E:\OF\"& .Name & ".cls"
End With
End Sub

2.5.4 Klassemodule exporteren

Sub Klassemodule_exporteren()
With ThisWorkbook.VBProject.VBComponents("Klasse1")
.export"E:\OF\"& .Name & ".cls"
End With
End Sub

2.5.5 Werkboek exporteren

Sub Werkboek_exporteren()
with ThisWorkbook.VBProject.VBComponents(1)
.export"E:\OF\"&.Name & ".cls"
End With
End Sub

2.5.6 Alle modules exporteren

Als de namen van de verschillende modules niet bekend zijn en het type module evenmin, kan aan de hand van de eigenschap 'Type' bepaald worden of het om een werkboek (Type=100), werkblad (Type=2), klassemodule, userform (Type=3) of macromodule (Type=1) gaat.
Sub Alle_modules_exporteren()
For Each cp In ThisWorkbook.VBProject.VBComponents
cp.Export"E:\OF\"& cp.Name & Switch(cp.Type = 1, ".bas", cp.Type = 3, ".frm", cp.Type = 2, ".cls", cp.Type = 100, ".cls")
Next
End Sub

2.6 Module importeren

Bestanden met VBA-code van een module kunnen geÔmporteerd worden met:

2.6.1 Werkblad importeren

Sub Werkblad_importeren()
ThisWorkbook.VBProject.VBComponents.Import "E:\OF\sheet1.cls"
End Sub

2.6.2 Macromodule importeren

Sub Macromodule_importeren()
ThisWorkbook.VBProject.VBComponents.Import "E:\OF\Macroos.bas"
End Sub

2.6.3 Userform importeren

Sub Userform_importeren()
ThisWorkbook.VBProject.VBComponents.Import "E:\OF\invoer.frm"
End Sub

2.6.4 Klassemodule importeren

Sub Klassemodule_importeren()
ThisWorkbook.VBProject.VBComponents.Import "E:\OF\klasse5.cls"
End Sub

2.6.5 Werkboek importeren

Een werkboek kan als bestand worden geŽxporteerd. Omdat een werkboek slechts 1 werkboekmodule kan bevatten lijkt de import van een geŽxporteerd werkbook problematisch. VBA voegt echter het geÔmporteerde bestand als een klassemodule toe aan de verzameling VBComponents.

2.7 Module verwijderen

2.7.1 Werkblad verwijderen

Sub werkblad_verwijderen()
ThisWorkbook.Sheets(1).Delete
End Sub

2.7.2 Macromodule verwijderen

Sub Macromodule_verwijderen()
With ThisWorkbook.VBProject
.VBComponents.Remove .VBComponents("Macroos")
End With
End Sub

2.7.3 Userform verwijderen

Sub Userform_verwijderen()
With ThisWorkbook.VBProject
.VBComponents.Remove .VBComponents("invoer")
End With
End Sub

2.7.4 Klassemodule verwijderen

Sub Klassemodule_verwijderen()
With ThisWorkbook.VBProject
.VBComponents.Remove .VBComponents("Klasse1")
End With
End Sub

2.7.5 Alle modules verwijderen

Sub Modules_verwijderen()
With ThisWorkbook.VBProject
for each cp in .VBComponents
.VBcomponents.Remove cp
Next
End With
End Sub

2.8 Module kopiŽren naar een ander bestand

2.8.1 Werkblad kopiŽren

Sub werkblad_kopiŽren()
Thisworkbook.sheets(1).copy workbooks(2).sheets1
End sub
NB. In VBA voor Word bestaat hiervoor een aparte VBA-methode: Application.OrganizerCopy

2.8.2 Macromodule kopiŽren

In Excel bestaat geen VBA-methode om een macromodule of Userform rechtstreeks te kopiŽren naar een ander document. Daarvoor moeten we een omweg bedenken, bijvoorbeeld:

Methode 1

∑ Exporteer de module naar een '.bas' (macromodule) of '.frm' (userform) bestand met dezelfde naam als de module
∑ Maak een nieuw bestand; importeer daarin het '.bas' (resp. het '.frm')-bestand.
Sub Macromodule_kopiŽren1()
ThisWorkbook.VBProject.VBComponents("Macroos").export "E:\Macroos.bas"
With Workbooks.Add
.VBProject.VBComponents.import "E:\Macroos.bas"
End With
End Sub
Methode 2

1. Lees de naam en de code van de te kopiŽren module.
2. Maak een nieuw bestand; maak daarin een nieuwe module met dezelfde naam als de te kopiŽren module.
3. Zet de code van de 'te kopiŽren' macromodule in de nieuwe macromodule (de methode die hiervoor gebruikt wordt - AddFromString- komt later aan de orde)

Sub Macromodule_kopiŽren2()
With ThisWorkbook.VBProject.VBComponents("Macroos")
c00 = .Name
c01 = .CodeModule.Lines(1, .CodeModule.CountOfLines)
End With
With Workbooks.Add
With .VBProject.VBComponents.Add(vbext_ct_StdModule)
.Name = c00
.CodeModule.AddFromString c01
End With
End With
End Sub

2.8.3 Userform kopiŽren

Omdat een Userform ook controls bevat is alleen methode 1 bruikbaar voor het kopiŽren van een userform.
Sub Userform_kopiŽren1()
ThisWorkbook.VBProject.VBComponents("invoer").export "E:\ invoer.frm"
With Workbooks.Add
.VBProject.VBComponents.import "E:\invoer.frm"
End With
End Sub

2.8.4 Klassemodule kopiŽren

Methode 1
Sub Klassemodule_kopiŽren1()
ThisWorkbook.VBProject.VBComponents("Klasse1").export "E:\Klasse_I.cls"
With Workbooks.Add
.VBProject.VBComponents.import "E:\Klasse_I.cls"
End With
End Sub
Methode 2
Sub Klassemodule_kopiŽren2()
With ThisWorkbook.VBProject.VBComponents("Klasse1")
c00 = .Name
c01 = .CodeModule.Lines(1, .CodeModule.CountOfLines)
End With
With Workbooks.Add
With .VBProject.VBComponents.Add(vbext_ct_ClsModule)
.Name = c00
.CodeModule.AddFromString c01
End With
End With
End Sub

2.8.5 Alle macromodules en userforms kopiŽren

Sub Modules_kopiŽren()
for each cp in ThisWorkbook.VBProject.VBComponents
if cp.type<>100 then
if Workbooks.count=1 then workbooks.Add
With workbooks(2).VBProject.VBComponents.Add(vbext_ct_MSForm)
.Name = cp.name
.CodeModule.AddFromString cp.codemodule.lines(1,cp.codemodule.countofLines)
End with
End if
Next
End Sub

2.9 Modules verplaatsen

In het ontwerpscherm van de VBEditor kun je in het subscherm projectverkenner modules( werkbladen, macromodules, userforms en klassemodules) van het ene naar het andere bestand slepen.
In het 'ontvangende' bestand wordt een kopie van de gesleepte module geplaatst.
Hiervoor heb ik nog geen VBA-code kunnen ontdekken.

Alleen voor werkbladmodules bestaat VBA-code om het werkblad binnen het werkboek te verplaatsen.
Daarnaast is verplaatsing naar een ander geopend bestand mogelijk.

2.9.1 Werkblad verplaatsen binnen het werkboek

Sub verplaats_werkblad()
ThisWorkbook.Sheets(1).Move ThisWorkbook.Sheets(4)
End Sub

2.9.2 Werkblad verplaatsen naar een ander werkboek

Sub verplaats_werkblad_naar_ander_werkboek()
ThisWorkbook.Sheets(1).Move Workbook(2).Sheets(4)
End Sub

2.9.3 Userform verplaatsen naar een ander werkboek

Gebruik hiervoor de export-import methode

2.9.4 Macromodule verplaatsen naar een ander werkboek

Gebruik hiervoor de export-import methode

2.9.5 Klassemodule verplaatsen naar een ander werkboek

Gebruik hiervoor de export-import methode

3 De inhoud van een module

Een module (werkboek, werkblad, gebruikersformulier, macromodule, klassemodule) bevat de eigenschap 'codemodule' die alle VBA-code van de module bevat.
Deze codemodule bevat alle VBA-procedures.
Er zijn vijf soorten procedures:

1. Modulegebeurteniscode
Het werkboek, ieder werkblad, een klassemodule en ieder userform kent een aantal 'gebeurtenissen' (in VBA: Events).
Bijvoorbeeld:
- het openen van het werkboek (Private Sub Workbook_Open)
- het wijzigen van een werkblad (Private Sub Worksheet_Change)
- het initialiseren van een userform (Private Sub Userform_Initialize)
- het initialiseren van een klassemodule (Private Class_initialize()

Deze gebeurtenissen hebben betrekking op de module (werkboek, werkblad, userform) zelf.
De VBA-code voor deze gebeurtenissen staat in de codemodule van het werkboek, werkblad of userform.

2. Macro's
Alle modules (werkboek, werkblad, gebruikersformulier, macromodule, klassemodule) kunnen macro's bevatten.

3. Funkties
Alle modules (werkboek, werkblad, gebruikersformulier, macromodule, klassemodule) kunnen funkties bevatten.

4. ActiveX objecten
Alleen werkbladen kunnen ActiveX-objecten en ActiveX-gebeurtenisprocedures bevatten.
ActiveX-objecten zijn afkomstig uit de werkset besturingselementen (bijv. tekstvak, keuzerondje, vinkvak, keuzelijst, keuzelijst met invoervak, opdrachtknop, label, etc).

5. Formcontrols
Alleen Userforms kunnen Userformcontrols en Userformcontrol-gebeurtenisprocedures bevatten.
Formuliercontrols zijn bijv. tekstvak, keuzerondje, vinkvak, keuzelijst, keuzelijst met invoervak, opdrachtknop, label, etc. Zij zijn afkomstig van de verzameling formcontrols.
 module
gebeurteniscode
macrofunktieActiveX
gebeurteniscode
formcontrol
gebeurteniscode
werkboekxxx  
werkbladxxxx 
userformxxx x
macromodule x x  
klassemodulexx x  

Procedures

Een procedure (macro, gebeurtenis of funktie) is geen apart objekt. Daarom bevat VBA ook geen methodes om deze toe te voegen (Add), te kopiŽren (Copy), te verplaatsen (Rename/Move) of te verwijderen (Delete/Remove).
Een procedure (macro, gebeurtenis of funktie) is niets anders dan een aantal regels code in de codemodule.
Het begin en het einde van een procedure wordt bepaald door een startregel en een eindregel:
Bij macro's en gebeurtenissen:
Sub naam (argumenten)
End Sub
Bij funkties:
Function naam (argumenten)
End Function
Het toevoegen, kopiŽren, verplaatsen, wijzigen of verwijderen van een procedure (macro, gebeurtenis of funktie) bestaat uit het bewerken van coderegels in het object codemodule. De codemodule kan gezien worden als ťťn pagina tekst die per regel (Line) uitgelezen of beschreven kan worden. In de codemodule is de basiseenheid de regel (line).
De begin- en sluitregel van een procedure funktioneren als markering voor een tekstonderdeel van de pagina.

Gebeurtenisprocedures zijn altijd beperkt tot de module waarvan ze deel uitmaken.
Dat blijkt uit de 'bereik'-toevoeging Private: Private Sub Workbook_Open()
Gebeurtenisprocedures kunnen specifieke argumenten hebben: Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Schrijven in een codemodule

De VBA-code van een gebeurtenis kan toegevoegd worden met de methoden AddFromString, InsertLines of AddFromFile.
Voor gebeurtenisprocedures bevat VBA ťťn aparte methode: CreateEventProc.
De VBA-methode CreateEventProc plaatst automatisch de begin- en eindregel van de procedure : Private Sub ***_methode(ByVal ...)
End Sub)

3.1 Codemodule

3.1.1 De volledige VBA-code lezen

Sub Code_in_werkboekmodule_lezen()
With ThisWorkbook.VBProject.VBComponents(1).CodeModule
MsgBox .Lines(1, .CountOfLines)
End With
End Sub

3.1.2 Een deel van de VBA-code lezen



' alle regels behalve de laatste 20
' alle regels behalve de eerste 10
' regel 15 t/m regel 45
' alle regels met declaraties van variabelen
Sub Code_in werkboek_deels_lezen()
With ThisWorkbook.VBProject.VBComponents(2).CodeModule
c00 = .Lines(1, .CountOfLines-20)
c01 =.Lines(10,.CountOflines-10)
c02 =.Lines(15,30)
c03 =.Lines(1,.CountOfDeclarationLines)
End With
End Sub

3.1.3 Verwijder alle code in een codemodule

Sub Code_werkboekmodule_verwijderen()
With ThisWorkbook.VBProject.VBComponents(1).CodeModule
.DeleteLines 1, .CountOfLines
End With
End Sub

3.2 Macromodule

3.2.1 Macro

3.2.1.1 Alle macro's in een module

VBA heeft geen methode om alle VBA-procedures in een module te tonen.
Die maken we zelf: iedere regel in een module heeft de eigenschap 'ProcOfLine', die de naam van de procedure (macro, funktie) weergeeft waarin de regel staat.
Als we van die eigenschap een lijst met unieke elementen maken hebben we het macro-overzicht.
In een userform met een keuzelijst (keus1) komt de lijst met macro's te staan.
Sub Macros_van_macromodule_in_userform_combobox()
For j = 1 To ThisWorkbook.VBProject.VBComponents("Macroos").CodeModule.CountOfLines
c02 = ThisWorkbook.VBProject.VBComponents(1).CodeModule.ProcOfLine(j, 0)
If InStr(c01, c02) = 0 Then c01 = c01 & "|" & c02
Next
keus1.List = Split(Mid(c01, 2), "|")
End Sub

3.2.1.2 Macro zoeken

Sub Macro_zoeken()
MsgBox "macro3" & IIf(ActiveWorkbook.VBProject.VBComponents("Macroos").CodeModule.Find("Sub macro3(", 1, 1, -1, -1), "", "Niet") & "gevonden."
End Sub

3.2.1.3 Macro toevoegen

Hiervoor bevat VBA 3 methodes;
- AddFromString
- InsertLines
- AddFromFile

- Methode AddFromString
De tekstreeks met VBA-code wordt altijd aan het begin van de codemodule gezet.
Sub Macro_in_macromodule_maken()
c00 =replace(Replace(Replace("Sub nieuwe_macro()#*MsgBox ^QED ^#End Sub", "#", vbCr), "*", vbTab),"^",chr(34))
ThisWorkbook.VBProject.VBComponents("Macroos").CodeModule.AddFromString c00
End Sub
NB.
* Een macronaam mag geen spaties bevatten.
* In het voorbeeld wordt eerst een string gemaakt, die daarna in de codemodule wordt gezet.
* Om in de reeks &'s te vermijden is gebruik gemaakt van de funktie replace. Bij langere tekstreeksen kan dit van pas komen.

"Sub nieuwe_macro()" & vbCr & vbTab &"MsgBox " & Chr(34) & "QED" & Chr(34) & vbCr & "End Sub"

- Methode Insertlines

Specificeer bij de methode Insertlines waar de beginregel gezet moet worden.
Daarom is het noodzakelijk te weten of de regel niet interfereert met de bestaande code in de codemodule.
Sub Macro_in_macromodule_maken2()
c00 =replace(Replace(Replace("Sub nieuwe_macro()#*MsgBox ^QED ^#End Sub", "#", vbCr), "*", vbTab),"^",chr(34))
ThisWorkbook.VBProject.VBComponents("Macroos").CodeModule.Insertlines 1, c00
End Sub
- Methode AddFromFile

Met de methode AddFromFile kan alle VBA-code uit een opgeslagen bestand worden geÔmporteerd.
Er kan niet slechts 1 macro of 1 gebeurtenis uit het bestand geladen worden.
Sub Macro_in_macromodule_maken3()
ThisWorkbook.VBProject.VBComponents("Macroos").CodeModule.Addfromfile "E:\OF\macro1.bas"
End Sub

3.2.1.4 Macro code lezen

Sub Macro_code_lezen()
With ThisWorkbook.VBProject.VBComponents("Macroos").codemodule
c00 = .Lines(.ProcStartLine("macro3", 0), .ProcCountLines("macro3", 0))
End With
End Sub
ProcStartLine: de 1e regel van een gespecificeerde macro
ProcCountLines: het aantal coderegels van een gespecificeerde macro

3.2.1.5 Macro kopiŽren

Sub Macro_kopiŽren()
With ThisWorkbook.VBProject.VBComponents("Macroos").codemodule
c00 = .Lines(.ProcStartLine("macro3", 0), .ProcCountLines("macro3", 0))
End With
ThisWorkbook.VBProject.VBComponents("Macromodule_2").AddFromString c00
End Sub

3.2.1.6 Macro code vervangen

Sub Macro_code_vervangen()
With ThisWorkbook.VBProject.VBComponents("Macroos").codemodule
.DeleteLines .ProcStartLine("macro3", 0) + 1, .ProcCountLines("macro3", 0) - 2
.InsertLines .ProcStartLine("macro3", 0) + 1, "c00 = " & Chr(34) & "Dit is de nieuwste tekst"
End With
End Sub

3.2.1.7 Macro hernoemen

Sub Macro_hernoemen()
With ThisWorkbook.VBProject.VBComponents("Macroos").codemodule
.ReplaceLine .ProcStartLine("macro3", 0), Replace(.Lines(.ProcStartLine("macro3", 0), 1), "macro3", "Macro37a")
End With
End Sub

3.2.1.8 Macro verwijderen

Sub Macro_verwijderen()
With ThisWorkbook.VBProject.VBComponents("Macroos").codemodule
.DeleteLines .ProcStartLine("macro3", 0), .ProcCountLines("macro3", 0)
End With
End Sub

3.2.1.9 Macro verplaatsen

Sub Macro_verplaatsen()
With ThisWorkbook.VBProject.VBComponents("Macroos").codemodule
c00 = .Lines(.ProcStartLine("macro3", 0), .ProcCountLines("macro3", 0))
.DeleteLines .ProcStartLine("macro3", 0), .ProcCountLines("macro3", 0)
End With
ThisWorkbook.VBProject.VBComponents("Macromodule_2").AddFromString c00
End Sub

3.2.2 Functies

3.2.2.1 Alle functies in een module

De eerste regel van een funktie bevat de term Function; na selectie wordt de naam eruit gelicht.
In keuzelijst (keus1) in werkblad 'Blad1' komt de lijst met funkties te staan.
Sub Alle_funkties_in_macromodule()
c00 = "Function "
With ThisWorkbook.VBProject.VBComponents("Macroos").CodeModule
c01=.Lines(1, .CountOfLines)
Blad1.keus1.List = Split(Replace(Replace(Join(Filter(Split(Join(Filter(Filter(Split(c01, vbCr & Chr(10)), c0), "=", False), "("), "("), c0), "|"),
c00, ""),"Private ",""), "|")
End With
End Sub

3.2.2.2 Functie zoeken

Sub Funktie_zoeken()
MsgBox "funktie2" & iif(With ThisWorkbook.VBProject.VBComponents("Macroos").codemodule.Find("funktie2","","niet ") & "gevonden"
End Sub

3.2.2.3 Functie toevoegen

Methode AddFromString
Sub Funktie_maken1()
c00 =replace(Replace(Replace("Function funktie1()#*MsgBox ^QED ^#End Sub", "#", vbCr), "*", vbTab),"^",chr(34))
ThisWorkbook.VBProject.VBComponents(1).CodeModule.AddFromString c00
End Sub
Methode Insertlines
Sub Funktie_maken2()
c00 =replace(Replace(Replace("Function funktie1()#*MsgBox ^QED ^#End Sub", "#", vbCr), "*", vbTab),"^",chr(34))
ThisWorkbook.VBProject.VBComponents("Macroos").CodeModule.Insertlines 1, c00
End Sub
Methode AddFromFile
Sub Funktie_maken3()
ThisWorkbook.VBProject.VBComponents("Blad1").CodeModule.Addfromfile "E:\OF\macro1.bas"
End Sub

3.2.2.4 Functie code lezen

Sub Funktie_code_lezen()
With ThisWorkbook.VBProject.VBComponents("Macroos").codemodule
c00 = .Lines(.ProcStartLine("funktie2", 0), .ProcCountLines("funktie2", 0))
End With
End Sub

3.2.2.5 Functie kopiŽren

Sub Funktie_kopiŽren()
With ThisWorkbook.VBProject.VBComponents("Macroos").codemodule
c00 = .Lines(.ProcStartLine("funktie2", 0), .ProcCountLines("funktie2", 0))
End With
ThisWorkbook.VBProject.VBComponents("Macroos_2").CodeModule.AddFromString c00
End Sub

3.2.2.6 Functie code vervangen

Sub Funktie_code_vervangen()
With ThisWorkbook.VBProject.VBComponents("Macroos").codemodule
.DeleteLines .ProcStartLine("funktie2", 0) + 1, .ProcCountLines("funktie2", 0) - 2
.InsertLines .ProcStartLine("funktie2", 0) + 1,"c00 = " & Chr(34) & "Dit is de nieuwste tekst"
End With
End Sub

3.2.2.7 Functie hernoemen

Sub Functie_hernoemen()
With ThisWorkbook.VBProject.VBComponents("Macroos").codemodule
.ReplaceLine .ProcStartLine("funktie2", 0), Replace(.Lines(.ProcStartLine("funktie2", 0), 1), "funktie2", "Funktie27a")
End With
End Sub

3.2.2.8 Functie verwijderen

Sub Functie_verwijderen()
With ThisWorkbook.VBProject.VBComponents("Macroos").codemodule
.DeleteLines .ProcStartLine("funktie2", 0), .ProcCountLines("funktie2", 0)
End With
End Sub

3.2.2.9 Functie verplaatsen

Sub Functie_verplaatsen()
With ThisWorkbook.VBProject.VBComponents("Macroos").codemodule
c00 = .Lines(.ProcStartLine("funktie2", 0), .ProcCountLines("funktie2", 0))
.DeleteLines .ProcStartLine("funktie2", 0), .ProcCountLines("funktie2", 0)
End With
ThisWorkbook.VBProject.VBComponents("Macroos_2").AddFromString c00
End Sub

3.3 Werkboek

3.3.1 Macro's

Zie de beschrijving van macro's bij de macromodule.

3.3.2 Functies

Zie de beschrijving van functies bij de macromodule.

3.3.3 Gebeurtenisprocedures

Een werkboek kan de volgende gebeurtenissen bevatten:

ActivateAddinInstallAddinUninstallBeforeClose
BeforePrintBeforeSaveDeactivateNewSheet
OpenSheetActivateSheetBeforeDoubleClickSheetBeforeRightClick
SheetCalculateSheetChangeSheetDeactivateSheetFollowhyperlink
SheetSelectionChangeWindowActivateWindoDeactivateWindowResize

3.3.3.1 Alle gebeurtenisprocedures in een werkboek

De startregel van iedere gebeurtenisprocedure in een werkboek bevat ' Sub Workbook_'
Sub alle_eventprocedures_in_werkboek()
With ThisWorkbook.VBProject.VBComponents(1).CodeModule
MsgBox join(filter( split(.Lines(1, .CountOfLines),vbCrLf),"Sub Workbook_"),vbLf)
end with
end sub

3.3.3.2 Gebeurtenisprocedure zoeken

Sub Werkboek_eventprocedure_zoeken()
msgbox "Workbook_Open" & iif(ThisWorkbook.VBProject.VBComponents(1).CodeModule.Find("Sub Workbook_Open", 1, 1, -1, -1),"", "niet ") & "gevonden"
End Sub

3.3.3.3 Gebeurtenisprocedure lezen

Het argument vbext_pk_Proc is equivalent aan 0
Sub Werkboek_eventprocedure_code_lezen()
With ThisWorkbook.VBProject.VBComponents(1).CodeModule
c01= .Lines(.ProcStartLine("Workbook_Open",0),.ProcCountlines("Workbook_Open",0))
End With
End Sub

3.3.3.4 Gebeurtenisprocedure verwijderen

Sub Werkboek_eventprocedure_verwijderen()
With ThisWorkbook.VBProject.VBComponents(1).CodeModule
.DeleteLines .ProcStartLine("Workbook_Open",0),.ProcCountlines("Workbook_Open",0)
End With
End Sub

3.3.3.5 Gebeurtenisprocedure toevoegen

Sub Werkboek_eventprocedure_toevoegen()
With ThisWorkbook.VBProject.VBComponents(1).CodeModule
.InsertLines .CreateEventProc("Open", "Workbook") + 1, vbTab & "MsgBox " & Chr(34) & "Dit is een nieuw werkboek"
End With
End Sub

3.3.3.6 Gebeurtenisprocedure kopiŽren

Een combinatie van een gebeurtenisprocedure lezen en schrijven.
Sub Werkboek_eventprocedure_kopiŽren()
With ThisWorkbook.VBProject.VBComponents(1).CodeModule
c01= .Lines(.ProcStartLine("Workbook_Open",0),.ProcCountlines("Workbook_Open",0))
End With
With Workbooks(2).VBProject.VBComponents(1).CodeModule
.AddFromString c01
End With
End Sub

3.3.3.7 Gebeurtenisprocedure verplaatsen

Een combinatie van een gebeurtenisprocedure lezen, schrijven en verwijderen.
Sub Werkboek_eventprocedure_verplaatsen()
With ThisWorkbook.VBProject.VBComponents(1).CodeModule
c01= .Lines(.ProcStartLine("Workbook_Open",0),.ProcCountlines("Workbook_Open",0)
) .deletelines .ProcStartLine("Workbook_Open",0),.ProcCountlines("Workbook_Open",0)
End With With Workbooks(2).VBProject.VBComponents(1).CodeModule
.AddFromString c01
End With
End Sub

3.4 Werkblad

3.4.1 Macro's

Zie de beschrijving van macro's bij de macromodule.

3.4.2 Functies

Zie de beschrijving van functies bij de macromodule.

3.4.3 Gebeurtenisprocedures

Een werkblad kan de volgende gebeurtenissen bevatten:

ActivateBeforeDoubleClickBeforeRightClickCalculate
ChangeDeactivateFollowHyperlinkSelectionChange

3.4.3.1 Alle gebeurtenisprocedures in een werkblad

De startregel van iedere gebeurtenisprocedure in een werkblad bevat ' Sub Worksheet_'
Sub Werkblad_alle_eventprocedures()
With ThisWorkbook.VBProject.VBComponents("Blad1").CodeModule
MsgBox join(filter( split(.Lines(1, .CountOfLines),vbCrLf)," Sub Worksheet_"),vbLf)
end with
end sub

3.4.3.2 Gebeurtenisprocedure zoeken

Sub Werkblad_eventprocedure_zoeken()
msgbox "Worksheet_Change " & iif(ThisWorkbook.VBProject.VBComponents("Blad1").CodeModule.Find(" Sub Worksheet_Change", 1, 1, -1, -1),"", "niet ") & "gevonden"
End Sub

3.4.3.3 Gebeurtenisprocedure lezen

Sub Werkblad_eventprocedure_code_lezen()
With ThisWorkbook.VBProject.VBComponents("Blad1").CodeModule
c01= .Lines(.ProcStartLine("Worksheet_Change",0),.ProcCountlines("Worksheet_Change",0))
End With
End Sub

3.4.3.4 Gebeurtenisprocedure verwijderen

Sub Werkblad_eventprocedure_verwijderen()
With ThisWorkbook.VBProject.VBComponents("Blad1").CodeModule
.DeleteLines .ProcStartLine("Worksheet_Change",0),.ProcCountlines("Worksheet_Change",0)
End With
End Sub

3.4.3.5 Gebeurtenisprocedure toevoegen

Sub Werkblad_eventprocedure_toevoegen()
With ThisWorkbook.VBProject.VBComponents("Blad1").CodeModule
.InsertLines .CreateEventProc("Change", "Worksheet") + 1,vbTab & "MsgBox " & Chr(34) & "Dit is een nieuw werkboek"
End With
End Sub

3.4.3.6 Gebeurtenisprocedure kopiŽren

Een combinatie van een gebeurtenisprocedure lezen en schrijven.
Sub Werkblad_eventprocedure_kopiŽren()
With ThisWorkbook.VBProject.VBComponents("Blad1").CodeModule
c01= .Lines(.ProcStartLine("Worksheet_Change",0),.ProcCountlines("Worksheet_Change",0))
End With
With Workbooks(2).VBProject.VBComponents("Blad2").CodeModule
.AddFromString c01
End With
End Sub

3.4.3.7 Gebeurtenisprocedure verplaatsen

Een combinatie van een gebeurtenisprocedure lezen, schrijven en verwijderen.
Sub Werkblad_eventprocedure_verplaatsen()
With ThisWorkbook.VBProject.VBComponents("Blad1").CodeModule
c01= .Lines(.ProcStartLine("Worksheet_Change",0),.ProcCountlines("Worksheet_Change",0)
) .deletelines .ProcStartLine("Worksheet_Change",0),.ProcCountlines("Worksheet_Change",0)
End With
With Workbooks(2).VBProject.VBComponents("Blad2").CodeModule
.AddFromString c01
End With
End Sub

4 ActiveX-objekten

In een werkblad kunnen ActiveX-objekten (ActiveX-controls) geplaatst worden.
Aan een gebeurtenis (bijv. Click, Change, Activate) van zo'n object code kun je code toevoegen.
De VBA-code van een gebeurtenis van een ActiveX-object komt in de codemodule van het werkblad te staan.

4.1 Alle ActiveX-objecten in een werkblad

Sub alle_ActiveX_objecten()
For Each cl In Sheets("Blad1").OLEObjects
c01 = c01 & vbLf & cl.Name
Next
MsgBox c01
End Sub

4.2 ActiveX-object toevoegen

Sub ActiveX_object_toevoegen()
With sheets("Blad1").OLEObjects.Add("Forms.CommandButton.1",,,,,,,40,60,40,24)
.Name="knop_vervolg"
With .Object
.Caption="Mededeling"
.Font.Size=9
.ForeColor=vbBlue
End With
End With
End Sub
Sub ActiveX_tekstvak_toevoegen()
Sheets("Blad1").OLEObjects.Add("Forms.Textbox.1", , , , , , , 40, 60, 40, 24).Name ="tekst_1"
End Sub
Sub ActiveX_keuzerondje_toevoegen()
Sheets("Blad1").OLEObjects.Add("forms.OptionButton.1").Name =""keus_1""
End Sub
Sub ActiveX_selectievak_toevoegen()
Sheets("Blad1").OLEObjects.Add("forms.CheckBox.1").Name ="selectie_1"
End Sub
Sub ActiveX_bijschrift_toevoegen()
Sheets("Blad1").OLEObjects.Add("forms.Label.1").Name ="bijschrift_1"
End Sub
Sub ActiveX_opdrachtknop_toevoegen()
Sheets("Blad1").OLEObjects.Add("forms.CommandButton.1").Name ="opdracht_1"
End Sub
Sub ActiveX_wisselknop_toevoegen()
Sheets("Blad1").OLEObjects.Add("forms.ToggleButton.1").Name ="wissel_1"
End Sub
Sub ActiveX_kringveld_toevoegen()
Sheets("Blad1").OLEObjects.Add("forms.SpinButton.1").Name ="spinner_1"
End Sub
Sub ActiveX_keuzelijst_met_invoervak_toevoegen()
Sheets("Blad1").OLEObjects.Add("forms.ComboBox.1").Name ="uitklap_1"
End Sub
Sub ActiveX_keuzelijst_toevoegen()
Sheets("Blad1").OLEObjects.Add("forms.ListBox.1").Name ="keuzen_1"
End Sub
Sub ActiveX_groepsvak_toevoegen()
Sheets("Blad1").OLEObjects.Add("forms.Frame.1").Name ="kader_1"
End Sub
Sub ActiveX_tabstrook_toevoegen()
Sheets("Blad1").OLEObjects.Add("forms.TabStrip.1").Name ="tab_1"
End Sub
Sub ActiveX_multipage_toevoegen()
Sheets("Blad1").OLEObjects.Add("forms.MultiPage.1").Name ="multi_1"
End Sub
Sub ActiveX_schuifbalk_toevoegen()
Sheets("Blad1").OLEObjects.Add("forms.ScrollBar.1").Name ="schuif_1"
End Sub
Sub ActiveX_afbeelding_toevoegen()
Sheets("Blad1").OLEObjects.Add("forms.Image.1").Name ="plaatje_1"
End Sub

4.3 ActiveX-object kopiŽren

Sub AciveX_kopie()
Sheets("Blad1").OLEObjects("tekstvak1").Copy
Sheets("Blad2").Paste
End Sub

4.4 ActiveX-object hernoemen

Sub ActiveX_hernoemen()
Sheets("Blad1").OLEObjects("knop_vervolg").Name = "knop_einde"
End Sub

4.5 ActiveX-object verwijderen

Sub ActiveX_verwijderen()
Sheets("Blad1").OLEObjects("knop_vervolg").delete
End Sub

4.6 ActiveX-gebeurteniscode

4.6.1 ActiveX gebeurteniscode zoeken

Sub ActiveX_gebeurteniscode_zoeken
MsgBox "knop_vervolg_Click" & ThisWorkbook.VBProject.VBComponents("Blad1").CodeModule.Find("Sub knop_vervolg_Click(","","niet ") & "gevonden
End Sub

4.6.2 ActiveX gebeurteniscode lezen

Sub ActiveX_gebeurteniscode_lezen
ThisWorkbook.VBProject.VBComponents("Blad1").CodeModule
MsgBox .Lines(.ProcStartLine("knop_vervolg_Click",0), .ProcCountLines("knop_vervolg_Click",0))
End with
End Sub

4.6.3 ActiveX gebeurteniscode toevoegen

Sub ActiveX_gebeurteniscode_toevoegen()
With ThisWorkbook.VBProject.VBComponents("Blad1").CodeModule
.InsertLines .CreateEventProc("Click", "knop_vervolg") + 1,vbTab & "MsgBox " & Chr(34) & "Je hebt knop_vervolg aangeklikt"
End With
End Sub

4.6.4 ActiveX gebeurteniscode kopiŽren

analoge objecten in hetzelfde werkblad met identieke code (bijv. tekstvak1 en tekstvak2)
Sub ActiveX_gebeurteniscode_kopie()
With ThisWorkbook.VBProject.VBComponents("Blad1").CodeModule
.AddFromString replace( .Lines(.ProcStartLine("tekstvak1_Change",0), .ProcCountLines("tekstvak1_Change",0)),"tekstvak1","tekstvak2")
End With
End Sub
de gebeurteniscode kopiŽren van Blad1 naar Blad2
Sub ActiveX_gebeurteniscode_kopiŽren2()
With ThisWorkbook.VBProject.VBComponents("Blad1").CodeModule
c00 = .Lines(.ProcStartLine("tekstvak1_Change",0), .ProcCountLines("tekstvak1_Change",0))
End With
ThisWorkbook.VBProject.VBComponents("Blad2").CodeModule.AddFromString c00
End Sub

4.6.5 ActiveX-gebeurteniscode verplaatsen

With ThisWorkbook.VBProject
with .VBComponents("Blad1").codemodule
c00 =.lines(.ProcStartLine("knop_vervolg_Click",0), .ProcCountLines("knop_vervolg_Click",0))
.DeleteLines .ProcStartLine("knop_vervolg_Click",0), .ProcCountLines("knop_vervolg_Click",0)
end with
.VBComponents("Blad2").codemodule.AddFromString c0.
End With

4.6.6 ActiveX gebeurteniscode vervangen

Sub ActiveX_code_vervangen1()
With ThisWorkbook.VBProject.VBComponents("Blad1").codemodule
.ReplaceLine .ProcStartLine("knop_vervolg_Click",0), Replace(.Lines(.ProcStartLine("knop_vervolg_Click",0), 1), "_vervolg", "_einde")
End With End Sub
of
Sub ActiveX_code_vervangen2()
With ThisWorkbook.VBProject.VBComponents("Blad1").CodeModule
.DeleteLines .ProcStartLine("knop_vervolg_Click",0) + 1, .ProcCountLines("knop_vervolg_Click",0) - 2
.InsertLines .ProcStartLine("knop_vervolg_Click",0) + 1,"c00 = " & Chr(34) & "Dit is de nieuwste tekst"
End With End Sub

4.6.7 ActiveX-gebeurteniscode verwijderen

Sub ActiveX_code_verwijderen()
With ThisWorkbook.VBProject.VBComponents("Blad1").codemodule
.DeleteLines .ProcStartLine("knop_vervolg_Click",0), .ProcCountLines("knop_vervolg_Click",0)
End With
End Sub

5 Userform

5.1 Macro's

Zie de beschrijving van macro's bij de codemodule.

5.2 Functies

Zie de beschrijving van functies bij de codemodule.

5.3 Gebeurtenisprocedures

Een userform kan de volgende gebeurtenissen bevatten:

ActivateAddControlBeforeDragoverBeforeDropOrPasteClick
DblClickDeActivateErrorInitializeKeyDown
KeyPressKeyUpLayOutMouseDownMouseMove
MouseUpQueryCloseRemoveControlResizeScroll
TerminateZoom   

5.3.1 Alle eventprocedures in een Userform

De startregel van iedere gebeurtenisprocedure in een userform bevat ' Sub Userform_'
Sub alle_eventprocedures_in_userform()
With ThisWorkbook.VBProject.VBComponents("invoer").CodeModule
MsgBox join(filter( split(.Lines(1, .CountOfLines),vbCrLf),"Sub UserForm_"),vbLf)
End With
End Sub

5.3.2 Gebeurtenisprocedure zoeken

Sub eventprocedure_zoeken()
msgbox"Userform_Initialize" & iif(ThisWorkbook.VBProject.VBComponents("invoer").CodeModule.Find("Sub Userform_Initialize(", 1, 1, -1, -1),"", "niet") & "gevonden"
End Sub

5.3.3 Gebeurtenisprocedure lezen

Sub eventprocedure_lezen()
With ThisWorkbook.VBProject.VBComponents("invoer").CodeModule
c01 = .Lines(.ProcStartLine("Userform_Initialize", 0), .ProcCountLines("Userform_Initialize", 0))
End With
End Sub

5.3.4 Gebeurtenisprocedure verwijderen

Sub eventprocedure_verwijderen()
With ThisWorkbook.VBProject.VBComponents("invoer").CodeModule
.DeleteLines .ProcStartLine("Userform_Initialize",0),.ProcCountlines("Userform_Initialize",0)
End With
End Sub

5.3.5 Gebeurtenisprocedure toevoegen

Sub eventprocedure_toevoegen()
With ThisWorkbook.VBProject.VBComponents("invoer").CodeModule
.InsertLines .CreateEventProc("Initialize", "Userform") + 1,vbTab & "MsgBox " & Chr(34) & "Dit is een nieuw werkboek"
End With
End Sub

5.3.6 Gebeurtenisprocedure kopiŽren

Een combinatie van een gebeurtenisprocedure lezen en schrijven.
Sub eventprocedure_kopiŽren()
With ThisWorkbook.VBProject.VBComponents("invoer").CodeModule
c01= .Lines(.ProcStartLine("Userform_Initialize",0),.ProcCountlines("Userform_Initialize",0))
End With
With Workbooks(2).VBProject.VBComponents("invoer").CodeModule
.AddFromString c01
End With
End Sub

5.3.7 Gebeurtenisprocedure verplaatsen

Een combinatie van een gebeurtenisprocedure lezen, schrijven en verwijderen.
Sub eventprocedure_verplaatsen()
With ThisWorkbook.VBProject.VBComponents("invoer").CodeModule
c01= .Lines(.ProcStartLine("Userform_Initialize",0),.ProcCountlines("Userform_Initialize",0))
.deletelines .ProcStartLine("Userform_Initialize",0),.ProcCountlines("Userform_Initialize",0)
End With
With Workbooks(2).VBProject.VBComponents("invoer").CodeModule
.AddFromString c01
End With
End Sub

5.4 Besturingselement in Userform

5.4.1 Alle besturingselementen

Sub alle_besturingselementen()
For Each ct In ThisWorkbook.VBProject.VBComponents("invoer").Designer.Controls
c01 = c01 & vbLf & ct.Name
Next
msgbox c01 , , "besturingselementen in userform"
End Sub
of
Sub Userform_alle_besturingselementen()
For Each ct InUserForm1.Controls
c01 = c01 & vbLf & ct.Name
Next
MsgBox c01, , "besturingselementen in" &UserForm1.Name
End Sub

5.4.2 Besturingselement toevoegen

Sub Userform_besturingselement_toevoegen()
With ThisWorkbook.VBProject.VBComponents("invoer").Designer.Controls.Add("forms.commandButton.1", "knop_einde")
.Caption = "Stop"
.Top =120
.Left =120
End With
End Sub
Sub Userform_tekstvak_toevoegen()
ThisWorkbook.VBProject.VBComponents("invoer").designer.Controls.Add("forms.Textbox.1").Name = "tekst_1"
End Sub
Sub Userform_keuzerondje_toevoegen()
ThisWorkbook.VBProject.VBComponents("invoer").designer.Controls.Add("forms.OptionButton.1").Name = "keus_1"
End Sub
Sub Userform_selectievak_toevoegen()
ThisWorkbook.VBProject.VBComponents("invoer").designer.Controls.Add("forms.CheckBox.1").Name = "selectie_1"
End Sub
Sub Userform_bijschrift_toevoegen()
ThisWorkbook.VBProject.VBComponents("invoer").designer.Controls.Add("forms.Label.1").Name = "bijschrift_1"
End Sub
Sub Userform_opdrachtknop_toevoegen()
ThisWorkbook.VBProject.VBComponents("invoer").designer.Controls.Add("forms.CommandButton.1").Name = "opdracht_1"
End Sub
Sub Userform_wisselknop_toevoegen()
ThisWorkbook.VBProject.VBComponents("invoer").designer.Controls.Add("forms.ToggleButton.1").Name = "wissel_1"
End Sub
Sub Userform_kringveld_toevoegen()
ThisWorkbook.VBProject.VBComponents("invoer").designer.Controls.Add("forms.SpinButton.1").Name = "spinner_1"
End Sub
Sub Userform_keuzelijst_met_invoervak_toevoegen()
ThisWorkbook.VBProject.VBComponents("invoer").designer.Controls.Add("forms.ComboBox.1").Name = "uitklap_1"
End Sub
Sub Userform_keuzelijst_toevoegen()
ThisWorkbook.VBProject.VBComponents("invoer").designer.Controls.Add("forms.ListBox.1").Name = "keuzen_1"
End Sub
Sub Userform_groepsvak_toevoegen()
ThisWorkbook.VBProject.VBComponents("invoer").designer.Controls.Add("forms.Frame.1").Name = "kader_1"
End Sub
Sub Userform_tabstrook_toevoegen()
ThisWorkbook.VBProject.VBComponents("invoer").designer.Controls.Add("forms.TabStrip.1").Name = "tab_1"
End Sub
Sub Userform_multipage_toevoegen()
ThisWorkbook.VBProject.VBComponents("invoer").designer.Controls.Add("forms.MultiPage.1").Name = "multi_1"
End Sub
Sub Userform_schuifbalk_toevoegen()
ThisWorkbook.VBProject.VBComponents("invoer").designer.Controls.Add("forms.ScrollBar.1").Name = "schuif_1"
End Sub
Sub Userform_afbeelding_toevoegen()
ThisWorkbook.VBProject.VBComponents("invoer").designer.Controls.Add("forms.Image.1").Name = "plaatje_1"
End Sub

5.4.3 Besturingselement kopiŽren

van Userform1 ("invoer") naar Userform2 ("invoer2")
Sub Userform_besturingselement_kopiŽren()
With ThisWorkbook.VBProject
With .VBComponents("invoer").Designer
.Controls("knop_einde").SetFocus
.Copy
End With
.VBComponents("invoer2").Designer.Paste
End With
End Sub

5.4.4 Besturingselement hernoemen

Sub Userform_besturingselement_hernoemen()
With ThisWorkbook.VBProject.VBComponents("invoer")
.Designer.Controls("knop_einde").Name = "knop_slot"
End With
End Sub

5.4.5 Besturingselement verwijderen

Sub Userform_besturingselement_verwijderen()
With ThisWorkbook.VBProject.VBComponents("invoer")
.Designer.Controls.Remove "knop_einde"
End With
End Sub

5.4.6 Besturingselement gebeurtenissen

5.4.6.1 Alle Besturingselement-gebeurteniscode van een bepaalde besturingselement

Sub Userform_alle_besturingselementcode_van_een_bepaald_besturingselement()
With ThisWorkbook.VBProject.VBComponents("invoer").CodeModule
sn = Filter(Split(.Lines(1, .countoflines), vbCrLf), "Sub TextBox1_")
For j = 0 To UBound(sn)(br/>
sn(j) = .Lines(.ProcStartLine(Split(Split(sn(j), "Sub ")(1), "(")(0), 0), .ProcCountLines(Split(Split(sn(j), "Sub ")(1), "(")(0), 0))
Next
End With
End Sub

5.4.6.2 Besturingselement-gebeurteniscode zoeken

Sub besturingselement_code_zoeken()
With ThisWorkbook.VBProject.VBComponents("invoer").CodeModule
MsgBox "knop_einde_Click gebeurtenis" & iif(.Find("Sub knop_einde_Click("),"","niet ") & "gevonden"
End with
End Sub

5.4.6.3 Besturingselement-gebeurteniscode lezen

Sub besturingselement_code_lezen()
With ThisWorkbook.VBProject.VBComponents("invoer").CodeModule
MsgBox .Lines(.ProcStartLine("knop_einde_Click",0), .ProcCountLines("knop_einde_Click",0))
End with
End Sub

5.4.6.4 Besturingselement-gebeurteniscode toevoegen.

Sub besturingselementcode_toevoegen()
With ThisWorkbook.VBProject.VBComponents("invoer").CodeModule
.InsertLines .CreateEventProc("Click","knop_einde")=1,"MsgBox " & chr(34) & "Controleer alle gegevens"
End With
End Sub

5.4.6.5 Besturingselement-gebeurteniscode kopiŽren

de gebeurteniscode kopiŽren van Userform1 ("invoer") naar Userform2 ("invoer2")
Sub besturingselement_code_kopie()
With ThisWorkbook.VBProject
With .VBComponents("invoer").CodeModule
c00 = .Lines(.ProcStartLine("knop_einde_Click",0), .ProcCountLines("knop_einde_Click",0))
End With
.VBComponents("invoer2").CodeModule.AddFromString c00
End with
End Sub
analoge objecten in hetzelfde Userform met identieke code in bijv. tekstvak1 en tekstvak2
Sub besturingselement_code_kopie2()
With ThisWorkbook.VBProject.VBComponents("invoer").CodeModule
.AddFromString replace(.Lines(.ProcStartLine("tekstvak1_Change",0), .ProcCountLines("tekstvak1_Change",0)),"tekstvak1","tekstvak2")
End With
End Sub

5.4.6.6 Besturingselement-gebeurteniscode vervangen

De begin- en sluitregel van de de gebeurtenisprocedure blijven staat; de code ertussen wordt vervangen.
Sub besturingselement_code_vervangen()
With ThisWorkbook.VBProject.VBComponents("invoer").CodeModule
.ReplaceLines .ProcStartLine("knop_einde_Click",0) + 1, .ProcCountLines("knop_einde_Click",0) - 2, .ProcStartLine("knop_einde_Click",0) + 1,"MsgBox " & Chr(34) & "Dit is de nieuwste tekst"
End With
End Sub

5.4.6.7 Besturingselement-gebeurteniscode aanpassen

Sub besturingselement_code_aanpassen()
With ThisWorkbook.VBProject.VBComponents("invoer").codemodule
.ReplaceLine .ProcStartLine("knop_einde_Click",0), Replace(.Lines(.ProcStartLine("knop_einde_Click",0), 1), "_einde", "_slot")
End With
End Sub

5.4.6.8 Besturingselement-gebeurteniscode verwijderen

Sub besturingselement_code_verwijderen()
With ThisWorkbook.VBProject.VBComponents("invoer").codemodule
.DeleteLines .ProcStartLine("knop_vervolg_Click",0), .ProcCountLines("knop_vervolg_Click",0)
End With
End Sub