Copier-coller colonne à partir d'une entête VBA
Bonjour à vous,
Je souhaite effectuer un copier-coller d'une colonne "A" d'un fichier "A" vers un fichier B. Cependant mon fichier "A" étant évolutif, je veux copier la colonne à partir du titre de celle-ci (les colonnes ne sont pas sous la forme d'un tableau) et non à partir de la lettre de la colonne (ce que je fais pour le moment)...
L'objectif et de pouvoir insérer de nouvelles colonnes ou l'on veux sans changer les données copier-collers.
Ce que je demande est-il réalisable ?
Mon code pour le moment :
Sub OuvrirData()
Dim Chemin As String
Dim NomFichier As String
Chemin = "M:\donnees\metiers\TEID\400-TEID1_Production_Engineering\050-ALM\08_FRACHEA Pierre-Adrien\Maintenance Moyens\FSW\" 'Format du chemin "XX\XX\XX\"
NomFichier = "N80_PdM_global_V8.6.xlsx" 'Format du Nom : "XXXXX.xlsx"
Workbooks.Open Filename:=Chemin & NomFichier, ReadOnly:=True ' Ouverture du fichier data en lecture seule
'Importer la Data
Dim Base As String 'Base = Fichier Collègue
Dim Interface As String ' Interface = Fichier Moi
Base = "N80_PdM_global_V8.6.xlsx"
Interface = "Interface Maintenance FSW_V1"
'Copie des colonnes
Workbooks(Base).Worksheets("PdM").Range("A:A").Copy
Workbooks(Interface).Worksheets("DATA").Range("A1").PasteSpecial Paste:=xlPasteValues
Workbooks(Base).Worksheets("PdM").Range("K:K").Copy
Workbooks(Interface).Worksheets("DATA").Range("B1").PasteSpecial Paste:=xlPasteValues
Workbooks(Base).Worksheets("PdM").Range("O:O").Copy
Workbooks(Interface).Worksheets("DATA").Range("C1").PasteSpecial Paste:=xlPasteValues
Workbooks(Base).Worksheets("PdM").Range("S:S").Copy
Workbooks(Interface).Worksheets("DATA").Range("D1").PasteSpecial Paste:=xlPasteValues
Workbooks(Base).Worksheets("PdM").Range("W:W").Copy
Workbooks(Interface).Worksheets("DATA").Range("E1").PasteSpecial Paste:=xlPasteValues
End SubJe ne sais pas si j'ai été claire ^^'
Merci d'avance pour votre temps !
Sub OuvrirData()
Dim wsDest as worksheet, wsSource as worksheet
Dim Chemin$, NomFichier$, Base$, Interface$
Chemin = "M:\donnees\metiers\TEID\400-TEID1_Production_Engineering\050-ALM\08_FRACHEA Pierre-Adrien\Maintenance Moyens\FSW\" 'Format du chemin "XX\XX\XX\"
NomFichier = "N80_PdM_global_V8.6.xlsx" 'Format du Nom : "XXXXX.xlsx"
Workbooks.Open Filename:=Chemin & NomFichier, ReadOnly:=True ' Ouverture du fichier data en lecture seule
'Importer la Data
Set wsSource = Activeworkbook.Worksheets("PdM") 'Base = Fichier Collègue
Set wsDest = thisworkbook.Worksheets("DATA") 'Interface = Fichier Moi
'Copie des colonnes
with wsDest 'sur la feuille de destination
for i = 1 to 5 'pour les colonnes 1 à 5
NBL = Application.counta(wsSource.columns(i)) 'compte nombre de cellules de la colonne i de la source
select case i
case 1 'si colonne 1
.cells(1, i).resize(NBL, 1).value = wsSource.columns(i).value 'colonne 1 retaillée prend valeurs colonne 1 source
case else 'pour les autres colonnes
.cells(1, i).resize(NBL, 1).value = wsSource.columns(3 + i * 4).value 'colonne i retaillée prend valeurs de la colonne (3 + i * 4) de la source
end select
next i
end with
End SubEdit : code d'origine
Bonjour 3GB,
Je test ton code est je reviens vers toi ;)
C'est d'un tout autre niveau je dois avouer ^^' Je vais essayer de tout comprendre !
Merci pour ton temps
Alors ça fonctionne ! Mais je ne sais pas pourquoi ^^' Je vais essayer de comprendre ton code et de me familiariser avec :)
Merci beaucoup !!
Edit : message supprimé...
Je suis content que ça marche ! J'ai cru voir une erreur (d'où mes éditions de messages)
Voici ce que je propose plutôt :
Sub OuvrirData()
Dim wsDest as worksheet, wsSource as worksheet
Dim Chemin$, NomFichier$, Base$, Interface$
Chemin = "M:\donnees\metiers\TEID\400-TEID1_Production_Engineering\050-ALM\08_FRACHEA Pierre-Adrien\Maintenance Moyens\FSW\" 'Format du chemin "XX\XX\XX\"
NomFichier = "N80_PdM_global_V8.6.xlsx" 'Format du Nom : "XXXXX.xlsx"
Workbooks.Open Filename:=Chemin & NomFichier, ReadOnly:=True ' Ouverture du fichier data en lecture seule
'Importer la Data
Set wsSource = Activeworkbook.Worksheets("PdM") 'Base = Fichier Collègue
Set wsDest = thisworkbook.Worksheets("DATA") 'Interface = Fichier Moi
'Copie des colonnes
with wsDest 'sur la feuille de destination
for i = 1 to 5 'pour les colonnes 1 à 5
select case i
case 1 'si colonne 1
NBL = Application.counta(wsSource.columns(i)) 'compte nombre de cellules de la colonne i de la source
.cells(1, i).resize(NBL, 1).value = wsSource.columns(i).value 'colonne 1 retaillée prend valeurs colonne 1 source
case else 'pour les autres colonnes
NBL = Application.counta(wsSource.columns(3 + i * 4)) 'compte nombre de cellules de la colonne (3 + i * 4) de la source
.cells(1, i).resize(NBL, 1).value = wsSource.columns(3 + i * 4).value 'colonne i retaillée prend valeurs de la colonne (3 + i * 4) de la source
end select
next i
end with
End SubMaintenant, ça devrait prendre les bonnes valeurs car j'ai fait une petite inversion.
Le code ouvre le fichier de ton collègue (qui devient le classeur actif) tandis que ton fichier est l'exécutant (Thisworkbook).
Sur le fichier exécutant, le destinataire donc, les colonnes 1 à 5 prennent les valeurs des colonnes 1 ou (3 + i * 4) du fichier Base (c'est-à-dire 11, 15, 19, 23 quand i vaut resp. 2, 3, 4, 5). Tout ça grâce à une boucle et une récurrence identifiée à partir de la deuxième colonne à importer.
Re 3GB,
Petite question, si j'insert une nouvelle colonne (par exemple entre B et C) ma colonne "C" deviendra "D", la "D" deviendra "E", etc...
Donc si je copiais les valeurs de la colonne "C" comme ses valeurs ce sont déplacé en colonne "D" mon copier-coller ne sera plus bon.
Je ne sais pas si votre code résout ce problème ?
Non, tu insères une nouvelle colonne, les données seront toujours copiées aux mêmes emplacements (sur les 5 premières).
Il y a moyen de dire (puisqu'on a déjà un select case 1 ou autres) de coller en colonne i+1 de ton fichier quand i ne vaut pas 1.
Mais, à mon avis, le mieux serait de définir ta plage comme un tableau structuré (et si possible celle de ton collègue aussi) afin de coller les valeurs en fonction des titres de colonnes et non de leur index dans la feuille.
Moi, je peux définir ma plage comme un tableau structuré il n'y a aucun problème là-dessus, mais pour mon collègue ça sera plus compliqué (voir pas possible... Malheure...).
Le code change beaucoup si on travaille à partir des titres des colonnes ?
Merci encore pour votre réactivité !
Je t'en prie !
A bientôt,
J'ai créer mon tableau.
Nom tableau : Tableaudata
Colonne A : Codification (trouve ses données en A)
Colonne B : EquipmentLevel1 (trouve ses données en K)
Colonne C : EquipmentLevel2 (trouveses données en O)
Colonne D : EquipmentLevel3 (trouveses données en S)
Colonne E : EquipmentLevel4 (trouve ses données en W)
Colonne F : EquipmentLevel5 (trouve ses données en AA
Colonne G : EquipmentLevel6 (trouve ses données en AE)
Colonne H : EquipmentDefinitionfile (trouve ses données en AM)
Colonne I : Additionaloperation (trouve ses données en BC)
Colonne J : Periodicity (trouve ses données en BD)
Colonne K : PeriodicityUnit (trouve ses données en BE)
Colonne L : Operationduration (trouve ses données en BG)
Dit moi si il te manque quelque chose :)
Bonsoir,
Avec le tableau nommé et les nouvelles colonnes à prendre en compte, voici le code à essayer :
Sub OuvrirData()
Dim wsDest as worksheet, wsSource as worksheet
Dim Chemin$, NomFichier$, Base$, Interface$
Chemin = "M:\donnees\metiers\TEID\400-TEID1_Production_Engineering\050-ALM\08_FRACHEA Pierre-Adrien\Maintenance Moyens\FSW\" 'Format du chemin "XX\XX\XX\"
NomFichier = "N80_PdM_global_V8.6.xlsx" 'Format du Nom : "XXXXX.xlsx"
Workbooks.Open Filename:=Chemin & NomFichier, ReadOnly:=True ' Ouverture du fichier data en lecture seule
'Importer la Data
Set wsSource = Activeworkbook.Worksheets("PdM") 'Base = Fichier Collègue
Set wsDest = thisworkbook.Worksheets("DATA") 'Interface = Fichier Moi
'Copie des colonnes
with wsDest 'sur la feuille de destination
NBL = Application.counta(wsSource.columns(1)) 'compte nombre de cellules de la colonne i de la source
.Range("Tableaudata[Codification]").resize(NBL, 1).value = wsSource.columns(1).value 'colonne 1 retaillée prend valeurs colonne 1 source
for i = 2 to 7 'pour les colonnes 1 à 5
NBL = Application.counta(wsSource.columns(3 + i * 4)) 'compte nombre de cellules de la colonne (3 + i * 4) de la source
.Range("Tableaudata[EquipmentLevel" & i - 1 & "]").resize(NBL, 1).value = wsSource.columns(3 + i * 4).value 'colonne i retaillée prend valeurs de la colonne (3 + i * 4) de la source
next i
NBL = Application.counta(wsSource.columns(39)) 'compte nombre de cellules de la colonne 39 de la source
.Range("Tableaudata[EquipmentDefinitionfile]").resize(NBL, 1).value = wsSource.columns(39).value 'colonne i retaillée prend valeurs de la colonne 39 de la source
NBL = Application.max(Application.counta(wsSource.columns(55)), _
Application.counta(wsSource.columns(56)), Application.counta(wsSource.columns(57))) 'compte max nombre de cellules entre colonnes 55 à 57 de la source
.Range("Tableaudata[Additionaloperation:PeriodicityUnit]").resize(NBL, 3).value = wsSource.columns("BC:BE").value 'colonnes 9 à 11 retaillées prennent valeurs des colonnes 55 à 57 de la source
NBL = Application.counta(wsSource.columns(59)) 'compte nombre de cellules de la colonne 59 de la source
.Range("Tableaudata[Operationduration]").resize(NBL, 1).value = wsSource.columns(59).value 'colonne 12 retaillée prend valeurs de la colonne 59 de la source
end with
End SubC'est probablement améliorable mais ça devrait fonctionner.
Wowww ! Tu gères ! Merci beaucoup !!!
j’essaye ça demain matin et je te fais un retour :)
Dans tous les cas merci beaucoup pour ton aide et ta patience !
Je t'en prie, bonne nuit !
Il y a un bug parce que l'objet n'est pas reconnu donc fort probablement parce que le nom du tableau ou de la colonne en question est mal renseigné dans le code.
Il faut le remplacer dans le code par le bon nom (à coup de ctrl + F : remplacer : "lemauvaisnom" par "lebonnom").
D'ailleurs, plus les noms sont courts et simples, mieux c'est
Attention cependant à laisser les numéros des colonnes Equipmentlevel car le code utilise cette numérotation.
Cdlt,
Super merci ! je me doutai que le nom en etait la cause !
Merci pour ta petite astuce ! :)
Bonjour 3GB !
J'ai besoin de ton expertise si tu veux bien :)
Je te présente mon code qui tourne depuis 3 mois maintenant. Or, la semaine dernière, je me suis aperçu que la totalité des colonnes du fichier DATA n'étaient pas "copier-coller" sur mon interface ...
Par exemple la colonne "A" qui comprend 3728 lignes s'arrête à la ligne 3727... mais ce qui est bizarre c'est que la colonne "C" qui comprend aussi 3728 lignes, s'arrête à la ligne 1802...
Je crains que le problème vienne du fichier Excel de mon collègue, mais je voudrai, si tu veux bien, que tu vérifies que mon code ne comporte pas d'erreur.
Mon code :
Sub OuvrirDatatest()
'Message de lancement ou non de la macro
If MsgBox("Avant de lancer le chargement des données, vérifier de bien être branché au réseau ! Sinon, cliquer sur 'Annuler'. ", vbOKCancel + vbExclamation, "Chargement des données") = vbCancel Then
Exit Sub
End If
'Message d'information sur la durrée de traitement
If MsgBox("Le traitement des données peut prendre un moment merci de patienter", vbInformation, "Il est temps de prendre un café non ?") = vbOK Then
End If
'Définition des variables
Dim wsDest As Worksheet, wsSource As Worksheet, wsPart As Worksheet, wsConso As Worksheet
Dim Chemin$, NomFichier$, Base$, Interface$
'Format du chemin "XX\XX\XX\"
Chemin = "M:\donnees\metiers\TEID\400-TEID1_Production_Engineering\050-ALM\08_FRACHEA Pierre-Adrien\Maintenance\Projet PFE\"
'Format du Nom : "XXXXX.xlsx"
NomFichier = "N80_PdM_global_V9.4.xlsx"
'Ouverture du fichier data en lecture seule et annulation du message de mise à jour (messages d'erreurs)
Workbooks.Open Filename:=Chemin & NomFichier, ReadOnly:=True, UpdateLinks:=0
'::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
' TRAITEMENT Feuille DATA
Set wsSource = ActiveWorkbook.Worksheets("PdM") 'Data Base = PDM
Set wsDest = ThisWorkbook.Worksheets("DATA") 'Interface = Fichier Moi
'Copie des colonnes vers l'interface
With wsDest 'sur la feuille de destination
'Copie de la colonne "Codification" vers l'interface
NBL = Application.CountA(wsSource.Range("Tableau1[Codification]"))
.Range("Tableau3[Codification]").Resize(NBL, 1).Value = wsSource.Range("Tableau1[Codification]").Value
'Copie des colonnes "Equipment Level" 1 à 6 vers l'interface
.Range("Tableau3[Equipment Level 1]").Resize(NBL, 1).Value = wsSource.Range("Tableau1[Equipment Level 1]").Value
.Range("Tableau3[Equipment Level 2]").Resize(NBL, 1).Value = wsSource.Range("Tableau1[Equipment level 2]").Value
.Range("Tableau3[Equipment Level 3]").Resize(NBL, 1).Value = wsSource.Range("Tableau1[Equipment level 3]").Value
.Range("Tableau3[Equipment Level 4]").Resize(NBL, 1).Value = wsSource.Range("Tableau1[Equipment Level 4]").Value
.Range("Tableau3[Equipment Level 5]").Resize(NBL, 1).Value = wsSource.Range("Tableau1[Equipment level 5]").Value
.Range("Tableau3[Equipment Level 6]").Resize(NBL, 1).Value = wsSource.Range("Tableau1[Equipment level 6]").Value
'Copie de la colonne "Equipment Definition file reference 2" vers l'interface
NBL = Application.CountA(wsSource.Range("Tableau1[Equipment Definition file reference 2]"))
.Range("Tableau3[Equipment Definition file reference 2]").Resize(NBL, 1).Value = wsSource.Range("Tableau1[Equipment Definition file reference 2]").Value
'Copie de la colonne "Rationale" vers l'interface
NBL = Application.CountA(wsSource.Range("Tableau1[Rationale]"))
.Range("Tableau3[Rationale]").Resize(NBL, 1).Value = wsSource.Range("Tableau1[Rationale]").Value
End With
'::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
'Fermeture du fichier Data
Workbooks(NomFichier).Close False
End SubMerci d'avance pour ton aide et pour ton temps :)
Salut Pirateee,
Je me suis permis des petites libertés dans la façon de modifier (style, commentaires, ordre d'instructions et surtout façon de procéder).
Pour résumer, on teste l'existence du fichier avant tout. Si la connexion au réseau n'est pas établie, il y aura donc sortie de procédure sans bug (ça reste à confirmer) assortie d'un message.
J'ai créé 2 array permettant de lister les noms des colonnes d'origine et de destination pour simplifier. L'idéal serait d'en avoir un seul avec des noms de colonnes identiques. DONC il serait bien de supprimer tous les espaces indésirables sur les en-têtes de la source ! D'ailleurs, il serait préférable de renommer carrément ces en-têtes afin d'avoir des noms courts et simples.
En cas d'échec de l'ouverture du fichier (qui a priori serait dû au fait d'essayer d'ouvrir le fichier source déjà ouvert) on a une sortie avec message.
Sinon, c'est le grand changement (et j'attends de voir si ça va), on ne compte plus le nombre de valeurs, cause probable du problème en cas de cellules vides en milieu de colonne. On prend directement toutes les lignes (des colonnes ciblées bien entendu) du tableau source. Ces lignes viennent donc remplacer les lignes du tableau de destination. Normalement, les 2 tableaux sont de même hauteur... ?
Sub OuvrirDatatest()
Chemin = "M:\donnees\metiers\TEID\400-TEID1_Production_Engineering\050-ALM\08_FRACHEA Pierre-Adrien\Maintenance\Projet PFE\"
NomFichier = "N80_PdM_global_V9.4.xlsx"
if dir(Chemin & NomFichier) = "" then
msgbox "Fichier introuvable !" & vblf & vblf & "Vérifiez la connexion au réseau.", vbcritical, "Procédure avortée"
exit sub
end if
MsgBox "Le traitement des données peut prendre un moment merci de patienter", vbInformation, "Il est temps de prendre un café non ?"
tSource = array("Codification", "Equipment Level 1", "Equipment level 2", "Equipment level 3", "Equipment Level 4", "Equipment level 5", "Equipment level 6", "Equipment Definition file reference 2", "Rationale")
tDest = array("Codification", "Equipment Level 1", "Equipment Level 2", "Equipment Level 3", "Equipment Level 4","Equipment Level 5", "Equipment Level 6", "Equipment Definition file reference 2", "Rationale")
Set wsDest = ThisWorkbook.Worksheets("DATA") 'Interface = Fichier Moi
on error goto fin
with Workbooks.Open(Filename:=Chemin & NomFichier, ReadOnly:=True, UpdateLinks:=0)
with .Worksheets("PdM") 'Data Base = PDM
NBL = .Range("Tableau1").rows.count
for i = lbound(tDest) to ubound(tDest)
wsDest.Range("Tableau3[" & tDest(i) & "]").Resize(NBL, 1).Value = .Range("Tableau1[" & tSource(i) & "]").Value
next i
End With
.Close False
end with
exit sub
fin:
msgbox "Vérifiez que le fichier n'est pas ouvert avant d'exécuter la macro", vbcritical, "Procédure avortée"
End SubC'est à voir. Si tu as des questions ou des précisions, n'hésite pas. Et je pense que tu devrais suivre mon conseil sur les noms de colonne !
A bientôt,

