Använda inbyggda funktioner
Svep för att visa menyn
VBA levereras med flera hundra inbyggda funktioner, och de flesta av dem kommer du aldrig att använda. Nedan listas de som ofta används inom affärsautomatisering — för att rensa text, arbeta med datum och konvertera datatyper.
Datumfunktioner
Debug.Print Now() ' current date and time
Debug.Print Date ' today's date only
Debug.Print DateAdd("d", 30, Date) ' 30 days from today
Debug.Print DateDiff("d", #01/09/2023#, Date) ' days since hire date
Debug.Print Format(Date, "dd/mm/yyyy")
Now() och Date ser lika ut men besvarar olika frågor — Now() inkluderar aktuell tid ner till sekunden (användbart för tidsstämpling när ett makro kördes), medan Date endast ger kalenderdagen, vilket är det du vill ha för allt som rör förfallodatum eller ålder. DateAdd och DateDiff är varandras spegelbilder: DateAdd räknar framåt eller bakåt från ett datum med en given enhet ("d" för dagar, men "m" för månader och "yyyy" för år fungerar också), medan DateDiff mäter avståndet mellan två befintliga datum.
VBA-datumlitteraler — allt som skrivs mellan #-symboler, som #01/09/2023# — använder alltid MM/DD/YYYY-ordning internt, oavsett dina Windows-regioninställningar eller systemets språk. Så #01/09/2023# betyder 9 januari 2023, inte 1 september, även för användare som vanligtvis använder formatet DD/MM/YYYY. Detta skiljer sig från hur datum skrivs in i ett kalkylblad, där regioninställningar gäller — formatet #...# är en VBA-specifik regel som alltid är densamma oavsett var koden körs.
Textfunktioner
Debug.Print UCase("wireless mouse") ' WIRELESS MOUSE
Debug.Print LCase("WIRELESS MOUSE") ' wireless mouse
Debug.Print Left("P001", 1) ' P
Debug.Print Right("P001", 3) ' 001
Debug.Print Mid("P001", 2, 3) ' 001
Debug.Print Trim(" Keyboard ") ' Keyboard
Debug.Print Len("Laptop Stand") ' 12
Debug.Print InStr("Wireless Mouse", "Mouse") ' 10 (position found)
UCase och LCase används för att göra jämförelser okänsliga för versaler/gemener, till exempel, If UCase(category) = UCase("electronics") Then fungerar oavsett hur kategorin ursprungligen skrevs. Left, Right och Mid extraherar en del av en sträng, men skiljer sig åt i var de börjar räkna: Left och Right räknar från varsin ände, medan Mid tar en startposition och en längd, vilket gör att Mid("P001", 2, 3) och Right("P001", 3) råkar ge samma resultat här — "P001" har bara ett sifferprefix, så "från position 2" och "de sista 3 tecknen" hamnar på samma delsträng. Trim tar tyst bort inledande och avslutande mellanslag — en oansenlig funktion som räddar dig när data har klistrats in från någonstans med ojämna mellanrum. InStr söker efter en sträng i en annan och returnerar positionen där den hittas (eller 0 om den inte finns alls), vilket är hur du kan testa "innehåller produktnamnet ordet Mouse?" utan att behöva en exakt matchning.
Numeriska funktioner
Debug.Print Round(24.996, 2) ' 25
Debug.Print Abs(-15) ' 15
Debug.Print Int(7.9) ' 7
Round och Int minskar båda ett tal, men på olika sätt — Round(24.996, 2) avrundar till närmaste värde med 2 decimaler (25,00, som visas som 25), medan Int(7.9) alltid trunkerar ner mot noll oavsett hur nära decimalen är att avrundas uppåt, och ger 7 istället för 8. Att blanda ihop dessa är en vanlig källa till prisfel: att avrunda ett pris till närmaste öre bör nästan alltid använda Round, inte Int, annars kommer du systematiskt att debitera för lite med en bråkdel av ett öre per transaktion.
Typkonvertering
Avgörande när du hämtar värden från ett kalkylblad, eftersom cellvärden ofta kommer som Variant:
Dim priceText As String
priceText = "39.50"
Dim price As Double
price = CDbl(priceText) ' text → number
Dim stockValue As Variant
stockValue = "44"
Dim stockCount As Integer
stockCount = CInt(stockValue)
CDbl konverterar till Double, CInt till Integer, CStr konverterar till String och CDate konverterar till ett korrekt Date-värde.
Varför inte bara låta VBA konvertera automatiskt vid behov? Det gör det oftast, men att lita på det är riskabelt: en cell som ser ut som ett tal men faktiskt har skrivits eller importerats som text kan göra att en If-jämförelse eller en aritmetisk operation misslyckas eller beter sig oväntat, och explicit konvertering fångar det tidigt, med ett fel på exakt den rad där de felaktiga data finns istället för flera steg senare.
Uppgift
- Skriv en rad som extraherar endast den numeriska delen av "P003" med hjälp av
Mid(tips: börja på position 2). - Skriv en rad som konverterar den extraherade texten till ett riktigt tal med
CIntellerCLng. - Använd
DateDiffför att beräkna hur många dagar sedan Emma Davis anställdes (15/03/2020) jämfört med idag.
1. Extrahera den numeriska delen
Midtar tre delar: själva strängen, var du ska börja räkna ifrån och hur många tecken du ska ta.- "P003" har en bokstav följt av tre siffror — du vill hoppa över "P" och ta allt efter den.
- Startposition 2 betyder "börja vid det andra tecknet" — räkna ut "P003" på fingrarna för att bekräfta att position 2 är första "0".
2. Konvertera till ett riktigt tal
- Det som
Midreturnerar är fortfarande text, även om det ser ut som ett tal. - Omslut hela
Mid(...)-uttrycket medCInt(...)ellerCLng(...)— du konverterar resultatet av en funktion med en annan. - Påminnelse från tidigare i kapitlet:
CInt/CLngkonverterar text till heltal; användCLngom du inte är säker på att talet alltid är litet.
3. Dagar sedan anställningsdatumet
DateDiffbehöver tre saker: vilken enhet som ska mätas ("d" för dagar), ett startdatum och ett slutdatum.- Det knepiga är att skriva ett datum i VBA — omslut det med
#-symboler, som#03/15/2020#. Inuti#...#förväntar sig VBA alltid månad/dag/år-ordning, oavsett dina regionala inställningar — så 15 mars är#03/15/2020#, inte#15/03/2020#. - För "idag" behöver du inte skriva ett datum alls — det finns ett nyckelord från avsnitt 2.3 som alltid returnerar dagens datum.
- Sätt in dessa två datum i
DateDiffi rätt ordning — det tidigare datumet först — annars får du ett negativt tal tillbaka.
Tack för dina kommentarer!
Fråga AI
Fråga AI
Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal