VBA -opplæringsmodul og eksempler

Denne opplæringen vil lære deg om klassemoduler i VBA. Du lærer hva de er og hvordan du bruker dem.

VBA -klassemoduler - Introduksjon

Når du setter inn moduler i Visual Basic Editor (VBE) for å angi koden din, har du kanskje lagt merke til at du også kan sette inn det som kalles en 'Klassemodul'.

Klassemoduler vs. moduler

Klassemodulene fungerer på en helt annen måte enn de vanlige modulene ved at de letter å lage en Component Object Model (COM) som deretter kan brukes i din vanlige VBA -kode

Effektivt lager du et objekt som fungerer på samme måte som et innebygd Excel -objekt, for eksempel ‘Regneark’. I regnearkobjektet har du en rekke egenskaper og metoder som lar deg få antall regneark i en arbeidsbok eller hvert enkelt navn på et regneark, eller mange andre opplysninger

Når du oppretter et nytt objekt på denne måten, oppretter du en byggestein som kan brukes hvor som helst i VBA. Objektet har en rekke egenskaper og metoder som VBA-koden kan få tilgang til fra hvor som helst i arbeidsboken uten å måtte skrive koden om igjen.

I tillegg til å referere til det nye objektet ditt fra en standard VBA -modul, kan du også bruke det i koden bak en UserForm som er en del av din tilpassede applikasjon

Du kan også bruke den der du har plassert Active X -kontroller på et regneark, for eksempel en kommandoknapp eller en rullegardinmeny. Disse kontrollene bruker alle VBA, og det nye objektet ditt kan enkelt inkorporeres i hendelseskoden for disse kontrollene.

Du kan også gjøre objektet om til et Excel-tillegg. Objektet ditt blir automatisk tilgjengelig for andre brukere som har dette tillegget lastet inn. Dette legger til din egen multi-tier arkitektur til Excel-applikasjonen din

Excel er en applikasjon med flere lag. Det er klienttjenestelaget, som driver det faktiske regnearkvinduet som brukeren er kjent med. Excel -objektmodellen er det neste laget under. Trykk på F2 i en VBA -modul, og du vil kunne se det enorme antallet objekter og medlemmer av objektene som er motoren i Excel. Vær oppmerksom på at det nye objektet ditt også vises her.

Til slutt, under alt dette, har du datatjenestelaget som inneholder alle dataene du har lagt inn i regneark og celler. Excel får tilgang til dette ved hjelp av Excel Object -modellen.

Ved å lage en klassemodul kan du utvide Excel -objektmodulen med dine egne egendefinerte objekter og medlemmer

Denne artikkelen forklarer deg hvordan du lager et enkelt hierarki av objekter ved hjelp av klassemoduler.

Fordeler med å bruke klassemoduler

  1. Du kan utvikle en robust byggestein som kan brukes i en rekke forskjellige Excel -applikasjoner
  2. Når den er grundig testet, kan du stole på at den alltid gir de riktige resultatene på samme måte som de innebygde Excel-objektene
  3. Hvis det oppdateres kode for andre steder i programmet, vil det nye objektet fortsatt fungere på samme måte
  4. Du kan bruke det nye objektet i andre Excel-applikasjoner som et tillegg
  5. Objektene kan brukes på nytt i andre applikasjoner og hjelper til med feilsøking

Ulemper ved bruk av klassemoduler

  1. De kan være vanskelige å lage og forstå.
  2. Navngivningskonvensjoner er veldig viktige fordi dette er det du vil se når du bruker objektet i en normal modul.
  3. Hvis du ikke har opprettet en klassemodul før, kan de være vanskelige å forstå, og det er en bratt læringskurve
  4. Umulig å gjøre endringer ved kjøretid-du må sette prosjektet på nytt.
  5. Hvis egenskaper og private variabler har samme navn, kan uendelige sløyfer oppstå som resulterer i feil

Sette inn en klassemodul

