Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Microsoft 365 Variable tableau : coller uniquement une partie des colonnes

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 !
 

job75

XLDnaute Barbatruc
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

  • Test.xlsm
    15.8 KB · Affichages: 5

BenHarber

XLDnaute Occasionnel
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

  • Testjob75.xlsm
    20.6 KB · Affichages: 1

job75

XLDnaute Barbatruc
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

  • Test.xlsm
    16.3 KB · Affichages: 1
Dernière édition:

BenHarber

XLDnaute Occasionnel
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
 

mapomme

XLDnaute Barbatruc
Supporter XLD
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

  • BenHarber- avec tableau- v1.xlsm
    25.8 KB · Affichages: 2

patricktoulon

XLDnaute Barbatruc
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



et tu dis après que tu ne sais pas faire pour restituer une part du tableau
 

BenHarber

XLDnaute Occasionnel
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.
 

patricktoulon

XLDnaute Barbatruc
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
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…