web-dev-qa-db-fra.com

retourner une ligne entière d'un tableau multidimensionnel dans VBA à un tableau unidimensionnel

Existe-t-il un moyen de retourner la valeur d'une ligne entière d'un tableau multidimensionnel à un tableau unidimensionnel dans VBA?

Quelque chose comme, arr_1dim = arr_2dim(3,:) est une expression matlab pour assigner la ligne 3 de arr_2dim tableau à arr_1dim en un seul tronçon.

Existe-t-il une méthode similaire moins coûteuse dans Excel VBA?

14
surya teja3

Non, il n'y a pas de fonction VBA pour obtenir une ligne ou une colonne. Vous pouvez seulement l'écrire vous-même ou jeter un œil ici:
http://www.cpearson.com/Excel/vbaarrays.htm

8
KekuSemau

Il existe un moyen simple d'obtenir une colonne ou une ligne d'un tableau à deux dimensions. Attribuez un zéro à la colonne pour obtenir la ligne, ou affectez un zéro à la ligne pour obtenir la colonne, ainsi:

Application.WorksheetFunction.Index(array, 0, columnyouwant) /* or */
Application.WorksheetFunction.Index(array, rowyouwant, 0)

Voir ici: Comment découper un tableau dans Excel VBA?

15
rxex

Voici ce que je fais pour imprimer facilement une dimension d'un tableau multidimensionnel.

Fondamentalement, je définis un nouveau tableau 1D et le remplis avec les valeurs du plus grand tableau.

Exemple (3D à 1D à imprimer):

Sub PrintItOut()
     ReDim big_array(10,5,n) as Variant, small_array(n) as Variant

     'use multidimensional array


     'place multi-dimensional values into the 1D array

     For i = 0 to n
            small_array(i) = big_array(0, 0, i)
     Next

     Range(Cells(1, 1), Cells(1, n + 1)) = small_array
End Sub

Voilà comment je le fais. J'espère que cela a du sens pour quiconque peut le lire. Je pense que c'est une façon très simple de le faire.

4
Elias

Matlab est une application tellement géniale pour travailler quand il s'agit de matrices, de tableaux, de vecteurs ...;) Mais Excel n'est pas si mal, il est également basé sur une matrice.

Donc, en supposant que vous ne voulez pas passer en boucle. Vous pouvez simplement ignorer votre multi-D array dans une feuille de calcul à l'aide de la fonction Transpose.

Tirez ensuite un Row à la taille de plage souhaitée dans un tableau à l'aide de Transpose.

Dim vArr as Variant

'--output multi-D array into worksheet
Sheets(2).Range("E2").Resize(UBound(multiDArray) + 1, _
UBound(Application.Transpose(multiDArray))) = multiDArray

'--pull back the row you need: we double transpose here to get 1D. Coz single transpose
'-- results in 2D array..
vArr = WorksheetFunctions.Transpose( _ 
       WorksheetFunctions.Transpose(Sheets(1).Range("A2:G2").Value)) 

Pour être absolument dynamique, vous pouvez resize votre range A2:G2 avec un nombre de lignes dynamique utilisant le multi-D array row upperbound :)

1
bonCodigo

Depuis que j'ai posé cette question par moi-même récemment, je veux partager mon code. J'ai écrit une fonction prête à l'emploi où vous pouvez choisir si vous voulez qu'une colonne ou une ligne soit extraite:

'*** Modul 1, define function ***

Function getOneLine(array2D As Variant, lineIndex As Integer, choice As String) As Variant
' returning one column or row of a 2D array
' array2D: 2 dimensional Array
' lineIndex: the index of column or row, starting at 0
' choice: "c" for column or "r" for row

    Dim i, n As Integer
    Dim oneLine As Variant


    If choice = "c" Then

    n = UBound(array2D, 2)
    ReDim oneLine(n)

        For i = 0 To n
            oneLine(i) = array2D(lineIndex, i)
        Next

    getOneLine = oneLine

    End If


    If choice = "r" Then

    n = UBound(array2D, 1)
    ReDim oneLine(n)

        For i = 0 To n
            oneLine(i) = array2D(i, lineIndex)
        Next

    getOneLine = oneLine

    End If

End Function


'*** Modul 2, call function ***

Sub SomeProcess()
    ' Creating a 3x2 Matrix
    ' (In VBA-arrays the column is indexed before the rows
    '  starting at 0. So 3x2 looks like 1x2)
    Dim SomeArray(1, 2) As Variant
        SomeArray(0, 0) = 1
        SomeArray(0, 1) = 2
        SomeArray(0, 2) = 3
        SomeArray(1, 0) = 4
        SomeArray(1, 1) = 5
        SomeArray(1, 2) = 6

    Dim oneLine As Variant
        oneLine = getOneLine(SomeArray, 1, "c")

    Debug.Print oneLine(2)
        ' prints 6

End Sub
0
crx