VBA - Visual Basic Working Partner

En av de mest enastående egenskaperna hos Visual Basic är att det är en komplett utvecklingsmiljö. Vad du än vill göra finns det en "smak" av Visual Basic som hjälper dig att göra jobbet! Du kan använda Visual Basic för desktop och mobil och fjärrutveckling (VB.NET), skript (VBScript) och Office-utveckling (VBA !) Om du har provat VBA och vill veta mer om hur du använder det, detta är handledning för dig. (Denna kurs är baserad på den version av VBA som finns i Microsoft Office 2010.)

Om du söker på en kurs i Microsoft Visual Basic .NET har du också hittat rätt plats. Kolla in: Visual Basic .NET 2010 Express - En "Från grunden" -handledning

VBA som ett allmänt koncept kommer att behandlas i denna artikel. Det finns mer i VBA än du kanske tror! Du kan också hitta artiklar om Office VBA-systrarna:

Det finns i princip två sätt att utveckla program som kan fungera med Office-applikationer: VBA och VSTO. I oktober 2003 introducerade Microsoft en förbättring av den professionella programmeringsmiljön Visual Studio .NET som heter Visual Studio Tools for Office - VSTO. Men även om VSTO utnyttjar de stora fördelarna med .NET i Office, är VBA fortfarande mer populärt än VSTO. VSTO kräver användning av Professional eller högre version av Visual Studio - vilket förmodligen kommer att kosta dig mer än Office-applikationen du använder - förutom Office-applikationen. Men eftersom VBA är integrerat med värd Office-applikationen behöver du inget annat.

VBA används främst av Office-experter som vill göra sitt arbete snabbare och enklare. Du ser sällan stora system skrivna i VBA. VSTO används å andra sidan av professionella programmerare i större organisationer för att skapa tillägg som kan vara ganska sofistikerade. En ansökan från en tredje part, som ett pappersföretag för Word eller ett revisionsföretag för Excel, är mer troligt att det skrivs med VSTO.

I sin dokumentation noterar Microsoft att det i princip finns tre skäl att använda VBA:

-> Automation & repetition - Datorer kan göra samma sak om och om igen mycket bättre och snabbare än människor kan.

-> Tillägg till användarinteraktion - Vill du föreslå exakt hur någon ska formatera ett dokument eller spara en fil? VBA kan göra det. Vill du validera vad någon skriver in? Det kan VBA också.

-> Interaktion mellan Office 2010-applikationer - En senare artikel i denna serie kallas Word och Excel Working Together. Men om det här är vad du behöver, kanske du vill överväga Kontorsautomation, det vill säga skriva systemet med VB.NET och sedan använda funktionerna från ett Office-program som Word eller Excel efter behov.

Microsoft har uttalat att de kommer att fortsätta att stödja VBA och det presenteras framträdande i Officiell Microsoft Office 2010-utvecklingsplan. Så du har så mycket säkerhet som Microsoft någonsin ger att din investering i VBA-utveckling inte kommer att bli föråldrad inom en snar framtid.

Å andra sidan är VBA den sista återstående Microsoft-produkten som beror på VB6 "COM" -teknologi. Det är över tjugo år nu! Under mänskliga år skulle det bli äldre än vampyren Lestat. Du kanske ser det som "provat, testat och sant" eller så kan du tänka på det som "forntida, utsliten och föråldrad". Jag tenderar att föredra den första beskrivningen men du bör vara medveten om fakta.

Det första att förstå är förhållandet mellan VBA och Office-applikationer som Word och Excel. Office-applikationen är en värd för VBA. Ett VBA-program kan aldrig köras av sig själv. VBA är utvecklad i värdmiljön (med hjälp av Utvecklare i Office-applikationsbandet) och det måste köras som en del av ett Word-dokument, en Excel-arbetsbok, en Access-databas eller någon annan Office-värd.

Hur VBA faktiskt används är också annorlunda. I en applikation som Word används VBA främst som ett sätt att få åtkomst till objekten i värdmiljön, till exempel åtkomst till styckena i ett dokument med Word's Word.Document.Paragraphs-objekt. Varje värdmiljö bidrar med unika objekt som inte är tillgängliga i de andra värdmiljöerna. (Det finns till exempel ingen "arbetsbok" i ett Word-dokument. En arbetsbok är unik för Excel.) Visual Basic-koden finns främst där för att göra det möjligt att använda objekt som är anpassade för varje Office-värdapplikation..

Fusionen mellan VBA och värdspecifik kod kan ses i detta kodprov (hämtat från Microsoft Northwind-samplingsdatabasen) där rent VBA-kod visas i rött och Access-specifik kod visas i blått. Den röda koden skulle vara densamma i Excel eller Word men den blå koden är unik för denna Access-applikation.

