VBA -klassemodulundervisning og eksempler

Denne vejledning lærer dig om klassemoduler i VBA. Du lærer, hvad de er, og hvordan du bruger dem.

VBA -klassemoduler - Introduktion

Når du indsætter moduler i Visual Basic Editor (VBE) for at indtaste din kode, har du muligvis bemærket, at du også kan indsætte det, der kaldes et 'Klassemodul'.

Klassemoduler mod moduler

Klassemodulerne fungerer på en meget anden måde end de almindelige moduler, idet de letter oprettelsen af ​​en Component Object Model (COM), som derefter kan bruges inden for din normale VBA -kode

Du opretter effektivt et objekt, der fungerer på samme måde som et indbygget Excel -objekt, f.eks. 'Arbejdsark'. I regnearksobjektet har du en række egenskaber og metoder, der giver dig mulighed for at få antallet af regneark i en projektmappe eller hvert enkelt navn på et regneark eller mange andre oplysninger

Når du opretter et nyt objekt på denne måde, opretter du en byggesten, som kan bruges overalt i VBA. Objektet har en række egenskaber og metoder, som din VBA-kode kan få adgang til overalt i projektmappen uden at skulle skrive koden igen.

Udover at henvise til dit nye objekt fra et standard VBA -modul, kan du også bruge det i koden bag en UserForm, der er en del af din brugerdefinerede applikation

Du kan også bruge den, hvor du har placeret Active X -kontroller på et regneark, f.eks. En kommandoknap eller en rullemenu. Disse kontroller bruger alle VBA, og dit nye objekt kan let inkorporeres i hændelseskoden for disse kontroller.

Du kan også omdanne dit objekt til en Excel-tilføjelse. Dit objekt vil automatisk være tilgængeligt for andre brugere, der har dette tilføjelsesprogram indlæst. Dette tilføjer din egen multi-tier arkitektur til din Excel-applikation

Excel er en applikation med flere niveauer. Der er klientservicelaget, som driver det faktiske regnearksvindue, som brugeren er bekendt med. Excel -objektmodellen er det næste lag nedenunder. Tryk på F2 i et VBA -modul, og du vil kunne se det enorme antal objekter og medlemmer af de objekter, der er motoren i Excel. Bemærk, at dit nye objekt også vises her.

Endelig under alt dette har du datatjenestelaget, der indeholder alle de data, du har indtastet i regneark og celler. Excel får adgang til dette ved hjælp af Excel Object -modellen.

Oprettelse af et klassemodul giver dig mulighed for at udvide Excel -objektmodulet med dine egne tilpassede objekter og medlemmer

Denne artikel forklarer dig, hvordan du opretter et simpelt hierarki af objekter ved hjælp af klassemoduler.

Fordele ved at bruge klassemoduler

  1. Du kan udvikle en robust byggesten, der kan bruges i et vilkårligt antal forskellige Excel -applikationer
  2. Når det er testet grundigt, kan det påberåbes for altid at producere de korrekte resultater på samme måde som de indbyggede Excel-objekter
  3. Hvis der foretages opdateringer af kode andre steder i applikationen, fortsætter det nye objekt stadig med at fungere på samme måde
  4. Du kan bruge dit nye objekt i andre Excel-applikationer som et tilføjelsesprogram
  5. Objekterne kan genbruges i andre applikationer og hjælper med fejlfinding

Ulemper ved brug af klassemoduler

  1. De kan være svære at skabe og forstå.
  2. Navngivningskonventioner er meget vigtige, fordi det er det, du vil se, når du bruger dit objekt i et normalt modul.
  3. Hvis du ikke har oprettet et klassemodul før, kan de være svære at forstå, og der er en stejl indlæringskurve
  4. Umuligt at foretage ændringer i løbetid-du skal genindstille projektet.
  5. Hvis egenskaber og private variabler har samme navn, kan der opstå uendelige sløjfer, der resulterer i fejl

Indsættelse af et klassemodul

