VBA Tableaux dentelés (tableaux de tableaux)


Exemple

Tableaux dentelés PAS de tableaux multidimensionnels

Les tableaux de tableaux (Jagged Arrays) ne sont pas les mêmes que les tableaux multidimensionnels si vous les considérez visuellement. Les tableaux multidimensionnels ressemblent à des matrices (rectangulaires) avec un nombre défini d'éléments sur leurs dimensions (tableaux internes). calendrier avec les tableaux intérieurs ayant un nombre différent d'éléments, comme des jours dans des mois différents.

Bien que les baies Jagged soient assez compliquées et délicates à utiliser en raison de leurs niveaux imbriqués et qu’elles n’ont pas beaucoup de sécurité, mais elles sont très flexibles, elles vous permettent de manipuler assez facilement différents types de données et vous n'avez pas besoin de éléments vides.

Créer un tableau dentelé

Dans l'exemple ci-dessous, nous allons initialiser un tableau en escalier contenant deux tableaux l'un pour les noms et l'autre pour les nombres, puis en accédant à un élément de chaque

Dim OuterArray() As Variant
Dim Names() As Variant
Dim Numbers() As Variant
'arrays are declared variant so we can access attribute any data type to its elements

Names = Array("Person1", "Person2", "Person3")
Numbers = Array("001", "002", "003")

OuterArray = Array(Names, Numbers)
'Directly giving OuterArray an array containing both Names and Numbers arrays inside

Debug.Print OuterArray(0)(1)
Debug.Print OuterArray(1)(1)
'accessing elements inside the jagged by giving the coordenades of the element

Création dynamique et lecture de tableaux dentelés

Nous pouvons aussi être plus dynamiques dans notre approche de la construction des baies, imaginez que nous ayons une fiche de données client dans Excel et que nous souhaitons construire un tableau pour afficher les détails du client.

   Name -   Phone   -  Email  - Customer Number 
Person1 - 153486231 - 1@STACK - 001
Person2 - 153486242 - 2@STACK - 002
Person3 - 153486253 - 3@STACK - 003
Person4 - 153486264 - 4@STACK - 004
Person5 - 153486275 - 5@STACK - 005

Nous allons construire dynamiquement un tableau d'en-tête et un tableau Customers, l'en-tête contiendra les titres des colonnes et le tableau Customers contiendra les informations de chaque client / ligne en tant que tableaux.

Dim Headers As Variant
' headers array with the top section of the customer data sheet
    For c = 1 To 4
        If IsEmpty(Headers) Then
            ReDim Headers(0)
            Headers(0) = Cells(1, c).Value
        Else
            ReDim Preserve Headers(0 To UBound(Headers) + 1)
            Headers(UBound(Headers)) = Cells(1, c).Value
        End If
    Next
    
Dim Customers As Variant
'Customers array will contain arrays of customer values
Dim Customer_Values As Variant
'Customer_Values will be an array of the customer in its elements (Name-Phone-Email-CustNum)
    
    For r = 2 To 6
    'iterate through the customers/rows
        For c = 1 To 4
        'iterate through the values/columns
            
            'build array containing customer values
            If IsEmpty(Customer_Values) Then
                ReDim Customer_Values(0)
                Customer_Values(0) = Cells(r, c).Value
            ElseIf Customer_Values(0) = "" Then
                Customer_Values(0) = Cells(r, c).Value
            Else
                ReDim Preserve Customer_Values(0 To UBound(Customer_Values) + 1)
                Customer_Values(UBound(Customer_Values)) = Cells(r, c).Value
            End If
        Next
        
        'add customer_values array to Customers Array
        If IsEmpty(Customers) Then
            ReDim Customers(0)
            Customers(0) = Customer_Values
        Else
            ReDim Preserve Customers(0 To UBound(Customers) + 1)
            Customers(UBound(Customers)) = Customer_Values
        End If
        
        'reset Custumer_Values to rebuild a new array if needed
        ReDim Customer_Values(0)
    Next

    Dim Main_Array(0 To 1) As Variant
    'main array will contain both the Headers and Customers
    
    Main_Array(0) = Headers
    Main_Array(1) = Customers

To better understand the way to Dynamically construct a one dimensional array please check Dynamic Arrays (Array Resizing and Dynamic Handling) on the Arrays documentation.

Le résultat de l'extrait ci-dessus est un Jagged Array avec deux tableaux l'un de ces tableaux avec 4 éléments, 2 niveaux d'indentation, et l'autre étant lui-même un autre Jagged Array contenant 5 tableaux de 4 éléments chacun et 3 niveaux d'indentation, voir ci-dessous la structure:

Main_Array(0) - Headers - Array("Name","Phone","Email","Customer Number")
          (1) - Customers(0) - Array("Person1",153486231,"1@STACK",001)
                Customers(1) - Array("Person2",153486242,"2@STACK",002)
                ...
                Customers(4) - Array("Person5",153486275,"5@STACK",005)

Pour accéder aux informations, vous devez tenir compte de la structure de Jagged Array que vous créez. Dans l'exemple ci-dessus, vous pouvez voir que le Main Array contient un tableau d'en- Headers et un tableau de tableaux ( Customers ). accéder aux éléments.

Nous allons maintenant lire les informations du Main Array et imprimer chacune des informations du client en tant que Info Type: Info .

For n = 0 To UBound(Main_Array(1))
    'n to iterate from fisrt to last array in Main_Array(1)
    
    For j = 0 To UBound(Main_Array(1)(n))
        'j will iterate from first to last element in each array of Main_Array(1)
        
        Debug.Print Main_Array(0)(j) & ": " & Main_Array(1)(n)(j)
        'print Main_Array(0)(j) which is the header and Main_Array(0)(n)(j) which is the element in the customer array
        'we can call the header with j as the header array has the same structure as the customer array
    Next
Next

N'OUBLIEZ PAS de garder une trace de la structure de votre tableau Jagged, dans l'exemple ci-dessus pour accéder au nom d'un client en accédant à Main_Array -> Customers -> CustomerNumber -> Name qui "Person4" trois niveaux, pour renvoyer "Person4" vous aurez besoin. l'emplacement des clients dans Main_Array, puis l'emplacement du client quatre sur le tableau Customers Jagged et enfin l'emplacement de l'élément dont vous avez besoin, dans ce cas Main_Array(1)(3)(0) qui est Main_Array(Customers)(CustomerNumber)(Name) .