VBA -klassmodulhandledning och exempel

Denna handledning kommer att lära dig om klassmoduler i VBA. Du lär dig vad de är och hur du använder dem.

VBA -klassmoduler - Introduktion

När du sätter in moduler i Visual Basic Editor (VBE) för att ange din kod har du kanske märkt att du också kan infoga det som kallas en ”klassmodul”.

Klassmoduler vs. moduler

Klassmodulerna fungerar på ett helt annat sätt än de vanliga modulerna genom att de underlättar skapandet av en Component Object Model (COM) som sedan kan användas inom din normala VBA -kod

Effektivt skapar du ett objekt som fungerar på samma sätt som ett inbyggt Excel -objekt som "Arbetsblad". I kalkylbladsobjektet har du ett antal egenskaper och metoder som gör att du kan få antalet kalkylblad i en arbetsbok eller varje enskilt namn på ett kalkylblad eller många andra uppgifter

När du skapar ett nytt objekt på detta sätt skapar du en byggsten som kan användas var som helst inom VBA. Objektet har ett antal egenskaper och metoder som kan nås av din VBA-kod var som helst i arbetsboken utan att behöva skriva om koden igen.

Förutom att hänvisa till ditt nya objekt från en standard VBA -modul kan du också använda det i koden bakom en UserForm som är en del av din anpassade applikation

Du kan också använda den där du har placerat Active X -kontroller på ett kalkylblad, till exempel en kommandoknapp eller en rullgardinsmeny. Dessa kontroller använder alla VBA, och ditt nya objekt kan enkelt införlivas i händelsekoden för dessa kontroller.

Du kan också förvandla ditt objekt till ett Excel-tillägg. Ditt objekt blir automatiskt tillgängligt för andra användare som har tillägget laddat. Detta lägger till din egen arkitektur i flera nivåer i din Excel-applikation

Excel är en applikation med flera nivåer. Det finns klienttjänstlagret som driver det faktiska kalkylbladsfönstret som användaren känner till. Excel -objektmodellen är nästa lager nedanför. Tryck på F2 i en VBA -modul så kommer du att kunna se det stora antalet objekt och medlemmar av de objekt som är motorn i Excel. Observera att ditt nya objekt också kommer att visas här.

Slutligen, under allt detta, har du datatjänstlagret som innehåller all data som du har angett i kalkylblad och celler. Excel använder detta med hjälp av Excel Object -modellen.

Genom att skapa en klassmodul kan du utöka Excel -objektmodulen med dina egna anpassade objekt och medlemmar

Den här artikeln förklarar för dig hur du skapar en enkel hierarki av objekt med hjälp av klassmoduler.

Fördelar med att använda klassmoduler

  1. Du kan utveckla en robust byggsten som kan användas i valfritt antal olika Excel -applikationer
  2. När det väl har testats noggrant kan man lita på att det alltid ger korrekta resultat på samma sätt som de inbyggda Excel-objekten
  3. Om koden uppdateras någon annanstans i programmet kommer det nya objektet fortfarande att fungera på samma sätt
  4. Du kan använda ditt nya objekt i andra Excel-program som ett tillägg
  5. Objekten kan återanvändas i andra applikationer och hjälper till med felsökning

Nackdelar med att använda klassmoduler

  1. De kan vara svåra att skapa och förstå.
  2. Namngivningskonventioner är mycket viktiga eftersom detta är vad du kommer att se när du använder ditt objekt i en normal modul.
  3. Om du inte har skapat en klassmodul tidigare kan de vara svåra att förstå och det finns en brant inlärningskurva
  4. Omöjligt att göra ändringar vid körning-du måste ställa om projektet.
  5. Om egenskaper och privata variabler har samma namn kan oändliga loopar uppstå som resulterar i fel

Infoga en klassmodul

Välj Infoga | Klassmodul från menyn VBE (Visual Basic Editor). Den nya klassmodulen kommer automatiskt att kallas ‘Klass 1’, men detta måste omedelbart ändras till det namn som du ska använda för ditt objekt

Du ändrar namnet i fönstret Egenskaper där pilen pekar. Du skriver helt enkelt in ditt nya namn, och detta kommer att ändras i klassmodulerna

Om fönstret Egenskaper inte syns väljer du Visa | Egenskaper på VBE -menyn eller tryck på F4

Kalla din nya klassmodul för 'MyItem' och dubbelklicka på namnet i trädvyn i Project Explorer för att visa kodfönstret för det.

Skapa ett objektobjekt

