N’étant pas très à l’aise avec les variables-tableau, je vous soumet mon petit pb.
Au terme d’une procédure, j’obtiens une variable tableau ‘monTab()’ qui s’étend environ sur 40 000 lignes et 10 colonnes.
J’aimerais coller dans une nouvelle feuille, à partir de la cellule A2, toutes les valeurs contenues dans 'monTab()' SAUF CELLES DE LA COLONNE N°1 : autrement dit, j’aimerais coller les colonnes 2 à 10 de monTab(40000,10) à partir de la cellule A2.
Pour l’instant, j’utilise la commande ci-dessous :
Sheets(1).[A2].Resize(UBound(monTab), UBound(monTab, 2)) = monTab
L’ennui, c’est qu’elle colle aussi en colonne ‘A’ de ma feuille, les valeurs de la 1ère col. de monTab(40000,10).
Est-ce que vous auriez une suggestion pour rédiger correctement la commande VBA à mettre en place ?
Sub Test()
Dim monTab
monTab = Sheets(2).[A2:J6]
Sheets(1).[A2].Resize(UBound(monTab), UBound(monTab, 2) - 1) = Application.Index(monTab, 0, [{2,3,4,5,6,7,8,9,10}])
End Sub
Il n'empêche qu'il me reste un gros pb. : je ne sais pas comment "variabiliser" le nombre de lignes qui est à chaque fois différent...et qui, en réalité, peut atteindre 40 000 lignes !
Je ne me vois pas écrire "Application.Transpose(Array(1, 2, 3, 4....,40 000) ! Peut-être existe-t-il une écriture plus condensée de cette commande ?
Du coup, la solution de Oneida -utiliser 2 variables-tableaux différentes- me semble à ce stade la plus appropriée.
Bonjour @job75
Merci beaucoup pour votre suggestion ! (j'ai simplement modifié le '1' en '2' dans la commande ci-dessous pour arriver exactement à ce que je recherchais, càd ne pas reprendre les valeurs en col. A).
= Application.Index(monTab, Evaluate("ROW(1:" & UBound(monTab) & ")"), Evaluate("TRANSPOSE(ROW(2:" & UBound(monTab, 2) & "))"))
Il n'empêche que j'ai appliqué bêtement votre code mais, sur le fond, je n'arrive pas à comprendre le mot-clé "ROW" dans la commande Evaluate("TRANSPOSE(ROW( Alors, si vous avez le temps pour une explication (ou un site de référence sur ces manips de variables-tableau) je suis preneur.
Donc voici un petit rien, rien que pour vous avec rien que des variables tableau (juste pour rien et juste pour le fun) . Le code (méthode 2) est commenté.
La méthode 1 modifie le tableau monTab alors que la méthode 2 le conserve tel quel.
Merci beaucoup @mapomme : je prendrai le temps de décortiquer cette manip., mais à tête...reposée !
(j'ai essayé : le code est effectivement très rapide à s'exécuter !)
Bonjour à tous @BenHarber perso je pige pas un truc
en page 1 dans le post #12
tu a ta solution pour récupérer les colonnes que tu veux
je te cite
Oneida, ça ressemble à ça :
With Sheets(1).Range("A2:BY40000")
monTab = Application.Index(.Value, Evaluate("ROW(1:" & .Rows.Count & ")"), [{1,16,17,18,19,20,21,22,23,24}])
End With
Pour résumer :
1) J'extrais les col. 1 + 16 à 24 de ma feuille dans monTab (avec la méthode ci-dessus)
2) Je fais un traitement des données dans monTab
3) Après ce traitement : ce sont les colonnes col. 2 à 10 de 'monTab' que j'aimerais recopier en bloc sur les col. 16 à 24 de la feuille Excel
Bonjour @patricktoulon,
Vous avez raison sur le principe mais, comme je l'ai indiqué au départ, je ne suis pas à l'aise avec les variables tableau...et que dire des commandes 'Evaluate'/'Index'...!!!
Aussi, dans mes multiples tentatives, j'ai dû essayer en rédigeant la commande suivante :
Sheets(1).[D15].Resize(UBound(monTab, 1), UBound(monTab, 2) - 1) = Application.Index(monTab, Evaluate("ROW(1:" & .Rows.Count & ")"), [{2,3,4,5,6,7,8}])
(...et certainement d'autres hérésies du genre dont aucune n'a fonctionné ! )
Bon, maintenant -merci Le Forum !-, je comprends un peu mieux le fonctionnement de ces tableaux.
evaluate("ROW(1:X)") x etant l'index de derniere ligne
ou en dur [{1;2;3;4;5;6;7;8;9}] les indexs de colonnes se suivent
ou encore [{1;5;3;4;9;7;2}]'il n'est pas forcé que ca se suive
(à noter que pour 2 dim le séparateur est ";" pour le sript evaluate abrégé"[{...}]")
l'array 1 dim pour les colonnes peut s'obtenir avec
application.transpose(evaluate("row(1;16;17;18;19;20;21;22;23;24)"))
ou bien encore evaluate("COLUMN(A:Z)")'26 colonnes
ou bien encore array(1,16,17,18,19,20,21,22,23,24) et là encore il n'est pas forcer que les indexs se suivent