Copier plusieurs fichier vers dossier en doublon Macro VBA
Bonjour,
Je suis nouveau sur votre forum et je n'ai pas l'habitude de demander de l'aide, j'aime me débrouiller seul mais la j'avoue que cela dépasse mes compétences qui sont un peux limitées.
J'explique j'ai créé ce fichier pour mon boulot (tout seule comme un grand
Cela fonctionne mais le hic c'est lorsque les fichier sont en doublons, ils me les remplaces et je ne veux pas.
Je voudrais par exemple un fichier comme ci-dessous:
de base : Ad-A3H-001.pdf
doublon : Ad-A3H-001 - Copie.pdf
doublon suivant : Ad-A3H-001 - Copie (2).pdf
et aussi de suite...
voir la macro COPIERFICHIERPDF1 sur mon fichier.
Il me reste un autre souci je n'arrive pas non plus à copier des fichiers lorsque celui ci à une quantité x2 comme indiqué sur la cellule N23 (elle aussi soumise ensuite au Problème de doublon par la suite avec les autres case et ainsi de suite).
Je vous remercie de votre aide.
Bonjour Miller77
Petite question ton problème ce situe dans les sub "Sub COPIERFICHIERPDF" ?
Pourquoi toutes ces sub d'ailleurs ?
Tu peux commencer par remplacer toutes tes Sub par 1 seule
Edit : Pour la copie des fichiers en doublon j'ai créé le code à tester
' Penser à mettre cette option en tête des modules
Option Explicit
Sub CopierFichierPDF()
'Declaration
Dim Lig As Long, Inc As Integer
Dim FSO
Dim sFile As String, sFileTmp As String
Dim sSFolder As String
Dim sDFolder As String
'Create Object for File System
Set FSO = CreateObject("Scripting.FileSystemObject")
' For each row of 23 to 47
For Lig = 23 To 47
'This is Your File Name which you want to Copy.You can change File name at U23.
sFile = Sheets("Modèle").Range("U" & Lig)
'Change to match the source folder path. You can change Source Folder name at V23.
sSFolder = Sheets("Modèle").Range("V" & Lig)
'Change to match the destination folder path. You can change Destination Folder name at W23.
sDFolder = Sheets("Modèle").Range("W" & Lig)
'Checking If File Is Located in the Source Folder
If Not FSO.FileExists(sSFolder & sFile) Then
MsgBox "Specified File Not Found in Source Folder", vbInformation, "Not Found"
GoTo SuiteLigne
End If
'Copying If the Same File is Not Located in the Destination Folder
If Not FSO.FileExists(sDFolder & sFile) Then
FSO.CopyFile (sSFolder & sFile), sDFolder, True
MsgBox "Specified File Copied to Destination Folder Successfully", vbInformation, "Done!"
Else
' The file already exist use increment
Inc = 1
sFileTmp = Left(sFile, InStr(1, sFile, ".pdf")) & "Ex" & Format(Inc, "00") & ".pdf"
Do While FSO.FileExists(sDFolder & sFileTmp)
Inc = Inc + 1
sFileTmp = Left(sFile, InStr(1, sFile, ".pdf")) & "Ex" & Format(Inc, "00") & ".pdf"
Loop
FSO.CopyFile (sSFolder & sFile), sDFolder & sFileTmp, True
MsgBox "Specified File Copied to Destination Folder Successfully with number : Ex" & Inc, vbInformation, "Done!"
End If
SuiteLigne:
Next Lig
End SubD'après le code initial, tes fichiers de destination ne sont pas remplacés, mais tu as un message qui doit apparaître
A+
Tout d'abord Merci de ta réactivité.
Je suis vraiment autodidacte sur excel, je fouine, je cherche, je bidouille, si tu regarde de plus prêt je suis sûre que tu te tirerais les cheveux lol!
En tout cas parfait cette macro unique, j'avais cherché la solution mais je n'avais point trouver j'avais donc contourner comme d'hab.
Effectivement mes fichiers ne sont pas remplacer mais je voudrais qu'ils soit copier avec incrémentation quand cela est le cas, si j'ai 18 fichiers ou lignes dans mon tableau je dois avoir 18 PDF au final même avec des fichiers avec des noms similaires.
A cela se rajoute comme j'avais indiquer le problème de la quantité ensuite mais déjà si mon première problème est résolu ça sera déjà ça de gagné.
Vraiment merci, ton code marche nickel.
Je pourrais encore abusé et te demander de voir pour le problème de quantité?
Sur ma feuille colonne N23:N47 j'ai des quantités et si je met 2 pour N23 il me faudrait aussi 2 fichier au lieu de 1, cela se complique
Je sais pas trop si c'est bien clair mon histoire.
Re,
Oui effectivement je n'ai pas traité ce problème
Voici le code à tester
Option Explicit
Sub CopierFichierPDF()
'Declaration
Dim Lig As Long, Inc As Integer, NbQt As Integer, Qt As Integer
Dim FSO As Object, Wst As Worksheet
Dim sFile As String, sFileTmp As String
Dim sSFolder As String
Dim sDFolder As String
'Create Object for File System
Set FSO = CreateObject("Scripting.FileSystemObject")
' Define the worksheet
Set Wst = ThisWorkbook.Sheets("Modèle")
' For each row of 23 to 47
For Lig = 23 To 47
'This is Your File Name which you want to Copy.You can change File name at U23.
sFile = Wst.Range("U" & Lig)
'Change to match the source folder path. You can change Source Folder name at V23.
sSFolder = Wst.Range("V" & Lig)
'Change to match the destination folder path. You can change Destination Folder name at W23.
sDFolder = Wst.Range("W" & Lig)
'Checking If File Is Located in the Source Folder
If Not FSO.FileExists(sSFolder & sFile) Then
MsgBox "Specified File Not Found in Source Folder", vbInformation, "Not Found"
GoTo SuiteLigne
End If
' Quantity
NbQt = Wst.Range("N" & Lig)
' For each Quantity
For Qt = 1 To NbQt
'Copying If the Same File is Not Located in the Destination Folder
If Not FSO.FileExists(sDFolder & sFile) Then
FSO.CopyFile (sSFolder & sFile), sDFolder, True
MsgBox "Specified File Copied to Destination Folder Successfully", vbInformation, "Done!"
Else
' The file already exist use increment
Inc = 1
sFileTmp = Left(sFile, InStr(1, sFile, ".pdf")) & "Ex" & Format(Inc, "00") & ".pdf"
Do While FSO.FileExists(sDFolder & sFileTmp)
Inc = Inc + 1
sFileTmp = Left(sFile, InStr(1, sFile, ".pdf")) & "Ex" & Format(Inc, "00") & ".pdf"
Loop
FSO.CopyFile (sSFolder & sFile), sDFolder & sFileTmp, True
MsgBox "Specified File Copied to Destination Folder Successfully with number : Ex" & Inc, vbInformation, "Done!"
End If
Next Qt
SuiteLigne:
Next Lig
End SubA+
Je te remercie beaucoup cela fonctionne parfaitement.
il y avait une erreur à la ligne :
Set Wst = ThisWorkbook.Sheets("Modèle")
j'ai viré :ThisWorkbook. et cela à marché
Pour la rapidité j'ai supprimé les messages.
Encore merci pour ton aide c'est géniale.
A bientôt.
Bonjour à tous,
Je reviens vers vous avec mon petit fichier excel qui marche du tonnerre mais il me manque encore un petit truc pour qu'il soit parfait.
J'aimerais incrémenter la copie de mes fichiers .pdf avec les numéros qui vont bien en case A23 et A75.
En faite je voudrais copie mes fichiers comme aujourd’hui mais avec les noms modifié dans les case correspondante de Z23 à Z75.
Je vous remercie d'avance pour vos réponse.
Merci.
Bonjour Miler77,
Voici le code initial rectifié selon les nouvelles colonnes et ta nouvelle demande
Il est dommage que tu n'essayes pas d'analyser le code, le changement à faire est ultra simple
Sub CopierFichierPDF()
'Declaration
Dim Lig As Long
Dim FSO As Object
Dim sFile As String
Dim sSFolder As String
Dim sDFolder As String
'Create Object for File System
Set FSO = CreateObject("Scripting.FileSystemObject")
' For each row of 23 to 75
For Lig = 23 To 75
'This is Your File Name which you want to Copy.You can change File name at Zxx.
sFile = Sheets("Modèle").Range("Z" & Lig)
'Change to match the source folder path. You can change Source Folder name at V23.
sSFolder = Sheets("Modèle").Range("W" & Lig)
'Change to match the destination folder path. You can change Destination Folder name at W23.
sDFolder = Sheets("Modèle").Range("X" & Lig)
'Checking If File Is Located in the Source Folder
If Not FSO.FileExists(sSFolder & sFile) Then
MsgBox "Specified File Not Found in Source Folder", vbInformation, "Not Found"
'Copying If the Same File is Not Located in the Destination Folder
ElseIf Not FSO.FileExists(sDFolder & sFile) Then
FSO.CopyFile (sSFolder & sFile), sDFolder, True
MsgBox "Specified File Copied to Destination Folder Successfully", vbInformation, "Done!"
Else
MsgBox "Specified File Already Exists In The Destination Folder", vbExclamation, "File Already Exists"
End If
Next Lig
' Effacer la variable objet
Set FSO = Nothing
End SubA+
Bonjour Bruno,
Je te remercie encore pour ton aide.
Mais j'ai essayé pourtant, ça fait déjà plus de 2 semaines que je suis dessus et pas possible de trouver la solution.
Je vais analyser ton code pour trouver la ou je n'y arrivais pas.
Merci.
Rebonjour Bruno,
En faite c'est plus compliqué que ça, je me suis sûrement mal expliquer.
Je veux garder le fichier source en colonne V :
Set FSO = CreateObject("Scripting.FileSystemObject")
' For each row of 23 to 75
For Lig = 23 To 75
'This is Your File Name which you want to Copy.You can change File name at Vxx.
sFile = Sheets("Modèle").Range("V" & Lig)
Mais après ce fichier la en colonne v je veux effectivement le coller dans le fichier source mais avec un renommage du fichier avec une correspondance de colonne, ici la colonne A.
Pour la ligne 23 en exemple--
Départ : Div-A3H-011.pdf
source : ok
destination : ok
Nom du fichier au final : "A23&-"Div-A3H-011.pdf
En faite le code était déjà pas mal car il y avait l'incrémentation qui allait bien au cas ou il y avait un doublon et la relation avec la quantités qui allait bien aussi.
Je sais pas si c'est possible de faire tout ça en même temps avec le filecopy.
Je te remercie.
Re,
Peut-être ce code ci
Sub CopierFichierPDF()
'Declaration
Dim Lig As Long
Dim FSO As Object
Dim sFileSce As String, sFileDes As String
Dim sFolderSce As String, sFolderDes As String
'Create Object for File System
Set FSO = CreateObject("Scripting.FileSystemObject")
' For each row of 23 to 75
For Lig = 23 To 75
' This is Your File Name which you want to Copy. You can change File name at Vxx.
sFileSce = Sheets("Modèle").Range("V" & Lig)
' This is Your File Name which you want.
sFileDes = Sheets("Modèle").Range("Z" & Lig)
'Change to match the source folder path. You can change Source Folder name at V23.
sFolderSce = Sheets("Modèle").Range("W" & Lig)
'Change to match the destination folder path. You can change Destination Folder name at W23.
sFolderDes = Sheets("Modèle").Range("X" & Lig)
'Checking If File Is Located in the Source Folder
If Not FSO.FileExists(sFolderSce & sFileSce) Then
MsgBox "Specified File Not Found in Source Folder", vbInformation, "Not Found"
'Copying If the Same File is Not Located in the Destination Folder
ElseIf Not FSO.FileExists(sFolderDes & sFileDes) Then
FSO.CopyFile sFolderSce & sFileSce, sFolderDes & sFileDes, True
MsgBox "Specified File Copied to Destination Folder Successfully", vbInformation, "Done!"
Else
MsgBox "Specified File Already Exists In The Destination Folder", vbExclamation, "File Already Exists"
End If
Next Lig
' Effacer la variable objet
Set FSO = Nothing
End SubA+
Ca marche nickel.
Milles merci à toi.
Mais que pense tu de ça?? pour l'intégration des quantités et incrémentation?
J'ai un souci l'incrémentation fonctionne mais j'ai un fichier de plus pour chaque ligne, je m'explique.
Si je met des quantité de 3 au lieu de me retrouver avec 3 fichier, je me retrouve avec 4 fichiers
Sub edcopie()
'Declaration
Dim Lig As Long, Inc As Integer, NbQt As Integer, Qt As Integer
Dim FSO As Object
Dim sFileSce As String, sFileDes As String
Dim sFolderSce As String, sFolderDes As String
'Create Object for File System
Set FSO = CreateObject("Scripting.FileSystemObject")
' For each row of 23 to 97
For Lig = 23 To 97
' This is Your File Name which you want to Copy. You can change File name at Vxx.
sFileSce = Sheets("Modèle").Range("V" & Lig)
' This is Your File Name which you want.
sFileDes = Sheets("Modèle").Range("Z" & Lig)
'Change to match the source folder path. You can change Source Folder name at V23.
sFolderSce = Sheets("Modèle").Range("W" & Lig)
'Change to match the destination folder path. You can change Destination Folder name at W23.
sFolderDes = Sheets("Modèle").Range("X" & Lig)
'Checking If File Is Located in the Source Folder
If Not FSO.FileExists(sFolderSce & sFileSce) Then
MsgBox "Specified File Not Found in Source Folder", vbInformation, "Not Found"
'Copying If the Same File is Not Located in the Destination Folder
ElseIf Not FSO.FileExists(sFolderDes & sFileDes) Then
FSO.CopyFile sFolderSce & sFileSce, sFolderDes & sFileDes, True
Else
MsgBox "Specified File Already Exists In The Destination Folder", vbExclamation, "File Already Exists"
GoTo SuiteLigne
End If
' Quantity
NbQt = Sheets("Modèle").Range("o" & Lig)
' For each Quantity
For Qt = 1 To NbQt
'Copying If the Same File is Not Located in the Destination Folder
If Not FSO.FileExists(sFolderDes & sFileDes) Then
FSO.CopyFile sFolderSce, sFolderDes & sFileSce, True
Else
' The file already exist use increment
Inc = 1
sFileTmp = Left(sFileDes, InStr(1, sFileDes, ".pdf")) & "Ex" & Format(Inc, "00") & ".pdf"
Do While FSO.FileExists(sFolderDes & sFileTmp)
Inc = Inc + 1
sFileTmp = Left(sFileDes, InStr(1, sFileDes, ".pdf")) & "Ex" & Format(Inc, "00") & ".pdf"
Loop
FSO.CopyFile (sFolderSce & sFileSce), sFolderDes & sFileTmp, True
End If
Next Qt
SuiteLigne:
Next Lig
' Effacer la variable objet
Set FSO = Nothing
End Sub@+
Re,
Essayes peut-être tout simplement avec ce code
On utilise la quantité comme incrément supplémentaire au nom de fichier
Sub CopierFichierPDFAvecQt()
'Declaration
Dim FSO As Object
Dim Lig As Long, Inc As Integer, NbQt As Integer, Qt As Integer
Dim sFileSce As String, sFileDes As String, sFileTmp As String
Dim sFolderSce As String, sFolderDes As String
'Create Object for File System
Set FSO = CreateObject("Scripting.FileSystemObject")
' For each row of 23 to 97
For Lig = 23 To 97
' This is Your File Name which you want to Copy. You can change File name at Vxx.
sFileSce = Sheets("Modèle").Range("V" & Lig)
' This is Your File Name which you want.
sFileDes = Sheets("Modèle").Range("Z" & Lig)
'Change to match the source folder path. You can change Source Folder name at V23.
sFolderSce = Sheets("Modèle").Range("W" & Lig)
'Change to match the destination folder path. You can change Destination Folder name at W23.
sFolderDes = Sheets("Modèle").Range("X" & Lig)
' Quantity
NbQt = Sheets("Modèle").Range("o" & Lig)
' For each Quantity
For Qt = 1 To NbQt
' Créer le nom du fichier avec l'incrément de la quantité
sFileTmp = Left(sFileDes, InStr(1, sFileDes, ".pdf")) & "Ex" & Format(Qt, "00") & ".pdf"
' Copier le fichier s'il n'existe pas dans la destination
If Not FSO.FileExists(sFolderDes & sFileTmp) Then
FSO.CopyFile sFolderSce & sFileSce, sFolderDes & sFileTmp, True
End If
Next Qt
Next Lig
' Effacer la variable objet
Set FSO = Nothing
End SubA+
Ca fonctionne parfaitement.
C'était si simple finalement mais quand on part de zero c'est pas évident.
Je te remercie en tout cas.
@+