Stocker une plage de cellule dans un tableau

Bonjour,

Je souhaite stocker les valeurs d'une plage de cellule dans un tableau. Pourquoi ce code ne fonctionne pas ?

Sub percentile()

Dim donnees As Variant

donnees = Range("C20:C24").Value

Debug.Print UBound(donnees)
Debug.Print donnees(1)

End Sub

Le premier Debug.Print m'indique bien que UBound = 5 mais je n'arrive pas à en extraire les données... ("L'indice n'appartient pas à la sélection")

Merci !

Bonjour,

C'est un tableau vertical (à 2 dimensions)

Bonjour as tous,

En complément de la réponse de Galopin :

C'est plutôt comme cela que vous devez opérer

Sub Test101()
    Dim t As Variant
    t = Range("Tableau5").Value ' // Renvoie toujours un tableau à deux dimensions
    Debug.Print UBound(t)
    Debug.Print t(2, 1)
End Sub

Le résultat en image :

000068

Merci !

Autre question, quelle différence cela fait-il si je renseigne :

donnees = Range("C20:C24").Cells au lieu de .value ?

En cherchant, j'ai vu que certains basculaient ainsi les plages de données dans des tableaux.

Bonsoir,

Autre question, quelle différence cela fait-il si je renseigne : donnees = Range("C20:C24").Cells au lieu de .value ?

Que nous dis Crosoft à ce sujet ?

Propriété Worksheet.Cells : Renvoie un objet Range qui représente toutes les cellules de la feuille de calcul (et pas seulement les cellules actuellement utilisées).

Objet Range (Excel) : Représente une cellule, une ligne, une colonne, une sélection de cellules contenant un ou plusieurs blocs de cellules contigus ou une plage 3D.
Le membre par défaut de Range transfère les appels sans paramètres à la propriété Value et les appels avec paramètres au membre Item.

Donc si l'on suit le raisonnement, Cells est un objet Range qui transfère les appels sans paramètres à la propriété Value. Donc l'un comme l'autre renverra un tableau à deux dimensions. Exemple :

Sub Test101()
    Dim t As Variant
    t = Range("Tableau1")
    Debug.Print "With t = Range(""Tableau1"")"
    Debug.Print UBound(t)
    Debug.Print t(2, 1)
    Set t = Nothing

    t = Range("Tableau1").Cells
    Debug.Print "With t = Range(""Tableau1"").Cells"
    Debug.Print UBound(t)
    Debug.Print t(2, 1)
    Set t = Nothing    

    t = Range("Tableau1").Value
    Debug.Print "With t = Range(""Tableau1"").Value"
    Debug.Print UBound(t)
    Debug.Print t(2, 1)
End Sub

Pour le résultat :

000069

Maintenant, je le dis toujours mieux vaut être explicite avec Excel donc dans le meilleur des monde, on utilisera Feuil1.Range("A1:A100").Value et cela même si cela nous coûte en écriture.

Bonne programmation...

Bonjour à tous,

La valeur par défaut de l'objet range est "Value". Donc t = Range("a1:a5") est équivalent à t = Range("a1:a5").Value

Certains disent que cette manière de lire des données d'une plage conduit toujours à un tableau (ou plutôt à un Array) :

  • de base 1 (chaque indice commence toujours à 1)
  • à deux dimensions (même si la plage n'a qu'une seule colonne ou une seule ligne)

En effet t = Range("a3:a5") donnera un tableau t avec 3 éléments accessibles par t(1,1), t(2,1) et t(3,1)

Sauf dans un cas => si la plage n'a qu'un seul élément (plage réduite à une seule cellule). Dans ce cas, t= range("a1") ne renvoie pas un tableau mais une simple variable contenant la valeur de A1. Après avoir lu t, on parcourt souvent t avec des boucles sur les lignes et/ou colonnes. Dans ce cas (avec un seul élément) la boucle provoquera une erreur. En effet t n'étant pas un tableau, on ne peut pas le parcourir avec des indices (que t n'a pas). On ne pourra pas non plus le parcourir avec une boucle For Each x in t.

Pour pallier cela, on peut utiliser le code suivant - à l'issue de ce code t sera toujours un tableau (ou array) :

Sub LecturePlage()        ' si plage a un seul élément ou bien plusieurs, ça fonctionnera
Dim t, aux
   t = Range(Plage)     
   If Not IsArray(t) Then aux = t: ReDim t(1 To 1, 1 To 1): t(1, 1) = aux
End Sub

Merci beaucoup pour vos retours !

Bonjour à tous,

@mafraise, @matteo,

Cela pourrait même être une fonction :

Public Function GetRangeValues(ByVal Plage As Excel.Range) As Variant
    Dim Values As Variant
    Values = Plage.Value

    If Not IsArray(Values) Then
        Dim tempValue As Variant
        tempValue = Values
        ReDim Values(1 To 1, 1 To 1)
        Values(1, 1) = tempValue
    End If
    GetRangeValues = Values
End Function

Pour le résultat :

000074

Bonne programmation.

Rechercher des sujets similaires à "stocker plage tableau"