VBA själv är nästan samma som det har varit i flera år. Hur det integreras med värd Office-applikationen och hjälpsystemet har förbättrats mer.

2010-versionen av Office visar inte utvecklarfliken som standard. Fliken Utvecklare tar dig med i den del av applikationen där du kan skapa VBA-program så det första du behöver göra är att ändra det alternativet. Gå bara till Arkiv-fliken, Alternativ, Anpassa band och klicka på Utvecklar-rutan i Huvudflikar.

Hjälpsystemet fungerar mycket smidigare än i tidigare versioner. Du kan få hjälp för dina VBA-frågor antingen offline, från ett system som är installerat med din Office-applikation eller online från Microsoft via Internet. De två gränssnitten är utformade för att se mycket lika ut:

--------
Klicka här för att visa bilden
--------

Om din internetanslutning är snabb ger onlinehjälpen dig mer och bättre information. Men den lokalt installerade versionen kommer förmodligen att vara snabbare och i de flesta fall är den lika bra. Du kanske vill göra den lokala hjälpen till standard och använd sedan onlinehjälpen om den lokala versionen inte ger dig vad du vill. Det snabbaste sättet att gå online är att helt enkelt välja "Allt Word" (eller "All Excel" eller annan app) i rullgardinsmenyn Sök i hjälpen. Detta kommer omedelbart att gå online och utföra samma sökning, men det återställer inte ditt standardval.

--------
Klicka här för att visa bilden
--------

På nästa sida kommer vi igång med hur man faktiskt skapar ett VBA-program.

När VBA "värd" av en applikation som Word eller Excel, "programmet" lever "i dokumentfilen som används av värden. I Word kan du till exempel spara ditt 'Word-makro' (det är inte ett "makro", men vi kommer inte att ifrågasätta om terminologi just nu) varken i ett Word-dokument eller en Word-mall.

Anta nu att detta VBA-program skapas i Word (detta enkla program ändrar bara teckensnittet till fetstil för en vald rad) och sparas i ett Word-dokument:

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

I tidigare versioner av Office kan du tydligt se VBA-koden lagrad som en del av dokumentfilen i det sparade Word-dokumentet genom att visa den i Notepad där allt i Word-dokumentet kan ses. Denna illustration producerades med en tidigare version av Word eftersom Microsoft ändrade dokumentformatet i den aktuella versionen och VBA-programkod visas inte tydligt som vanlig text längre. Men rektor är densamma. På samma sätt, om du skapar ett Excel-kalkylblad med ett "Excel-makro" kommer det att sparas som en del av en .xlsm-fil.

--------
Klicka här för att visa bilden
--------

VBA och säkerhet

Ett av de mest effektiva datavirustricksna tidigare var att infoga skadlig VBA-kod i ett Office-dokument. Med tidigare versioner av Office, när ett dokument öppnades, kunde viruset köras automatiskt och skapa förödelse på din maskin. Detta öppna säkerhetshål i Office började påverka Office-försäljningen och det fick verkligen Microsofts uppmärksamhet. Med den nuvarande Office-generationen 2010 har Microsoft pluggat hålet noggrant. Förutom de förbättringar som nämns här har Microsoft förbättrat Office-säkerheten på sätt som du kanske inte ens märker helt ner till hårdvarunivån. Om du tvekar att använda VBA eftersom du hörde att det inte var säkert, kan du vara säker på att Microsoft har gått den extra milen för att ändra det nu.

Den viktigaste förändringen var att skapa en speciell dokumenttyp bara för Office-dokument som innehåller VBA-program. I Word, till exempel, kan MyWordDoc.docx inte innehålla ett VBA-program eftersom Word inte tillåter program i en fil som är sparad med en "docx" -filtillägg. Filen måste sparas som en "MyWordDoc.docm" för att VBA-programmering ska tillåtas som en del av filen. I Excel är filändelsen ".xlsm".

För att följa den förbättrade dokumenttypen skapade Microsoft ett nytt säkerhetsundersystem i Office som heter Trust Center. I huvudsak kan du anpassa hur din Office-applikation behandlar dokument som innehåller VBA-kod i detalj. Du öppnar Trust Center från fliken Utvecklare i ditt Office-program genom att klicka på Macro Security i kodavsnittet i bandet.

--------
Klicka här för att visa bilden
--------

Vissa av alternativen är utformade för att "härda" dina Office-applikationer så att skadlig kod inte körs och andra är utformade för att göra det enklare för utvecklare och användare att använda VBA utan att ha säkerhet onödigt långsammare. Som ni ser finns det många sätt att anpassa säkerheten och att gå igenom dem alla är långt utanför denna artikel. Lyckligtvis har Microsofts webbplats omfattande dokumentation om detta ämne. Och det är också lyckligtligt att standardsäkerhetsinställningarna är bra för de flesta krav.

