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?
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
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)
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.
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
:)
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