Mettre colonnes dans tableaux variables
Bonjour,
Je viens vers vous cette fois après avoir épluché les discussions sur les tableaux variables, mais je n'ai pas trouvé mon bonheur. C'est la première fois que je souhaite utiliser les tableaux variables et j'avoue que j'ai du mal à en comprendre le fonctionnement.
Mon problème est le suivant :
J'ai joint un fichier Excel qui permet d'illustrer mon besoin. Je cherche à pouvoir mettre chaque colonne dans une variable, un peu comme si je souhaitais mettre la valeur contenue dans une cellule dans une variable déclarée.
Donc j'aimerai pouvoir mettre la colonne A dans le tableau TabA, la colonne B dans le tableau TabB, etc. Dans mon exemple, il n'y a que 7 colonnes remplies mais je souhaite pouvoir stocker au maximum 100 colonnes dans 100 tableaux.
Le but final étant : je souhaite que lorsque ces colonnes sont stockées, je puisse ensuite les trier comme je le souhaite, mais ça normalement je devrait m'en sortir. Mon problème majeur est bien le stockage de chaque colonne dans des variables.
J'espère que j'ai réussi à être clair, et que c'est faisable parce que je ne me rend pas bien compte...
Hello,
Sois je n'ai pas compris ton problème (très probable) soit cette solution ultra simple peut te convenir :
1 - clic sur n'importe laquelle cellule de ton tableau
2 - Ctrl + A
3 - Onglet Excel ("Insertion")
4 - "Insertion" --> Tableau
5 - Cochez "Mon tableau comporte des entêtes) puis Ok
Tu récupères un tableau structuré Excel sur lequel tu peux directement trier (avec la petite flèche sous chaque colonne)
Pour faire un tri plus compliqué (comme par exemple pression plus grand ou plus petit puis la vitesse..)
Clic droit puis tri personnalisé et laisse toi guider.
J'espère t'avoir aidé,
Excelement,
Adrien
Bonjour AlienFall,
Merci beaucoup pour ton aide, mais ce n'est pas ce que j'entendais par "tableau".
C'est plutôt dans le sens "variable tableau" que l'on déclare dans un code VBA. Il s'agit d'écrire une/des boucle(s) qui met/mettent la colonne A dans une variable nommée TabA, la colonne B dans une variable nommée TabB, etc. De cette façon, chaque colonne comprenant l'entête et les données sera stockée dans une variable déclarée, et ensuite à moi d'écrire les bouts de programme VBA qui appellent telle ou telle variable.
Bonjour le fil, bonjour le forum,
Une proposition VBA. Le code va créer un tableau de plages où le numéro correspond à la colonne.
TP(1) = plage de la première colonne
TP(2) = plage de la seconde colonne
etc...
Le code :
Sub Macro1()
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim TV As Variant 'déclare la variable TV (Tanleau des Valeurs)
Dim NL As Integer 'déclare la variable NL (Nombre de Lignes)
Dim NC As Integer 'déclare la variable NC (Nombre de Colonnes)
Dim I As Integer 'déclare la variable I (Incrément)
Dim K As Integer 'déclare la variable K (incrément)
Dim TP() As Range 'déclare la variable TP (Tableau des Plages)
Set O = Worksheets("Feuil1") 'définit l'onglet O
TV = O.Range("A1").CurrentRegion 'définit le tableau des valeurs TV
NL = UBound(TV, 1) 'définit le nombre de lignes NL du tableau ds valeurs TV
NC = UBound(TV, 2) 'définit le nombre de colonnes NC du tableau ds valeurs TV
K = 1 'initialise la variable K
For I = 1 To NC 'boucle dut toutes les colonnes I du tableau ds valeurs TV
ReDim Preserve TP(K) 'redimensionne le tabpleau des plages TP
Set TP(K) = O.Range(O.Cells(1, I), O.Cells(NL, I)) 'définit la plage indéxée K
K = K + 1 'incrémente L
Next I 'prochaine colonne de la boucle
MsgBox TP(5).Address 'juste pour l'exemple
TP(2).Select 'juste pour l'exemple
End SubSalut ThauThème,
Purée ça à l'air de bien fonctionner ! ^^ Merci à toi !
Et petite question additionnelle : comment dois-je m'y prendre pour copier/coller une variable tableau dans une cellule ? En gros pour "déplacer" la colonne contenue dans la variable TP(1) par exemple.
ThauThème,
C'est bon j'y suis arrivé. Merci beaucoup pour ton aide, je devrai bien me démerder avec ça maintenant !
Re,
TP(1).Copy Range("L1")Pour copier la première plage dans la cellule L1...
Chaque plage indexée TP(x) est à traiter exactement comme n'importe quelle plage normale, avec toutes les fonctions que tu utilises habituellement avec les plages.
En revanche je viens de me rendre compte d'une chose : les variables TP sont des plages, c'est à dire qu'elles ne sont pas enregistrées.
Par exemple, si je souhaite faire cela à la fin du programme :
TP(3).Copy
Range("A1").Select
ActiveSheet.Paste
TP(1).Copy
Range("C1").Select
ActiveSheet.Paste(en gros inverser ces 2 colonnes)
cela ne fonctionne pas parce que la colonne A est d'abord modifiée, et la variable TP(1) fait donc référence aux nouvelles valeurs contenues dans celle-ci. Chaque colonne n'est donc pas "enregistrée" dans une variable. Les variables TP font référence à des plages.
Re,
Oui tu as raison mais tu n'avais pas demandé des plages nommées !...
Le nouveau code va les créer et les nommer. Tu pourras les appeler de deux manières Range("Tab_1") ou TP(1) et désormais, même si tu déplaces une plage, sa variable indexée ne fait plus référence à une plage de cellules mais à la plage nommée correspondante.
Le code:
Sub Macro1()
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim TV As Variant 'déclare la variable TV (Tanleau des Valeurs)
Dim NL As Integer 'déclare la variable NL (Nombre de Lignes)
Dim NC As Integer 'déclare la variable NC (Nombre de Colonnes)
Dim I As Integer 'déclare la variable I (Incrément)
Dim K As Integer 'déclare la variable K (incrément)
Dim TP() As Range
Set O = Worksheets("Feuil1") 'définit l'onglet O
TV = O.Range("A1").CurrentRegion 'définit le tableau des valeurs TV
NL = UBound(TV, 1) 'définit le nombre de lignes NL du tableau ds valeurs TV
NC = UBound(TV, 2) 'définit le nombre de colonnes NC du tableau ds valeurs TV
K = 1 'initialise la variable K
For I = 1 To NC 'boucle dut toutes les colonnes I du tableau ds valeurs TV
O.Range(O.Cells(1, I), O.Cells(NL, I)).Name = "Tab_" & I 'nomme la plage
ReDim Preserve TP(K) 'redimensionne le tableau des plage
Set TP(K) = Range("Tab_" & I) 'définit la variable indexée TP(K)
K = K + 1 'incrémente K
Next I 'prochaine colonne de la boucle
End SubBonjour ThauThème,
Et merci une nouvelle fois pour ta réponse et ton efficacité ! Cela va grandement m'aider pour l'utilisation de plages nommées !
Il ne manque pas grand chose je pense mais voici le bout de code que j'ai mis à la suite de ton programme :
Sub Macro1()
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim TV As Variant 'déclare la variable TV (Tanleau des Valeurs)
Dim NL As Integer 'déclare la variable NL (Nombre de Lignes)
Dim NC As Integer 'déclare la variable NC (Nombre de Colonnes)
Dim I As Integer 'déclare la variable I (Incrément)
Dim K As Integer 'déclare la variable K (incrément)
Dim TP() As Range
Set O = Worksheets("Feuil1") 'définit l'onglet O
TV = O.Range("A1").CurrentRegion 'définit le tableau des valeurs TV
NL = UBound(TV, 1) 'définit le nombre de lignes NL du tableau ds valeurs TV
NC = UBound(TV, 2) 'définit le nombre de colonnes NC du tableau ds valeurs TV
K = 1 'initialise la variable K
For I = 1 To NC 'boucle dut toutes les colonnes I du tableau ds valeurs TV
O.Range(O.Cells(1, I), O.Cells(NL, I)).Name = "Tab_" & I 'nomme la plage
ReDim Preserve TP(K) 'redimensionne le tableau des plage
Set TP(K) = Range("Tab_" & I) 'définit la variable indexée TP(K)
K = K + 1 'incrémente K
Next I 'prochaine colonne de la boucle
Range("Tab_3").Copy
Range("A1").Select
ActiveSheet.Paste
Range("Tab_1").Copy
Range("C1").Select
ActiveSheet.Paste
End SubJe souhaite comme je l'ai dit inverser 2 colonnes par exemple. Regarde ce que ça donne pour toi mais en fait les plages ne sont toujours pas définitivement stockées et réutilisables à volonté.
Dans cet exemple, j'ai "vitesse 2" dans la colonne C et "temps" dans la colonne A. Si j'exécute le programme, je vais bien avoir "vitesse 2" dans la colonne A mais je l'aurai également dans la colonne C, puisque la colonne A a été modifiée avant.
Est-ce que c'est plus clair pour toi ? Il ne s'agit pas uniquement de faire référence à une plage de cellules, mais de la stocker définitivement quelque part. C'est un peu quand on écrit des choses du type :
MaVariable = Range("A1").ValueIci, la valeur contenue dans MaVariable est définitivement stockée.
Merci encore, tu m'es vraiment d'une grande aide !
C'est bon j'ai trouvé !!!
Sub Macro1()
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim TV As Variant 'déclare la variable TV (Tanleau des Valeurs)
Dim NL As Integer 'déclare la variable NL (Nombre de Lignes)
Dim NC As Integer 'déclare la variable NC (Nombre de Colonnes)
Dim I As Integer 'déclare la variable I (Incrément)
Dim K As Integer 'déclare la variable K (incrément)
Dim TP() As Range
Set O = Worksheets("Feuil1") 'définit l'onglet O
TV = O.Range("A1").CurrentRegion 'définit le tableau des valeurs TV
NL = UBound(TV, 1) 'définit le nombre de lignes NL du tableau ds valeurs TV
NC = UBound(TV, 2) 'définit le nombre de colonnes NC du tableau ds valeurs TV
K = 1 'initialise la variable K
For I = 1 To NC 'boucle dut toutes les colonnes I du tableau ds valeurs TV
O.Range(O.Cells(1, I), O.Cells(NL, I)).Name = "Tab_" & I 'nomme la plage
ReDim Preserve TP(K) 'redimensionne le tableau des plage
Set TP(K) = Range("Tab_" & I) 'définit la variable indexée TP(K)
K = K + 1 'incrémente K
Next I 'prochaine colonne de la boucle
tp1 = Range("Tab_1").Value
tp3 = Range("Tab_3").Value
Range("A1") = tp3
Range("C1") = tp1
End SubIl n'y a même pas besoin de déclarer les tp1, tp3, etc. A moi maintenant de faire une boucle qui crée ces variables automatiquement et de faire mes autres bouts de programme qui les utilisent.
Un grand merci à toi ThauThème, rapide et efficace !
A plus !