VBA - De Visual Basic Working Partner

Een van de meest opvallende kwaliteiten van Visual Basic is dat het een compleet ontwikkelomgeving. Wat je ook wilt doen, er is een 'smaak' van Visual Basic om je te helpen het werk te doen! U kunt Visual Basic gebruiken voor desktop- en mobiele en externe ontwikkeling (VB.NET), scripting (VBScript) en Office-ontwikkeling (VBA !) Als u VBA hebt geprobeerd en meer wilt weten over het gebruik ervan, dit is de tutorial voor jou. (Deze cursus is gebaseerd op de versie van VBA in Microsoft Office 2010.)

Als u een cursus zoekt in Microsoft Visual Basic .NET, bent u ook op de juiste plaats. Bekijk: Visual Basic .NET 2010 Express - Een "vanaf de grond af" handleiding

VBA als algemeen concept zal in dit artikel worden behandeld. VBA bevat meer dan u denkt! U kunt ook artikelen vinden over de Office VBA-zussen:

Er zijn in principe twee manieren om programma's te ontwikkelen die met Office-toepassingen kunnen werken: VBA en VSTO. In oktober 2003 introduceerde Microsoft een verbetering van de professionele programmeeromgeving Visual Studio .NET genaamd Visual Studio Tools for Office - VSTO. Maar hoewel VSTO gebruik maakt van de aanzienlijke voordelen van .NET in Office, blijft VBA populairder dan VSTO. VSTO vereist het gebruik van de Professional of hogere versie van Visual Studio - die u waarschijnlijk meer zal kosten dan de Office-toepassing die u gebruikt - naast de Office-toepassing. Maar omdat VBA is geïntegreerd met de Office-hostapp, hebt u verder niets nodig.

VBA wordt voornamelijk gebruikt door Office-experts die hun werk sneller en eenvoudiger willen maken. Je ziet zelden grote systemen geschreven in VBA. VSTO daarentegen wordt door professionele programmeurs in grotere organisaties gebruikt om invoegtoepassingen te maken die behoorlijk geavanceerd kunnen zijn. Een toepassing van een derde partij, zoals een papierbedrijf voor Word of een accountantskantoor voor Excel, is waarschijnlijker om te worden geschreven met behulp van VSTO.

In hun documentatie merkt Microsoft op dat er in principe drie redenen zijn om VBA te gebruiken:

-> Automatisering en herhaling - Computers kunnen hetzelfde steeds beter en sneller doen dan mensen.

-> Uitbreidingen voor gebruikersinteractie - Wilt u precies voorstellen hoe iemand een document moet opmaken of een bestand moet opslaan? VBA kan dat. Wilt u valideren wat iemand binnenkomt? VBA kan dat ook.

-> Interactie tussen Office 2010-toepassingen - Een later artikel in deze serie wordt Word en Excel genoemd. Maar als dit is wat je nodig hebt, zou je kunnen overwegen Kantoor Automatisering, dat wil zeggen, het systeem schrijven met behulp van VB.NET en vervolgens de functies van een Office-toepassing zoals Word of Excel gebruiken als dat nodig is.

Microsoft heeft verklaard dat zij VBA zullen blijven ondersteunen en het is prominent aanwezig in de Officieel Microsoft Office 2010 Ontwikkeling Roadmap. U hebt dus zoveel zekerheid als Microsoft ooit biedt dat uw investering in VBA-ontwikkeling in de nabije toekomst niet verouderd zal zijn.

Aan de andere kant is VBA het laatst overgebleven Microsoft-product dat afhankelijk is van VB6 "COM" -technologie. Het is nu meer dan twintig jaar oud! In menselijke jaren zou dat het ouder maken dan Lestat the Vampire. Je zou dat kunnen zien als "beproefd, getest en waar" of je zou het kunnen zien als "oud, versleten en verouderd". Ik geef de voorkeur aan de eerste beschrijving, maar u moet zich bewust zijn van de feiten.

Het eerste dat u moet begrijpen, is de relatie tussen VBA en Office-toepassingen zoals Word en Excel. De Office-toepassing is een gastheer voor VBA. Een VBA-programma kan nooit zelf worden uitgevoerd. VBA is ontwikkeld in de hostomgeving (met behulp van de Ontwikkelaar tab in het Office-toepassingslint) en het moet worden uitgevoerd als onderdeel van een Word-document, een Excel-werkmap, een Access-database of een andere Office-host.