Vælg Indsæt | Klassemodul fra menuen VBE (Visual Basic Editor). Det nye klassemodul kaldes automatisk 'Klasse 1', men dette skal straks ændres til det navn, du vil bruge til dit objekt

Du ændrer navnet i vinduet Egenskaber, hvor pilen peger. Du skal ganske enkelt indtaste dit nye navn, og dette ændres i samlingen Klassemoduler

Hvis vinduet Egenskaber ikke er synligt, skal du vælge Vis | Egenskaber i menuen VBE, eller tryk på F4

Kald dit nye klassemodul for 'MyItem', og dobbeltklik på navnet i trævisningen i Project Explorer for at få vist kodevinduet for det.

Oprettelse af et objekt

Dette eksempel vil oprette et objekt på topniveau kaldet 'MyItems' med et medlemsobjekt under det kaldet 'MyItem', som gemmer de individuelle data for hvert element. Når den er oprettet, fungerer den på samme måde som et indbygget Excel -objekt. For eksempel er der et objekt kaldet 'Arbejdsark', som er en samling af hvert regneark i din projektmappe. Der er også et objekt kaldet 'Sheet', der repræsenterer hvert enkelt regneark i din projektmappe og indeholder alle egenskaber og metoder for hvert regneark. Dette objekt vedrører "Objektark" -indsamlingsobjektet.

Du kan gentage gennem ‘Arbejdsark’ -samlingen og se hvert‘ Ark ’efter tur. På samme måde vil du kunne gentage gennem 'MyItems' -samlingen og se de egenskaber, du har oprettet i' Myitem' -medlemmet.

Den første ting at gøre er at oprette et subobjekt for medlemsniveauet, som vil indeholde de faktiske elementer i samlingen af ​​objektet på øverste niveau. Dette svarer til medlemmerne (f.eks. Navn, synligt, antal) i objektet ‘Ark’ i Excel. Denne kode indtastes i klassemodulet kaldet 'MyItem'

Klassemoduler har egenskaber og metoder. Egenskaber er effektivt som variabler, idet de indeholder værdier for data som variabler, og metoder er som underrutiner eller funktioner.

I underobjektet skal vi oprette to egenskaber for objektet - Item og Detail

Oprindeligt skal to strengvariabler erklæres for at holde værdierne for egenskaberne:

12 Privat emne som strengPrivat mDetail som streng

Disse skal erklæres i afsnittet Erklæringer øverst i koden til klassemodulet, så de kan bruges i alle underrutiner i hele modulet

De skal have unikke navne for at gøre dem anderledes end de egenskaber, vi skal oprette, så der er sat et ‘m’ (for medlem) foran hvert navn.

Variablerne erklæres som private, så de kan ikke ses af nogen, der bruger objektet. De er arbejdsvariabler til brug inden for objektkoden og er der ikke som en del af det endelige objekt.

Det næste trin er at opsætte kode for at give adgang til de to ejendomme. Du gør dette ved hjælp af en ejendomsudlejning og en ejendomshent -erklæring for hver ejendom. Disse skal være offentlige, ellers vil objektet på øverste niveau ikke have nogen synlige egenskaber

123456789101112131415 Offentlig ejendom Lad vare (vdata som streng)mItem = vdataSlut ejendomOffentlig ejendom Få vare () som strengVare = mItemSlut ejendomOffentlig ejendom Lad detaljer (vdata som streng)mDetail = vdataSlut ejendomOffentlig ejendom Få detaljer () som strengDetalje = mDetailSlut ejendom

Denne kode skaber midler til at læse og skrive værdier til de to egenskaber (Item og Detail) ved hjælp af de to private variabler, der blev defineret i deklarationsafsnittet i modulet.

Parameteren 'vdata' bruges til at videregive data til den pågældende ejendom.

Det er vigtigt, at hver ejendom har en 'Lad' og 'Få' erklæring, og at ejendomsnavnet er det samme i hvert tilfælde. Du kan ende med to forskellige egenskaber, hvis du stavefejl - en, som du kan læse fra, og en, du kan skrive til!

