Copier coller colonnes d'un fichier à un autre
#1
Débutant XLPages

Inscription: 23/12/2022
De Paris

Messages: 16

Système d'exploitation:
pc
Version Excel utilisée:
365fr
Posté le : 23-12-2022 10h55

Bonjour tout le monde !

 

J'ai une macro qui permet de copier coller des colonnes d'un fichier situé dans un classeur à un autre fichier situer dans un autre classeur, ensuite il exécute le reste du code de la macro (la suite de la macro n'est pas importante car tout fonctionne).

 

J'ai un problème au niveau des copier coller.. je souhaite copier coller les colonnes : Supplier label (colonne D), Date Trouble Code (DTC) (colonne E), State of the activation of the strategy (colonne k) et enfin Detection class (colonne W) du fichier Matrix qui se situe dans le classeur MatrixDiag, et je souhaite coller tout ça vers le fichier Diff dans les colonnes A, C, D et E (qui ont les mêmes noms de colonnes que l'autre fichier) qui se situe dans le classeur DiffClasseur.

 

Le souci c'est que la macro me demande quel fichier je souhaite ouvrir, ensuite je l'ouvre et hop il plante en disant qu'un objet est manquant des qu'il arrive au niveau des copier coller des colonnes (ci-dessous la partie de code ou je me concentre).

''''''''''''''''''''''''''''''''''''''''''''''''
'Main procedure to check Diag Matrix vs XML file
''''''''''''''''''''''''''''''''''''''''''''''''
Public Sub DiagMatrixCheck()

Dim MATRIX_WB As Workbook
Dim MATRIX_WS As Worksheet
Dim DIFF_WS As Worksheet
Dim DIFF_WB As Workbook
Dim MATRIX_LABEL_H, MATRIX_DETECT_H, MATRIX_STATE_H, MATRIX_DTC_H As Range
Dim MATRIX_LABEL, MATRIX_DETECT, MATRIX_STATE, MATRIX_DTC, D7 As Range
Dim DIFF_DETECT_H, DIFF_DETECT, PREV_DIAG, DIFF_LABEL_H, DIFF_DTC_H, DIFF_STATE_H As Range
Dim XML_FILE, XML_LABEL, XML_DETECT, PCODE, MATRIX_FILE As String
Dim XDOC As DOMDocument60
Dim SHORT_NAME, LONG_NAME, V_NAME, INSTANCE As Object
Dim i As Integer
Dim DebugText As String

On Error GoTo ErrorHandler
Application.ScreenUpdating = False

'Chemin = ThisWorkbook.Path

'Open Excel Diag Matrix file
MATRIX_FILE = Application.GetOpenFilename(FileFilter:="Excel File (*.xls*), *.xls*", Title:="Open Excel File")
Set MATRIX_WB = Workbooks.Open(Filename:=MATRIX_FILE, ReadOnly:=False)
'Set MATRIX_WB = Application.Workbooks.Open(Chemin & "\MatrixDiag.xlsm")
Set MATRIX_WS = MATRIX_WB.Sheets("Matrix")

Set DIFF_WB = ThisWorkbook
Set DIFF_WS = DIFF_WB.Sheets("Diff")

'Set the header for every used column of the matrix
Set MATRIX_LABEL_H = MATRIX_WS.Range("A6").EntireRow.Find("Supplier Label")
Set MATRIX_DETECT_H = MATRIX_WS.Range("A6").EntireRow.Find("Detection Class")
Set MATRIX_STATE_H = MATRIX_WS.Range("A6").EntireRow.Find("State of the activation of the strategy")
Set MATRIX_DTC_H = MATRIX_WS.Range("A6").EntireRow.Find("Data Trouble Code (DTC)")

'Define variables for Diff tab
Set DIFF_DETECT_H = DIFF_WS.Range("A2").EntireRow.Find("Detection Class")
Set DIFF_LABEL_H = DIFF_WS.Range("A2").EntireRow.Find("Supplier Label")
Set DIFF_DTC_H = DIFF_WS.Range("A2").EntireRow.Find("DTC code")
Set DIFF_STATE_H = DIFF_WS.Range("A2").EntireRow.Find("Activation state")