De manier waarop VBA daadwerkelijk wordt gebruikt, is ook anders. In een toepassing zoals Word wordt VBA voornamelijk gebruikt als een manier om toegang te krijgen tot de objecten van de hostomgeving, zoals toegang tot de alinea's in een document met het Word.Document.Paragraphs-object van Word. Elke hostomgeving levert unieke objecten op die niet beschikbaar zijn in de andere hostomgevingen. (Er is bijvoorbeeld geen "werkmap" in een Word-document. Een werkmap is uniek voor Excel.) De Visual Basic-code is er vooral om het mogelijk te maken om aangepaste objecten te gebruiken voor elke Office-hosttoepassing.

De fusie tussen VBA en host-specifieke code is te zien in dit codevoorbeeld (afkomstig uit de voorbeelddatabase van Microsoft Northwind) waar de pure VBA-code in rood wordt weergegeven en de toegangsspecifieke code in blauw wordt weergegeven. De rode code zou hetzelfde zijn in Excel of Word, maar de blauwe code is uniek voor deze Access-toepassing.

VBA zelf is bijna hetzelfde als het al jaren is. De manier waarop het wordt geïntegreerd met de host Office-toepassing en het Help-systeem is meer verbeterd.

De 2010-versie van Office geeft standaard het tabblad Ontwikkelaar niet weer. Het tabblad Ontwikkelaars brengt u naar het gedeelte van de applicatie waar u VBA-programma's kunt maken, dus het eerste wat u hoeft te doen, is die optie wijzigen. Ga gewoon naar het tabblad Bestand, Opties, Lint aanpassen en klik op het vak Ontwikkelaar op de hoofdtabbladen.

Het Help-systeem werkt veel soepeler dan in eerdere versies. U kunt offline hulp krijgen bij uw VBA-vragen, van een systeem dat is geïnstalleerd met uw Office-toepassing of online van Microsoft via internet. De twee interfaces zijn ontworpen om veel op elkaar te lijken:

--------
Klik hier om de illustratie weer te geven
--------

Als uw internetverbinding snel is, geeft de online-help u meer en betere informatie. Maar de lokaal geïnstalleerde versie zal waarschijnlijk sneller zijn en in de meeste gevallen is het net zo goed. Misschien wilt u de lokale help instellen als standaard en vervolgens de online help gebruiken als de lokale versie u niet geeft wat u wilt. De snelste manier om online te gaan is om eenvoudigweg "Alle Word" (of "Alle Excel" of andere app) te selecteren in de vervolgkeuzelijst Zoeken in de Help. Dit gaat onmiddellijk online en voert dezelfde zoekactie uit, maar uw standaardselectie wordt niet gereset.

--------
Klik hier om de illustratie weer te geven
--------

Op de volgende pagina beginnen we met het maken van een VBA-programma.

Wanneer VBA wordt "gehost" door een toepassing zoals Word of Excel, "leeft" het programma in het documentbestand dat door de host wordt gebruikt. In Word kunt u bijvoorbeeld uw 'Word-macro' opslaan (het is niet een 'macro', maar we zullen nu niet over de terminologie kibbelen) in een Word-document of een Word-sjabloon.

Stel nu dat dit VBA-programma is gemaakt in Word (dit eenvoudige programma verandert het lettertype gewoon in vet voor een geselecteerde regel) en wordt opgeslagen in een Word-document:

 Sub AboutMacro () "AboutMacro Macro 'Macro opgenomen 9/9/9999 door Dan Mabbutt' Selection.HomeKey Unit: = wdStory Selection.EndKey Unit: = wdLine, Extend: = wdExtend Selection.Font.Bold = wdToggle Selection.EndKey Unit: = wdStory End Sub 

In eerdere versies van Office kon je duidelijk de VBA-code zien die is opgeslagen als onderdeel van het documentbestand in het opgeslagen Word-document door het te bekijken in Kladblok waar alles in het Word-document te zien is. Deze illustratie is gemaakt met een eerdere versie van Word omdat Microsoft het documentformaat in de huidige versie heeft gewijzigd en VBA-programmacode niet meer duidelijk als gewone tekst wordt weergegeven. Maar het principe is hetzelfde. Evenzo, als u een Excel-spreadsheet met een "Excel-macro" maakt, wordt dit opgeslagen als onderdeel van een .xlsm-bestand.

--------
Klik hier om de illustratie weer te geven
--------

VBA en beveiliging