Eftersom VBA är bundet till värd Office-applikationen måste du köra det där. Detta ämne behandlas från nästa sida.

Hur kör jag en VBA-applikation

Det är faktiskt en mycket bra fråga eftersom det är den första som användare av din applikation kommer att ställa. Det finns i princip två sätt:

-> Om du bestämmer dig för att inte använda en kontroll, som en knapp, för att starta programmet, måste du använda Macros-kommandot på bandet (fliken utvecklare, kodgrupp). Välj VBA-programmet och klicka på Kör. Men detta kan tyckas lite för mycket för vissa av dina användare. Till exempel kanske du inte vill att fliken Utvecklare ens ska vara tillgänglig för dem. Isåfall…

-> Du måste lägga till något som användaren kan klicka på eller skriva för att starta applikationen. I den här artikeln kommer vi att titta på knappkontrollen. Men det kan vara att klicka på en genväg, en ikon i ett verktygsfält eller till och med att ange data. Dessa kallas evenemang och vad vi kommer att skriva i detta och senare artiklar är händelsekod - programkod som körs automatiskt när någon specifik händelse - som att klicka på en knappkontroll - inträffar.

UserForms, Formkontroller och ActiveX-kontroller

Om du inte bara väljer ett makro är det vanligaste sättet att köra ett VBA-program att klicka på en knapp. Den knappen kan antingen vara en formkontroll eller en ActiveX-kontroll. Till viss del beror dina val på Office-applikationen som du använder. Excel ger något annorlunda val än till exempel Word. Men dessa grundläggande typer av kontroller är desamma.

Eftersom det erbjuder mest flexibilitet, låt oss titta på vad du kan göra med Excel 2010. Ett enkelt textmeddelande kommer att infogas i en cell när flera olika knappar klickas bara för att göra skillnaderna tydligare.

För att komma igång, skapa en ny Excel-arbetsbok och välj fliken Utvecklare. (Om du har en annan Office-applikation bör en variation av dessa instruktioner fungera.)

Klicka på Infoga-ikonen. Vi arbetar först med knappen Formkontroller.

Formkontroller är den äldre tekniken. I Excel introducerades de först i version 5.0 1993. Vi kommer att arbeta med VBA UserForms nästa men formulärkontroller kan inte användas med dem. De är inte heller kompatibla med webben. Formkontroller placeras direkt på arbetsbladets yta. Å andra sidan kan vissa ActiveX-kontroller - som vi överväger nästa - inte användas direkt på kalkylblad.

Formkontroller används med en "klicka och dra" -teknik. Klicka på knappen för knappformulär. Muspekaren ändras till ett plustecken. Rita kontrollen genom att dra över ytan. När du släpper musknappen dyker upp en dialogruta som ber om ett makrokommando för att ansluta till knappen.

--------
Klicka här för att visa bilden
--------

Särskilt när du skapar en kontroll för första gången, kommer du inte att ha en VBA-makro som väntar på att bli ansluten med knappen, så klicka på Ny så kommer VBA-redigeraren att öppnas med det föreslagna namnet redan fyllt i skalet på en händelse subrutin.

--------
Klicka här för att visa bilden
--------

För att slutföra denna mycket enkla applikation, skriv bara detta VBA-koduttalande i Sub:

 Celler (2, 2) .Value = "Formknapp klickad" 

En ActiveX-knapp är nästan exakt densamma. En skillnad är att VBA placerar denna kod i kalkylbladet, inte i en separat modul. Här är den kompletta händelsekoden.

 Privat subkommandoButton1_Click () Celler (4, 2) .Value = "ActiveX-knapp klickade" End Sub 

Förutom att placera dessa kontroller direkt på kalkylbladet kan du också lägga till en Userform till projektet och placera kontroller på det istället. UserForms - ungefär samma sak som Windows-formulär - har många fördelar med att kunna hantera dina kontroller mer som en vanlig Visual Basic-applikation. Lägg till en UserForm till projektet i Visual Basic-redigeraren. Använd Visa-menyn eller högerklicka i Project Explorer.

--------
Klicka här för att visa bilden
--------

Standard för en UserForm är att inte visa formuläret. Så för att göra det synligt (och göra kontrollerna på det tillgängligt för användaren), kör formen Show-form. Jag har lagt till en annan formknapp just för detta.

 Sub Button2_Click () UserForm1.Show End Sub 

Du kommer att märka att UserForm är det modal som standard. Det betyder att när formuläret är aktivt är allt annat i applikationen inaktiv. (Att klicka på de andra knapparna gör till exempel ingenting.) Du kan ändra detta genom att ändra egenskapen ShowModal i UserForm till False. Men detta får oss djupare in i programmering. De nästa artiklarna i denna serie kommer att förklara mer om detta.

