[VBA] - Coller le contenu d'une seule colonne d'une variable tableau

Bonsoir,

Si l'on utilise ce code :

.Cells(1, 1).Resize(UBound(tab1, 2), UBound(tab1)) = Application.Transpose(tab1)

On colle entièrement le contenu de la variable tableau, quel que soit le nombre de colonnes de cette variable.

En s'y prenant ainsi :

.Cells(1, 1).Resize(UBound(tab1, 2), 1) = Application.Transpose(tab1)

On ne colle que le contenu de la première colonne.

Mais comment pourrais-je m'y prendre pour ne coller que le contenu de la colonne "x" ; admettons la colonne 2 ?

Une telle solution me serait d'une grande aide car ça m'éviterais de créer plusieurs variables tableau en fonction de ce que je souhaite coller ensuite..

Je vous remercie de votre attention,

Bonne soirée !

Bonjour

Vous devriez trouver des réponses à cette adresse

Bonjour

Bonjour à tous

Essai ainsi :

Dim tab1, tab2, j&, x&

Sub ess()

    tab1 = Range("M1").CurrentRegion
    x = 2   'ligne (colonne transposée) à prendre en compte -> à adapter

    ReDim tab2(1 To 1, 1 To UBound(tab1, 2))
    For j = 1 To UBound(tab1, 2)
        tab2(1, j) = tab1(x, j)
    Next j
    Cells(1, 1).Resize(UBound(tab1, 2), 1) = Application.Transpose(tab2)
    Erase tab2
End Sub
25essai.xlsm (23.25 Ko)

Bye !

Bonsoir,

Merci pour vos réponses !
Donc visiblement, vous passez par une seconde variable tableau.

Je pense que ça revient à alimenter les deux variables tableau en amont, mais ça peut être utilise si on rempli une seule variable tableau à un moment, puis que l'on va piocher, via une seconde variable tableau les colonnes qui nous intéressent au fur et à mesure.

Pour rechercher une colonne :

Dim tab1, tab2, j&, x&

Sub ess()

    tab1 = Range("M1").CurrentRegion
    x = 3   'ligne (colonne transposée) à prendre en compte -> à adapter

    ReDim tab2(1 To 1, 1 To UBound(tab1, 1))
    For j = 1 To UBound(tab1, 1)
        tab2(1, j) = tab1(j, x)
    Next j
    Cells(1, 1).Resize(UBound(tab1, 1), 1) = Application.Transpose(tab2)
    Erase tab2
End Sub

Il n'y a donc pas de solution plus simple qui permettrait d'indiquer à Excel ce qui est la colonne 2, 3, 4, etc. et de ne coller que cette colonne.

Merci

Bonne soirée !

Bonjour le fil

Pas bien compris il suffit de donner la bonne colonne à l'initialisation de "Tab1"

Bonjour

Bonjour à tous

Variantes :

18essai-v2.xlsm (26.87 Ko)

Bye !

Bonjour,

Pas bien compris il suffit de donner la bonne colonne à l'initialisation de "Tab1"

Parfois j'enregistre le contenu de "x" colonnes dans une variable tableau (tab1() as string)

Mes lignes et mes colonnes sont donc enregistrées dans cette variable. Par exemple :

Redim tab1(1 to 4, 1 to 3)

tab1(1,1) = A1 tab1(1,2) = A2 tab1(1,3) = A3

tab1(2,1) = B1 tab1(2,2) = B2 tab1(2,3) = B3

tab1(3,1) = C1 tab1(3,2) = C2 tab1(3,3) = C3

tab1(4,1) = D1 tab1(4,2) = D2 tab1(4,3) = D3

En écrivant ceci :

.Cells(1, 1).Resize(UBound(tab1), UBound(tab1,2)) = tab1

Je colle tout le tableau dans les cellules à partir de A1.

Et comme ça :

.Cells(1, 1).Resize(UBound(tab1), 1) = tab1

Je colle les données contenues dans tab1(x,1)

Mais comment pourrais-je coller les données de tab1(x,2) uniquement par exemple. Sans passer par une seconde variable tableau.

C'était ma question.

J'ai l'impression qu'on ne peut pas..

Bonne journée.

Salut Le Drosophile,

Utiliser une variable tableau sert à accélérer le traitement d'un grand nombre de données sur plusieurs colonnes

Au delà du possible ou pas, pour moi, s'il ne faut gérer qu'une seule colonne, ça ne sert à rien

@+

Bonjour,

Je génère plusieurs type de tableaux à partir d'une grande source de données (un tableau de 80 colonnes sur quelques centaines de lignes en général) et de plusieurs autres petites bases de données.

Ces différents tableaux ne se présentent pas tous de la même façon. En outre, selon les options que je choisis, certaines informations peuvent être recherchées ou pas (ce qui ajoute ou enlève des colonnes de mes tableaux finaux).

Pour donner un exemple, je peux charger, entre autres, dans cette variable la colonne des codes espèces "CDE" et de leur correspondance "CORRESP", et lorsque je veux les mettre dans mon tableau final, la colonne "CDE" ne se trouve pas à coté de "CORRESP", j'aimerais donc lui indiquer tout simplement de coller la première colonne dans "CDE" puis la seconde dans "CORRESP".

