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
Bonjour le Forum,
Je reprends ce post car directement en relation avec ma question ci-dessous (et désolé par avance si j'écris encore des énormités )
Après avoir écris cette commande :
...monTab = Application.Index(.Value, Evaluate("ROW(1:" & .Rows.Count & ")"), [{1,16,17,18,19,20,21,22,23,24}])...
je souhaiterais maintenant boucler sur toutes les lignes de la 2ème colonne de ma variable tableau (càd la col. 16 de ma feuille) : quelle est la syntaxe de cette boucle SVP ?
J'ai essayé monTab(numLigne,2) mais, bien entendu, j'ai un message d'erreur...
Merci d'avance pour vos suggestions...et votre indulgence...