Een van de meest effectieve trucs voor computervirussen in het verleden was het invoegen van schadelijke VBA-code in een Office-document. In eerdere versies van Office, toen een document werd geopend, kon het virus automatisch worden uitgevoerd en schade aanrichten op uw computer. Dit open beveiligingslek in Office begon de verkoop van Office te beïnvloeden en dat trok echt de aandacht van Microsoft. Met de huidige 2010 Office-generatie heeft Microsoft het gat grondig gedicht. Naast de hier genoemde verbeteringen, heeft Microsoft verbeterde Office-beveiliging op een manier die u misschien niet eens opmerkt tot op hardwareniveau. Als u aarzelt om VBA te gebruiken omdat u hebt gehoord dat het niet veilig was, kunt u er zeker van zijn dat Microsoft de extra mijl heeft genomen om dat nu te veranderen.

De belangrijkste wijziging was het creëren van een speciaal documenttype alleen voor Office-documenten met VBA-programma's. In Word kan MyWordDoc.docx bijvoorbeeld geen VBA-programma bevatten omdat Word geen programma's toestaat in een bestand dat is opgeslagen met de extensie "docx". Het bestand moet worden opgeslagen als een "MyWordDoc.docm" om de VBA-programmering toe te staan ​​als onderdeel van het bestand. In Excel is de bestandsextensie ".xlsm".

Om mee te gaan met dit verbeterde documenttype, heeft Microsoft een nieuw beveiligingssubsysteem in Office gemaakt, het Trust Center. In wezen kunt u aanpassen hoe uw Office-toepassing documenten met VBA-code tot in detail behandelt. U opent het Vertrouwenscentrum vanaf het tabblad Ontwikkelaars in uw Office-toepassing door te klikken op Macrobeveiliging in het gedeelte Code van het lint.

--------
Klik hier om de illustratie weer te geven
--------

Sommige opties zijn ontworpen om uw Office-toepassingen te "harden" zodat kwaadaardige code niet wordt uitgevoerd en andere zijn ontworpen om het voor ontwikkelaars en gebruikers gemakkelijker te maken om VBA te gebruiken zonder dat beveiliging onnodig vertraagt. Zoals u ziet, zijn er veel manieren waarop u de beveiliging kunt aanpassen en ze allemaal doorlopen, valt ver buiten het bestek van dit artikel. Gelukkig heeft de website van Microsoft uitgebreide documentatie over dit onderwerp. En het is ook een geluk dat de standaardbeveiligingsinstellingen geschikt zijn voor de meeste vereisten.

Aangezien VBA is gekoppeld aan de host-Office-toepassing, moet u deze daar uitvoeren. Dat onderwerp wordt behandeld vanaf de volgende pagina.

Hoe voer ik een VBA-toepassing uit

Dat is eigenlijk een heel goede vraag, omdat het de eerste is die gebruikers van uw applicatie zullen stellen. Er zijn in principe twee manieren:

-> Als u besluit om geen besturingselement, zoals een knop, te gebruiken om het programma te starten, moet u de opdracht Macro's op het lint gebruiken (tabblad Ontwikkelaar, codegroep). Selecteer het VBA-programma en klik op Uitvoeren. Maar dit lijkt voor sommige van uw gebruikers misschien iets te veel. U wilt bijvoorbeeld misschien niet dat het tabblad Ontwikkelaars zelfs voor hen beschikbaar is. In dat geval…

-> U moet iets toevoegen waarop de gebruiker kan klikken of typen om de toepassing te starten. In dit artikel zullen we kijken naar de knopbesturing. Maar het kan een snelkoppeling zijn, een pictogram op een werkbalk of zelfs het invoeren van gegevens. Deze worden genoemd events en wat we in dit en latere artikelen zullen schrijven is gebeurtenis code - programmacode die automatisch wordt uitgevoerd wanneer een specifieke gebeurtenis - zoals klikken op een knopbesturing - plaatsvindt.

UserForms, Form Controls en ActiveX Controls

Als u niet alleen een macro selecteert, is de meest gebruikelijke manier om een ​​VBA-programma uit te voeren, op een knop te klikken. Die knop kan een zijn vorm controle of een ActiveX-besturingselement. Tot op zekere hoogte zijn uw keuzes afhankelijk van de Office-toepassing die u gebruikt. Excel biedt iets andere keuzes dan bijvoorbeeld Word. Maar deze fundamentele typen bedieningselementen zijn hetzelfde.

