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

15prefac.xlsx (17.00 Ko)
15test-axio-v4.xlsx (12.83 Ko)

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é !!!!

Rechercher des sujets similaires à "copier coller entre fichier"