Comment ne copier qu'une colonne de matrice dans une feuille?

jhlamoustache

XLDnaute Occasionnel
Bonjour le forum,

J'ai créé une matrice, et je souhaite reporter la deuxième colonne de cette matrice dans une plage.

Si je code plage = matrice c'est la première colonne de la matrice qui est collée.

Si je code plage = matrice(,1) ou matrice(*,1) ou matrice(?,1) j'ai une erreur de compilation.

Plus précisemment je souhaite le faire sans boucle car j'ai plus de 100 000 lignes à coller. Est-ce possible?

Pour info, je suis en base 0

Merci d'avance
 

Efgé

XLDnaute Barbatruc
Re : Comment ne copier qu'une colonne de matrice dans une feuille?

Bonjour jhlamoustache

Application.Index(Matrice, , 2) :

VB:
Sub test()
Dim Matrice As Variant
Matrice = Range("A1:L23")
Range("A26").Resize(UBound(Matrice, 1), 1) = Application.Index(Matrice, , 2)
End Sub

Cordialement
 

jhlamoustache

XLDnaute Occasionnel
Re : Comment ne copier qu'une colonne de matrice dans une feuille?

Re

le fichier comporte 47 cellules non vides, deux onglets, et un module de quelques lignes de codes.
Zippé, il fait 564 KO!

Mais je vais vérifier un truc, à savoir que dans ma matrice il y a des vides, et que c'est peut-être ces vides qui génèrent le bug.
Je te dis
 

jhlamoustache

XLDnaute Occasionnel
Re : Comment ne copier qu'une colonne de matrice dans une feuille?

Bonjour Efgé,

Oui, c'était ça. Plus précisemment la plage qui alimentait la matrice n'était pas correctement définie, et au cours des tentatives de débugage la plage s'aggrandissait à mon insu.
Et puis je n'avais pas remarqué que lorsque j'alimente la matrice depuis une colonne unique, (Matrice = Plage) dans la matrice je dois y accéder en précisant deux indices (Mat(J,1) = blablabla
Du vrai débutant
Merci de ton aide.
Cordialement

Dernière question : comment clore cette discussion? est-ce dans le mode avancé?
 

jhlamoustache

XLDnaute Occasionnel
Re : Comment ne copier qu'une colonne de matrice dans une feuille?

Bonjour le forum, Efgé

je reviens vers vous car finalement l'erreur 13 "incompatibilité de type" continue d'apparaitre lorsque je code le fichier de production.
De ce que j'ai lu de l'aide en ligne il est possible qu'un sous-type de la matrice ne soit pas correct. Mais comment savoir?
Quelqu'un peut-il m'aider?
 
Dernière édition:

jhlamoustache

XLDnaute Occasionnel
Re : Comment ne copier qu'une colonne de matrice dans une feuille?

Bonjour Efgé, le forum,

Je te remercie de ton implication
Mes difficultés sont de te présenter un fichier suffisamment maigre, et dans lequel apparaisse le bug.
De plus, le contrôle sécurité s'en mêle.
Je ne désespère pas d'y parvenir aujourd'hui.

Bien cordialement
 

jhlamoustache

XLDnaute Occasionnel
Re : Comment ne copier qu'une colonne de matrice dans une feuille?

Re

Ce fichier ne génère pas l'erreur 13 : incompatibilité de type. Mais j'espère que cela vous éclairera.
l'objectif de la procédure test est de compléter la colonne C en fonction de la colonne B. Il faut utiliser un tableau car mon fichier prod comporte 137500 lignes et pourrait grossir. Donc remplir avec une boucle prendra trop de temps.
Voir les commentaires dans le code car
J'ai donc inséré une boucle pour repérer l'erreur 13 (ou autre) sans résultat : toute la colonne se remplit (très lentement).

A votre disposition pour tout renseignement complémentaire.
CDT
 

Pièces jointes

  • Classeur2.xlsm
    24 KB · Affichages: 43
  • Classeur2.xlsm
    24 KB · Affichages: 43
  • Classeur2.xlsm
    24 KB · Affichages: 46

Efgé

XLDnaute Barbatruc
Re : Comment ne copier qu'une colonne de matrice dans une feuille?

Bonjour jhlamoustache,
Et comme ça ?
VB:
Sub EFGE()
Dim i&, D As Object, T As Variant, Td As Variant

Set D = CreateObject("Scripting.dictionary")

With Sheets("TBLDECOUPAGE6")
    T = .Range([CLE_TYPETRAVERSETBL].Offset(1, 0), _
        .Cells(.Rows.Count, [CLE_TYPETRAVERSETBL].Column).End(3)(1, 2))
    Td = .Range([CLE_TYPETRAVERSE].Offset(1, 0), _
        .Cells(.Rows.Count, [CLE_TYPETRAVERSE].Column).End(3)(1, 2))
End With

For i = LBound(Td, 1) To UBound(Td, 1)
    D(Td(i, 1)) = Td(i, 2)
Next i

For i = LBound(T, 1) To UBound(T, 1)
   If T(i, 1) <> "" Then T(i, 2) = D(T(i, 1))
Next i

[CLE_TYPETRAVERSETBL].Offset(1, 0).Resize(UBound(T, 1), 2) = T
End Sub
 

Pièces jointes

  • Classeur2(1).xlsm
    20.1 KB · Affichages: 37
  • Classeur2(1).xlsm
    20.1 KB · Affichages: 30
  • Classeur2(1).xlsm
    20.1 KB · Affichages: 44

jhlamoustache

XLDnaute Occasionnel
Re : Comment ne copier qu'une colonne de matrice dans une feuille?

Re
Chouette, on y est presque !
La ligne de code [CLE_TYPETRAVERSETBL].Offset(1, 0).Resize(UBound(T, 1), 2) = T pose pb :
Dans mon tableau de prod, la colonne contigüe à celle contenant la cellule nommée "CLE_TYPETRAVERSETBL" est remplacée par les valeurs (bois, béton, métallique) à l'exécution de sub EFGE. Or ces valeurs doivent être écrite dans la colonne contenant la cellule nommée "planchertbl" (qui se trouve pour l'instant à douze colonnes à droite)

J'ai donc écrit [planchertbl].Offset(1, 0).Resize(UBound(T, 1), 2) = T
J'obtiens la copie des clés dans la colonne contenant la cellule nommée "planchertbl" et les valeurs (bois, béton, métallique ou rien) dans la colonne contigüe à sa droite.

En fait je souhaite écrire dans colonne contenant la cellule nommée "planchertbl" les valeurs (bois, béton, métallique ou rien).
Par contre, je n'ai pas eu d'erreur 13. Super

Merci de bien vouloir continuer à m'aider

Cdt
 

Discussions similaires

Statistiques des forums

Discussions
312 304
Messages
2 087 069
Membres
103 453
dernier inscrit
Choupi