For at hjælpe med at oprette denne kode kan du bruge Indsæt | Procedure i VBE -menuen til at oprette et kodeskelet, som vil oprette den oprindelige kode for egenskaberne "Hent" og "Lad" for et givet ejendomsnavn

Dette viser et pop-up-vindue, hvor du skriver ejendomsnavnet i og vælger 'Ejendom' på radioknapperne:

Klik på 'OK', og skeletkoden tilføjes til klassemodulet:

1234567 Offentlig ejendom Få MyProperty () som variantSlut ejendomOffentlig ejendom Lad min ejendom (ByVal vNewValue As Variant)Slut ejendom

Dette forhindrer fejl i navne på ejendomme. Du tilføjer simpelthen din kode mellem udsagnene 'Offentlig ejendom' og 'Slut ejendom'.

Du har nu et objekt kaldet 'MyItem', som gemmer alle data til denne øvelse.

Træt af at søge efter eksempler på VBA -kode? Prøv AutoMacro!

Oprettelse af en samling

Det næste trin er at oprette et objekt på topniveau som et samlingobjekt for at give adgang til de egenskaber, du har konfigureret i 'MyItem' -objektet

Igen skal du definere et arbejdsobjekt for at fungere som samlingsobjektet på samme måde som du definerede de to strengvariabler i objektet ‘MyItem’.

1 Private emner som samling

Igen skal dette have et unikt navn, hvorfor der er et 'm' (medlemsobjekt) foran navnet, og det erklæres også som 'privat', så det ikke vises, når det nye objekt bliver Brugt

Dernæst skal du udfylde Class_Initialize -koden. Dette kører, når du først bruger objektet i din kode, og det bestemmer, hvilke værdier der indlæses i objektet

Du kan få adgang til denne underrutine ved at vælge 'Klasse' i den første rulleliste og 'Initialiser' i den anden rulleliste i modulvinduet

12345678910 Privat underklasse_Initialisering ()Dim objItem som MyItemIndstil mItems = Ny samlingFor n = 1 til 3Indstil objItem = Nyt MyItemobjItem.Item = Regneark ("Ark1"). Område ("a" & n) .VærdiobjItem.Detail = Regneark ("Ark1"). Område ("b" & n) .VærdimItems.Add objItemNæste nAfslut Sub

Koden opretter et objekt kaldet 'objItem' ved hjælp af definitionen af ​​'MyItem', som vi tidligere byggede som et klassemodul.

Derefter opretter den en ny samling baseret på objektet 'mItems', der er defineret tidligere

Det gentager sig gennem værdier, der findes på Sheet1 i projektmappen og sætter dem i de egenskaber, som vi har oprettet for objektet ‘MyItem’. Bemærk, at når du bruger 'objitem', vises der en rullemenu, der viser de to egenskaber, præcis som om du brugte et indbygget Excel-objekt.

Vareobjektet tilføjes derefter til samlingsobjektet, som nu gemmer alle data i ejendomsværdierne.

Inputdataene skal ikke tages fra et regneark. Det kan være statiske værdier, eller det kan komme fra en forbindelse til en database, f.eks. Microsoft Access eller SQL Server, eller det kan komme fra et andet regneark.

Du skal derefter tilføje en offentlig funktion kaldet 'Item'

123 Public Function Item (indeks som heltal) Som MyItemAngiv element = mItems.Item (indeks)Afslut funktion

Dette giver dig mulighed for at henvise til individuelle objekter inden for samlingsobjektet efter deres indeksnummer. Denne funktion giver et 'spejl' af, hvad der foregår i 'mMyItems' -samlingen i baggrunden.

Du skal også tilføje en egenskab kaldet 'Count', så din kode kan fastslå, hvor mange 'MyItem' -objekter, der er i' MyItems' -samlingen, hvis du ønsker at gentage den.

123 Offentlig ejendom få tælle () så længeCount = mItems.CountSlut ejendom

