Microsoft 365 Initialisation d'une variable tableau à partir d'une plage de cellules

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

BenHarber

XLDnaute Occasionnel
Bonjour le Forum,
Je crois avoir déjà lu (mais sur quel site ? 🙄) que l'initialisation d'une variable tableau avec les commandes suivantes...
Dim DataRange As Variant
DataRange = Range("maPlage").Value
...ne pouvait pas se faire avec une plage de cellules discontinues : Vous confirmez ?

Ci-joint un petit exemple avec 2 tests :
1) une plage de cellules continues nommée "CellsContinues" : pas de pb pour passer en revue l'intégralité des valeurs de ma variable-tableau,
2) une plage de cellules discontinues nommée "CellsDiscontinues" : ma variable-tableau n'a été initialisée que sur le 1er groupe de cellules continues de ma plage discontinue.

Dans le second cas, avez-vous une suggestion d'initialisation SIMPLE pour CellsDiscontinues ?

Merci d'avance pour vos suggestions et idées qui sont toujours pour moi source d'inspiration !
 

Pièces jointes

Bonjour BenHarper,
Vous confirmez ?
Oui.

Un essai avec :
VB:
Sub Essai()
Set Plage = Range("CellsDiscontinues")
N = Plage.Count             ' Nb éléments dans CellsDiscontinues
ReDim Tablo(1 To N): i = 1  ' Dim tablo avec nbre éléments
For Each C In Plage         ' On récupère les valeurs
    Tablo(i) = C.Value
    i = i + 1
Next C
' Pour affichage
For i = 1 To UBound(Tablo)
    Chaine = Chaine & Chr(10) & Tablo(i)
Next i
MsgBox Chaine
End Sub
 

Pièces jointes

Bonjour à tous,

Le principe : parcourir les plages inclus dans le range à parcourir puis pour chaque plage lister les valeurs de cellules.

Deux codes parmi tant d'autres possibles :
VB:
Sub testZoneDiscontinue()
Dim ia&, t, i&, j&
   For ia = 1 To Range("CellsDiscontinues").Areas.Count
      t = Range("CellsDiscontinues").Areas(ia)
      For i = 1 To UBound(t): For j = 1 To UBound(t, 2): MsgBox t(i, j): Next j, i
   Next ia
End Sub

VB:
Sub testZoneDiscontinueBis()
Dim x, y
   For Each x In Range("CellsDiscontinues").Areas: For Each y In x: MsgBox y: Next y, x
End Sub
 
Bonjour BenHarber, le forum,

Un tableau VBA doit toujours être créé à partir d'une plage de cellules jointives :
VB:
Dim tablo(), i As Long, j As Integer, a As Range

Sub testZoneContinue()
tablo = Range("CellsContinues").Resize(Range("CellsContinues").Rows.Count + 1) 'tableau, plus rapide, au moins 2 ééléments
For i = 1 To UBound(tablo, 1) - 1
    For j = 1 To UBound(tablo, 2)
        MsgBox tablo(i, j)
Next j, i
End Sub

Sub testZoneDiscontinue()
For Each a In Range("CellsDiscontinues").Areas
    tablo = a.Resize(a.Rows.Count + 1) 'tableau, plus rapide, au moins 2 ééléments
    For i = 1 To UBound(tablo, 1) - 1
        For j = 1 To UBound(tablo, 2)
            MsgBox tablo(i, j)
Next j, i, a
End Sub
A+
 

Pièces jointes

Salut Mapomme,
En fait comme c'était un fichier test, j'ai pensé que BenHarper voulait à terme récupéré les données dans un tableau, pour la suite.
Apparemment je me suis planté il voulait juste l'affichage des valeurs une par une dans un msgbox.
 
Bonjour.
VB:
Sub TestZoneDiscontinue()
   Dim TVals(), Zon As Range, A As Integer, L As Long, C As Integer
   With Range("CellsDiscontinues")
      ReDim TVals(1 To .Areas.Count)
      For Each Zon In .Areas
         A = A + 1: TVals(A) = Zon.Value
         Next Zon
      End With
   For A = 1 To UBound(TVals)
      For L = 1 To UBound(TVals(A), 1)
         For C = 1 To UBound(TVals(A), 2)
            MsgBox TVals(A)(L, C)
            Next C, L, A
   End Sub
 
Hello

@BenHarber : tu ne te souviens plus où tu as vu ca??
n'as tu pas déjà eu la réponse ici??

 
VB:
Sub TestZoneDiscontinue()
   Dim TVals(), Zon As Range, A As Integer, L As Long, C As Integer
   With Range("CellsDiscontinues")
      ReDim TVals(1 To .Areas.Count)
      For Each Zon In .Areas
         A = A + 1: TVals(A) = Zon.Value
         Next Zon
      End With
   For A = 1 To UBound(TVals)
      For L = 1 To UBound(TVals(A), 1)
         For C = 1 To UBound(TVals(A), 2)
            MsgBox TVals(A)(L, C)
            Next C, L, A
   End Sub
Bernard il y a bug si l'une des Areas est constituée d'une seule cellule.
 
Si on tient à ranger les valeurs dans un tableau 2D :
VB:
Sub TestZoneDiscontinue()
   Dim TVals(), Zon As Range, A As Integer, LMax As Long, CMax As Integer, TDon(), LD As Long, LR As Long, C As Integer
   With Range("CellsDiscontinues")
      For Each Zon In .Areas
         LMax = LMax + Zon.Rows.Count
         C = Zon.Columns.Count: If CMax < C Then CMax = C
         Next Zon
      ReDim TVals(1 To LMax, 1 To CMax)
      For Each Zon In .Areas
         If Zon.Rows.Count = 1 And Zon.Columns.Count = 1 Then
            LR = LR + 1: TVals(LR, 1) = Zon.Value
         Else
            TDon = Zon.Value
            For LD = 1 To UBound(TDon, 1)
               LR = LR + 1
               For C = 1 To UBound(TDon, 2)
                  TVals(LR, C) = TDon(LD, C)
                  Next C, LD
            End If
         Next Zon
      End With
   For LR = 1 To UBound(TVals, 1)
      For C = 1 To UBound(TVals, 2)
         If Not IsEmpty(TVals(LR, C)) Then MsgBox TVals(LR, C)
         Next C, LR
   End Sub
S'il risque d'y avoir des cellules isolées il suffit d'en récupérer les valeurs dans un élément de tableau au lieu d'un tableau.
 
Re,

Suite à la remarque de @job75 (que je salue 😉) concernant les plages composées d'une unique cellule, je modifie le code de Sub testZoneDiscontinue() pour celui-ci :
VB:
Sub testZoneDiscontinue()
Dim ia&, t, i&, j&
   For ia = 1 To Range("CellsDiscontinues").Areas.Count
      t = Range("CellsDiscontinues").Areas(ia)
      ' si t n'est pas un tableau alors la plage n'est composée que d'une seule cellule
      ' => on recrée un tableau t à 2 dimensions de base 1 contenant le seul élément de la plage
      If Not IsArray(t) Then ReDim t(1 To 1, 1 To 1): t(1, 1) = Range("CellsDiscontinues").Areas(ia)
      For i = 1 To UBound(t): For j = 1 To UBound(t, 2): MsgBox t(i, j): Next j, i
   Next ia
End Sub
 
Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
2
Affichages
515
Compte Supprimé 979
C
Retour