VBA -funktion - Samtal, returvärde och parametrar

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.

Du kommer att bidra till utvecklingen av webbplatsen, dela sidan med dina vänner

wave wave wave wave wave