Microsoft 365 Variable tableau : coller uniquement une partie des colonnes

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,

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 ?

Merci d’avance pour vos idées !
 
Bonjour BenHarber, le forum,

Voyez le fichier joint et exécutez :
VB:
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
A+
 

Pièces jointes

Bonjour @job75 , @Oneida, le Forum,
Effectivement, il y avait une coquille dans ma ligne de commande : mea culpa !
cf. PJ

J'aurais dû écrire :
Sheets(1).[D15].Resize(UBound(monTab, 1), UBound(monTab, 2) - 1) = Application.Index(monTab, Application.Transpose(Array(1, 2, 3, 4, 5)), [{2,3,4,5,6,7,8}]).

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.
 

Pièces jointes

Bonjour BenHarber, le forum,
Effectivement, il y avait une coquille dans ma ligne de commande : mea culpa !
Une coquille ? Ce serait plutôt une erreur de conception !

Alors utilisez plutôt cette solution :
VB:
Sub Test()
Dim monTab
monTab = Sheets(2).[A2:J40000]
Sheets(1).[A2].Resize(UBound(monTab), UBound(monTab, 2) - 1) = Application.Index(monTab, Evaluate("ROW(1:" & UBound(monTab) & ")"), Evaluate("TRANSPOSE(ROW(2:" & UBound(monTab, 2) & "))"))
End Sub
A+
 

Pièces jointes

Dernière édition:
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.

Encore un grand merci pour votre aide précieuse !

BH
 
Bonjour @BenHarber 🙂 ,
N’étant pas très à l’aise avec les variables-tableau, je vous soumet mon petit pb.
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.
 

Pièces jointes

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



et tu dis après que tu ne sais pas faire pour restituer une part du tableau
😳🤔
 
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.
 
re
tu determine ton tableau de départ avec ceci
VB:
monTab = Application.Index(.Value, Evaluate("ROW(1:" & .Rows.Count & ")"), [{1,16,17,18,19,20,21,22,23,24}])

pour info la colonne 2 de montab contient la colonne 16 de la feuille

2°tu travaille dessus blablabla

3° tu re balance ton montab de la colonne 2 a 10 dans la plage de colonne 16 à la fin
ben c'est simple
Code:
montab = Application.Index(montab, Evaluate("ROW(1:" & UBound(montab) & ")"), [{2,3,4,5,6,7,8,9}])
Cells(1, 16).Resize(UBound(montab), UBound(montab, 2)) = montab
pas compliqué

shemas
montab = Application.Index(tableau de base , array (2 dim sur x lignes et 1 colonne) , array(1dim) )

tableau de base
  1. peut être une variable tableau(array à 2 dim)
  2. ou le .value d'un range

l'array 2 dim peut s'optenir avec
  1. evaluate("ROW(1:X)") x etant l'index de derniere ligne
  2. ou en dur [{1;2;3;4;5;6;7;8;9}] les indexs de colonnes se suivent
  3. ou encore [{1;5;3;4;9;7;2}]'il n'est pas forcé que ca se suive
  4. (à 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

voilà pour la piqure de rappel 😉
 
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...
 
Notre forum d’entraide est 100 % gratuit et le restera.
Aucune formation payante, aucun fichier à acheter, rien à vendre. Mais comme tout site, nous devons couvrir nos frais pour continuer à vous accompagner.
Soutenez-nous en souscrivant à un compte membre : c’est rapide, vous choisissez simplement votre niveau de soutien et le tour est joué.

Je soutiens la communauté et j’accède à mon compte membre

Discussions similaires

Retour