Variable Tableau : récupérer une plage multiple

clf

XLDnaute Nouveau
Bonjour,

J'essaye de charger une variable tableau à partir d'une plage multiple mais cela ne me prend que la 1ère plage.
Le code :

der = Range("a1000000").End(xlUp).Row - 3
Application.Union(Range("a4:b" & der + 3), Range("f4:f" & der + 3)).Copy
plage = Application.Union(Range("a4:a" & der + 3), Range("e4:e" & der + 3)).Address
ReDim tablox(der, 3)
tablox = Range(plage).Value

La copie avec Union fonctionne, mais le chargement du tableau ne prend que la colonne A.

Que manque t-il ? Est-ce possible de charger dans une variable tableau une plage multiple en une opération ?

Merci
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Variable Tableau : récupérer une plage multiple

Bonsoir à tous :),

Un autre essai :
VB:
Sub toto()
Dim der&, i&, tab1, tab2, t0
  t0 = Timer: der = Cells(Rows.Count, "a").End(xlUp).Row
  tab1 = Range("a4:b" & der).Value: tab2 = Range("f4:f" & der).Value
  der = UBound(tab1): ReDim Preserve tab1(1 To der, 1 To 3)
  For i = 1 To der: tab1(i, 3) = tab2(i, 1): Next i
  Erase tab2: t0 = Timer - t0: MsgBox Format(t0, "#,##0.0")
End Sub
 

job75

XLDnaute Barbatruc
Re : Variable Tableau : récupérer une plage multiple

Bonjour mapomme, le forum,

Ta solution est la plus simple s'il n'y a que 2 zones.

Et que la 2ème ne comporte qu'une colonne.

Mais le sujet - plage multiple - suppose que le nombre de zones peut-être quelconque...

Bonne journée.
 

Dranreb

XLDnaute Barbatruc
Re : Variable Tableau : récupérer une plage multiple

Bonjour.
La question qui me dérange depuis le début c'est pourquoi vouloir à tout prix un tableau à 3 colonnes ?
Si c'est parce qu'il le faut en tant qu'image d'un résultat à reproduire, eh bien ma fois chargez toute la UsedRange dans un tableau d'entrée et n'en transférez vers le tableau de sortie que les éléments des colonnes dont vous avez besoin.
S'il faut pouvoir combiner plages multizones de colonnes disjointes venant de feuilles diverse et tableaux de Variant (tous ayant le même nombre de lignes) vous pouvez utiliser cette pièce de mon module MDictionnarbo :
VB:
Rem. —— Chargement des paramètres en Tableau. Plages multizones et tableaux de variants supportés. Ces fonctions sont concues pour mettre en un tableau
'       unique de Variant des valeurs de plages exactement comme le fait DictionnArbo mais pour d'autres usages, ou non, depuis VBA, à partir
'       de paramètres à analyser soit spécifiés par la procédure appelante soit simplement transmis par elle selon un ParamArray récupéré.
Public Sub CréerTabSpécif(TabRésu() As Variant, ParamArray Param() As Variant):  CréerTableau TabRésu, Param: End Sub
Public Sub CréerTabDicoSpécif(ParamArray Param() As Variant):                    CréerTableau TabDico, Param: End Sub
Public Sub CréerTabDico(ByVal Param As Variant):                                 CréerTableau TabDico, Param: End Sub
Public Function TabSpéc(ByVal Param As Variant) As Variant():                    CréerTableau TabSpéc, Param: End Function
Public Sub CréerTableau(TabRésu() As Variant, ByVal Param As Variant)
Dim P As Long, Z As Long, VZon() As Variant, C As Long, CFnA As Long
LMax = 0
For P = 0 To UBound(Param)
   If TypeName(Param(P)) = "Range" Then
      For Z = 1 To Param(P).Areas.Count
         If LMax = 0 Then
            TabRésu = Param(P).Areas(1).Value: LMax = UBound(TabRésu, 1): CMax = UBound(TabRésu, 2)
         Else
            VZon = Param(P).Areas(Z).Value
            If UBound(VZon, 1) <> LMax Then MsgBox "Paramètre " & P & ", zone " & Z & ": " & UBound(VZon, 1) & " lignes au lieu de " & LMax _
               & vbLf & "==> Débogage obligatoire", vbCritical, "Fabriquer tableau": Stop: Exit Sub ' Déroulez en pas à pas
            ReDim Preserve TabRésu(1 To LMax, 1 To CMax + UBound(VZon, 2)) As Variant
            For C = 1 To UBound(VZon, 2)
               CMax = CMax + 1
               For L = 1 To LMax: TabRésu(L, CMax) = VZon(L, C): Next L
               Next C
            End If
         Next Z
   ElseIf Not IsArray(Param(P)) Then
      On Error Resume Next: CFnA = Param(P): If Err Then CFnA = CMax
      On Error GoTo 0
   ElseIf LMax = 0 Then
      TabRésu = Param(P): LMax = UBound(TabRésu, 1): CMax = UBound(TabRésu, 2)
   ElseIf UBound(Param(P), 1) <> LMax Then
      MsgBox "Paramètre " & P & ": " & UBound(Param(P), 1) & " lignes au lieu de " & LMax _
         & vbLf & "==> Débogage obligatoire", vbCritical, "Fabriquer tableau": Stop: Exit Sub ' Déroulez en pas à pas
   Else
      ReDim Preserve TabRésu(1 To LMax, 1 To CMax + UBound(Param(P), 2)) As Variant
      For C = 1 To UBound(Param(P), 2)
         CMax = CMax + 1
         For L = 1 To LMax: TabRésu(L, CMax) = Param(P)(L, C): Next L
         Next C
      End If
   Next P