Velg Sett inn | Klassemodul fra VBE -menyen (Visual Basic Editor). Den nye klassemodulen vil automatisk bli kalt ‘Klasse 1’, men dette må endres umiddelbart til navnet du skal bruke for objektet ditt

Du endrer navnet i vinduet Egenskaper der pilen peker. Du skriver ganske enkelt inn det nye navnet ditt, og dette vil endres i klassemodulsamlingen

Hvis vinduet Egenskaper ikke er synlig, velger du Vis | Egenskaper på VBE -menyen eller trykk F4

Kall den nye klassemodulen for ‘MyItem’ og dobbeltklikk på navnet i trevisningen i Project Explorer for å vise kodevinduet for det.

Opprette et objekt

Dette eksemplet vil opprette et objekt på toppnivå kalt 'MyItems' med et medlemsobjekt under det kalt 'MyItem' som vil inneholde de individuelle dataene for hvert element. Når den er opprettet, fungerer den på samme måte som et innebygd Excel -objekt. For eksempel er det et objekt som heter "Regneark" som er en samling av hvert regneark i arbeidsboken din. Det er også et objekt kalt "Ark" som representerer hvert enkelt regneark i arbeidsboken din, og som inneholder alle egenskapene og metodene for hvert regneark. Dette objektet er knyttet til samlingsobjektet "Regneark".

Du kan gjenta gjennom "Regneark" -samlingen og se hvert "ark" etter tur. På samme måte vil du kunne iterere gjennom "MyItems" -samlingen og se egenskapene du opprettet i "Myitem" -medlemmet.

Den første tingen å gjøre er å lage delobjektet for medlemsnivået som vil inneholde de faktiske elementene i samlingen av objektet på toppnivå. Dette tilsvarer medlemmene (f.eks. Navn, synlig, telling) i "Ark" -objektet i Excel. Denne koden legges inn i klassemodulen kalt 'MyItem'

Klassemoduler har egenskaper og metoder. Egenskaper er effektivt som variabler, ved at de inneholder verdier for data som variabler, og metoder er som underrutiner eller funksjoner.

I delobjektet skal vi lage to egenskaper for objektet - Item og Detail

I utgangspunktet må to strengvariabler deklareres for å holde verdiene for egenskapene:

12 Privat emne som strengPrivat mDetail som streng

Disse må deklareres i delen Deklarasjoner øverst i koden for klassemodulen, slik at de kan brukes i alle delrutiner gjennom modulen

De må gis unike navn for å gjøre dem annerledes enn egenskapene vi skal opprette, så en 'm' (for medlem) har blitt satt foran hvert navn.

Variablene er deklarert som private, slik at de ikke kan sees av noen som bruker objektet. De er arbeidsvariabler for bruk i objektkoden og er ikke der som en del av det endelige objektet.

Det neste trinnet er å sette opp kode for å gi tilgang til de to egenskapene. Du gjør dette ved hjelp av en Property Let og en Property Get -erklæring for hver eiendom. Disse må være offentlige, ellers vil objektet på toppnivå ikke ha noen synlige egenskaper

123456789101112131415 Offentlig eiendom La vare (vdata som streng)mItem = vdataSlutt eiendomOffentlig eiendom Få element () som strengVare = mItemSlutt eiendomOffentlig eiendom La detaljer (vdata som streng)mDetail = vdataSlutt eiendomOffentlig eiendom Få detaljer () som strengDetalj = mDetailSlutt eiendom

Denne koden skaper midler til å lese og skrive verdier til de to egenskapene (element og detalj) ved hjelp av de to private variablene som ble definert i deklarasjonsdelen av modulen.

Parameteren ‘vdata’ brukes til å overføre data til den aktuelle eiendommen.

Det er viktig at hver eiendom har en "La" og "Få" -erklæring, og at eiendomsnavnet er det samme i hvert tilfelle. Du kan ende opp med to forskjellige egenskaper hvis du skriver feil - en som du kan lese fra og en som du kan skrive til!