'Copy and paste column Matrix to Diff
Workbooks("MATRIX_WB").Sheets("MATRIX_WS").MATRIX_LABEL_H.Copy
Workbooks("DIFF_WB").Sheets("DIFF_WS").DIFF_LABEL_H.Paste

Workbooks("MATRIX_WB").Sheets("MATRIX_WS").MATRIX_DETECT_H.Copy
Workbooks("DIFF_WB").Sheets("DIFF_WS").DIFF_DETECT_H.Paste

Workbooks("MATRIX_WB").Sheets("MATRIX_WS").MATRIX_STATE_H.Copy
Workbooks("DIFF_WB").Sheets("DIFF_WS").DIFF_STATE_H.Paste

Workbooks("MATRIX_WB").Sheets("MATRIX_WS").MATRIX_DTC_H.Copy
Workbooks("DIFF_WB").Sheets("DIFF_WS").DIFF_DTC_H.Paste

La partie qui suit le code ci-dessus est l'ouverture du fichier xml etc (pas important pour mon prob).

 

Je vous laisse les fichiers ci-dessous, concernant la macro elle demande d'ouvrir un premier classeur qui est MatrixDiag et ensuite d'ouvrir le fichier xml.

 

Merci par avance !

Pièce jointe:
zip test_vba.zip   [ Taille: 294.85 Ko - Téléchargements: 131 ]
Edité par Razmo le 23/12/2022 16:10:03
Hors Ligne
Rapport   Haut 

Re: Copier coller colonnes d'un fichier à un autre
#2
Webmestre

Inscription: 18/05/2006
De Saône-et-Loire (71)

Messages: 1539

Système d'exploitation:
PC
Version Excel utilisée:
97, 2000, 2002, 2003, 2007, 2010, 2013, 2016 et 365
Posté le : 23-12-2022 15h12

Bonjour Razmo, bienvenu sur XLpages Content(e)

 

Tu trouveras en pièce jointe une tentative de réponse à ta demande, sachant que je ne me suis préoccupé que de la partie du code dont tu parles...

 

1/ A mon avis, il y a visiblement une grosse confusion dans ton code entre les "objets" et les noms que tu leur donnes. ... Pas très simple à expliquer, mais je tente ma chance :

 

Par exemple, dans cette expression : 

Set MATRIX_WB = Workbooks.Open(Filename:=MATRIX_FILE, ReadOnly:=False)

MATRIX_WB est un objet (d'où la nécessité de l'instruction "Set" pour lui attribuer un contenu)

MATRIX_FILE est une variable chaine de caractère.

 

Si (plus loin dans ton code) tu écris quelque chose comme ça :

Workbooks("MATRIX_WB")
Ca ne peut plus avoir de signification pour VBA (car là, tu essaies de faire référence à un Classeur qui se nommerait textuellement "MATRIX_WB" et non au classeur lui-même !).
 

Par exemple, pour fermer le dit classeur, tu ferais simplement : MATRIX_WB.Close (et non pas Workbooks("MATRIX_WB").Close)

 

2/ Pour info, pour les déclarations de variables en VBA, lorsque tu écris :

Dim MATRIX_LABEL_H, MATRIX_DETECT_H, MATRIX_DTC_H As Range
 

Seul "MATRIX_DTC_H" est déclaré comme Range. Les 2 autres sont considérés comme Variant par VBA. Il faut obligatoirement indiquer le type de variable pour CHAQUE élément, même s'ils sont sur une même ligne Dim (c'est en particulier, une différence entre VB et VBA sauf erreur). En l'absence de Type, le code considère qu'il s'agit de Variant.

 