If CFnA <> 0 Then CMax = CFnA
End Sub
 
Dernière édition:

Paf

XLDnaute Barbatruc
Re : Variable Tableau : récupérer une plage multiple

Re tous

@ gosselien:
je viens de tester ton code mais il copie bien les colonnes A et B en M et N mais pas la colonne F ...

normal, (même si je n'ai pas répondu strictement à la demande) puisqu'avec
tablox = Application.Index(.Value, Evaluate("row(1:" & der & ")"), Array(1, 2, 5)) 'on prend les colonnes 1,2 et 5
on prend les colonnes 1 (A), 2 (B) et 5 (E)

il aurait fallu
tablox = Application.Index(.Value, Evaluate("row(1:" & der & ")"), Array(1, 2, 6)) 'on prend les colonnes 1,2 et 6



Avec tablox = Application.Index(.Value, Evaluate("row(1:" & der & ")"), Array(1, 2, 3, 4, 5, 6)), on récupère la totalité des 6 colonnes de la plage de départ, ce qui revient à écrire :
Code:
tablox = Range("a4:f" & der)

L'intérêt de l'instruction c'est que l'on peut 'récupérer' les colonnes que l'on veut dans l'ordre que l'on veut :

tablox = Application.Index(.Value, Evaluate("row(1:" & der & ")"), Array(6, 2, 3))

par exemple, permet d'obtenir un tableau contenant les colonnes F,B et C dans cet ordre

Mais de toutes façons, pas de nouvelles de clf depuis 3 jours ....

A+
 

eriiic

XLDnaute Barbatruc
Re : Variable Tableau : récupérer une plage multiple

Bonjour,

Une idée pour dépasser les 65536 lignes :
Code:
Sub test3()
    Dim shTmp As Worksheet, datas
    Application.ScreenUpdating = False
    Intersect([A1].CurrentRegion.EntireRow, Range("A:A,B:B,E:E")).Copy
    Set shTmp = Sheets.Add
    shTmp.[A1].PasteSpecial Paste:=xlPasteValues
    datas = shTmp.[A1].CurrentRegion
    Application.DisplayAlerts = False
    shTmp.Delete
    Application.DisplayAlerts = True
End Sub
Ca reste relativement rapide, 0.7s pour 100000 lignes.


eric
 

Pat78

XLDnaute Nouveau
Re : Variable Tableau : récupérer une plage multiple

Bonjour,

Merci pour ce fil que je suis depuis ces derniers jours.
Petite question que je ne sais résoudre en utilisant l'array.

Supposons qu'il soit possible d'identifier le nombre de colonnes à récupérer, et le code n° de ces mêmes colonnes définies dans un range de la feuille, ou via une inputbox, ou via le balayage des en-têtes etc... , quelle serait alors la méthode pour charger dynamiquement ceci dans l'array, à l'image de Array(6,2,3).
Merci de vos lumières.
 

klin89

XLDnaute Accro
Re : Variable Tableau : récupérer une plage multiple

Bonsoir à tous, :)

Ai-je compris :p
Via une InputBox :
VB:
Sub Array_Colonnes()
Dim x, i As Byte
    x = Split(InputBox(prompt:="Saisir les numéros de colonnes"), ",")
    For i = LBound(x) To UBound(x)
        MsgBox x(i)
    Next i
End Sub
Le code de Jacques réajusté pour la circonstance :
VB:
Sub FiltreColonnes()
    a = [A4:F10].Value
    x = Split(InputBox(prompt:="Saisir les numéros de colonnes"), ",")
    b = FiltreArrayCol(a, x)    ' on prend les colonnes 1, 2,6
    [m1].Resize(UBound(b), UBound(b, 2)) = b
End Sub

Function FiltreArrayCol(tableau, ColResult)
  Dim b()
  ReDim b(LBound(tableau) To UBound(tableau), 1 To UBound(ColResult) + 1 - LBound(ColResult))
  For i = LBound(tableau, 1) To UBound(tableau, 1)
    For c = LBound(ColResult) To UBound(ColResult)
      col = ColResult(c)
      b(i, c + 1) = tableau(i, col)
    Next c
  Next i
  FiltreArrayCol = b
End Function
klin89
 
Dernière édition:

Pat78

