web-dev-qa-db-fra.com

Création d'un tableau à partir d'une plage dans VBA

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.

25
basaltanglia

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.

39
vacip

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

Lecture bonus

  • Range.Value : Retourne ou définit une valeur Variant qui représente la valeur de la plage spécifiée.
  • Range.Value2 : La seule différence entre cette propriété et la propriété Value est que la propriété Value2 n'utilise pas les types de données Currency et Date.
17
brettdj

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:

enter image description here

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:

enter image description here

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:

enter image description here

16
Vityata

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
1
Paolo