Úvod.
Minulý týden jsme měli krátké představení jednoduchého Objektu vlastní třídy pouze se dvěma vlastnostmi pro délku a Šířka Hodnoty. Metoda pro výpočet plochy čehokoli, s hodnotami délky a šířky. Doufám, že jste pochopili základy modulu vlastní třídy Ms-Access. Pokud ne, zde je odkaz:Ms-Access Class Module a VBA. Než budete pokračovat, navštivte prosím stránku.
Class Module Objects ušetří spoustu kódu ve vašich programech. Když najdete něco, co děláte opakovaně v kódu, vzpomeňte si na objekt modulu třídy. Opakující se kód lze také přeměnit na užitečnou funkci, ale pro objekty třídy musíte zvolit jiný přístup.
U jednoduchého úkolu může vylepšování funkcí Class Module Object vyžadovat více kódu, ale vaše hlavní modulové programy budou jednoduché a veškerý komplikovaný kód vyvinutý a rafinovaný zůstane ostatním skryt.
Ale prozatím máme v ruce jednoduchý modul třídy, který si vyzkoušíme, jak vytvořit pole objektů pro výpočet oblasti mnoha položek.
Podrutina ClassArray().
Ukázkový kód VBA ve standardním modulu vytvoří pole pěti objektů třídy ClsArea a vytiskne jejich hodnoty vlastností a výsledek metody v okně ladění. Zkopírujte a vložte (nebo lépe, když je zadáte, abyste každý řádek lépe poznali, co dělají) následující kód do standardního modulu:
Public Sub ClassArray() Dim tmpA As ClsArea Dim CA() As ClsArea Dim j As Long, title As String Dim L As Long, U As Long title = "ClassArray" For j = 1 To 5 ‘the Loop is set for 5 items 'instantiate temporary ClsArea Object 'to enter input Set tmpA = New ClsArea tmpA.strDesc = InputBox(Str(j) & ") Description:", title, "") tmpA.dblLength = InputBox(Str(j) & ") Enter Length:", title, 0) tmpA.dblWidth = InputBox(Str(j) & ") Enter Width:", title, 0) 'Redimension Array ReDim Preserve CA(1 To j) As ClsArea Set CA(j) = tmpA 'Copy Object to Array Set tmpA = Nothing 'Remove temporary object from memory. Next ‘PRINTING SECTION 'Print the Array contents into the Debug Window L = LBound(CA) U = UBound(CA) Debug.Print "Description", "Length", "Width", "Area" For j = L To U With CA(j) Debug.Print .strDesc, .dblLength, .dblWidth, .Area End With Next ’stop 'Clear array objects from memory For j = L To U Set CA(j) = Nothing Next End Sub
Klikněte někam doprostřed kódu a stisknutím klávesy F5 kód spusťte. Zadejte hodnoty pro popis, délku a šířku z klávesnice pro 5 různých položek, jednu po druhé.
Ukázka běhu programu je uvedena níže:
Description Length Width Area Door Mat 5 8 40 Carpet 12 23 276 Bed Room 21 23 483 Store Room 15 25 375 Terrace 40 50 2000
Recenze kódu řádek po řádku.
Podívejme se na kód řádek po řádku. V oblasti deklarace jsme deklarovali objektovou proměnnou tmpA typu ClsArea. Na druhém řádku je deklarováno prázdné pole CA() typu ClsArea. Požadovaný počet prvků bude později v programu předimenzován.
Na dalších dvou řádcích jsme deklarovali proměnné title typu String a j, L, a U proměnné typu Long Integer.
Dále je proměnná title inicializována řetězcem ‚ClassArray‘ a bude použita jako nadpis ve funkci InputBox(). Pro….Další smyčka je nastavena pomocí řídicí proměnné j spustit smyčku pětkrát. Po dalších dvou řádcích komentáře Nastavit výpis instanciuje (přiděluje paměť) Objekt třídy ClsArea v paměti s názvem tmpA .
Následující tři řádky kódu slouží k zadávání hodnot pro strDesc , dblLength, a dblWidth Vlastnosti objektu třídy tmpA.
Po dalším řádku komentáře je objekt třídy ClsArea (CA) předimenzován na 1 až j krát (1 až 1krát) zachováním existujících prvků Object, pokud existují (toto je první objekt v poli). Toto se bude neustále zvyšovat prostřednictvím ReDim příkazu na 1 až 2, 1 až 3, 1 až 4 a 1 až 5 zachováním dřívějších hodnot objektu v rámci For . . . Další smyčka. Možnost Zachovat klíčové slovo zajišťuje, že se stávající objekty pole neztratí.
Poznámka: Příkaz Re-Dimension zvýší/sníží počet zadaných prvků objektu, ale vymaže existující objekty načtené do pole dříve, bez možnosti Zachovat klíčové slovo.
Sada příkaz na dalším řádku zkopíruje objekt tmpA s jeho daty do CA(j) Nově vytvořený objekt ClsArea j prvek pole.
Další řádek Nastavit tmpA =nic odebere dočasný objekt z paměti.
Cyklus For…Next zopakuje tuto akci ještě čtyřikrát, aby vložil další položky do nově vytvořeného dočasného objektu tmpA, jednu po druhé, a zkopíruje objekt do pole objektů CA.
Další dva řádky za řádkem komentáře najdou rozsah indexu Object Array (najde nejnižší a nejvyšší indexové číslo.
Další Debug.Print příkaz vytiskne řádek záhlaví ve 14 zónách sloupců v okně ladění. Pro . . . Další smyčka s L a U rozsahy čísel indexů vázaného pole spouští vnitřní příkazy pro přístup ke každému objektu z Array CA, s číslem indexu v řídicí proměnné j.
Aktuální odkaz na objekt je nastaven v With. . . Konec namísto opakování názvu objektu CA(j).strDesc, CA(j).dblLength, CA(j).dblWidth a CA(j).Area k vytištění hodnot vlastností objektu a výsledků metody Area() v okně ladění.
Odstraňte symbol komentáře z Stop příkaz k vytvoření pauzy v programu na příkazu Stop. Spusťte kód znovu a zadejte 5 podrobností o položce, abyste mohli experimentovat s objektem Array. Můžete selektivně oslovit kteroukoli vlastnost objektu pomocí čísla Array Index a upravit nebo vytisknout jakoukoli hodnotu v okně ladění, jak je znázorněno níže.
Příkaz Nastavit CA(j) =Nothing v rámci For. . . Další smyčka vymaže objekty pole jeden po druhém z paměti.
Předejte pole objektů třídy jako parametr funkce.
Pole objektů třídy můžeme předat programu jako parametr, jako jsme to udělali s uživatelem definovaným datovým typem.
Vytvořme jednoduchý tiskový podprogram tím, že vyjmeme kód tiskové sekce z hlavního programu a vložíme jej do nového programu.
Zkopírujte kód podprogramu ClassArray(), vložte jej do stejného standardního modulu a změňte název jako ClassArray2(), jak je uvedeno níže.
Public Sub ClassArray2() Dim tmpA As ClsArea Dim CA() As ClsArea Dim j As Long, title As String Dim L As Long, U As Long title = "ClassArray" For j = 1 To 5 ‘the Loop is set for 5 items 'instantiate temporary ClsArea Object 'to enter input Set tmpA = New ClsArea tmpA.strDesc = InputBox(Str(j) & ") Description:", title, "") tmpA.dblLength = InputBox(Str(j) & ") Enter Length:", title, 0) tmpA.dblWidth = InputBox(Str(j) & ") Enter Width:", title, 0) 'Redimension Array ReDim Preserve CA(1 To j) As ClsArea Set CA(j) = tmpA 'Copy Object to Array Set tmpA = Nothing 'Remove temporary object from memory. Next ‘PRINTING SECTION 'Print the Array contents into the Debug Window L = LBound(CA) U = UBound(CA) Debug.Print "Description", "Length", "Width", "Area" For j = L To U With CA(j) Debug.Print .strDesc, .dblLength, .dblWidth, .Area End With Next ’stop 'Clear array objects from memory For j = L To U Set CA(j) = Nothing Next End Sub
Kód ClassArray2 bez části tisku.
Vytvořte nový podprogram, jak je uvedeno níže:
Public Sub ClassPrint(ByRef clsPrint() As ClsArea) Dim L As Long, U As Long Dim j As Long End Sub
Zvýrazněte část tisku až k příkazu Stop v programu ClassArray2(), ořízněte zvýrazněnou oblast kódu a vložte ji pod Dim příkazy v ClassPrint() Program. Upravené verze obou kódů jsou uvedeny níže:
Public Sub ClassArray2() Dim tmpA As ClsArea Dim CA() As ClsArea Dim j As Long, title As String title = "ClassArray" For j = 1 To 5 ‘the Loop is set for 5 items 'instantiate temporary ClsArea Object 'to enter input Set tmpA = New ClsArea tmpA.strDesc = InputBox(Str(j) & ") Description:", title, "") tmpA.dblLength = InputBox(Str(j) & ") Enter Length:", title, 0) tmpA.dblWidth = InputBox(Str(j) & ") Enter Width:", title, 0) 'Redimension Array ReDim Preserve CA(1 To j) As ClsArea Set CA(j) = tmpA 'Copy Object to Array Set tmpA = Nothing 'Remove temporary object from memory. Next Call ClassPrint(CA) ‘Pass the Object Array to print routine 'Clear array objects from memory For j = L To U Set CA(j) = Nothing Next End Sub
Program ClassPrint().
Public Sub ClassPrint(ByRef clsPrint() As ClsArea) Dim L As Long, U As Long Dim j As Long 'Printing Section 'Print the Array Contents into the Debug Window. L = LBound(clsPrint) U = UBound(clsPrint) Debug.Print "Description", "Length", "Width", "Area" For j = L To U With clsPrint(j) Debug.Print .strDesc, .dblLength, .dblWidth, .Area End With Next End Sub
Zkontrolujte změny kódu v obou programech a proveďte opravy, kdykoli je to možné. Klepněte doprostřed kódu ClassArray2() a stisknutím klávesy F5 spusťte program.
Příkaz Call v prvním programu předá pole objektů třídy CA jako parametr ByRef podprogramu ClassPrint(). Program vytiskne vlastnosti objektu a zavolá funkci Area(), aby vypočítala a vrátila hodnotu k tisku.
Příští týden se naučíme, jak používat náš modul třídy ClsArea jako základní třídu k vytvoření nového objektu třídy VBA pro výpočet Volume něčeho.
- MS-Access Class Module a VBA
- Pole objektů třídy VBA MS Access
- Základní třída MS-Access a odvozené objekty
- Základní třída VBA a odvozené objekty-2
- Základní třída a varianty odvozených objektů
- Sada záznamů a modul třídy Ms-Access
- Přístup k modulu třídy a třídám Wrapper
- Transformace funkčnosti třídy Wrapper
- Základy přístupu a shromažďovacích objektů
- Modul třídy Ms-Access a objekt kolekce
- Záznamy tabulek v objektu a formuláři kolekce
- Základy objektů slovníku
- Základy objektů slovníku-2
- Řazení klíčů a položek objektů slovníku
- Zobrazení záznamů ze slovníku do formuláře
- Přidat objekty třídy jako položky slovníku
- Aktualizovat položku slovníku objektů třídy ve formuláři