Denna handledning lär dig att skapa och använda funktioner med och utan parametrar i VBA
VBA innehåller en stor mängd inbyggda funktioner som du kan använda, men du kan också skriva dina egna. När du skriver kod i VBA kan du skriva den i en delprocedur eller ett funktionsförfarande. Ett funktionsförfarande kan returnera ett värde till din kod. Detta är extremt användbart om du vill att VBA ska utföra en uppgift för att returnera ett resultat. VBA-funktioner kan också anropas inifrån Excel, precis som Excels inbyggda Excel-funktioner.
Skapa en funktion utan argument
För att skapa en funktion måste du definiera funktionen genom att ge funktionen ett namn. Funktionen kan sedan definieras som en datatyp som anger vilken datatyp du vill att funktionen ska returnera.
Du kanske vill skapa en funktion som returnerar ett statiskt värde varje gång det anropas - lite som en konstant.
123 | Funktion GetValue () som heltalGetValue = 50Avsluta funktion |
Om du skulle köra funktionen skulle funktionen alltid returnera värdet 50.
Du kan också skapa funktioner som hänvisar till objekt i VBA men du måste använda Ställ in nyckelord för att returnera värdet från funktionen.
123 | Funktion GetRange () som intervallAnge GetRange = Range ("A1: G4")Avsluta funktion |
Om du skulle använda ovanstående funktion i din VBA -kod skulle funktionen alltid returnera cellintervallet A1 till G4 i vilket ark du arbetar i.
Anropa en funktion från ett delprocedur
När du har skapat en funktion kan du ringa den från någon annanstans i koden genom att använda ett delprocedur för att ringa funktionen.
Värdet på 50 skulle alltid returneras.
Du kan också ringa till GetRange -funktionen från ett delprocedur.
I exemplet ovan kallas GetRange -funktionen av delproceduren för att markera cellerna i intervallobjektet.
Skapa funktioner
Enstaka argument
Du kan också tilldela en eller flera parametrar till din funktion. Dessa parametrar kan kallas Argument.
123 | Funktion ConvertKilosToPounds (dblKilo som dubbel) som dubbelConvertKiloToPounds = dblKilo*2.2Avsluta funktion |
Vi kan sedan ringa ovanstående funktion från ett delprocedur för att räkna ut hur många pund en specifik mängd kilo är.
En funktion kan kallas från flera procedurer i din VBA -kod om det behövs. Detta är mycket användbart eftersom det hindrar dig från att behöva skriva samma kod om och om igen. Det gör det också möjligt att dela långa procedurer i små hanterbara funktioner.
I exemplet ovan har vi två procedurer - var och en använder funktionen för att beräkna pundvärdet för de kilon som överförs till dem i dblKilo Argument för funktionen.
Flera argument
Du kan skapa en funktion med flera argument och skicka värdena till funktionen med hjälp av ett delprocedur.
123 | Funktion CalculateDayDiff (datum1 som datum, datum2 som datum) som dubbelCalculateDayDiff = Date2-Date1Avsluta funktion |
Vi kan sedan ringa funktionen för att beräkna antalet dagar mellan 2 datum.
Valfria argument
Du kan också skicka valfria argument till en funktion. Med andra ord, ibland kan du behöva argumentet, och ibland kanske du inte - beroende på vilken kod du använder funktionen med.
123456 | Funktion CalculateDayDiff (datum1 som datum, valfritt datum2 som datum) som dubbel'kolla efter andra datum och om inte det, gör Date2 lika med dagens datum.Om Date2 = 0 då Date2 = Date'beräkna skillnadenCalculateDayDiff = Date2-Date1Avsluta funktion |
Standard Argumentvärde
Du kan också ange standardvärdet för de valfria argumenten när du skapar funktionen så att om användaren utelämnar argumentet, kommer värdet som du har satt som standard att användas istället.
1234 | Funktion CalculateDayDiff (Datum1 som datum, valfritt datum2 som datum = "06/02/2020") som dubbel'beräkna skillnadenCalculateDayDiff = Date2-Date1Avsluta funktion |
ByVal och ByRef
När du skickar värden till en funktion kan du använda ByVal eller ByRef nyckelord. Om du utelämnar någon av dessa, kommer ByRef används som standard.
ByVal betyder att du skickar en kopia av variabeln till funktionen, medan ByRef betyder att du hänvisar till variabelns ursprungliga värde. När du skickar en kopia av variabeln (ByVal), variabelns ursprungliga värde är INTE ändras, men när du refererar till variabeln ändras variabelns ursprungliga värde av funktionen.
1234 | Funktion GetValue (ByRef intA som heltal) Som heltalintA = intA * 4GetValue = intAAvsluta funktion |
I funktionen ovan kan ByRef utelämnas och funktionen fungerar på samma sätt.
1234 | Funktion GetValue (intA som heltal) Som heltalintA = intA * 4GetValue = intAAvsluta funktion |
För att kalla den här funktionen kan vi köra en delprocedur.
123456789 | Sub TestValues ()Dim intVal som heltal'fyll i variabeln med värdet 10intVal = 10'kör GetValue -funktionen och visa värdet i det omedelbara fönstretDebug.Print GetValue (intVal)'visa värdet på intVal -variabeln i det omedelbara fönstretDebug.Print intValAvsluta Sub |
Observera att felsökningsfönstren visar värdet 40 båda gångerna. När du skickar variabeln IntVal till funktionen - värdet 10 överförs till funktionen och multipliceras med 4. Om du använder ByRef -nyckelordet (eller utelämnar det helt) ändras värdet på IntVal -variabeln. Detta visas när du först visar resultatet av funktionen i det omedelbara fönstret (40) och sedan värdet för IntVal -variabeln i felsökningsfönstret (även 40).
Om vi INTE vill ändra värdet på den ursprungliga variabeln måste vi använda ByVal i funktionen.
1234 | Funktion GetValue (ByVal intA som heltal) Som heltalintA = intA * 4GetValue = intAAvsluta funktion |
Om vi nu kallar funktionen från en delprocedur, kommer värdet på variabeln IntVal att förbli på 10.
Avsluta funktion
Om du skapar en funktion som testar för ett visst villkor, och när villkoret befunnits vara sant, vill du returnera värdet från funktionen, kan du behöva lägga till ett avslutningsfunktionsuttalande i din funktion för att lämna funktionen innan du har kört igenom all kod i den funktionen.
12345678910111213 | Funktion FindNumber (strSearch As String) Som heltalDim i As Integer'gå igenom varje bokstav i strängenFör i = 1 To Len (strSearch)'om bokstaven är numerisk, returnera värdet till funktionenIf IsNumeric (Mid (strSearch, i, 1)) DåFindNumber = Mid (strSearch, i, 1)'avsluta sedan funktionenAvsluta funktionAvsluta omNästaFindNumber = 0Avsluta funktion |
Funktionen ovan går igenom strängen som tillhandahålls tills den hittar ett nummer och returnerar sedan det numret från strängen. Det hittar bara det första numret i strängen som det kommer då Utgång funktionen.
Funktionen ovan kan anropas av en underrutin som den nedan.
1234567 | Sub CheckForNumber ()Dim NumIs som heltal'skicka en textsträng till funktionen hitta nummerNumIs = FindNumber ("Upper Floor, 8 Oak Lane, Texas")'visa resultatet i det omedelbara fönstretDebug.Print NumIsAvsluta Sub |
Använda en funktion från ett Excel -ark
Förutom att anropa en funktion från din VBA -kod med hjälp av en delprocedur kan du också ringa funktionen från ditt Excel -blad. De funktioner som du har skapat ska som standard visas i din funktionslista i avsnittet Användardefinierad i funktionslistan.
Klicka på fx för att visa dialogrutan Infoga funktion.
Välj Användardefinierad från kategorilistan
Välj den funktion du behöver från den tillgängliga Användardefinierade funktioner (UDF).
Alternativt, när du börjar skriva din funktion i Excel, ska funktionen visas i rullgardinsmenyn med funktioner.
Om du inte vill att funktionen ska vara tillgänglig i ett Excel -ark måste du lägga det privata ordet framför ordet Funktion när du skapar funktionen i din VBA -kod.
123 | Privat funktion CalculateDayDiff (datum1 som datum, datum2 som datum) som dubbelCalculateDayDiff = Date2-Date1Avsluta funktion |
Det kommer nu inte att visas i rullgardinsmenyn som visar tillgängliga Excel -funktioner.
Intressant nog kan du dock fortfarande använda funktionen - den kommer bara inte att visas i listan när du letar efter den!
Om du har deklarerat det andra argumentet som Frivilligkan du utelämna det både i Excel -bladet och i VBA -koden.
Du kan också använda en funktion som du har skapat utan argument i ditt Excel -blad.