XLDnaute Nouveau
Re : Variable Tableau : récupérer une plage multiple

Merci klin89,

Mon pb n'est pas l'identification des colonnes dans une variable (via inputbox ou autre), mais leur retranscription dans cette ligne :
tablox = Application.Index(.Value, Evaluate("row(1:" & der & ")"), Array(1, 2, 6)), au niveau de l'array(x,y,z,etc,etc,etc...)

Merci
 

klin89

XLDnaute Accro
Re : Variable Tableau : récupérer une plage multiple

Re à tous,

Pour la syntaxe, j'ai repris la solution de Jacques, le fichier du post #11
VB:
Sub FiltreColonnes()
    a = [A4:F10].Value
    txt = "1,2,6"
    x = Evaluate("{" & txt & "}")
    'x = Array(1, 2, 6)
    'b = FiltreArrayCol(a, Array(1, 2, 6))    ' on prend les colonnes 1, 2,6
    b = FiltreArrayCol(a, x)    ' on prend les colonnes 1, 2,6
    [m1].Resize(UBound(b), UBound(b, 2)) = b
End Sub

Function FiltreArrayCol(tableau, ColResult)
  Dim b()
  ReDim b(LBound(tableau) To UBound(tableau), 1 To UBound(ColResult) - LBound(ColResult) + 1)
  For i = LBound(tableau, 1) To UBound(tableau, 1)
    For c = LBound(ColResult) To UBound(ColResult)
      col = ColResult(c)
      b(i, c) = tableau(i, col)
    Next c
  Next i
  FiltreArrayCol = b
End Function
Cela fonctionne comme ceci.
klin89
 
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Variable Tableau : récupérer une plage multiple

Bonjour à tous :),

Pour le fun, un essai avec possibilité d'indiquer les colonnes à prendre en compte ainsi que leur ordre de prise en compte.


  • les colonnes sont obligatoirement désignées par des lettres
  • les espaces sont tolérés
  • les groupes de colonnes sont séparés par une virgule ou un point-virgule
  • un groupe de colonnes est indiqué par le séparateur : comme par exemple A:B
  • si on indique les colonnes C:A alors on prendra dans le tableau final res d'abord la colonne C puis la colonne B et enfin la colonne A
  • ex : e, b:a ; c:d => on recopiera les colonnes E, B, A, C, D avec cet ordre dans le tableau res

Comme mon PC date de la dernière guerre, j'ai des dépassements de capacité (sans message d’information) pour le tableau vba res, quand le nombre de lignes multiplié par le nombre de colonnes devient grand (de l'ordre de 600 000 éléments).
J'ai adjoint une petite vérification lors de l'affichage du tableau pour les détecter. Bizarre qu'Excel ou le PC ne plante pas (ce qui ne signifie pas qu'on n'écrit pas dans des zones mémoire où on n'aurait pas dû !). Je songe sérieusement à le renouveler, mon vieux bouzin chéri.

nota : en cas de nombreux éléments, les temps d'initialisation et d'affichage (après l'indication du temps de construction du tableau res) peuvent être assez longs.
 

Pièces jointes

  • CLF-Variable Tableau récupérer une plage multiple-v2.xlsm
    28.1 KB · Affichages: 41
Dernière édition:

Pat78

XLDnaute Nouveau
Re : Variable Tableau : récupérer une plage multiple

Merci Dranreb, Klin89 & Mapomme,

Testées avec peu de données, vos trois solutions me conviennent. ...un petit faible pour celle de mapomme.:)
Elles ont peut être plus ou moins de souplesse d'utilisation pour un fichier de plus de 150 col sur 10 000 lignes, ...heureusement quelques colonnes seulement sont retenues mais toutes les lignes sont à importer.

Je teste demain.
En tous les cas merci à tous.
 

Paf

XLDnaute Barbatruc
Re : Variable Tableau : récupérer une plage multiple

re et bonjour à tous

@ Pat78
Merci klin89,

Mon pb n'est pas l'identification des colonnes dans une variable (via inputbox ou autre), mais leur retranscription dans cette ligne :
tablox = Application.Index(.Value, Evaluate("row(1:" & der & ")"), Array(1, 2, 6)), au niveau de l'array(x,y,z,etc,etc,etc...)

Merci

une solution :

Code:
a = 4
b = 2
c = 5

TabCol = Split(a & " " & b & " " & c)
....
...
tablox = Application.Index(.Value, Evaluate("row(1:" & der & ")"), TabCol)
...


A+
 

Pat78

XLDnaute Nouveau
Re : Variable Tableau : récupérer une plage multiple

Bonjour Eriiic, Paf

Désolé Pat78 = Pat78 sur Xld seulement.

Merci Paf, j'avais tenté dans ce sens avec Array(TabCol) où TabCol valait 1,2,6. La solution semble encore plus simple !

Merci.
 

Discussions similaires

Statistiques des forums

Discussions
312 836
Messages
2 092 642
Membres
105 476
dernier inscrit
hilt