For å hjelpe deg med å lage denne koden, kan du bruke Sett inn | Fremgangsmåte på VBE -menyen for å lage et kodeskjelett som vil lage den opprinnelige koden for "Get" og "Let" -egenskapene for et gitt eiendomsnavn

Dette vil vise et popup-vindu der du skriver inn eiendomsnavnet og velger 'Egenskap' på alternativknappene:

Klikk "OK" og skjelettkoden blir lagt til i klassemodulen:

1234567 Offentlig eiendom Få MyProperty () som variantSlutt eiendomOffentlig eiendom La MyProperty (ByVal vNewValue As Variant)Slutt eiendom

Dette forhindrer feil i navn på eiendommer. Du legger bare til koden mellom uttalelsene "Offentlig eiendom" og "Slutt eiendom".

Du har nå et objekt som heter ‘MyItem’ som vil inneholde alle dataene for denne øvelsen.

Lei av å søke etter eksempler på VBA -kode? Prøv AutoMacro!

Opprette en samling

Det neste trinnet er å lage et objekt på toppnivå som et samlingsobjekt for å gi tilgang til egenskapene du har konfigurert i ‘MyItem’ -objektet

Igjen må du definere et arbeidsobjekt for å fungere som samlingsobjektet på samme måte som du definerte de to strengvariablene i objektet ‘MyItem’.

1 Private gjenstander som samling

Igjen, dette må ha et unikt navn, og derfor er det et 'm' (medlemsobjekt) foran navnet, og det er også erklært som 'privat' slik at det ikke vises når det nye objektet blir brukt

Deretter må du fylle ut Class_Initialize -koden. Dette kjøres når du først bruker objektet i koden din, og det bestemmer hvilke verdier som skal lastes inn i objektet

Du får tilgang til denne underrutinen ved å velge ‘Klasse’ i den første rullegardinmenyen og ‘Initialiser’ i den andre nedtrekkslisten i modulvinduet

12345678910 Private Sub Class_Initialize ()Dim objItem As MyItemSett mItems = Ny samlingFor n = 1 til 3Sett objItem = New MyItemobjItem.Item = Regneark ("Ark1"). Område ("a" og n) .ValueobjItem.Detail = Regneark ("Ark1"). Område ("b" og n) .ValuemItems.Legg til objItemNeste nSlutt Sub

Koden setter opp et objekt kalt 'objItem' ved å bruke definisjonen av 'MyItem' som vi bygde som en klassemodul tidligere.

Deretter oppretter den en ny samling basert på objektet ‘mItems’ som er definert tidligere

Den gjentar seg gjennom verdier på ark1 i arbeidsboken og legger dem inn i egenskapene som vi opprettet for objektet ‘MyItem’. Vær oppmerksom på at når du bruker 'objitem', vises en rullegardinliste som viser de to egenskapene, akkurat som om du brukte et innebygd Excel-objekt.

Vareobjektet legges deretter til samlingsobjektet som nå inneholder alle dataene i eiendomsverdiene.

Inndataene trenger ikke å tas fra et regneark. Det kan være statiske verdier, eller det kan komme fra en tilkobling til en database som Microsoft Access eller SQL Server, eller det kan komme fra et annet regneark.

Du må deretter legge til en offentlig funksjon som heter 'Item'

123 Element for offentlig funksjon (indeks som heltall) som MyItemSett element = mItems.Item (indeks)Sluttfunksjon

Dette lar deg referere til individuelle objekter i samleobjektet etter deres indeksnummer. Denne funksjonen gir et "speil" av hva som skjer i "mMyItems" -samlingen i bakgrunnen.

Du må også legge til en egenskap som kalles ‘Count’, slik at koden din kan fastslå hvor mange ‘MyItem’ -objekter som er i‘ MyItems ’-samlingen, hvis du ønsker å gjennomgå den.

123 Offentlig eiendom Få telling () så lengeCount = mItems.CountSlutt eiendom