I det här exemplet skapas ett objekt på toppnivå som heter "MyItems" med ett medlemsobjekt under det som kallas "MyItem" som innehåller de enskilda uppgifterna för varje objekt. När den väl skapats fungerar den på samma sätt som ett inbyggt Excel -objekt. Till exempel finns det ett objekt som heter "Arbetsblad" som är en samling av varje kalkylblad i din arbetsbok. Det finns också ett objekt som kallas "Ark" som representerar varje enskilt kalkylblad i din arbetsbok och innehåller alla egenskaper och metoder för varje kalkylblad. Detta objekt hänför sig till samlingsobjektet "Arbetsblad".

Du kan iterera genom "Arbetsblad" -samlingen och se varje "blad" i tur och ordning. På samma sätt kommer du att kunna iterera genom "MyItems" -samlingen och se egenskaperna som du skapade i "Myitem" -medlemmen.

Det första du ska göra är att skapa subobjektet för medlemsnivån som kommer att hålla de faktiska objekten i samlingen av objektet på högsta nivå. Detta motsvarar medlemmarna (t.ex. namn, synligt, antal) i objektet "Ark" i Excel. Denna kod matas in i klassmodulen som heter 'MyItem'

Klassmoduler har egenskaper och metoder. Egenskaper är effektivt som variabler, eftersom de innehåller värden för data som variabler, och Metoder är som underrutiner eller funktioner.

I delobjektet ska vi skapa två egenskaper för objektet - Artikel och detalj

Inledningsvis måste två strängvariabler deklareras för att hålla värdena för egenskaperna:

12 Privat objekt som strängPrivat mDetail som sträng

Dessa måste deklareras i avsnittet Deklarationer högst upp i koden för klassmodulen så att de kan användas i alla delrutiner i hela modulen

De måste få unika namn för att de ska skilja sig från de egenskaper som vi ska skapa, så ett 'm' (för medlem) har placerats framför varje namn.

Variablerna deklareras som privata så att de inte kan ses av någon som använder objektet. De är arbetsvariabler för användning inom objektkoden och finns inte där som en del av det slutliga objektet.

Nästa steg är att ställa in kod för att ge åtkomst till de två egenskaperna. Du gör detta med hjälp av en Property Let och en Property Get -uttalande för varje fastighet. Dessa måste vara offentliga annars kommer objektet på högsta nivå inte att ha några synliga egenskaper

123456789101112131415 Allmän egendom Låt objekt (vdata som sträng)mItem = vdataSlutfastighetAllmän egendom Få objekt () som strängArtikel = mItemSlutfastighetAllmän egendom Låt detaljer (vdata som sträng)mDetail = vdataSlutfastighetAllmän egendom Få detaljer () som strängDetalj = mDetailSlutfastighet

Denna kod skapar medel för att läsa och skriva värden till de två egenskaperna (artikel och detalj) med hjälp av de två privata variablerna som definierades i deklarationsavsnittet i modulen.

Parametern "vdata" används för att överföra data till den berörda egenskapen.

Det är viktigt att varje egendom har ett ”Låt” och ”Hämta” -uttalande och att fastighetsnamnet är detsamma i varje fall. Du kan sluta med två olika egenskaper om du stavar fel - en som du kan läsa från och en som du kan skriva till!

För att hjälpa till med att skapa denna kod kan du använda Infoga | Procedur på VBE -menyn för att skapa ett kodskelett som skapar den ursprungliga koden för egenskaperna "Hämta" och "Låt" för ett givet fastighetsnamn

Detta visar ett popup-fönster där du skriver fastighetsnamnet och väljer "Egenskap" på alternativknapparna:

Klicka på "OK" och skelettkoden läggs till i klassmodulen:

1234567 Allmän egendom Skaffa MyProperty () som variantSlutfastighetAllmän egendom Låt MyProperty (ByVal vNewValue As Variant)Slutfastighet

Detta förhindrar eventuella misstag över namn på fastigheter. Du lägger helt enkelt till din kod mellan uttalandena "Offentlig egendom" och "Slutfastighet".

Du har nu ett objekt som heter "MyItem" som innehåller all data för denna övning.

Trött på att söka efter exempel på VBA -kod? Prova AutoMacro!

Skapa en samling

Nästa steg är att skapa ett objekt på toppnivå som ett samlingsobjekt för att ge åtkomst till de egenskaper som du har konfigurerat i objektet "MyItem"

Återigen måste du definiera ett arbetsobjekt för att fungera som samlingsobjekt på samma sätt som du definierade de två strängvariablerna i objektet "MyItem".

1 Privata objekt som samling

Återigen måste detta ha ett unikt namn, varför det finns ett 'm' (medlemsobjekt) framför namnet, och det förklaras också som 'privat' så att det inte visas när det nya objektet Begagnade

Därefter måste du fylla i Class_Initialize -koden. Detta körs när du först använder objektet i din kod och det avgör vilka värden som ska laddas in i objektet

Du kan komma åt denna underrutin genom att välja "Klass" i den första rullgardinsmenyn och "Initiera" i den andra rullgardinsmenyn i modulfönstret

