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
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
:oops:🤔
 

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

Statistiques des forums

Discussions
313 769
Messages
2 102 234
Membres
108 181
dernier inscrit
Chr1sD