I dette tilfellet trenger du bare en "Get" -egenskap fordi den er skrivebeskyttet. Den bruker mItems -samlingen fordi denne allerede har en telleiendom innebygd i den.

Du har nå et objekt (MyItems) med et fullt hierarki definert av objektet ‘MyItem’

For å få det hele til å fungere, må du nå fylle ut et regneark (ark1) med data slik at Class Initialize -rutinen kan samle dette inn i objektet

Regnearket ditt skal se slik ut:

Bruke ditt nye objekt

Du kan nå bruke samlingsobjektet (MyItems) i en standard Excel VBA -modul. Skriv inn følgende kode:

12345678 Sub test_object ()Dim MyClass As New MyItems, n As IntegerMsgBox MyClass.CountFor n = 1 til MyClass.CountMsgBox MyClass.Item (n) .ProduktMsgBox MyClass.Item (n) .DetaljNeste nSlutt Sub

Denne koden oppretter et objekt kalt 'MyClass' basert på samleobjektet du opprettet kalt 'MyItems'. Dette brenner av "Initialiser" -rutinen som trekker ut alle dataene fra regnearket til objektet.

Den viser antall elementer i samlingen og går deretter gjennom samlingen som viser "Artikkel" -teksten og "Detalj" -teksten. Du vil legge merke til at når du refererer til "MyClass" -objektet i koden din, vil du se en liste over de to medlemsegenskapene som hjelper deg med å legge til den riktige egenskapen.

Hvis du endrer verdien til en celle i inndataene i regnearket, oppdateres dette automatisk i samlingen når du kjører koden ovenfor igjen, siden når du dimensjonerer objektet, starter initialiseringsrutinen og plukker opp alle de nye dataene

Hvis du bruker ordet 'Statisk' i stedet for 'Dim', starter ikke initialiseringsrutinen og de gamle verdiene beholdes, så lenge koden kjører kontinuerlig. Hvis dataene i regnearket endres, vil dette ikke gjenspeiles i objektet

1234567 Sub Test_Static ()Statisk Myclass Som New MyItems, n As IntegerFor n = 1 Til Myclass.CountMsgBox Myclass.Item (n) .ProduktMsgBox Myclass.Item (n) .DetaljNeste nSlutt Sub

Sammendrag av å lage et objekt ved hjelp av en klassemodul

Som du har sett, er det ganske komplisert å lage et hierarki av klassemoduler som skal brukes som objekt, selv for en struktur som er så enkel som eksemplet som er gitt her. Muligheten for å gjøre feil er enorm!

Imidlertid har den store fordeler ved å gjøre koden din mer elegant og lettere å lese. Det er også lettere å dele med andre Excel-applikasjoner og utviklere ved å gjøre det til et tillegg.

I dette eksemplet på hvordan du oppretter et objekt for å lagre data, ville det være en normal tilnærming å opprette et flerdimensjonalt array for å lagre dataene i flerkolonnen-regnearket, og du ville skrive en linje med kode for å oppdatere eller lese hvert element i matrisen. Dette vil trolig ende opp med å bli ganske rotete, og det kan lett gjøres feil ved å ta opp de ulike elementene.

Med det nye objektet kan du ganske enkelt referere til det og medlemmene du har opprettet under det for å beholde dataene.

Hvis dataene endres i regnearket (eller i en koblet database hvis du har brukt dette som datakilde i klassemodulen) når du bruker 'Dim' -setningen, blir initialiseringsrutinen kalt og dataene oppdateres umiddelbart . Du trenger ikke å skrive kode for å fylle ut matrisen på nytt.

Bruke en klassemodul til å lage et variabelt arkiv

Når du skriver VBA -kode, bruker du variabler overalt, alle med forskjellige omfang. Noen kan bare defineres for en bestemt prosedyre, noen for en bestemt modul, og noen kan være globale variabler som kan brukes i hele applikasjonen