12345678910 Private Sub Class_Initialize ()Dim objItem som MyItemAnge mItems = Ny samlingFör n = 1 till 3Set objItem = New MyItemobjItem.Item = Arbetsblad ("Sheet1"). Område ("a" & n) .VärdeobjItem.Detail = Arbetsblad ("Ark1"). Område ("b" & n) .VärdemItems.Lägg till objItemNästa nAvsluta Sub

Koden skapar ett objekt som heter 'objItem' med hjälp av definitionen av 'MyItem' som vi byggde som en klassmodul tidigare.

Den skapar sedan en ny samling baserad på objektet "mItems" som definierats tidigare

Det iterates genom värden som finns på Sheet1 i arbetsboken och lägger dem i egenskaperna som vi skapade för objektet "MyItem". Observera att när du använder 'objitem' visas en rullgardinsmeny som visar de två egenskaperna, precis som om du använder ett inbyggt Excel-objekt.

Objektobjektet läggs sedan till i samlingsobjektet som nu innehåller alla data i fastighetsvärdena.

Inmatningsdata behöver inte tas från ett kalkylblad. Det kan vara statiska värden, eller det kan komma från en anslutning till en databas som Microsoft Access eller SQL Server, eller det kan komma från ett annat kalkylblad.

Du måste sedan lägga till en offentlig funktion som heter "Artikel"

123 Public Function Item (index As Integer) As MyItemAnge objekt = mItems.Item (index)Avsluta funktion

Detta låter dig referera till enskilda objekt i samlingsobjektet med deras indexnummer. Denna funktion ger en "spegel" av vad som händer i "mMyItems" -samlingen i bakgrunden.

Du måste också lägga till en egenskap som kallas "Count" så att din kod kan fastställa hur många "MyItem" -objekt som finns i "MyItems" -samlingen, om du vill iterera genom den.

123 Allmän egendom får räkna () så längeCount = mItems.CountSlutfastighet

I det här fallet behöver du bara en "Get" -egenskap eftersom den är skrivskyddad. Den använder mItems -samlingen eftersom den redan har en count -egenskap inbyggd i den.

Du har nu ett objekt (MyItems) med en fullständig hierarki definierad av objektet 'MyItem'

För att få det hela att fungera måste du nu fylla i ett kalkylblad (Sheet1) med data så att Class Initialize -rutinen kan samla in detta i objektet

Ditt kalkylblad ska se ut så här:

Använda ditt nya objekt

Du kan nu använda ditt samlingsobjekt (MyItems) inom en standard Excel VBA -modul. Ange följande kod:

12345678 Sub test_object ()Dim MyClass as New MyItems, n As IntegerMsgBox MyClass.CountFör n = 1 till MyClass.CountMsgBox MyClass.Item (n) .ItemMsgBox MyClass.Item (n) .DetailNästa nAvsluta Sub

Denna kod skapar ett objekt som heter "MyClass" baserat på det samlingsobjekt som du skapade kallat "MyItems". Detta avfyrar rutan "Initiera" som extraherar all data från kalkylbladet till objektet.

Det visar antalet objekt i samlingen och går sedan igenom samlingen som visar texten "Artikel" och "Detalj" -texten. Du kommer att märka att när du hänvisar till "MyClass" -objektet i din kod kommer du att se en lista över de två medlemsegenskaperna som hjälper till att lägga till rätt egendom.

Om du ändrar värdet på en cell i inmatningsdata i kalkylbladet, kommer detta automatiskt att uppdateras i samlingen när du kör ovanstående kod igen, eftersom när du dimensionerar objektet startar initieringsrutinen och plockar upp alla nya data

Om du använder ordet "Statisk" istället för "Dim" startar inte initialiseringsrutinen och de gamla värdena behålls, så länge koden körs kontinuerligt. Om data i kalkylarket ändras kommer detta inte att återspeglas i objektet

1234567 Sub Test_Static ()Statisk myklass som nya MyItems, n som heltalFör n = 1 till Myclass.CountMsgBox Myclass.Item (n) .ItemMsgBox Myclass.Item (n) .DetailNästa nAvsluta Sub

Sammanfattning av att skapa ett objekt med hjälp av en klassmodul

Som du har sett är det ganska komplicerat att skapa en hierarki av klassmoduler att använda som ett objekt, även för en struktur som är så enkel som exemplet här. Utrymmet för att göra misstag är enormt!

Det har dock enorma fördelar med att göra din kod mer elegant och lättare att läsa. Det är också lättare att dela med andra Excel-applikationer och utvecklare genom att göra det till ett tillägg.

I det här exemplet på hur man skapar ett objekt för att lagra data, skulle det vara ett normalt tillvägagångssätt att skapa en flerdimensionell matris för att hålla flerkolumnens kalkyldata, och du skulle skriva en kodrad för att uppdatera eller läsa varje element i matrisen. Detta skulle förmodligen bli ganska rörigt, och det kan lätt göras misstag när det gäller att ta itu med de olika elementen.