Omdat het de meeste flexibiliteit biedt, laten we eens kijken wat u kunt doen met Excel 2010. Een eenvoudig tekstbericht wordt in een cel ingevoegd wanneer op verschillende knoppen wordt geklikt om de verschillen duidelijker te maken.

Maak om te beginnen een nieuwe Excel-werkmap en selecteer het tabblad Ontwikkelaars. (Als u een andere Office-toepassing hebt, zou een variatie van deze instructies moeten werken.)

Klik op het pictogram Invoegen. We werken eerst met de knop Formulierbesturing.

Formulierbesturing is de oudere technologie. In Excel werden ze voor het eerst geïntroduceerd in versie 5.0 in 1993. We werken daarna met VBA UserForms, maar formulierbesturingselementen kunnen hiermee niet worden gebruikt. Ze zijn ook niet compatibel met internet. Formulierbesturingselementen worden direct op het werkbladoppervlak geplaatst. Aan de andere kant kunnen sommige ActiveX-besturingselementen - die we hierna beschouwen - niet direct op werkbladen worden gebruikt.

Formulierbesturingselementen worden gebruikt met een "klik en teken" -techniek. Klik op het besturingselement Knopformulier. De muisaanwijzer verandert in een plusteken. Teken het besturingselement door over het oppervlak te slepen. Wanneer u de muisknop loslaat, verschijnt er een dialoogvenster waarin u wordt gevraagd om een ​​macroopdracht om verbinding te maken met de knop.

--------
Klik hier om de illustratie weer te geven
--------

Vooral wanneer u voor het eerst een besturingselement maakt, hoeft u geen VBA-macro te wachten om te worden verbonden met de knop, dus klik op Nieuw en de VBA-editor wordt geopend met de voorgestelde naam al ingevuld in de shell van een evenement subroutine.

--------
Klik hier om de illustratie weer te geven
--------

Typ deze VBA-codeverklaring in de Sub om deze zeer eenvoudige toepassing te voltooien:

 Cellen (2, 2) .Value = "Formulierknop geklikt" 

Een ActiveX-knop is bijna precies hetzelfde. Een verschil is dat VBA deze code in het werkblad plaatst, niet in een afzonderlijke module. Hier is de complete evenementcode.

 Private Sub CommandButton1_Click () Cells (4, 2) .Value = "ActiveX-knop geklikt" Sub beëindigen 

Naast het plaatsen van deze bedieningselementen op het werkblad, kunt u ook een toevoegen UserForm naar het project en plaats daarop controles. UserForms - ongeveer hetzelfde als Windows-formulieren - hebben veel voordelen in het kunnen beheren van uw besturingselementen meer als een normale Visual Basic-toepassing. Voeg een UserForm toe aan het project in de Visual Basic-editor. Gebruik het menu Beeld of klik met de rechtermuisknop in Project Explorer.

--------
Klik hier om de illustratie weer te geven
--------

De standaardwaarde voor een UserForm is niet toon het formulier. Om het zichtbaar te maken (en de bedieningselementen beschikbaar te maken voor de gebruiker), voert u de methode Show van het formulier uit. Ik heb hiervoor nog een formulierknop toegevoegd.

 Sub Button2_Click () UserForm1.Toon End Sub 

U zult merken dat het UserForm is modaal standaard. Dat betekent dat wanneer het formulier actief is, al het andere in de toepassing inactief is. (Klikken op de andere knoppen doet bijvoorbeeld niets.) U kunt dit wijzigen door de eigenschap ShowModal van het UserForm te wijzigen in False. Maar hierdoor worden we dieper in programmeren. In de volgende artikelen in deze serie wordt hier meer over uitgelegd.

De code voor het UserForm wordt in het UserForm-object geplaatst. Als u Code weergeven voor alle objecten in Project Explorer selecteert, ziet u dat er drie afzonderlijke Click-event-subroutines zijn die zich in drie verschillende objecten bevinden. Maar ze zijn allemaal beschikbaar voor dezelfde werkmap.

--------
Klik hier om de illustratie weer te geven
--------

Naast het forceren van een gebeurtenis door op een knop te klikken, wordt VBA ook gebruikt om te reageren op gebeurtenissen in de objecten in de hostingtoepassing. U kunt bijvoorbeeld detecteren wanneer een spreadsheet in Excel verandert. Of u kunt detecteren wanneer een rij wordt toegevoegd aan een database in Access en een programma schrijven om die gebeurtenis af te handelen.

