Suggesties |
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. Een Excelbestand heet in VBA-taal een Workbook. Het Workbook kan VBA-code bevatten; in VBA-taal het VBproject. ThisWorkbook.VBproject 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 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:
De index van ThisWorkbook is altijd 1, de index van het eerste werkblad is 2. ThisWorkbook.VBProject.VBComponents(1) ThisWorkbook.VBProject.VBComponents("ThisWorkbook")
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
End Submsgbox ThisWorkbook.VBProject.VBComponents(j).Name
NextSub Modules_namen2() For each cp in ThisWorkbook.VbProject.VBcomponents
End Submsgbox cp.Name
NextSub Module_werkboek_codenaam() msgbox=ThisWorkbook.CodeName
End SubSub module_werkblad_codenamen() For each sh in ThisWorkbook.Sheets
End Submsgbox sh.CodeName
NextOmdat 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 SubSub Modulenaam_werkblad_wijzigen() ThisWorkbook.VbProject.VBcomponents(2).Name ="werkblad overzicht"
End SubSub Modulenaam_userform_wijzigen() ThisWorkbook.VbProject.VBcomponents("Userform1").Name ="invoer"
End Sub
Sub Modulenaam_macromodule_wijzigen() ThisWorkbook.VbProject.VBcomponents("Module1").Name ="macroos"
End Sub
Sub Modulenaam_klassemodule_wijzigen() ThisWorkbook.VbProject.VBcomponents("Klasse1").Name ="Klas_I"
End Sub- een werkblad - een macro module (vbext_ct_StdModule) - een gebruikersformulier/Userform (vbext_ct_MSForm) - een classmodule (vbext_ct_ClassModule)
Sub Werkbladmodule_toevoegen() ThisWorkbook.Sheets.Add
End SubSub Macromodule_toevoegen1() ThisWorkbook.VBProject.VBComponents.Add vbext_ct_StdModule
End SubSub Macromodule_toevoegen2() ThisWorkbook.VBProject.VBComponents.Add 1
End SubAls 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 SubSub Macromodule_toevoegen_naam2() ThisWorkbook.VBProject.VBComponents.Add(1).Name ="Macroos"
End SubSub Userform_toevoegen1() ThisWorkbook.VBProject.VBComponents.Add vbext_ct_MSForm
End SubSub Userform_toevoegen2() ThisWorkbook.VBProject.VBComponents.Add 3
End SubAls 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 SubSub Userform_toevoegen_naam2() ThisWorkbook.VBProject.VBComponents.Add(3).Name ="invoer"
End SubSub Klassemodule_toevoegen1() ThisWorkbook.VBProject.VBComponents.Add vbext_ct_ClassModule
End SubSub Klassemodule_toevoegen2() ThisWorkbook.VBProject.VBComponents.Add 2
End SubAls 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 SubSub Klassemodule_toevoegen_naam2() ThisWorkbook.VBProject.VBComponents.Add(2).Name ="Klassenaam"
End SubExtensies: - .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. Sub Macromodule_exporteren() With ThisWorkbook.VBProject.VBComponents("Macroos")
End Sub.export"E:\OF\"&.Name & ".bas"
End WithSub Userform_exporteren() With ThisWorkbook.VBProject.VBComponents("invoer")
End Sub.export"E:\OF\"&.Name & ".frm"
End WithSub Werkblad_exporteren() With ThisWorkbook.VBProject.VBComponents("Blad1")
End Sub.export"E:\OF\"& .Name & ".cls"
End WithSub Klassemodule_exporteren() With ThisWorkbook.VBProject.VBComponents("Klasse1")
End Sub.export"E:\OF\"& .Name & ".cls"
End WithSub Werkboek_exporteren() with ThisWorkbook.VBProject.VBComponents(1)
End Sub.export"E:\OF\"&.Name & ".cls"
End WithSub Alle_modules_exporteren() For Each cp In ThisWorkbook.VBProject.VBComponents
End Subcp.Export"E:\OF\"& cp.Name & Switch(cp.Type = 1, ".bas", cp.Type = 3, ".frm", cp.Type = 2, ".cls", cp.Type = 100, ".cls")
NextSub Werkblad_importeren() ThisWorkbook.VBProject.VBComponents.Import "E:\OF\sheet1.cls"
End SubSub Macromodule_importeren() ThisWorkbook.VBProject.VBComponents.Import "E:\OF\Macroos.bas"
End SubSub Userform_importeren() ThisWorkbook.VBProject.VBComponents.Import "E:\OF\invoer.frm"
End SubSub Klassemodule_importeren() ThisWorkbook.VBProject.VBComponents.Import "E:\OF\klasse5.cls"
End SubSub werkblad_verwijderen() ThisWorkbook.Sheets(1).Delete
End SubSub Macromodule_verwijderen() With ThisWorkbook.VBProject
End Sub.VBComponents.Remove .VBComponents("Macroos")
End WithSub Userform_verwijderen() With ThisWorkbook.VBProject
End Sub.VBComponents.Remove .VBComponents("invoer")
End With
Sub Klassemodule_verwijderen() With ThisWorkbook.VBProject
End Sub.VBComponents.Remove .VBComponents("Klasse1")
End With
Sub Modules_verwijderen() With ThisWorkbook.VBProject
End Subfor each cp in .VBComponents
End With.VBcomponents.Remove cp
Next
Sub werkblad_kopiëren() Thisworkbook.sheets(1).copy workbooks(2).sheets1
End subMethode 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"
End SubWith Workbooks.Add .VBProject.VBComponents.import "E:\Macroos.bas"
End With1. 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")
End Subc00 = .Name
End Withc01 = .CodeModule.Lines(1, .CodeModule.CountOfLines) With Workbooks.Add With .VBProject.VBComponents.Add(vbext_ct_StdModule)
End With.Name = c00
End With.CodeModule.AddFromString c01 Sub Userform_kopiëren1() ThisWorkbook.VBProject.VBComponents("invoer").export "E:\ invoer.frm"
End SubWith Workbooks.Add .VBProject.VBComponents.import "E:\invoer.frm"
End WithSub Klassemodule_kopiëren1() ThisWorkbook.VBProject.VBComponents("Klasse1").export "E:\Klasse_I.cls"
End SubWith Workbooks.Add .VBProject.VBComponents.import "E:\Klasse_I.cls"
End WithSub Klassemodule_kopiëren2() With ThisWorkbook.VBProject.VBComponents("Klasse1")
End Subc00 = .Name
End Withc01 = .CodeModule.Lines(1, .CodeModule.CountOfLines) With Workbooks.Add With .VBProject.VBComponents.Add(vbext_ct_ClsModule)
End With.Name = c00
End With.CodeModule.AddFromString c01
Sub Modules_kopiëren() for each cp in ThisWorkbook.VBProject.VBComponents
End Subif cp.type<>100 then
Nextif Workbooks.count=1 then workbooks.Add
End ifWith workbooks(2).VBProject.VBComponents.Add(vbext_ct_MSForm) .Name = cp.name
End with.CodeModule.AddFromString cp.codemodule.lines(1,cp.codemodule.countofLines) 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.
Sub verplaats_werkblad() ThisWorkbook.Sheets(1).Move ThisWorkbook.Sheets(4)
End Sub
Sub verplaats_werkblad_naar_ander_werkboek() ThisWorkbook.Sheets(1).Move Workbook(2).Sheets(4)
End Sub
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.
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 Function naam (argumenten) End Function 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)
Sub Code_in_werkboekmodule_lezen() With ThisWorkbook.VBProject.VBComponents(1).CodeModule
End SubMsgBox .Lines(1, .CountOfLines)
End With
' 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
End Subc00 = .Lines(1, .CountOfLines-20)
End Withc01 =.Lines(10,.CountOflines-10) c02 =.Lines(15,30) c03 =.Lines(1,.CountOfDeclarationLines)
Sub Code_werkboekmodule_verwijderen() With ThisWorkbook.VBProject.VBComponents(1).CodeModule
End Sub.DeleteLines 1, .CountOfLines
End With
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
End Subc02 = ThisWorkbook.VBProject.VBComponents(1).CodeModule.ProcOfLine(j, 0)
NextIf InStr(c01, c02) = 0 Then c01 = c01 & "|" & c02 keus1.List = Split(Mid(c01, 2), "|") Sub Macro_zoeken()
MsgBox "macro3" & IIf(ActiveWorkbook.VBProject.VBComponents("Macroos").CodeModule.Find("Sub macro3(", 1, 1, -1, -1), "", "Niet") & "gevonden."
End Sub- 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))
End SubThisWorkbook.VBProject.VBComponents("Macroos").CodeModule.AddFromString c00 * 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))
End SubThisWorkbook.VBProject.VBComponents("Macroos").CodeModule.Insertlines 1, c00 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 SubSub Macro_code_lezen()
With ThisWorkbook.VBProject.VBComponents("Macroos").codemodule
End Subc00 = .Lines(.ProcStartLine("macro3", 0), .ProcCountLines("macro3", 0))
End WithProcCountLines: het aantal coderegels van een gespecificeerde macro Sub Macro_kopiëren()
With ThisWorkbook.VBProject.VBComponents("Macroos").codemodule
End Subc00 = .Lines(.ProcStartLine("macro3", 0), .ProcCountLines("macro3", 0))
End WithThisWorkbook.VBProject.VBComponents("Macromodule_2").AddFromString c00 Sub Macro_code_vervangen()
With ThisWorkbook.VBProject.VBComponents("Macroos").codemodule
End Sub.DeleteLines .ProcStartLine("macro3", 0) + 1, .ProcCountLines("macro3", 0) - 2
End With.InsertLines .ProcStartLine("macro3", 0) + 1, "c00 = " & Chr(34) & "Dit is de nieuwste tekst" Sub Macro_hernoemen()
With ThisWorkbook.VBProject.VBComponents("Macroos").codemodule
End Sub.ReplaceLine .ProcStartLine("macro3", 0), Replace(.Lines(.ProcStartLine("macro3", 0), 1), "macro3", "Macro37a")
End WithSub Macro_verwijderen()
With ThisWorkbook.VBProject.VBComponents("Macroos").codemodule
End Sub.DeleteLines .ProcStartLine("macro3", 0), .ProcCountLines("macro3", 0)
End WithSub Macro_verplaatsen()
With ThisWorkbook.VBProject.VBComponents("Macroos").codemodule
End Subc00 = .Lines(.ProcStartLine("macro3", 0), .ProcCountLines("macro3", 0))
End With.DeleteLines .ProcStartLine("macro3", 0), .ProcCountLines("macro3", 0) ThisWorkbook.VBProject.VBComponents("Macromodule_2").AddFromString c00
In keuzelijst (keus1) in werkblad 'Blad1' komt de lijst met funkties te staan. Sub Alle_funkties_in_macromodule() c00 = "Function "
End SubWith ThisWorkbook.VBProject.VBComponents("Macroos").CodeModule c01=.Lines(1, .CountOfLines) c00, ""),"Private ",""), "|")Blad1.keus1.List = Split(Replace(Replace(Join(Filter(Split(Join(Filter(Filter(Split(c01, vbCr & Chr(10)), c0), "=", False), "("), "("), c0), "|"), End With Sub Funktie_zoeken() MsgBox "funktie2" & iif(With ThisWorkbook.VBProject.VBComponents("Macroos").codemodule.Find("funktie2","","niet ") & "gevonden"
End SubSub Funktie_maken1() c00 =replace(Replace(Replace("Function funktie1()#*MsgBox ^QED ^#End Sub", "#", vbCr), "*", vbTab),"^",chr(34))
End SubThisWorkbook.VBProject.VBComponents(1).CodeModule.AddFromString c00 Sub Funktie_maken2() c00 =replace(Replace(Replace("Function funktie1()#*MsgBox ^QED ^#End Sub", "#", vbCr), "*", vbTab),"^",chr(34))
End SubThisWorkbook.VBProject.VBComponents("Macroos").CodeModule.Insertlines 1, c00 Sub Funktie_maken3() ThisWorkbook.VBProject.VBComponents("Blad1").CodeModule.Addfromfile "E:\OF\macro1.bas"
End SubSub Funktie_code_lezen() With ThisWorkbook.VBProject.VBComponents("Macroos").codemodule
End Subc00 = .Lines(.ProcStartLine("funktie2", 0), .ProcCountLines("funktie2", 0))
End WithSub Funktie_kopiëren()
With ThisWorkbook.VBProject.VBComponents("Macroos").codemodule
End Subc00 = .Lines(.ProcStartLine("funktie2", 0), .ProcCountLines("funktie2", 0))
End WithThisWorkbook.VBProject.VBComponents("Macroos_2").CodeModule.AddFromString c00
Sub Funktie_code_vervangen() With ThisWorkbook.VBProject.VBComponents("Macroos").codemodule
End Sub.DeleteLines .ProcStartLine("funktie2", 0) + 1, .ProcCountLines("funktie2", 0) - 2
End With.InsertLines .ProcStartLine("funktie2", 0) + 1,"c00 = " & Chr(34) & "Dit is de nieuwste tekst" Sub Functie_hernoemen()
With ThisWorkbook.VBProject.VBComponents("Macroos").codemodule
End Sub.ReplaceLine .ProcStartLine("funktie2", 0), Replace(.Lines(.ProcStartLine("funktie2", 0), 1), "funktie2", "Funktie27a")
End WithSub Functie_verwijderen()
With ThisWorkbook.VBProject.VBComponents("Macroos").codemodule
End Sub.DeleteLines .ProcStartLine("funktie2", 0), .ProcCountLines("funktie2", 0)
End WithSub Functie_verplaatsen()
With ThisWorkbook.VBProject.VBComponents("Macroos").codemodule
End Subc00 = .Lines(.ProcStartLine("funktie2", 0), .ProcCountLines("funktie2", 0))
End With.DeleteLines .ProcStartLine("funktie2", 0), .ProcCountLines("funktie2", 0) ThisWorkbook.VBProject.VBComponents("Macroos_2").AddFromString c00
Sub alle_eventprocedures_in_werkboek() With ThisWorkbook.VBProject.VBComponents(1).CodeModule
end subMsgBox join(filter( split(.Lines(1, .CountOfLines),vbCrLf),"Sub Workbook_"),vbLf)
end with
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
Sub Werkboek_eventprocedure_code_lezen() With ThisWorkbook.VBProject.VBComponents(1).CodeModule
End Subc01= .Lines(.ProcStartLine("Workbook_Open",0),.ProcCountlines("Workbook_Open",0))
End With
Sub Werkboek_eventprocedure_verwijderen() With ThisWorkbook.VBProject.VBComponents(1).CodeModule
End Sub.DeleteLines .ProcStartLine("Workbook_Open",0),.ProcCountlines("Workbook_Open",0)
End With
Sub Werkboek_eventprocedure_toevoegen() With ThisWorkbook.VBProject.VBComponents(1).CodeModule
End Sub.InsertLines .CreateEventProc("Open", "Workbook") + 1, vbTab & "MsgBox " & Chr(34) & "Dit is een nieuw werkboek"
End With
Sub Werkboek_eventprocedure_kopiëren() With ThisWorkbook.VBProject.VBComponents(1).CodeModule
End Subc01= .Lines(.ProcStartLine("Workbook_Open",0),.ProcCountlines("Workbook_Open",0))
End WithWith Workbooks(2).VBProject.VBComponents(1).CodeModule .AddFromString c01
End With
Sub Werkboek_eventprocedure_verplaatsen() With ThisWorkbook.VBProject.VBComponents(1).CodeModule
End Subc01= .Lines(.ProcStartLine("Workbook_Open",0),.ProcCountlines("Workbook_Open",0)
End With
With Workbooks(2).VBProject.VBComponents(1).CodeModule) .deletelines .ProcStartLine("Workbook_Open",0),.ProcCountlines("Workbook_Open",0) .AddFromString c01
End With
Sub Werkblad_alle_eventprocedures() With ThisWorkbook.VBProject.VBComponents("Blad1").CodeModule
end subMsgBox join(filter( split(.Lines(1, .CountOfLines),vbCrLf)," Sub Worksheet_"),vbLf)
end with
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
Sub Werkblad_eventprocedure_code_lezen() With ThisWorkbook.VBProject.VBComponents("Blad1").CodeModule
End Subc01= .Lines(.ProcStartLine("Worksheet_Change",0),.ProcCountlines("Worksheet_Change",0))
End With
Sub Werkblad_eventprocedure_verwijderen() With ThisWorkbook.VBProject.VBComponents("Blad1").CodeModule
End Sub.DeleteLines .ProcStartLine("Worksheet_Change",0),.ProcCountlines("Worksheet_Change",0)
End With
Sub Werkblad_eventprocedure_toevoegen() With ThisWorkbook.VBProject.VBComponents("Blad1").CodeModule
End Sub.InsertLines .CreateEventProc("Change", "Worksheet") + 1,vbTab & "MsgBox " & Chr(34) & "Dit is een nieuw werkboek"
End With
Sub Werkblad_eventprocedure_kopiëren() With ThisWorkbook.VBProject.VBComponents("Blad1").CodeModule
End Subc01= .Lines(.ProcStartLine("Worksheet_Change",0),.ProcCountlines("Worksheet_Change",0))
End WithWith Workbooks(2).VBProject.VBComponents("Blad2").CodeModule .AddFromString c01
End With
Sub Werkblad_eventprocedure_verplaatsen() With ThisWorkbook.VBProject.VBComponents("Blad1").CodeModule
End Subc01= .Lines(.ProcStartLine("Worksheet_Change",0),.ProcCountlines("Worksheet_Change",0)
End With) .deletelines .ProcStartLine("Worksheet_Change",0),.ProcCountlines("Worksheet_Change",0) With Workbooks(2).VBProject.VBComponents("Blad2").CodeModule .AddFromString c01
End WithAan 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.
Sub alle_ActiveX_objecten() For Each cl In Sheets("Blad1").OLEObjects
End Subc01 = c01 & vbLf & cl.Name
NextMsgBox c01 Sub ActiveX_object_toevoegen() With sheets("Blad1").OLEObjects.Add("Forms.CommandButton.1",,,,,,,40,60,40,24)
End Sub.Name="knop_vervolg"
End WithWith .Object .Caption="Mededeling"
End With.Font.Size=9 .ForeColor=vbBlue Sub ActiveX_tekstvak_toevoegen()
Sheets("Blad1").OLEObjects.Add("Forms.Textbox.1", , , , , , , 40, 60, 40, 24).Name ="tekst_1"
End SubSub ActiveX_keuzerondje_toevoegen()
Sheets("Blad1").OLEObjects.Add("forms.OptionButton.1").Name =""keus_1""
End SubSub ActiveX_selectievak_toevoegen()
Sheets("Blad1").OLEObjects.Add("forms.CheckBox.1").Name ="selectie_1"
End SubSub ActiveX_bijschrift_toevoegen()
Sheets("Blad1").OLEObjects.Add("forms.Label.1").Name ="bijschrift_1"
End SubSub ActiveX_opdrachtknop_toevoegen()
Sheets("Blad1").OLEObjects.Add("forms.CommandButton.1").Name ="opdracht_1"
End SubSub ActiveX_wisselknop_toevoegen()
Sheets("Blad1").OLEObjects.Add("forms.ToggleButton.1").Name ="wissel_1"
End SubSub ActiveX_kringveld_toevoegen()
Sheets("Blad1").OLEObjects.Add("forms.SpinButton.1").Name ="spinner_1"
End SubSub ActiveX_keuzelijst_met_invoervak_toevoegen()
Sheets("Blad1").OLEObjects.Add("forms.ComboBox.1").Name ="uitklap_1"
End SubSub ActiveX_keuzelijst_toevoegen()
Sheets("Blad1").OLEObjects.Add("forms.ListBox.1").Name ="keuzen_1"
End SubSub ActiveX_groepsvak_toevoegen()
Sheets("Blad1").OLEObjects.Add("forms.Frame.1").Name ="kader_1"
End SubSub ActiveX_tabstrook_toevoegen()
Sheets("Blad1").OLEObjects.Add("forms.TabStrip.1").Name ="tab_1"
End SubSub ActiveX_multipage_toevoegen()
Sheets("Blad1").OLEObjects.Add("forms.MultiPage.1").Name ="multi_1"
End SubSub ActiveX_schuifbalk_toevoegen()
Sheets("Blad1").OLEObjects.Add("forms.ScrollBar.1").Name ="schuif_1"
End SubSub ActiveX_afbeelding_toevoegen()
Sheets("Blad1").OLEObjects.Add("forms.Image.1").Name ="plaatje_1"
End SubSub AciveX_kopie() Sheets("Blad1").OLEObjects("tekstvak1").Copy
End SubSheets("Blad2").Paste Sub ActiveX_hernoemen() Sheets("Blad1").OLEObjects("knop_vervolg").Name = "knop_einde"
End Sub
Sub ActiveX_verwijderen() Sheets("Blad1").OLEObjects("knop_vervolg").delete
End Sub
Sub ActiveX_gebeurteniscode_zoeken MsgBox "knop_vervolg_Click" & ThisWorkbook.VBProject.VBComponents("Blad1").CodeModule.Find("Sub knop_vervolg_Click(","","niet ") & "gevonden
End Sub
Sub ActiveX_gebeurteniscode_lezen ThisWorkbook.VBProject.VBComponents("Blad1").CodeModule
End SubMsgBox .Lines(.ProcStartLine("knop_vervolg_Click",0), .ProcCountLines("knop_vervolg_Click",0))
End with
Sub ActiveX_gebeurteniscode_toevoegen() With ThisWorkbook.VBProject.VBComponents("Blad1").CodeModule
End Sub.InsertLines .CreateEventProc("Click", "knop_vervolg") + 1,vbTab & "MsgBox " & Chr(34) & "Je hebt knop_vervolg aangeklikt"
End With
Sub ActiveX_gebeurteniscode_kopie() With ThisWorkbook.VBProject.VBComponents("Blad1").CodeModule
End Sub.AddFromString replace( .Lines(.ProcStartLine("tekstvak1_Change",0), .ProcCountLines("tekstvak1_Change",0)),"tekstvak1","tekstvak2")
End WithSub ActiveX_gebeurteniscode_kopiëren2() With ThisWorkbook.VBProject.VBComponents("Blad1").CodeModule
End Subc00 = .Lines(.ProcStartLine("tekstvak1_Change",0), .ProcCountLines("tekstvak1_Change",0))
End WithThisWorkbook.VBProject.VBComponents("Blad2").CodeModule.AddFromString c00
With ThisWorkbook.VBProject with .VBComponents("Blad1").codemodule
End Withc00 =.lines(.ProcStartLine("knop_vervolg_Click",0), .ProcCountLines("knop_vervolg_Click",0))
end with.DeleteLines .ProcStartLine("knop_vervolg_Click",0), .ProcCountLines("knop_vervolg_Click",0) .VBComponents("Blad2").codemodule.AddFromString c0.
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 SubSub ActiveX_code_vervangen2() With ThisWorkbook.VBProject.VBComponents("Blad1").CodeModule .DeleteLines .ProcStartLine("knop_vervolg_Click",0) + 1, .ProcCountLines("knop_vervolg_Click",0) - 2
End With
End Sub.InsertLines .ProcStartLine("knop_vervolg_Click",0) + 1,"c00 = " & Chr(34) & "Dit is de nieuwste tekst"
Sub ActiveX_code_verwijderen() With ThisWorkbook.VBProject.VBComponents("Blad1").codemodule
End Sub.DeleteLines .ProcStartLine("knop_vervolg_Click",0), .ProcCountLines("knop_vervolg_Click",0)
End With
Sub alle_eventprocedures_in_userform() With ThisWorkbook.VBProject.VBComponents("invoer").CodeModule
End SubMsgBox join(filter( split(.Lines(1, .CountOfLines),vbCrLf),"Sub UserForm_"),vbLf)
End With
Sub eventprocedure_zoeken() msgbox"Userform_Initialize" & iif(ThisWorkbook.VBProject.VBComponents("invoer").CodeModule.Find("Sub Userform_Initialize(", 1, 1, -1, -1),"", "niet") & "gevonden"
End Sub
Sub eventprocedure_lezen() With ThisWorkbook.VBProject.VBComponents("invoer").CodeModule
End Subc01 = .Lines(.ProcStartLine("Userform_Initialize", 0), .ProcCountLines("Userform_Initialize", 0))
End With
Sub eventprocedure_verwijderen() With ThisWorkbook.VBProject.VBComponents("invoer").CodeModule
End Sub.DeleteLines .ProcStartLine("Userform_Initialize",0),.ProcCountlines("Userform_Initialize",0)
End With
Sub eventprocedure_toevoegen() With ThisWorkbook.VBProject.VBComponents("invoer").CodeModule
End Sub.InsertLines .CreateEventProc("Initialize", "Userform") + 1,vbTab & "MsgBox " & Chr(34) & "Dit is een nieuw werkboek"
End With
Sub eventprocedure_kopiëren() With ThisWorkbook.VBProject.VBComponents("invoer").CodeModule
End Subc01= .Lines(.ProcStartLine("Userform_Initialize",0),.ProcCountlines("Userform_Initialize",0))
End WithWith Workbooks(2).VBProject.VBComponents("invoer").CodeModule .AddFromString c01
End With
Sub eventprocedure_verplaatsen() With ThisWorkbook.VBProject.VBComponents("invoer").CodeModule
End Subc01= .Lines(.ProcStartLine("Userform_Initialize",0),.ProcCountlines("Userform_Initialize",0))
End With.deletelines .ProcStartLine("Userform_Initialize",0),.ProcCountlines("Userform_Initialize",0) With Workbooks(2).VBProject.VBComponents("invoer").CodeModule .AddFromString c01
End With
Sub alle_besturingselementen() For Each ct In ThisWorkbook.VBProject.VBComponents("invoer").Designer.Controls
End Subc01 = c01 & vbLf & ct.Name
Nextmsgbox c01 , , "besturingselementen in userform" Sub Userform_alle_besturingselementen() For Each ct InUserForm1.Controls
End Subc01 = c01 & vbLf & ct.Name
NextMsgBox c01, , "besturingselementen in" &UserForm1.Name
Sub Userform_besturingselement_toevoegen() With ThisWorkbook.VBProject.VBComponents("invoer").Designer.Controls.Add("forms.commandButton.1", "knop_einde")
End Sub.Caption = "Stop"
End With.Top =120 .Left =120 Sub Userform_tekstvak_toevoegen() ThisWorkbook.VBProject.VBComponents("invoer").designer.Controls.Add("forms.Textbox.1").Name = "tekst_1"
End SubSub Userform_keuzerondje_toevoegen() ThisWorkbook.VBProject.VBComponents("invoer").designer.Controls.Add("forms.OptionButton.1").Name = "keus_1"
End SubSub Userform_selectievak_toevoegen() ThisWorkbook.VBProject.VBComponents("invoer").designer.Controls.Add("forms.CheckBox.1").Name = "selectie_1"
End SubSub Userform_bijschrift_toevoegen() ThisWorkbook.VBProject.VBComponents("invoer").designer.Controls.Add("forms.Label.1").Name = "bijschrift_1"
End SubSub Userform_opdrachtknop_toevoegen() ThisWorkbook.VBProject.VBComponents("invoer").designer.Controls.Add("forms.CommandButton.1").Name = "opdracht_1"
End SubSub Userform_wisselknop_toevoegen() ThisWorkbook.VBProject.VBComponents("invoer").designer.Controls.Add("forms.ToggleButton.1").Name = "wissel_1"
End SubSub Userform_kringveld_toevoegen() ThisWorkbook.VBProject.VBComponents("invoer").designer.Controls.Add("forms.SpinButton.1").Name = "spinner_1"
End SubSub Userform_keuzelijst_met_invoervak_toevoegen() ThisWorkbook.VBProject.VBComponents("invoer").designer.Controls.Add("forms.ComboBox.1").Name = "uitklap_1"
End SubSub Userform_keuzelijst_toevoegen() ThisWorkbook.VBProject.VBComponents("invoer").designer.Controls.Add("forms.ListBox.1").Name = "keuzen_1"
End SubSub Userform_groepsvak_toevoegen() ThisWorkbook.VBProject.VBComponents("invoer").designer.Controls.Add("forms.Frame.1").Name = "kader_1"
End SubSub Userform_tabstrook_toevoegen() ThisWorkbook.VBProject.VBComponents("invoer").designer.Controls.Add("forms.TabStrip.1").Name = "tab_1"
End SubSub Userform_multipage_toevoegen() ThisWorkbook.VBProject.VBComponents("invoer").designer.Controls.Add("forms.MultiPage.1").Name = "multi_1"
End SubSub Userform_schuifbalk_toevoegen() ThisWorkbook.VBProject.VBComponents("invoer").designer.Controls.Add("forms.ScrollBar.1").Name = "schuif_1"
End SubSub Userform_afbeelding_toevoegen() ThisWorkbook.VBProject.VBComponents("invoer").designer.Controls.Add("forms.Image.1").Name = "plaatje_1"
End Sub
Sub Userform_besturingselement_kopiëren() With ThisWorkbook.VBProject
End SubWith .VBComponents("invoer").Designer
End With.Controls("knop_einde").SetFocus
End With.Copy .VBComponents("invoer2").Designer.Paste
Sub Userform_besturingselement_hernoemen() With ThisWorkbook.VBProject.VBComponents("invoer")
End Sub.Designer.Controls("knop_einde").Name = "knop_slot"
End With
Sub Userform_besturingselement_verwijderen() With ThisWorkbook.VBProject.VBComponents("invoer")
End Sub.Designer.Controls.Remove "knop_einde"
End With
Sub Userform_alle_besturingselementcode_van_een_bepaald_besturingselement() With ThisWorkbook.VBProject.VBComponents("invoer").CodeModule
End Subsn = Filter(Split(.Lines(1, .countoflines), vbCrLf), "Sub TextBox1_")
End WithFor 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
Sub besturingselement_code_zoeken() With ThisWorkbook.VBProject.VBComponents("invoer").CodeModule
End SubMsgBox "knop_einde_Click gebeurtenis" & iif(.Find("Sub knop_einde_Click("),"","niet ") & "gevonden" End with
Sub besturingselement_code_lezen() With ThisWorkbook.VBProject.VBComponents("invoer").CodeModule
End SubMsgBox .Lines(.ProcStartLine("knop_einde_Click",0), .ProcCountLines("knop_einde_Click",0))
End with
Sub besturingselementcode_toevoegen() With ThisWorkbook.VBProject.VBComponents("invoer").CodeModule
End Sub.InsertLines .CreateEventProc("Click","knop_einde")=1,"MsgBox " & chr(34) & "Controleer alle gegevens"
End With
Sub besturingselement_code_kopie() With ThisWorkbook.VBProject
End SubWith .VBComponents("invoer").CodeModule
End withc00 = .Lines(.ProcStartLine("knop_einde_Click",0), .ProcCountLines("knop_einde_Click",0))
End With.VBComponents("invoer2").CodeModule.AddFromString c00 Sub besturingselement_code_kopie2() With ThisWorkbook.VBProject.VBComponents("invoer").CodeModule
End Sub.AddFromString replace(.Lines(.ProcStartLine("tekstvak1_Change",0), .ProcCountLines("tekstvak1_Change",0)),"tekstvak1","tekstvak2")
End With
Sub besturingselement_code_vervangen() With ThisWorkbook.VBProject.VBComponents("invoer").CodeModule
End Sub.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
Sub besturingselement_code_aanpassen() With ThisWorkbook.VBProject.VBComponents("invoer").codemodule
End Sub.ReplaceLine .ProcStartLine("knop_einde_Click",0), Replace(.Lines(.ProcStartLine("knop_einde_Click",0), 1), "_einde", "_slot")
End With
Sub besturingselement_code_verwijderen() With ThisWorkbook.VBProject.VBComponents("invoer").codemodule
End Sub.DeleteLines .ProcStartLine("knop_vervolg_Click",0), .ProcCountLines("knop_vervolg_Click",0)
End With |