Du kan opprette en klassemodul som vil inneholde et stort antall variabler, og fordi det er et objekt, kan det brukes hvor som helst i koden din, selv på et brukerskjema eller i en Active X -kontroll som du har plassert i et regneark.

Den ekstra fordelen er at når du refererer til det variable objektet, vil du se en liste over alle variabelnavnene i objektet sortert i stigende rekkefølge.

For å opprette et depot må du sette inn en ny klassemodul. Du gjør dette ved å bruke Sett inn | Klassemodul fra VB Editor -menyen

Endre navnet til ‘MyVariables’ ved å bruke samme metodikk som tidligere diskutert i denne artikkelen.

Skriv inn følgende kode:

12345678910111213141516 Privat mV Som variantOffentlig eiendom Få variabel1 () som variantVariabel1 = mVSlutt eiendomOffentlig eiendom La variabel1 (ByVal vNewValue As Variant)mV = vNewValueSlutt eiendomOffentlig eiendom Få variabel2 () som variantVariabel1 = mVSlutt eiendomOffentlig eiendom Let Variable2 (ByVal vNewValue As Variant)mV = vNewValueSlutt eiendom

Denne koden setter opp "La" og "Få" egenskaper for to variabler ("Variabel1" og "Variabel2"). Let and Get -egenskapene kreves for hver av variablene dine slik at de leses / skrives

Du kan bruke dine egne navn for variablene i stedet for eksemplene i denne koden, og du kan legge til flere variabler, og sørg for at hver ny variabel har en "La" og "Få" setning.

Den private erklæringen av variabelen 'mV' er å lage en arbeidsvariabel som bare brukes i klassemodulen for å overføre verdier.

For å bruke variabellagringsstedet, skriv inn følgende kode i en standardmodul:

123456 Global VarRepo som nye MyVariablesSub TestVariableRepository ()MsgBox VarRepo.Variable1VarRepo.Variable1 = 10MsgBox VarRepo.Variable1Slutt Sub

Denne koden oppretter en global forekomst av "MyVariables" -objektet ditt som du opprettet. Du trenger bare å gjøre denne erklæringen én gang fra hvor som helst i koden.

Koden viser først verdien av "Variabel1" for å vise at den er tom.

En verdi på 10 er tilordnet "Variabel1", og den nye verdien i objektet vises deretter for å vise at denne egenskapen nå har denne verdien.

Fordi forekomsten av "MyVariables" -objektet er definert globalt, kan du referere til hvilken som helst av de definerte variablene i objektet hvor som helst i koden din.

Dette har en stor fordel ved at hvis du vil bruke variablene dine hvor som helst i koden din, trenger du bare å definere en global variabel, og fra den forekomsten kan alle variablene åpnes og endres fritt gjennom koden.

Gjør objektet ditt til et tillegg

Så langt er koden for objektopprettelsen i arbeidsbokprogrammet ditt. Hvis du imidlertid vil dele objektet ditt med andre utviklere eller i andre Excel-programmer, kan du gjøre det til et tillegg

For å gjøre dette er alt som trenger å skje å lagre filen som et tillegg. Velg Fil | Lagre som og et nettleservindu vises

Velg filtypen som tillegg (.xlam) fra rullegardinlisten for filtype og klikk OK. Filen blir som standard lagret i Add-In-mappen, men du kan endre plasseringen.

Du kan deretter inkorporere tilleggsfilen i Excel-programmene dine, og gir deg fleksibiliteten til å bruke det nye objektet

For å inkludere det nye tillegget i Excel, klikk på Fil på Excel-båndet, og klikk deretter på Alternativer nederst i ruten til venstre

Klikk på "Tillegg" i ruten til venstre i popup-vinduet som vises. Nederst i vinduet er en knapp merket "Gå"

Klikk på dette, og et "Tillegg" -vindu vises. Klikk på "Bla gjennom" og finn deretter tilleggsprogrammet. Du vil da kunne referere til objektet ditt i koden din.

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

wave wave wave wave wave