Med ditt nya objekt kan du helt enkelt hänvisa till det och medlemmarna som du har skapat under det för att hålla data.

Om data ändras i kalkylarket (eller i en länkad databas om du har använt detta som en datakälla i din klassmodul) när du använder "Dim" -satsen kommer initialiseringsrutinen att ringas och data uppdateras omedelbart . Du behöver inte skriva kod för att fylla i din array igen.

Använda en klassmodul för att skapa ett variabelt förråd

När du skriver VBA -kod använder du variabler överallt, alla med olika omfattningar. Vissa kan bara definieras för ett visst förfarande, vissa för en viss modul, och vissa kan vara globala variabler som kan användas över hela applikationen

Du kan skapa en klassmodul som rymmer ett stort antal variabler, och eftersom det är ett objekt kan den användas var som helst i din kod, även på ett användarformulär eller i en Active X -kontroll som du har placerat på ett kalkylblad.

Den extra fördelen är att när du hänvisar till ditt variabelobjekt kommer du att se en lista över alla variabelnamn som finns i objektet sorterade i stigande ordning.

För att skapa ett arkiv måste du infoga en ny klassmodul. Du gör detta genom att använda Infoga | Klassmodul från VB Editor -menyn

Ändra namnet till ‘MyVariables’ med samma metodik som tidigare diskuterats i denna artikel.

Ange följande kod:

12345678910111213141516 Privat mV som variantAllmän egendom Få variabel1 () som variantVariabel1 = mVSlutfastighetPublic Property Let Variable1 (ByVal vNewValue As Variant)mV = vNewValueSlutfastighetAllmän egendom Skaffa variabel2 () som variantVariabel1 = mVSlutfastighetPublic Property Let Variable2 (ByVal vNewValue As Variant)mV = vNewValueSlutfastighet

Denna kod konfigurerar egenskaperna ”Låt” och ”Hämta” för två variabler (”Variabel1” och ”Variabel2”). Egenskaperna Let and Get krävs för var och en av dina variabler så att de läses / skrivs

Du kan använda dina egna namn för variablerna i stället för exemplen i den här koden, och du kan lägga till ytterligare variabler och se till att varje ny variabel har ett ”Let” och ”Get” -uttalande.

Den privata deklarationen för variabeln 'mV' är att skapa en arbetsvariabel som endast används inom klassmodulen för att överföra värden.

Om du vill använda variabelförvaret anger du följande kod i en standardmodul:

123456 Global VarRepo som nya MyVariablesSub TestVariableRepository ()MsgBox VarRepo.Variable1VarRepo.Variable1 = 10MsgBox VarRepo.Variable1Avsluta Sub

Denna kod skapar en global instans av ditt "MyVariables" -objekt som du skapade. Du behöver bara göra denna deklaration en gång var som helst i din kod.

Koden visar först värdet på "Variabel1" för att visa att den är tom.

Ett värde på 10 tilldelas "Variabel1" och det nya värdet i objektet visas sedan för att visa att den här egenskapen nu har detta värde.

Eftersom förekomsten av "MyVariables" -objektet har definierats globalt kan du hänvisa till någon av de definierade variablerna i objektet var som helst i din kod.

Detta har en enorm fördel i att om du vill använda dina variabler var som helst i din kod behöver du bara definiera en global variabel, och från den instansen kan alla variabler fritt nås och modifieras i hela din kod.

Förvandla ditt objekt till ett tillägg

Hittills finns koden för objektskapandet i din arbetsboksprogram. Men om du vill kunna dela ditt objekt med andra utvecklare eller i andra egna Excel-program kan du göra det till ett tillägg

För att göra detta är allt som behöver hända att spara filen som ett tillägg. Välj Arkiv | Spara som och ett webbläsarfönster visas

Välj filtyp som tillägg (.xlam) från rullgardinsmenyn och klicka på OK. Filen sparas som standard i mappen Tillägg, men du kan ändra platsen.

Du kan sedan integrera tilläggsfilen i dina Excel-program, vilket ger dig flexibiliteten att använda ditt nya objekt

Om du vill inkludera ditt nya tillägg i Excel klickar du på Arkiv i Excel-menyfliksområdet och klickar sedan på Alternativ längst ner i den vänstra rutan

Klicka på "Tillägg" i den vänstra rutan i popup-fönstret som visas. Längst ner i fönstret finns en knapp märkt "Gå"

Klicka på det här så visas ett popup-fönster för tillägg. Klicka på "Bläddra" och hitta sedan din tilläggsfil. Du kommer då att kunna referera till ditt objekt i din kod.

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

wave wave wave wave wave