Koden för UserForm placeras i UserForm-objektet. Om du väljer Visa kod för alla objekt i Project Explorer kommer du att se att det finns tre separata klickhändelsunderrutiner som finns i tre olika objekt. Men de är alla tillgängliga för samma arbetsbok.

--------
Klicka här för att visa bilden
--------

Förutom att tvinga en händelse genom att klicka på en knapp används VBA också för att reagera på händelser i objekten i värdprogrammet. Till exempel kan du upptäcka när ett kalkylblad ändras i Excel. Eller så kan du upptäcka när en rad läggs till i en databas i Access och skriva ett program för att hantera den händelsen.

Förutom de välbekanta kommandoknapparna, textrutorna och andra komponenter som du ser i program hela tiden kan du lägga till komponenter som faktiskt ingår i ditt Excel-kalkylblad i ditt Word-dokument. Eller gör omvänt. Detta går långt utöver "kopiera och klistra in". Till exempel kan du visa ett Excel-kalkylblad i ett Word-dokument.

Med VBA kan du använda hela kraften i en Office-applikation i en annan. Till exempel har Word en relativt enkel beräkningsmöjlighet inbyggd. Men Excel - ja - "utmärker" vid beräkningen. Anta att du ville använda den naturliga loggen för Gamma-funktionen (en relativt sofistikerad matematisk beräkning) i ditt Word-dokument? Med VBA kan du skicka värden till den funktionen i Excel och få svaret tillbaka i ditt Word-dokument.

Och du kan använda mycket mer än Office-applikationerna! Om du klickar på ikonen "Fler kontroller" kan du se en betydande lista över saker som är installerade på din dator. Inte alla dessa fungerar "ut ur lådan" och du bör ha dokumentationen för var och en av dem tillgängliga, men det ger dig en uppfattning om hur bred supporten är för VBA.

Av alla funktioner i VBA finns det en som är tydligt mer användbar än någon annan. Ta reda på vad det är på nästa sida.

Jag har sparat det bästa för sist! Här är en teknik som gäller över hela linjen för alla Office-applikationer. Du hittar dig själv som använder det mycket så vi täcker det här i introduktionen.

När du börjar koda mer sofistikerade VBA-program är ett av de första problemen du kommer att stöta på hur du kan ta reda på om Office-objektens metoder och egenskaper. Om du skriver ett VB.NET-program letar du ofta efter kodprover och exempel för att lösa problemet. Men när du överväger alla olika värdapplikationer och det faktum att var och en av dem har hundratals nya objekt, kan du vanligtvis inte hitta något som exakt matchar vad du behöver göra.

Svaret är "Spela in makro ..."

Den grundläggande idén är att aktivera "Spela in makro", gå igenom stegen i en process som liknar det du vill att ditt program ska uppnå och sedan kontrollera det resulterande VBA-programmet för kod och idéer..

Många människor gör misstaget att tro att du måste kunna spela in exakt det program du behöver. Men det är inte alls nödvändigt att vara så exakt. Det är vanligtvis tillräckligt bra för att spela in ett VBA-program som bara är "nära" vad du vill och sedan lägga till kodändringarna för att göra det exakt. Det är så enkelt och användbart att jag ibland kommer att spela in ett dussin program med små skillnader bara för att se vad kodskillnaderna är i resultatet. Kom ihåg att ta bort alla experiment när du är klar med att titta på dem!

Som ett exempel klickade jag på Spela in makro i Word Visual Basic Editor och skrev flera textrader. Här är resultatet. (Linjefortsättning har lagts till för att göra dem kortare.)

 Sub Macro1 () "Macro1 Macro" Selection.TypeText Text: = _ "Det här är tiderna som" Selection.TypeText Text: = _ "prova mäns själar." Selection.TypeText Text: = _ "sommarsoldat" Selection.TypeText Text: = _ "och solskenpatriot" Selection.TypeText Text: = _ "kommer i dessa tider att krympa från" Selection.TypeText Text: = _ "deras lands tjänst." Selection.MoveUp Unit: = wdLine, Count: = 1 Selection.HomeKey Unit: = wdLine Selection.MoveRight Unit: = wdCharacter, _ Count: = 5, Extend: = wdExtend Selection.Font.Bold = wdToggle End Sub 

Ingen studerar VBA bara för sig själv. Du använder den alltid tillsammans med en specifik Office-applikation. Så för att fortsätta lära, det finns artiklar här som visar VBA som används med både Word och Excel:

-> Komma igång med VBA: Word Working Partner

-> Komma igång med VBA: Excel Working Partner