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.