Par ailleurs, je pense sincèrement que nommer une variable "D7" (voir ton code) et en tant que Range qui plus est, ce n'est pas forcément un bonne idée (ça ressemblerait plus à une simple référence de cellule, mais c'est juste un point de vue personnel).

 

3/ En fonction de ce que j'ai compris de ton objectif, voici la partie du code que je te propose dans la pièce jointe :

 

En déclaration supplémentaire :

Dim MATRIX_LABEL_H_Datas As Range, MATRIX_DETECT_H_Datas As Range, MATRIX_STATE_H_Datas As Range, MATRIX_DTC_H_Datas As Range

Dim nbLignDatas&
Puis ...
...
...
...
'Set the header for every used column of the matrix
With MATRIX_WS
    Set MATRIX_LABEL_H = .Range("A6").EntireRow.Find("Supplier Label")
    Set MATRIX_DETECT_H = .Range("A6").EntireRow.Find("Detection Class")
    Set MATRIX_STATE_H = .Range("A6").EntireRow.Find("State of the activation of the strategy")
    Set MATRIX_DTC_H = .Range("A6").EntireRow.Find("Data Trouble Code (DTC)")
    
    'set Datas range for these columns
    nbLignDatas = .Cells(.Rows.Count, MATRIX_LABEL_H.Column).End(xlUp).Row - 6          '(car entête en ligne 6)
    Set MATRIX_LABEL_H_Datas = MATRIX_LABEL_H.Resize(nbLignDatas, 1).Offset(1, 0)
    nbLignDatas = .Cells(.Rows.Count, MATRIX_DETECT_H.Column).End(xlUp).Row - 6
    Set MATRIX_DETECT_H_Datas = MATRIX_DETECT_H.Resize(nbLignDatas, 1).Offset(1, 0)
    nbLignDatas = .Cells(.Rows.Count, MATRIX_STATE_H.Column).End(xlUp).Row - 6
    Set MATRIX_STATE_H_Datas = MATRIX_STATE_H.Resize(nbLignDatas, 1).Offset(1, 0)
    nbLignDatas = .Cells(.Rows.Count, MATRIX_DTC_H.Column).End(xlUp).Row - 6
    Set MATRIX_DTC_H_Datas = MATRIX_DTC_H.Resize(nbLignDatas, 1).Offset(1, 0)
End With

'Define variables for Diff tab
Set DIFF_DETECT_H = DIFF_WS.Range("A2").EntireRow.Find("Detection Class")
Set DIFF_LABEL_H = DIFF_WS.Range("A2").EntireRow.Find("Supplier Label")
Set DIFF_DTC_H = DIFF_WS.Range("A2").EntireRow.Find("DTC code")
Set DIFF_STATE_H = DIFF_WS.Range("A2").EntireRow.Find("Activation state")

'Copy and paste column Matrix to Diff
MATRIX_LABEL_H_Datas.Copy Destination:=DIFF_LABEL_H.Offset(1, 0)
MATRIX_DETECT_H_Datas.Copy Destination:=DIFF_DETECT_H.Offset(1, 0)
MATRIX_STATE_H_Datas.Copy Destination:=DIFF_STATE_H.Offset(1, 0)
MATRIX_DTC_H_Datas.Copy Destination:=DIFF_DTC_H.Offset(1, 0)
 

 

En espérant t'avoir donné la bonne piste à suivre...

 

Bien cordialement,

 

 

Pièce jointe:
xlsm PourRazmo - DiffClasseur.xlsm   [ Taille: 46.17 Ko - Téléchargements: 135 ]
Edité par myDearFriend! le 23/12/2022 20:01:11

Didier_mDF
Image redimensionnée
Le Webmaster

La réponse vous satisfait ? Merci de revenir solder le sujet en [résolu], voir ce lien
Hors Ligne
Rapport   Haut 

Re: Copier coller colonnes d'un fichier à un autre
#3
Débutant XLPages

Inscription: 23/12/2022
De Paris

Messages: 16

Système d'exploitation:
pc
Version Excel utilisée:
365fr
Posté le : 23-12-2022 16h05

