J'ai un problème apparemment fondamental, mais je ne trouve aucune ressource pour le résoudre.
En termes simples, je veux juste charger le contenu d'une plage de cellules (toutes une colonne) dans un tableau.
Je suis capable d'accomplir cela au moyen de
DirArray = Array(Range("A1"), Range("A2"))
Mais pour une raison quelconque, je ne peux pas créer le tableau quand il est exprimé de cette façon:
DirArray = Array(Range("A1:A2"))
Ma vraie portée est beaucoup plus longue (et peut varier en longueur), donc je ne veux pas avoir à énumérer individuellement les cellules de cette façon. Quelqu'un peut-il me dire comment charger correctement une plage entière dans un tableau?
Avec ce dernier code:
MsgBox UBound(DirArray, 1)
Et
MsgBox UBound(DirArray)
Renvoie 0, alors qu'avec l'ancien ils renvoient 1.
Il suffit de définir la variable en tant que variante et de la rendre égale:
Dim DirArray As Variant
DirArray = Range("a1:a5").Value
Pas besoin de la commande Array.
Utiliser Value2
donne un avantage de performance. Selon blog de Charles Williams
Range.Value2 fonctionne de la même manière que Range.Value, sauf qu'il ne vérifie pas le format de la cellule et ne le convertit pas en date ni en devise. Et c’est probablement pourquoi il est plus rapide que .Value lors de la récupération de nombres.
Alors
DirArray = [a1:a5].Value2
Si nous le faisons comme ça:
Dim myArr as Variant
myArr = Range("A1:A10")
le nouveau tableau aura deux dimensions. Ce qui n'est pas toujours confortable avec:
Pour éviter les deux dimensions, il est possible d'utiliser la fonction Excel intégrée "Transposer" lors de la création d'une seule colonne dans un tableau. Avec elle, les données deviennent dans une dimension:
Si nous avons les données dans une rangée, une seule transposition ne fera pas le travail. Nous devons utiliser la fonction Transpose deux fois:
En plus des solutions proposées, et si vous avez une plage allant de 1D à 1D, je préfère le traiter via une fonction comme ci-dessous. La raison est simple: si, pour une raison quelconque, votre plage est réduite à 1 plage d'éléments, pour autant que je connaisse la commande Range (), la valeur ne renverra pas un tableau variant mais simplement une variante et vous ne pourrez pas affecter de variante. variable à un tableau variant (précédemment déclaré).
Je devais convertir une plage de taille variable en un tableau double, et lorsque la plage était de 1 taille de cellule, je ne pouvais pas utiliser une construction telle que range (). Value, de sorte que je procédais avec une fonction comme ci-dessous.
Public Function Rng2Array(inputRange As Range) As Double()
Dim out() As Double
ReDim out(inputRange.Columns.Count - 1)
Dim cell As Range
Dim i As Long
For i = 0 To inputRange.Columns.Count - 1
out(i) = inputRange(1, i + 1) 'loop over a range "row"
Next
Rng2Array = out
End Function