Access
 sql >> Database >  >> RDS >> Access

Matrici di oggetti di classe VBA di Ms-Access

Introduzione.

La scorsa settimana abbiamo avuto una breve introduzione di un semplice oggetto classe personalizzato con solo due Proprietà, per Lunghezza e Larghezza Valori. Un metodo per calcolare l'Area di qualsiasi cosa, con valori di lunghezza e larghezza. Spero che tu abbia compreso le basi di un modulo di classe personalizzato Ms-Access. In caso contrario, ecco il link:Ms-Access Class Module e VBA. Si prega di visitare la pagina prima di continuare.

Class Module Objects salva molto codice nei tuoi programmi. Quando hai trovato qualcosa che fai ripetutamente nel codice, pensa a un oggetto modulo di classe. Anche il codice ripetitivo può essere trasformato in una funzione di utilità, ma per gli oggetti di classe è necessario adottare un approccio diverso.

Per un compito semplice, potrebbe essere necessario più codice per perfezionare le funzioni dell'Oggetto Modulo Classe, ma i programmi dei moduli principali saranno semplici e tutto il codice complicato sviluppato e perfezionato rimarrà nascosto agli altri.

Ma per ora, abbiamo un semplice modulo di classe in mano, proveremo a creare un array di oggetti per calcolare l'area di molti elementi.

La sottoroutine ClassArray().

Il codice VBA di esempio nel modulo standard crea una matrice di cinque oggetti della classe ClsArea e ne stampa i valori delle proprietà e il risultato del metodo nella finestra di debug. Copia e Incolla (o meglio se li digiti, per conoscere meglio ogni riga cosa fanno) il seguente codice in un Modulo Standard:

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
 

Fare clic da qualche parte nel mezzo del codice e premere F5 per eseguire il codice. Inserisci i valori per Descrizione, Lunghezza e Larghezza dalla tastiera per 5 elementi diversi, uno dopo l'altro.

Di seguito è riportato un esempio di esecuzione del programma:

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 

Revisione del codice riga per riga.

Esaminiamo il codice riga per riga. Nell'area di dichiarazione, abbiamo dichiarato una variabile oggetto tmpA di tipo ClsArea. Nella seconda riga dichiarata una matrice vuota CA() di tipo ClsArea. Il numero richiesto di elementi verrà ridimensionato più avanti nel programma.

Nelle prossime due righe, abbiamo dichiarato le variabili titolo di tipo String e j, L, e U variabili di tipo Long Integer.

Successivamente, la variabile title viene inizializzata con la stringa "ClassArray" e verrà utilizzata come titolo nella funzione InputBox(). Il Per….Il prossimo loop è impostato con una variabile di controllo j per eseguire il ciclo cinque volte. Dopo le due righe di commento successive, il Set dichiarazione crea un'istanza (alloca memoria) Classe ClsArea Oggetto in memoria con il nome tmpA .

Le tre righe di codice successive servono ai valori di input per strDesc , dblLength, e dblWidth Proprietà dell'oggetto classe tmpA.

Dopo la successiva riga di commento, l'oggetto classe ClsArea (CA) viene ridimensionato da 1 a j volte (da 1 a 1 volta) preservando gli elementi Object esistenti, se presenti (questo è il primo oggetto nell'array). Questo continuerà ad aumentare, attraverso il ReDim istruzione, da 1 a 2, da 1 a 3, da 1 a 4 e da 1 a 5 preservando i valori dell'oggetto precedenti, all'interno di For . . . Ciclo successivo. La Preserva assicura che gli oggetti dell'array esistenti non vadano persi.

Nota: L'istruzione Re-Dimension aumenta/diminuisce il numero di elementi oggetto specificati ma cancella gli oggetti esistenti caricati nell'array in precedenza, senza Preserva parola chiave.

Il set l'istruzione nella riga successiva copia l'oggetto tmpA, con i suoi dati nella CA(j) ClsArea Oggetto appena creato j elemento dell'array.

Riga successiva Imposta tmpA =Niente rimuove l'oggetto temporaneo dalla memoria.

Il ciclo For...Next ripete questa azione altre quattro volte per inserire altri elementi nell'oggetto temporaneo appena istanziato tmpA, uno dopo l'altro, e copia l'oggetto nell'array di oggetti CA.