Bonjour myDearFriend,

 

Ca marche comme je le souhaitais je te remercie pour ça !

 

Concernant la variable D7 je l'ai mis mais j'avais oublié de l'enlever car elle me servait à rien c'etait pour tester quelque chose. 

De plus pour les déclarations de variables je pensais que c'etait correct de définir de cette maniere car on m'avait toujours dit de faire comme ça surprise, merci de m'avoir corriger !

 

Pour le reste, ton explication etait très comprehensible je te remercie pour ça, juste je comprends pas très bien la partie With/end With que t'as mis.

Hors Ligne
Rapport   Haut 

Re: Copier coller colonnes d'un fichier à un autre
#4
Webmestre

Inscription: 18/05/2006
De Saône-et-Loire (71)

Messages: 1539

Système d'exploitation:
PC
Version Excel utilisée:
97, 2000, 2002, 2003, 2007, 2010, 2013, 2016 et 365
Posté le : 23-12-2022 20h24

Citation :

Razmo a écrit :

Pour le reste, ton explication etait très comprehensible je te remercie pour ça, juste je comprends pas très bien la partie With/end With que t'as mis.

 

Un petit tour dans l'aide VBA Microsoft sur l'instruction With (ou plus exactement sur le bloc d'instructions With / End With) :

 

L’instruction With vous permet d’exécuter une série d’instructions sur un objet spécifié sans requalifier le nom de l’objet. Par exemple, pour modifier plusieurs propriétés sur un même objet, placez les instructions d’affectation de propriétés dans la structure de contrôle With et faites référence une fois à l’objet, au lieu d’y faire référence à chaque affectation de propriété.

 

Autrement dit, si je prends par exemple ton code :

'Define variables for Diff tab
Set DIFF_DETECT_H = DIFF_WS.Range("A2").EntireRow.Find("Detection Class")
Set DIFF_LABEL_H = DIFF_WS.Range("A2").EntireRow.Find("Supplier Label")
Set DIFF_DTC_H = DIFF_WS.Range("A2").EntireRow.Find("DTC code")
Set DIFF_STATE_H = DIFF_WS.Range("A2").EntireRow.Find("Activation state")

Je peux l'alléger un peu et surtout le rendre plus facile à lire en faisant :

'Define variables for Diff tab
With DIFF_WS.Range("A2").EntireRow
    Set DIFF_DETECT_H = .Find("Detection Class")
    Set DIFF_LABEL_H = .Find("Supplier Label")
    Set DIFF_DTC_H = .Find("DTC code")
    Set DIFF_STATE_H = .Find("Activation state")
End With

C'est exactement la même chose, mais beaucoup plus digeste à la lecture et compréhension du code.

 

L'expression

DIFF_WS.Range("A2").EntireRow"

représente un objet de type Range (c'est la ligne entière qui contient la cellule A2). Tu n'es donc pas obligé de l'écrire 4 fois de suite grâce à un bloc With / End With.

 

Prend bien note de la présence du "." (point) devant chaque méthode Find ci-dessus. C'est ce point qui fait le lien avec l'objet en With.

 

Bien cordialement,


Didier_mDF
Image redimensionnée
Le Webmaster

La réponse vous satisfait ? Merci de revenir solder le sujet en [résolu], voir ce lien
Hors Ligne
Rapport   Haut 


Vous pouvez voir les sujets.
Vous ne pouvez pas débuter de nouveaux sujets.
Vous ne pouvez pas répondre aux contributions.
Vous ne pouvez pas éditer vos contributions.
Vous ne pouvez pas effacez vos contributions.
Vous ne pouvez pas ajouter de nouveaux sondages.
Vous ne pouvez pas voter en sondage.
Vous ne pouvez pas attacher des fichiers à vos contributions.
Vous ne pouvez pas poster sans approbation.

[Recherche avancée]


Qui consulte actuellement ce sujet ?   1 Utilisateur(s) anonymes