I dette tilfælde har du kun brug for en 'Get' -egenskab, fordi den er skrivebeskyttet. Den bruger mItems -samlingen, fordi denne allerede har en count -egenskab indbygget i den.

Du har nu et objekt (MyItems) med et fuldt hierarki defineret af objektet 'MyItem'

For at få det hele til at fungere, skal du nu udfylde et regneark (Sheet1) med data, så rutinen Class Initialize kan indsamle dette i objektet

Dit regneark skal se sådan ud:

Brug af dit nye objekt

Du kan nu bruge dit Samlingsobjekt (MyItems) inden for et standard Excel VBA -modul. Indtast følgende kode:

12345678 Sub test_object ()Dim MyClass Som New MyItems, n As IntegerMsgBox MyClass.CountFor n = 1 Til MyClass.CountMsgBox MyClass.Item (n) .ItemMsgBox MyClass.Item (n) .DetailNæste nAfslut Sub

Denne kode opretter et objekt kaldet 'MyClass' baseret på det samlingobjekt, du har oprettet, kaldet 'MyItems'. Dette slukker for 'Initialiser' -rutinen, der udtrækker alle data fra regnearket til objektet.

Det viser antallet af genstande i samlingen og gentager derefter gennem samlingen, der viser 'Item' -teksten og' Detail' -teksten. Du vil bemærke, at når du refererer til 'MyClass' -objektet i din kode, vil du se en liste over de to medlemsegenskaber, der hjælper med at tilføje den korrekte ejendom.

Hvis du ændrer værdien af ​​en celle i inputdataene på regnearket, opdateres dette automatisk i samlingen, når du kører ovenstående kode igen, da når du dimensionerer objektet, kører initialiseringsrutinen og henter alle de nye data

Hvis du bruger ordet 'Statisk' i stedet for 'Dim' kører initialiseringsrutinen ikke, og de gamle værdier bevares, så længe koden kører kontinuerligt. Hvis dataene på regnearket ændres, afspejles dette ikke i objektet

1234567 Sub Test_Static ()Statisk Myclass som nye MyItems, n As IntegerFor n = 1 Til Myclass.CountMsgBox Myclass.Item (n) .ItemMsgBox Myclass.Item (n) .DetailNæste nAfslut Sub

Resumé af oprettelse af et objekt ved hjælp af et klassemodul

Som du har set, er det ganske kompliceret at oprette et hierarki af klassemoduler, der skal bruges som et objekt, selv for en så simpel struktur som eksemplet her. Muligheden for at begå fejl er enorm!

Det har dog enorme fordele ved at gøre din kode mere elegant og lettere at læse. Det er også lettere at dele med andre Excel-applikationer og udviklere ved at gøre det til et tilføjelsesprogram.

I dette eksempel på, hvordan man opretter et objekt til lagring af data, ville det være en normal tilgang til at oprette et multidimensionelt array til at gemme dataene i regnearket med flere kolonner, og du ville skrive en linje med kode for at opdatere eller læse hvert element i arrayet. Dette ville sandsynligvis ende med at blive ret rodet, og der kunne let laves fejl i håndteringen af ​​de forskellige elementer.

Med dit nye objekt kan du blot henvise til det og de medlemmer, du har oprettet under det, for at gemme dataene.

Hvis dataene ændres i regnearket (eller i en sammenkædet database, hvis du har brugt dette som en datakilde i dit klassemodul), når du bruger 'Dim' -sætningen, vil initialiseringsrutinen blive kaldt, og dataene opdateres øjeblikkeligt . Ingen grund til at skrive kode for at genopfylde dit array.

Brug af et klassemodul til at oprette et variabelt lager

Når du skriver VBA -kode, bruger du variabler overalt, alle med forskellige anvendelsesområder. Nogle kan kun defineres for en bestemt procedure, nogle for et bestemt modul, og nogle kan være globale variabler, der kan bruges overalt i applikationen