C'est un exemple simplifié, car ça peut aller plus loin, avec une dizaine de colonnes qui n'ont pas une place fixe selon les options sélectionnées.

Bonne journée !

Bonjour

Pas sûr que ça réponde à la question que je ne comprends pas très bien.

32choix-colonnes.xlsm (24.94 Ko)

Bonjour,

Merci de votre réponse. En effet, ça ne répond pas à la question que je posais.

Votre outil permet de copier des colonnes au choix.

Ce que je cherche à savoir c'est, lorsqu'une variable tableau est dimensionnée à l'identique d'un tableau (des dimensions pour les lignes et pour les colonnes), peut-on coller la colonne de son choix (pour le moment je sais tout coller, ou bien ne coller que la colonne n°1 ; je ne sais pas coller la colonne n° 2 ; 3 ; 4 etc.

Je sais comment contourner la situation (en chargeant les données que je veux dans une variable tableau (de dimension 1 colonne "x" lignes) qui ne contient que les données que je veux ; ou bien coller le tout et supprimer les colonnes que je ne veux pas garder.

Je cherche à savoir s'il y a mieux que ça. Ça m'éviterait de créer plusieurs variables pour la même opération.

Bonne journée

Une autre proposition probablement hors sujet parce que je dois être un peu idiot mais je ne comprends toujours pas

Peut être qu'un fichier exemple m'éclairerait

17choix-colonnes.xlsm (31.92 Ko)

Bonjour à tous,

A ma connaissance, ce n'est pas possible sans passer par une solution nécessitant une seconde variable ou une fonction/procédure.

La seule astuce que j'imagine, dans le cas d'une variable déclarée comme tableau, non préalablement dimensionnée, avec les colonnes en seconde dimension, c'est d'utiliser un redim preserve.

Mais s'il fallait conserver la totalité des colonnes du tableau pour la suite du code, ça nécessiterait encore une fois de passer par une seconde variable.

La meilleure solution selon moi serait celle déjà proposée par gmb et yal_excel mais sous forme de fonction paramétrée :

function GetVector(ArrSrc, Column as long)
redim temp(lbound(ArrSrc) to ubound(ArrSrc))
for i = lbound(ArrSrc) to ubound(ArrSrc)
    temp(i) = ArrSrc(i, Column)
next i
GetVector = temp 'pour obtenir un vecteur ligne
'ou GetVector = application.transpose(temp) 'pour obtenir un array colonne en 2D
end function

Ensuite, on utilise cette fonction à souhait :

Dim tab1, tab2, j&, x&

Sub ess()
    tab1 = Range("M1").CurrentRegion
    Cells(1, 1).Resize(UBound(tab1, 1), 1) = application.transpose(GetVector(tab1, 3)) 'si vecteur ligne
    'ou Cells(1, 1).Resize(UBound(tab1, 1), 1) = GetVector(tab1, 3) 'si tableau monocolonne en 2D
End Sub

Et dans cet exemple, sans recourir à une variable.

Cdlt,

Bonjour,

si j'ai bien compris le besoin :

'Restitution de la colonne 3 uniquement (Merci à Boisgontier)
Cells(2, 3).Resize(UBound(t, 1)) = Application.Index(t, , 3)

Je me rappelle que tu as des grands tableaux. Je suppose que tu sais que Transpose() est limité à 64k lignes
eric

Bonjour,

Merci beaucoup pour vos réponse ! Je vais tester ça dès que possible (ce soir ou demain j'imagine)

Je me rappelle que tu as des grands tableaux. Je suppose que tu sais que Transpose() est limité à 64k lignes

Ah bah non je ne savais pas. J'ai créé quelques macros qui me permettent de découper et de mieux gérer mes bases de données. La plus grosse ne fait plus que 90 000 lignes ; et je ne la charge pas dans une variable tableau, elle sert surtout pour des recherches.

Les plus gros tableaux qui sont déplacés via transpose() font tout au plus quelques centaines de lignes, on pourrait arriver à ne dizaines de milliers dans le cadre de gros projets, mais ça devrait le faire !

Edit : Je constate que pour utiliser

Application.Index(t, , 3)

Il faut que la variable tableau soit dimensionnée avec les lignes en 1ère dimension et les colonnes en seconde dimensions. Si c'est inversé, il faut charger la variable dans une autre variable en inversant colonne et lignes.

En général j'ai surtout des variables avec colonnes en 1ère dimension, et j'ajoute les lignes au fur et à mesure.

Edit 2 :

En s'y prenant ainsi :

Application.Transpose(Application.Index(tab2, 2))

Encore merci !

Bonne journée.

Bonsoir …

Un exemple

Bonjour,

oui, il te faut extraire la ligne au lieu de la colonne.

syntaxe :

INDEX(matrice; no_lig; [no_col])

eric

Rechercher des sujets similaires à "vba coller contenu seule colonne variable tableau"