Le due righe successive, dopo la riga di commento, trovano l'intervallo dell'indice Object Array (trova i numeri di indice più bassi e più alti.

Il prossimo Debug.Print stampa una riga di intestazione in 14 zone di colonna nella finestra di debug. Il per . . . Avanti loop con la L e U gli intervalli di numeri dell'indice dell'array vincolati eseguono le istruzioni interne per accedere a ciascun oggetto dall'array CA con numero indice nella variabile di controllo j.

Il riferimento all'oggetto corrente è impostato all'interno di With. . . Termina con struttura, anziché ripetere il nome dell'oggetto CA(j).strDesc, CA(j).dblLength, CA(j).dblWidth e CA(j).Area per stampare i valori delle proprietà dell'oggetto e i risultati dell'area del metodo() nella finestra di debug.

Rimuovi il simbolo del commento da "Stop per creare una pausa nel programma sull'istruzione Stop. Esegui di nuovo il codice e inserisci 5 dettagli dell'elemento in modo da poter sperimentare con l'oggetto Array. Puoi indirizzare selettivamente una qualsiasi delle proprietà dell'oggetto, con il numero di indice dell'array, per modificare o stampare qualsiasi valore nella finestra di debug come mostrato di seguito.


L'istruzione Imposta CA(j) =Niente all'interno del For. . . Next Loop cancella gli oggetti dell'array, uno per uno dalla memoria.

Passa l'array di oggetti di classe come parametro di funzione.

Possiamo passare Class Object Array come parametro a un programma, come abbiamo fatto con il tipo di dati definito dall'utente.

Creiamo una semplice Subroutine di Stampa, tagliando il Codice della Sezione di Stampa, del programma principale, e inserendolo nel nuovo programma.

Copia il codice della sub-routine ClassArray(), incollalo nello stesso modulo standard e cambia il nome come ClassArray2(), come mostrato di seguito.

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
 

Sezione codice ClassArray2 senza stampa.

Crea una nuova sotto-routine come indicato di seguito:

Public Sub ClassPrint(ByRef clsPrint() As ClsArea)
Dim L As Long, U As Long
Dim j As Long

End Sub

Evidenzia la sezione di stampa fino all'istruzione "Stop nel programma ClassArray2()", taglia l'area evidenziata del codice e incollala sotto Dim istruzioni in ClassPrint() Programma. Di seguito la versione modificata di entrambi i Codici:

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

Il programma 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

Verificare la presenza di modifiche al codice in entrambi i programmi e apportare correzioni, ove applicabile. Fare clic nel mezzo del codice ClassArray2() e premere F5 per eseguire il programma.

L'istruzione Call nel primo programma passa la CA Class Object Array come parametro ByRef alla subroutine ClassPrint(). Il programma stampa le proprietà dell'oggetto e chiama la funzione Area() per calcolare e restituire il valore da stampare.

La prossima settimana impareremo come utilizzare il nostro modulo Classe ClsArea come Classe Base per creare un nuovo Oggetto Classe VBA per calcolare il Volume di qualcosa.

  1. Modulo di classe MS-Access e VBA
  2. Matrici di oggetti di classe VBA MS-Access
  3. Classe base MS-Access e oggetti derivati
  4. Classe base VBA e oggetti derivati-2
  5. Classe base e varianti di oggetti derivati
  6. Recordset Ms-Access e modulo di classe
  7. Accedi al modulo di classe e alle classi wrapper
  8. Trasformazione della funzionalità della classe wrapper
  9. Nozioni di base su Ms-Access e Collection Object
  10. Modulo di classe Ms-Access e oggetto Collection
  11. Record di tabella nell'oggetto e nella forma della raccolta
  12. Nozioni di base sugli oggetti del dizionario
  13. Nozioni di base sugli oggetti del dizionario-2
  14. Ordinamento delle chiavi e degli elementi degli oggetti del dizionario
  15. Visualizza record dal dizionario al modulo
  16. Aggiungi oggetti classe come elementi del dizionario
  17. Aggiorna l'elemento del dizionario degli oggetti della classe nel modulo