Du kan oprette et klassemodul, der indeholder et stort antal variabler, og fordi det er et objekt, kan det bruges overalt i din kode, selv på en brugerformular eller i en Active X -kontrol, som du har placeret på et regneark.

Den ekstra fordel er, at når du refererer til dit variabelobjekt, vil du se en liste over alle variabelnavne i objektet sorteret i stigende rækkefølge.

For at oprette et depot skal du indsætte et nyt klassemodul. Det gør du ved at bruge Indsæt | Klassemodul fra menuen VB Editor

Skift navnet til 'MyVariables' ved hjælp af den samme metode som tidligere diskuteret i denne artikel.

Indtast følgende kode:

12345678910111213141516 Privat mV Som variantOffentlig ejendom Få variabel1 () som variantVariabel1 = mVSlut ejendomOffentlig ejendom Lad variabel1 (ByVal vNewValue som variant)mV = vNyVærdiSlut ejendomOffentlig ejendom Få variabel2 () som variantVariabel1 = mVSlut ejendomOffentlig ejendom Lad variabel2 (ByVal vNewValue som variant)mV = vNyVærdiSlut ejendom

Denne kode opsætter egenskaber "Lad" og "Få" for to variabler ("Variabel1" og "Variabel2"). Egenskaberne Lad og Hent er påkrævet for hver af dine variabler, så de læses / skrives

Du kan bruge dine egne navne til variablerne i stedet for eksemplerne i denne kode, og du kan tilføje yderligere variabler og sørge for, at hver ny variabel har en 'Lad' og 'Få' sætning.

Den private erklæring af variablen 'mV' er at oprette en arbejdsvariabel, der kun bruges i klassemodulet til at overføre værdier.

Hvis du vil bruge det variable lager, skal du indtaste følgende kode i et standardmodul:

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

Denne kode opretter en global forekomst af dit 'MyVariables' -objekt, som du har oprettet. Du behøver kun at lave denne erklæring én gang fra hvor som helst i din kode.

Koden viser først værdien af ​​'Variabel1' for at vise, at den er tom.

En værdi på 10 tildeles ‘Variabel1’, og den nye værdi i objektet vises derefter for at vise, at denne egenskab nu har denne værdi.

Fordi forekomsten af ​​"MyVariables" -objektet er blevet defineret globalt, kan du henvise til en hvilken som helst af de definerede variabler i objektet hvor som helst i din kode.

Dette har en kæmpe fordel i, at hvis du vil bruge dine variabler hvor som helst i din kode, behøver du kun at definere en global variabel, og fra den forekomst kan alle variablerne frit få adgang til og modificeres i hele din kode.

Gør dit objekt til en tilføjelse

Indtil videre er koden til objektoprettelsen i din projektmapprogram. Men hvis du vil kunne dele dit objekt med andre udviklere eller i dine egne Excel-applikationer, kan du gøre det til et tilføjelsesprogram

For at gøre dette er alt, hvad der skal ske, at gemme filen som et tilføjelsesprogram. Vælg File | Gem som, og der vises et browservindue

Vælg filtypen som tilføjelse (.xlam) fra rullelisten, og klik på OK. Filen gemmes som standard i tilføjelsesmappen, men du kan ændre placeringen.

Du kan derefter indarbejde tilføjelsesfilen i dine Excel-applikationer, hvilket giver dig fleksibiliteten til at gøre brug af dit nye objekt

Hvis du vil inkludere din nye tilføjelse til Excel, skal du klikke på Fil på Excel-båndet og derefter klikke på Indstillinger i bunden af ​​venstre rude

Klik på 'Tilføjelser' i venstre rude i pop op-vinduet, der vises. I bunden af ​​vinduet er en knap mærket 'Go'

Klik på dette, og et 'Add-In' pop-up vindue vises. Klik på 'Gennemse', og find derefter din tilføjelsesfil. Du vil derefter kunne henvise til dit objekt i din kode.

Du vil bidrage til udviklingen af ​​hjemmesiden, at dele siden med dine venner

wave wave wave wave wave