VBA -funksjon - Anrop, returverdi og parametere

Denne opplæringen lærer deg å lage og bruke funksjoner med og uten parametere i VBA

VBA inneholder en stor mengde innebygde funksjoner du kan bruke, men du kan også skrive dine egne. Når du skriver kode i VBA, kan du skrive den i en delprosedyre eller en funksjonsprosedyre. En funksjonsprosedyre kan returnere en verdi til koden din. Dette er ekstremt nyttig hvis du vil at VBA skal utføre en oppgave for å returnere et resultat. VBA-funksjoner kan også kalles fra Excel, akkurat som Excels innebygde Excel-funksjoner.

Opprette en funksjon uten argumenter

For å lage en funksjon må du definere funksjonen ved å gi funksjonen et navn. Funksjonen kan deretter defineres som en datatype som angir datatypen du vil at funksjonen skal returnere.

Det kan være lurt å opprette en funksjon som returnerer en statisk verdi hver gang den kalles - litt som en konstant.

123 Funksjon GetValue () som heltallGetValue = 50Sluttfunksjon

Hvis du skulle kjøre funksjonen, ville funksjonen alltid returnere verdien på 50.

Du kan også opprette funksjoner som refererer til objekter i VBA, men du må bruke Sett søkeord for å returnere verdien fra funksjonen.

123 Funksjon GetRange () som områdeSett GetRange = Range ("A1: G4")Sluttfunksjon

Hvis du skulle bruke funksjonen ovenfor i VBA -koden din, ville funksjonen alltid returnere celleområdet A1 til G4 i hvilket ark du jobber i.

Kalle en funksjon fra en delprosedyre

Når du har opprettet en funksjon, kan du kalle den fra andre steder i koden din ved å bruke en delprosedyre for å kalle funksjonen.

Verdien på 50 vil alltid bli returnert.

Du kan også ringe GetRange -funksjonen fra en delprosedyre.

I eksemplet ovenfor kalles GetRange -funksjonen av delprosedyren for å markere cellene i områdeobjektet.

Opprette funksjoner

Enkelt argument

Du kan også tilordne en eller flere parametere til funksjonen din. Disse parameterne kan kalles argumenter.

123 Funksjon ConvertKilosToPounds (dblKilo som Double) som DoubleConvertKiloToPounds = dblKilo*2.2Sluttfunksjon

Vi kan deretter ringe funksjonen ovenfor fra en delprosedyre for å finne ut hvor mange kilo en bestemt mengde kilo er.

En funksjon kan kalles fra flere prosedyrer i VBA -koden om nødvendig. Dette er veldig nyttig ved at det stopper deg fra å måtte skrive den samme koden om og om igjen. Det lar deg også dele lange prosedyrer i små håndterbare funksjoner.

I eksemplet ovenfor har vi to prosedyrer - hver av dem bruker funksjonen til å beregne pundverdien til kiloene som ble sendt til dem i dblKilo Argument for funksjonen.

Flere argumenter

Du kan opprette en funksjon med flere argumenter og overføre verdiene til funksjonen ved hjelp av en delprosedyre.

123 Funksjon CalculateDayDiff (Date1 as Date, Date2 as Date) som DoubleCalculateDayDiff = Date2-Date1Sluttfunksjon

Vi kan deretter ringe funksjonen for å beregne mengden dager mellom 2 datoer.

Valgfrie argumenter

Du kan også sende valgfrie argumenter til en funksjon. Med andre ord, noen ganger trenger du kanskje argumentet, og noen ganger trenger du det ikke - avhengig av hvilken kode du bruker funksjonen med.

123456 Funksjon CalculateDayDiff (dato1 som dato, valgfri dato2 som dato) som dobbel'sjekk etter andre dato, og hvis ikke der, gjør Date2 lik dagens dato.Hvis Date2 = 0 så Date2 = Date'beregne forskjellenCalculateDayDiff = Date2-Date1Sluttfunksjon

Standard argumentverdi

Du kan også angi standardverdien for de valgfrie argumentene når du oppretter funksjonen, slik at hvis brukeren utelater argumentet, blir verdien du har satt som standard brukt i stedet.

1234 Funksjon CalculateDayDiff (dato1 som dato, valgfri dato2 som dato = "06/02/2020") som dobbel'beregne forskjellenCalculateDayDiff = Date2-Date1Sluttfunksjon

ByVal og ByRef

Når du sender verdier til en funksjon, kan du bruke ByVal eller ByRef søkeord. Hvis du utelater en av disse, vil ByRef brukes som standard.

ByVal betyr at du sender en kopi av variabelen til funksjonen, mens ByRef betyr at du refererer til den opprinnelige verdien av variabelen. Når du sender en kopi av variabelen (ByVal), er den opprinnelige verdien av variabelen IKKE endret, men når du refererer til variabelen, endres variabelens opprinnelige verdi av funksjonen.