Naast de bekende opdrachtknoppen, tekstvakken en andere componenten die u altijd in programma's ziet, kunt u componenten toevoegen die feitelijk deel uitmaken van uw Excel-spreadsheet in uw Word-document. Of doe het omgekeerde. Dit gaat veel verder dan "kopiëren en plakken". U kunt bijvoorbeeld een Excel-spreadsheet in een Word-document weergeven.

Met VBA kunt u de volledige kracht van de ene Office-toepassing in de andere gebruiken. Word heeft bijvoorbeeld een relatief eenvoudige rekencapaciteit ingebouwd. Maar Excel - nou ja - "blinkt" uit bij de berekening. Stel dat u het natuurlijke logboek van de Gamma-functie (een relatief geavanceerde wiskundige berekening) in uw Word-document wilt gebruiken? Met VBA kunt u waarden aan die functie doorgeven in Excel en het antwoord terug krijgen in uw Word-document.

En u kunt veel meer gebruiken dan de Office-toepassingen! Als u op het pictogram "Meer bedieningselementen" klikt, ziet u een aanzienlijke lijst met dingen die op uw computer zijn geïnstalleerd. Niet al deze werken "out of the box" en je zou de documentatie voor elk van deze beschikbaar moeten hebben, maar het geeft je een idee over hoe breed de ondersteuning voor VBA is.

Van alle functies in VBA is er een die duidelijk nuttiger is dan alle andere. Ontdek wat het is op de volgende pagina.

Ik heb het beste voor het laatst bewaard! Hier is een techniek die overal van toepassing is op alle Office-toepassingen. Je zult merken dat je het veel gebruikt, dus we behandelen het hier in de Inleiding.

Naarmate u meer geavanceerde VBA-programma's gaat coderen, is een van de eerste problemen die u tegenkomt, hoe u te weten kunt komen over methoden en eigenschappen van Office-objecten. Als u een VB.NET-programma schrijft, zoekt u vaak naar codevoorbeelden en voorbeelden om dit probleem op te lossen. Maar als je rekening houdt met alle verschillende hostingtoepassingen en het feit dat elk van hen honderden nieuwe objecten heeft, kun je meestal niet iets vinden dat precies overeenkomt met wat je moet doen.

Het antwoord is de "Macro opnemen ..."

Het basisidee is om 'Macro opnemen' in te schakelen, door de stappen van een proces te gaan dat vergelijkbaar is met wat u met uw programma wilt bereiken en vervolgens het resulterende VBA-programma te controleren op code en ideeën.

Veel mensen maken de fout om te denken dat je precies het programma moet kunnen opnemen dat je nodig hebt. Maar het is helemaal niet nodig om precies te zijn. Het is meestal goed genoeg om een ​​VBA-programma op te nemen dat gewoon "dicht" ligt bij wat u wilt en vervolgens de codewijzigingen toe te voegen om het precies te laten werken. Het is zo eenvoudig en nuttig dat ik soms een dozijn programma's met kleine verschillen zal opnemen om te kijken wat de codeverschillen in het resultaat zijn. Vergeet niet om alle experimenten te verwijderen als u klaar bent met kijken!

Als voorbeeld klikte ik op Record Macro in de Word Visual Basic Editor en typte ik verschillende regels tekst. Hier is het resultaat. (Regeluitbreidingen zijn toegevoegd om ze korter te maken.)

 Sub Macro1 () "Macro1 Macro" Selection.TypeText-tekst: = _ "Dit zijn de tijden dat" Selection.TypeText-tekst: = _ "mannenzielen proberen. De" Selection.TypeText-tekst: = _ "zomersoldaat" Selection.TypeText Tekst: = _ "en de zonneschijnpatriot" Selection.TypeText Tekst: = _ "zal in deze tijden krimpen voor" Selection.TypeText Tekst: = _ "de service van hun land." Selection.MoveUp Unit: = wdLine, Count: = 1 Selection.HomeKey Unit: = wdLine Selection.MoveRight Unit: = wdCharacter, _ Count: = 5, Extend: = wdExtend Selection.Font.Bold = wdToggle End Sub 

Niemand studeert VBA alleen voor zichzelf. U gebruikt het altijd samen met een specifieke Office-toepassing. Dus, om verder te leren, zijn er artikelen die aantonen dat VBA wordt gebruikt met zowel Word als Excel:

-> Aan de slag met VBA: de Word Working Partner

-> Aan de slag met VBA: de Excel-werkpartner