VBA-kod - OnePro IT
Transcription
VBA-kod - OnePro IT
EXCEL-VBA ONEPRO IT Objekt ActiveX-kontroller ActiveX-kontroller är en grupp verktyg som precis som formulärkontrollerna ska automatisera och förenkla inmatning och kommunikation med kalkylblad och arbetsböcker. Den stora skillnaden mellan formulär- och ActiveX-kontroller är att formulär knyts till specifika funktioner via statiska cellreferenser medan ActiveX-kontrollerna kan knytas till olika funktioner med hjälp av händelser och metoder i VBA-kod. Dessa blir alltså fristående objekt i Excel. Bägge typerna av kontrollera hittas på menyfliken Utvecklare och knappen Infoga. Klicka på den kontroll som ska användas och klicka sedan i kalkylbladet där kontrollen ska placeras. Kalkylbladet går automatiskt över i designläge så att justeringar av storlek och position kan ske. Innan kontrollen blir funktionell så måste designläget stängas av. Egenskaper Alla objekt i Excel (Active-X kontroller m.m.) har egenskaper som kan sättas via egenskapsrutan eller via VBA-kod. Direkt när en ActiveX-kontroll skapas bör man klicka egenskaper i menyfliken Utvecklare för att sätta grundläggande egenskaper beroende på vilken typ av kontroll det är. Genomgående är det viktigt att namnge kontrollerna på ett bra sätt så att man sedan i koden enkelt kan anropa respektive kontroll. Om kontrollen även innehåller en text sätts den med egenskapen Caption. Händelser – Metoder För att programmet ska veta när det ska utföra den kod vi skriver så knyter vi vår kod till en specifik händelse. Vilka händelser vi har att välja på beror på vilket objekt det är. En händelse är sedan något som utförs av användaren t.ex. genom att klicka på, markera, ändra eller kanske avmarkera ett objekt. Exempel: Om vi vill att en kod ska köras när någon avmarkerar en textruta som heter txtNamn så skapar vi en metod till just den händelsen Private Sub txtNamn_LostFocus() Vår kod… End Sub Om man högerklickar på det objekt som man vill knyta händelsen till och väljer Visa kod så skapar VBA-fönstret en Metod med en föreslagen händelse (se mer info om VBA-fönstret nedan) VBA-fönstret Tillgängliga objekt Händelse att knyta till objekten I VBA-fönstret skrivs den kod som skall köras i arbetsboken. Varje kalkylblad har sin ”kodsida” som man tar fram genom att dubbelklicka på respektive blad i navigationsfönstret på vänstra sidan. Den kod som skrivs på respektive kalkylblad är endast tillgänglig där. Förutom de olika kalkylbladen finns också en övergripande sida – ThisWorkbook, där kod kan skrivas för hela arbetsboken och en moduldel där makron och globala funktioner (kod som ska vara tillgänglig för hela arbetsboken) skapas. Variabler Variabler är tillfälliga objekt som kan skapas i koden. Variablerna syns aldrig fysiskt i kalkylbladen men dom kan innehålla värden och därmed sedan användas på olika platser i kalkylbladet/arbetsboken. En variabel skapas genom nyckelordet Dim följt av variabelns namn och vilken typ av data man vill kunna knyta till variabeln. Dim Age (Varibelns namn) As Integer (Datatyp) Namnet på variabeln är helt valfritt, det bestämmer kodskrivaren. Datatypen måste dock väljas från tillgängliga datatyper. Följande lista på datatyper är hämtad från VBA-hjälpen. Byte 1 byte 0 to 255 Boolean 2 bytes True or False Integer 2 bytes -32,768 to 32,767 Long (long integer) 4 bytes -2,147,483,648 to 2,147,483,647 Single (single-precision floating-point) 4 bytes -3.402823E38 to -1.401298E-45 for negative values; 1.401298E-45 to 3.402823E38 for positive values Double (double-precision floating-point) 8 bytes -1.79769313486231E308 to -4.94065645841247E-324 for negative values; 4.94065645841247E-324 to 1.79769313486232E308 for positive values Currency (scaled integer) 8 bytes -922,337,203,685,477.5808 to 922,337,203,685,477.5807 Decimal 14 bytes +/-79,228,162,514,264,337,593,543,950,335 with no decimal point; +/-7.9228162514264337593543950335 with 28 places to the right of the decimal; smallest non-zero number is +/-0.0000000000000000000000000001 Date 8 bytes January 1, 100 to December 31, 9999 Object 4 bytes Any Object reference String (variable-length) 10 bytes + string length 0 to approximately 2 billion String (fixed-length) Length of string 1 to approximately 65,400 Variant (with numbers) 16 bytes Any numeric value up to the range of a Double Variant (with characters) 22 bytes + string length Same range as for variable-length String User-defined (using Type) Number required by elements The range of each element is the same as the range of its data type. Flera Variabler av samma datatyp kan skapas på en rad Dim Age, Years, Atid, Days As Integer Användarkommunikation MsgBox En Messagebox (meddelanderuta) används för att lämna information till användaren om t.ex. ett visst villkor uppfylls. Kombineras ofta med If-villkor (se nedan). Meddelandetexten skrivs som en textsträng inom en parantes. Exempel: Låt oss säga att koden skall utföra en beräkning men användaren har glömt att fylla i ett värde i cell A1 så att beräkningen inte kan göras korrekt. I stället för att då få ett felaktigt värde kan vi informera användaren om att värdet saknas. If Range(”A1”).Value = ”” Then MsgBox(“Det saknas värde I cell A1!”) … InputBox En InputBox (inmatningsruta) används för att hämta ett tillfälligt värde från användaren. Oftast är värdet knutet till en variabel som sedan kan användas i en beräkning. Meddelandetexten skrivs som en textsträng inom en parantes. Exempel: Vi vill veta användarens födelsedatum för att kunna räkna ut åldern och skapar en variabel kallad Birthdate.Vi hämtar variabelns värde med en InputBox Dim Birthdate As Date Birthdate = InputBox(”Ange födelsedatum”) Vanliga villkorsrutiner If, Else, ElseIf If-satsen används för att kontrollera om ett villkor uppfylls. Om så är fallet kan man be programkoden köra en programsats. Med utökningarna ElseIf och Else kan man utöka satsen för att få med fler villkorskontroller i samma sats. (Nyckelord: If, Then, ElseIf, Else, End If) Exempel: Låt oss säga att värdet i cellen A1 bestämmer värdet i cellen B1. Om värdet i A1 är större än 100 så ska B1 ha värdet 0,5. Annars ska värdet i B1 vara 0,25. If satsen ser ut så här If Range(”A1”).Value > 100 Then Range(“B1”).Value = 0.5 Else Range(“B1”).Value = 0.25 End If Om vi utökar med ett villkor till… Om värdet i cellen A1 är större än 200 ska värdet i B1 vara 0,75. Vi lägger då även till ett ElseIf-villkor. If Range(”A1”).Value > 200 Then Range(“B1”).Value = 0.75 ElseIf Range(”A1”).Value > 100 Then Range(“B1”).Value = 0.5 Else Range(“B1”).Value = 0.25 End If Select Case I en situation där vi vill ha många alternative beroende på ett värde så är oftast Select Case det smidigaste alternativet. Satsen bygger på att man anropar en egenskap och sedan bygger olika scenarion för denna egenskap. Vi tar föregående exempel där värdet i cell B1 är beroende utav värdet i cell A1. Men vi lägger till några ytterligare alternativ. Select Case Range(”A1”).Value Case Is > 200 Range(“B1”).Value = 0.75 Case Is > 150 Range(“B1”).Value = 0.65 Case Is > 120 Range(“B1”).Value = 0.57 Case Is > 100 Range(“B1”).Value = 0.5 Case Else Range(“B1”).Value = 0.25 End Select Do While, Do Until För att få programmet att upprepa något ända tills ett visst villkor uppfylls så används en Do While- eller Do Until-sats. While används för att upprepa något så länge ett villkor uppfylls och Until används för att upprepa något tills ett villkor uppfylls. Bägge kan oftast användas och får i så fall styra villkoret. Nyckelordet Loop avslutar för att upprepa händelsen. Vi har ett antal siffror i A-kolumnen med början i A1. Vi vill räkna upp alla värden med 1 men bara så länge det finns värden. Vi väljer att utöka värdet med 1 och sedan hoppa en cell nedåt ända tills vi träffar på en tom cell. Range(”A1”).Activate Do Until ActiveCell.Value = "" ActiveCell.Value = ActiveCell.Value + 1 ActiveCell.Offset(1, 0).Activate Loop For Next Do-satser används när man inte vet hur många gånger en upprepning ska ske. Om man däremot vet hur många gånger upprepningen ska ske används istället en For Next-sats. I det här fallet vill vi göra exakt samma sak som ovan men nu vet vi att det är området A1-A10 som skall uppdateras. Koden skall alltså upprepas 10 ggr. MyCounter nedan är namnet på räknaren vilket jag själv sätter. Range(”A1”).Activate For MyCounter = 1 to 10 ActiveCell.Value = ActiveCell.Value + 1 ActiveCell.Offset(1, 0).Activate Next MyCounter Loop Exempelkod från introduktionsövning - Räknare Private Sub cmdBerakna_Click() ' Bengt Nordström ' 2012-06-13 ' Deklarerar variabler (som heltal - integer) Dim Varde1 As Integer Dim Varde2 As Integer Dim Svar As Integer ' Tilldelar variablerna värden från textrutorna Varde1 = txtVarde1.Value Varde2 = txtVarde2.Value 'Kollar om det är tomt i textrutorna och skickar upp en meddelanderuta If txtVarde2.Value = "" Then MsgBox ("Det saknas värde i ruta 2!") ElseIf txtVarde1.Value = "" Then MsgBox ("Det saknas värde i ruta 1!") End If 'Kollar vilken Alt-knapp som är vald och väljer räknesätt If altPlus.Value = True Then txtResultat.Value = Varde1 + Varde2 ElseIf altSub.Value = True Then txtResultat.Value = txtVarde1.Value - txtVarde2.Value ElseIf altMul.Value = True Then txtResultat.Value = txtVarde1.Value * txtVarde2.Value ElseIf altDiv.Value = True Then txtResultat.Value = txtVarde1.Value / txtVarde2.Value End If Svar = txtResultat.Value MsgBox ("Reslutatet av beräkningen blir " & Svar) 'Använder en variabel i en meddelanderuta Range("A1").Activate 'Markerar en specifik cell 'Letar reda på första tomma cell i raden och markerar den Do Until ActiveCell.Value = "" ActiveCell.Offset(1, 0).Activate Loop ActiveCell.Value = Svar 'Tilldelar dn markerade cellen värdet från en variabel 'tömmer textrutorna txtVarde1.Value = "" txtVarde2.Value = "" txtResultat.Value = "" cmdBerakna.Caption = "Klart!" 'Ändrar knapptext txtVarde1.Activate 'Sätter markören i en taxtruta End Sub Private Sub cmdInput_Click() Dim Namn As String Namn = InputBox("Vad heter du? (Förnamn-Efternamn)") Range("B1").Value = Namn End Sub Private Sub cmdRensa_Click() Range("A:A").Value = "" 'tömmer ett cellområde End Sub Private Sub cmdUndo_Click() Range("A1").Activate Do While ActiveCell.Value <> "" ActiveCell.Offset(1, 0).Activate Loop ActiveCell.Offset(-1, 0).Value = "" End Sub Private Sub txtVarde1_Change() cmdBerakna.Caption = "Beräkna" End Sub Kalkylbladsobjekt från introduktionsövning 1 Bengt Nordström Klart! Ångra Rensa A-kolumnen Ansvarig © 2011 - OnePRO IT – Bengt Nordström