1234 Funksjon GetValue (ByRef intA As Integer) As IntegerintA = intA * 4GetValue = intASluttfunksjon

I funksjonen ovenfor kunne ByRef utelates, og funksjonen ville fungere på samme måte.

1234 Funksjon GetValue (intA Som Heltall) Som HeltallintA = intA * 4GetValue = intASluttfunksjon

For å kalle denne funksjonen kan vi kjøre en delprosedyre.

123456789 Sub TestValues ​​()Dim intVal As Integer'fyll variabelen med verdien 10intVal = 10'kjør GetValue -funksjonen, og vis verdien i det umiddelbare vinduetDebug.Print GetValue (intVal)'vis verdien av varianten intVal i det umiddelbare vinduetDebug.Print intValSlutt Sub

Vær oppmerksom på at feilsøkingsvinduene viser verdien 40 begge gangene. Når du sender variabelen IntVal til funksjonen - verdien 10 overføres til funksjonen, og multipliseres med 4. Ved å bruke ByRef -søkeordet (eller utelate det helt), endres verdien av IntVal -variabelen. Dette vises når du først viser resultatet av funksjonen i det umiddelbare vinduet (40), og deretter verdien av IntVal -variabelen i feilsøkingsvinduet (også 40).

Hvis vi IKKE ønsker å endre verdien til den opprinnelige variabelen, må vi bruke ByVal i funksjonen.

1234 Funksjon GetValue (ByVal intA As Integer) As IntegerintA = intA * 4GetValue = intASluttfunksjon

Hvis vi nå kaller funksjonen fra en delprosedyre, vil verdien av variabelen IntVal forbli på 10.

Avslutt funksjon

Hvis du oppretter en funksjon som tester for en bestemt tilstand, og når tilstanden er funnet å være sann, vil du returnere verdien fra funksjonen, må du kanskje legge til en Avslutt funksjon -setning i funksjonen din for å gå ut av funksjonen før du har kjørt gjennom all koden i den funksjonen.

12345678910111213 Funksjon FindNumber (strSearch As String) Som heltallDim i As Integer'gå gjennom hver bokstav i strengenFor i = 1 To Len (strSearch)'Hvis bokstaven er numerisk, returnerer du verdien til funksjonenIf IsNumeric (Mid (strSearch, i, 1)) DaFindNumber = Mid (strSearch, i, 1)'avslutt deretter funksjonenAvslutt funksjonSlutt omNesteFindNumber = 0Sluttfunksjon

Funksjonen ovenfor vil gå gjennom strengen som er gitt til den finner et tall, og deretter returnere det tallet fra strengen. Det vil bare finne det første tallet i strengen som det vil da Exit funksjonen.

Funksjonen ovenfor kan kalles av en underrutine som den nedenfor.

1234567 Sub CheckForNumber ()Dim NumIs som heltall'send en tekststreng til funksjonen Finn tallNumIs = FindNumber ("Upper Floor, 8 Oak Lane, Texas")'vis resultatet i det umiddelbare vinduetDebug.Print NumIsSlutt Sub

Bruke en funksjon fra et Excel -ark

I tillegg til å ringe en funksjon fra VBA -koden din ved hjelp av en delprosedyre, kan du også ringe funksjonen fra Excel -arket. Funksjonene du har opprettet, bør som standard vises i funksjonslisten i brukerdefinerte delen av funksjonslisten.

Klikk på fx for å vise dialogboksen Sett inn funksjon.

Plukke ut Brukerdefinert fra kategorilisten

Velg funksjonen du trenger fra den tilgjengelige Brukerdefinerte funksjoner (UDF).

Alternativt, når du begynner å skrive funksjonen din i Excel, skal funksjonen vises i rullegardinlisten med funksjoner.

Hvis du ikke vil at funksjonen skal være tilgjengelig i et Excel -ark, må du sette det private ordet foran ordet Funksjon når du oppretter funksjonen i VBA -koden.

123 Privat funksjon CalculateDayDiff (Date1 as Date, Date2 as Date) som DoubleCalculateDayDiff = Date2-Date1Sluttfunksjon

Det vil nå ikke vises i rullegardinlisten som viser tilgjengelige Excel -funksjoner.

Interessant nok, men du kan fortsatt bruke funksjonen - den vil bare ikke vises i listen når du leter etter den!

Hvis du har erklært det andre argumentet som Valgfri, kan du utelate det både i Excel -arket og i VBA -koden.

Du kan også bruke a -funksjonen du har opprettet uten argumenter i Excel -arket.

Du vil bidra til utvikling av området, dele siden med vennene dine

wave wave wave wave wave