Copier coller entre fichier
Bonjour
je souhaiterai copier des colonnes sur le fichier test axio v4,
cette manip doit s effectuer a partir d une selection de date situé en colonne E
Exemple je sélectionne la date du 1er juillet
je copie de test axio v4 a prefac les éléments qui apparaissent dans les colonnes en date du 1er juillet
ci joint les elements a copier coller
1-copier test axio V4, colonne F =>coller en suivant sur le fichier prefac colonne P
2-copier test axio V4, colonne J =>coller en suivant sur le fichier prefac colonne J
3-copier test axio V4, colonne R =>coller en suivant sur le fichier prefac colonne O
4-copier test axio V4, colonne S =>coller en suivant sur le fichier prefac colonne W
5-copier test axio V4, colonne Y =>coller en suivant sur le fichier prefac colonne G
6-copier test axio V4, colonne Z =>coller en suivant sur le fichier prefac colonne H
7-copier test axio V4, colonne AE =>coller en suivant sur le fichier prefac colonne AE
8-copier test axio V4, colonne AF =>coller en suivant sur le fichier prefac colonne AF
9- copier test axio V4, colonne AG =>coller en suivant sur le fichier prefac colonne AG
10-copier test axio V4, colonne AH=>coller en suivant sur le fichier prefac colonne AH
j ai tenté pas mal de chose mais je n y arrive pas
actuellement je le fais manuellement
merci pour votre aide
Bonjour Serge, bonjour le forum,
Attention ! je suis parti de l'hypothèse que les deux classeurs étaient enregistrés dans le même dossier ou que les deux classeurs étaient ouverts avant de lancer la macro...
Si j'ai bien compris, le code ci-dessous, à mettre dans le classeur test axio v4 qui prendra, par conséquent l'extension .xlsm, devrait convenir :
Sub Macro1()
Dim CS As Workbook 'déclare la variable CS (Classeur Source)
Dim CH As String 'déclare la variable CH (CHemin d'accès)
Dim CD As Workbook 'déclare la variable CD (Classeur Destination)
Dim OS As Worksheet 'déclare la variable OS (Onglet Source)
Dim OD As Worksheet 'déclare la variable OD (Onglet Destination)
Dim DL As Integer 'déclare la variable DL (Dernière ligne)
Dim LR As Integer 'déclare la variable LR (Ligne de Référence)
Set CS = ThisWorkbook 'définit la classeur source CS
CH = CS.Path & "\" 'définit le chemin d'accès CH
On Error Resume Next 'gestion des erreurs (en cas d'erreur passe à la ligne suivante
Set CD = Workbooks("prefac.xlsx") 'définit le classeur destination CD (génère une erreur si ce classeur né st pas ouvert)
If Err <> 0 Then 'condition : si une erreur a été générée
Err.Clear 'efface l'erreur
Workbooks.Open (CH & "prefac.xlsx") 'ouvre le classeur "prefac.xlsx"
Set CD = ActiveWorkbook 'définit le classeur destination CD
End If 'fin de la condition
On Error GoTo 0 'annulela gestion des erreur
Set OS = CS.Sheets("Feuil1") 'définit l'onglet source OS
Set OD = CD.Sheets("Feuil1") 'définit l'onglet destination OD
DL = OS.Cells(Application.Rows.Count, 1).End(xlUp).Row 'définit la dernière ligne éditée DL de la colonne 1 (=A) de l'onglet source
LR = OD.Cells(Application.Rows.Count, 1).End(xlUp).Row + 1 'définit la première ligne vide LR de la colonne 1 (=A) de l'onglet destination OD
'copie des plages
OS.Range(OS.Cells(3, "F"), OS.Cells(DL, "F")).Copy OD.Cells(LR, "P") 'copie la colonne F de la source dans la colonne P de la destination
OS.Range(OS.Cells(3, "J"), OS.Cells(DL, "J")).Copy OD.Cells(LR, "J") 'copie la colonne J de la source dans la colonne J de la destination
OS.Range(OS.Cells(3, "R"), OS.Cells(DL, "R")).Copy OD.Cells(LR, "O") 'copie la colonne R de la source dans la colonne O de la destination
OS.Range(OS.Cells(3, "S"), OS.Cells(DL, "S")).Copy OD.Cells(LR, "W") 'copie la colonne S de la source dans la colonne W de la destination
OS.Range(OS.Cells(3, "Y"), OS.Cells(DL, "Y")).Copy OD.Cells(LR, "G") 'copie la colonne Y de la source dans la colonne G de la destination
OS.Range(OS.Cells(3, "Z"), OS.Cells(DL, "Z")).Copy OD.Cells(LR, "H") 'copie la colonne Z de la source dans la colonne H de la destination
OS.Range(OS.Cells(3, "AE"), OS.Cells(DL, "AH")).Copy OD.Cells(LR, "AE") 'copie la plage AE:AH de la source dans la colonne AE de la destination
End Sub
Re,
Arf ! J'ai relu et vu qu'il y avait un critère de date... Code à revoir complètement mais là je n'ai plus le temps... Plus tard !
bonjour
oui effectivement c est ce paramètre qui me prend la tête
merci deja pour le travail accompli
Bonjour le fil
@ThauThème, je me permets d'attirer ton attention sur tes déclarations de variables "Integer" pour les lignes
ThauThème a écrit :Dim DL As Integer 'déclare la variable DL (Dernière ligne) Dim LR As Integer 'déclare la variable LR (Ligne de Référence)
Un "Integer" en VBA prend les valeurs de -32.768 à 32767, or le nombre de ligne est bien plus grand
Tu auras donc à un moment donné une erreur 6 : Dépassement de capacité
Petit test pour te démontrer
Sub Test()
Dim DL As Integer ' Dernière ligne
DL = Range("A1").End(xlDown).Row
End Sub
A+
Bonjour le fil, bonjour le forum,
@Bruno
Juste une question d'habitude car les tableaux de plus de 32 767 ligne sont assez rares et je n'utilise pratiquement jamais xlDown pour atteindre la dernière ligne éditée d'une colonne. Mais tu as tout à fait raison...
@Serge
Je ne lâche pas l'affaire...
Re,
Voici une nouvelle proposition qui devrait convenir :
Sub Macro1()
Dim CS As Workbook 'déclare la variable CS (Classeur Source)
Dim OS As Worksheet 'déclare la variable OS (Onglet Source)
Dim DL As Integer 'déclare la variable DL (Dernière ligne)
Dim PL As Range 'déclare la variable PL (PLage)
Dim PLV As Range 'déclare la variable PLV (PLage Visible)
Dim CH As String 'déclare la variable CH (CHemin d'accès)
Dim CD As Workbook 'déclare la variable CD (Classeur Destination)
Dim OD As Worksheet 'déclare la variable OD (Onglet Destination)
Dim LR As Integer 'déclare la variable LR (Ligne de Référence)
Application.ScreenUpdating = False 'masque les rafraîchissements d'écran
Set CS = ThisWorkbook 'définit la classeur source CS
Set OS = CS.Sheets("Feuil1") 'définit l'onglet source OS
CS.Activate 'actice le classeur source CS
OS.Select 'active l'onglet source OS
If Not IsDate(ActiveCell) = True Or ActiveCell.Column <> 5 Then 'condition : si la cellule active n'est pas une date
MsgBox "Vous devez sélectionner la date de référence dans la colonne E !" 'message
Range("E3").Select 'sélectionne la cellule E3
Exit Sub 'sort de la procédure
End If 'fin de la condition
DL = OS.Cells(Application.Rows.Count, 1).End(xlUp).Row 'définit la dernière ligne éditée DL de la colonne 1 (=A) de l'onglet source OS
Set PL = OS.Range("A3:AH" & DL) 'définit la plage PL (le tableau sans la première ligne)
'filtre le tableau par rapport à la colonne E avec la date de la cellule active comme critère
OS.Range("A2").AutoFilter Field:=5, Criteria1:=Format(DateSerial(Year(ActiveCell.Value), Month(ActiveCell.Value), Day(ActiveCell.Value)), "dd/mm/yyyy")
Set PLV = PL.SpecialCells(xlCellTypeVisible) 'définit la plage PLV (la plage PL visible après le filtre)
CH = CS.Path & "\" 'définit le chemin d'accès CH
On Error Resume Next 'gestion des erreurs (en cas d'erreur passe à la ligne suivante
Set CD = Workbooks("prefac.xlsx") 'définit le classeur destination CD (génère une erreur si ce classeur né st pas ouvert)
If Err <> 0 Then 'condition : si une erreur a été générée
Err.Clear 'efface l'erreur
Workbooks.Open (CH & "prefac.xlsx") 'ouvre le classeur "prefac.xlsx"
Set CD = ActiveWorkbook 'définit le classeur destination CD
End If 'fin de la condition
On Error GoTo 0 'annule la gestion des erreurs
Set OD = CD.Sheets("Feuil1") 'définit l'onglet destination OD
LR = OD.Cells(Application.Rows.Count, 16).End(xlUp).Row + 1 'définit la ligne de référence LR par rapport à la colonne 16 (=P) de l'onglet OD
Application.Intersect(PLV, OS.Columns("F:F")).Copy OD.Cells(LR, "P") 'copie la colonne F visible de la source dans la colonne P de la destination
Application.Intersect(PLV, OS.Columns("J:J")).Copy OD.Cells(LR, "J") 'copie la colonne J visible de la source dans la colonne J de la destination
Application.Intersect(PLV, OS.Columns("R:R")).Copy OD.Cells(LR, "O") 'copie la colonne R visible de la source dans la colonne O de la destination
Application.Intersect(PLV, OS.Columns("S:S")).Copy OD.Cells(LR, "W") 'copie la colonne S visible de la source dans la colonne W de la destination
Application.Intersect(PLV, OS.Columns("Y:Z")).Copy OD.Cells(LR, "G") 'copie la plage Y:Z visible de la source dans la colonne G de la destination
Application.Intersect(PLV, OS.Columns("AE:AH")).Copy OD.Cells(LR, "AE") 'copie la plage AE:AH visible de la source dans la colonne AE de la destination
OS.Range("A2").AutoFilter 'supprime le filte automatique
Application.ScreenUpdating = True 'affiche les rafraîchissements d'écran
End Sub
Pour automatiser au double-clic tu peux :
• Copier le code ci-dessus dans une module standard nommé Module 1
• Dans le composant VBA de l'onglet Feuil1 [Feuil(Feuil1)] du classeur source, tu copies la procédure événementielle ci-dessous :
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Module1.Macro1 'lance la procédure "Macro1" du module [Module1]
Cancel = True 'empêche le mode édition lié au double-clic
End Sub
Ainsi, en double-cliquant sur une date de la colonne E, la procédure se lance automatiquement...
bonjour
merci pour le travail accompli
j ai tenté d insérer les codes Vba dans le classeur test axio v4 , j ai uniquement modifié l adresse d expédition pour qu il corresponde a la véritable adresse de destination
voici le code apres modification des adresses
Sub Macro1()
Dim CS As Workbook 'déclare la variable CS (Classeur Source)
Dim OS As Worksheet 'déclare la variable OS (Onglet Source)
Dim DL As Integer 'déclare la variable DL (Dernière ligne)
Dim PL As Range 'déclare la variable PL (PLage)
Dim PLV As Range 'déclare la variable PLV (PLage Visible)
Dim CH As String 'déclare la variable CH (CHemin d'accès)
Dim CD As Workbook 'déclare la variable CD (Classeur Destination)
Dim OD As Worksheet 'déclare la variable OD (Onglet Destination)
Dim LR As Integer 'déclare la variable LR (Ligne de Référence)
Application.ScreenUpdating = False 'masque les rafraîchissements d'écran
Set CS = ThisWorkbook 'définit la classeur source CS
Set OS = CS.Sheets("planning") 'définit l'onglet source OS
CS.Activate 'actice le classeur source CS
OS.Select 'active l'onglet source OS
If Not IsDate(ActiveCell) = True Or ActiveCell.Column <> 5 Then 'condition : si la cellule active n'est pas une date
MsgBox "Vous devez sélectionner la date de référence dans la colonne E !" 'message
Range("E3").Select 'sélectionne la cellule E3
Exit Sub 'sort de la procédure
End If 'fin de la condition
DL = OS.Cells(Application.Rows.Count, 1).End(xlUp).Row 'définit la dernière ligne éditée DL de la colonne 1 (=A) de l'onglet source OS
Set PL = OS.Range("A3:AH" & DL) 'définit la plage PL (le tableau sans la première ligne)
'filtre le tableau par rapport à la colonne E avec la date de la cellule active comme critère
OS.Range("A2").AutoFilter Field:=5, Criteria1:=Format(DateSerial(Year(ActiveCell.Value), Month(ActiveCell.Value), Day(ActiveCell.Value)), "dd/mm/yyyy")
Set PLV = PL.SpecialCells(xlCellTypeVisible) 'définit la plage PLV (la plage PL visible après le filtre)
CH = CS.Path & "\" 'définit le chemin d'accès CH
On Error Resume Next 'gestion des erreurs (en cas d'erreur passe à la ligne suivante
Set CD = Workbooks("COPIE SERGE- PREFACTURATION DES TRANSPORTEURS avec TIP V6.xlsm") 'définit le classeur destination CD (génère une erreur si ce classeur né st pas ouvert)
If Err <> 0 Then 'condition : si une erreur a été générée
Err.Clear 'efface l'erreur
Workbooks.Open (CH & "COPIE SERGE- PREFACTURATION DES TRANSPORTEURS avec TIP V6.xlsm") 'ouvre le classeur "COPIE SERGE-PREFACTURATION DES TRANSPORTEURS avec TIP V6.XLSM"
Set CD = ActiveWorkbook 'définit le classeur destination CD
End If 'fin de la condition
On Error GoTo 0 'annule la gestion des erreurs
Set OD = CD.Sheets("base de transport") 'définit l'onglet destination OD
LR = OD.Cells(Application.Rows.Count, 16).End(xlUp).Row + 1 'définit la ligne de référence LR par rapport à la colonne 16 (=P) de l'onglet OD
Application.Intersect(PLV, OS.Columns("F:F")).Copy OD.Cells(LR, "P") 'copie la colonne F visible de la source dans la colonne P de la destination
Application.Intersect(PLV, OS.Columns("J:J")).Copy OD.Cells(LR, "J") 'copie la colonne J visible de la source dans la colonne J de la destination
Application.Intersect(PLV, OS.Columns("R:R")).Copy OD.Cells(LR, "O") 'copie la colonne R visible de la source dans la colonne O de la destination
Application.Intersect(PLV, OS.Columns("S:S")).Copy OD.Cells(LR, "W") 'copie la colonne S visible de la source dans la colonne W de la destination
Application.Intersect(PLV, OS.Columns("Y:Z")).Copy OD.Cells(LR, "G") 'copie la plage Y:Z visible de la source dans la colonne G de la destination
Application.Intersect(PLV, OS.Columns("AE:AH")).Copy OD.Cells(LR, "AE") 'copie la plage AE:AH visible de la source dans la colonne AE de la destination
OS.Range("A2").AutoFilter 'supprime le filte automatique
Application.ScreenUpdating = True 'affiche les rafraîchissements d'écran
End Sub
Resultat il me met un message d erreur ci joint et pourtant je sélectionne la cellule ou la date apparaît
Set PLV = PL.SpecialCells(xlCellTypeVisible) 'définit la plage PLV (la plage PL visible après le filtre)
c est frustrant , j ai du faire une connerie mais je ne sais pas ou ?
Bonjour Serge, bonjour le forum,
Moi je n'ai que tes deux premiers fichiers pour tester et ça marche. Je ne pourrais pas t'en dire plus sans les nouveaux fichiers...
ok $
je vais les renommer de la meme facon
je vous dirais
Bonjours
suite
j ai recopié le code sur les fichiers d origine et il ne me copie que la 1ere ligne , c est a dire l intitule en plus il me met une erreur code 400 visual basic ?
Je n aime pas baisse les bras mais cela devient complique pour moi
Re,
Je ne pourrais malheureusement t'aider qu'avec les fichiers. Si ils sont confidentiels ou trop volumineux, envoie-les par mail perso...
Bonjour
pour que ce soit plus claire pour les personnes qui souhaitent m aider ,
ci joint une macro basique que j ai fait et qui fonctionne , que st ce que je devrait modifier pour que
1- la notion date soit prisen en compte
2- Que sur le fichier destinataire COPIE SERGE- PREFACTURATION DES TRANSPORTEURS avec TIP V6.xlsm",les éléments collés viennent s ajouter automatiquement en suivant sur le fichier
merci pour votre aide
ci joint le code
Sub suite()
'
' suite Macro
'
'
Range("E3:E70").Select
Selection.Copy
ActiveWindow.SmallScroll Down:=-45
Windows("COPIE SERGE- PREFACTURATION DES TRANSPORTEURS avec TIP V6.xlsm"). _
Activate
ActiveWindow.SmallScroll Down:=117
Range("E12280").Select
Range("E12280").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Windows("test axio v4.xlsm").Activate
ActiveWindow.SmallScroll Down:=-18
Range("F3:F70").Select
Application.CutCopyMode = False
Selection.Copy
Windows("COPIE SERGE- PREFACTURATION DES TRANSPORTEURS avec TIP V6.xlsm"). _
Activate
ActiveWindow.SmallScroll ToRight:=-17
Range("P12280").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Windows("test axio v4.xlsm").Activate
Range("J3:J70").Select
Range("J70").Activate
Application.CutCopyMode = False
Selection.Copy
Windows("COPIE SERGE- PREFACTURATION DES TRANSPORTEURS avec TIP V6.xlsm"). _
Activate
Range("J12280").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Windows("test axio v4.xlsm").Activate
ActiveWindow.SmallScroll ToRight:=2
Range("R3:R70").Select
Application.CutCopyMode = False
Selection.Copy
Windows("COPIE SERGE- PREFACTURATION DES TRANSPORTEURS avec TIP V6.xlsm"). _
Activate
Range("O12280").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Windows("test axio v4.xlsm").Activate
Range("S3:S70").Select
Range("S70").Activate
Application.CutCopyMode = False
Selection.Copy
Windows("COPIE SERGE- PREFACTURATION DES TRANSPORTEURS avec TIP V6.xlsm"). _
Activate
ActiveWindow.SmallScroll ToRight:=2
Range("W12280").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Windows("test axio v4.xlsm").Activate
ActiveWindow.SmallScroll ToRight:=5
Range("U3:X70").Select
Application.CutCopyMode = False
Selection.Copy
Windows("COPIE SERGE- PREFACTURATION DES TRANSPORTEURS avec TIP V6.xlsm"). _
Activate
ActiveWindow.SmallScroll ToRight:=8
Range("AE12280").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Windows("test axio v4.xlsm").Activate
Range("Y3:Z70").Select
Range("Y70").Activate
Application.CutCopyMode = False
Selection.Copy
Windows("COPIE SERGE- PREFACTURATION DES TRANSPORTEURS avec TIP V6.xlsm"). _
Activate
Range("G12280").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
ActiveWindow.SmallScroll Down:=0
Windows("test axio v4.xlsm").Activate
ActiveWindow.SmallScroll Down:=-3
End Sub
Bonjour
j ai vainement tenté de faire marcher la macro depuis 2 semaines et tous les jours , malheureusement cela ne fonctionne pas
il me demande de sélectionner une date , et puis après code PLV inexistant apparaît , je ne sais pas pourquoi
avec toi cela marchait , j ai simplement copié collé la formule en adaptant les adresses des classeurs .
merci d avoir passé du temps pour moi sur ce projet ,
je suis desabusé !!!!