Copyfile permission refusée

Fermé
sormick - 24 sept. 2015 à 19:23
 sormick - 25 sept. 2015 à 15:42
Bonjour,

J'ai créé un code vba qui me permet de copier des fichiers jpg sur un disque dur externe.
Il me copie uniquement les fichiers selon la date de creation que j'ai choisi
J'ai également un code vba qui me détecte la lettre par exemple F:\ du disque dur Externe car parfois cette lettre change.

Par contre à chaque fois que je lance mon bout de code vba il y a souvent une erreur (70) permission refusée qui m'empêche de copier les fichiers.
Peu être est ce le fait que le dossier de destination du disque dur externe est en lecture seule?
J'ai déjà désactivé manuellement la lecture seule de ce dossier mais ça se réactive tout seul:

Je vous donnes mon code vba complet car on ne sait jamais que cette Erreur (70) soit du à un bout de code manquant ou mal écrit.

Merci d'avance pour votre aide

Sheets("cp87").Select
Sheets("macros").Range("a203").Value = ""
Dim appShell As Object
Dim FileName As Variant
Dim FilePath As Variant
Dim oFolder As Object
Dim oFolderItem As Object
Dim testdate As Variant

FolderPath = "D:\Users\Public\IMPORT\TAGSIMPORTAFAIRE\"
FileName = "*.jpg"

EnterDate:
testdate = InputBox("entrez la date de renommage des tags." & vbCrLf & "Exemple: 27/11/2014", "entrez la date", (Date))
If testdate = "" Then Exit Sub
If Not IsDate(testdate) Then
MsgBox "La date entrée n'est pas valide." & vbCrLf _
& "Veuillez re-saisir la date."
GoTo EnterDate
End If
testdate = CDate(testdate)

Set appShell = CreateObject("Shell.Application")
Set oFolder = appShell.Namespace(FolderPath)

For Each oFolderItem In oFolder.Items
If oFolderItem.Name Like FileName Then

If DateValue(oFolder.GetDetailsOf(oFolderItem, 3)) = testdate Then

If Not oFolderItem.Name Like "*TAGSAFAIRE*" Then
a = a + 1
Dim destination As String
Dim objDrive As Object
With CreateObject("Scripting.FileSystemObject")
For Each objDrive In .Drives
If objDrive.IsReady Then
If objDrive.VolumeName = "VERBATIM HD" Then
destination = objDrive.Path & "\SAUVEGARDE IMPORT\"
Sheets("macros").Range("a203").Value = "OUI"
Exit For
End If
End If
Next
End With
If Sheets("macros").Range("a203").Value = "" Then
MsgBox "Le disque externe de sauvegarde n'est pas connecté en USB!", vbCritical
Exit Sub
End If

Dim xlobj As Object
Set xlobj = CreateObject("Scripting.FileSystemObject")
xlobj.CopyFile FolderPath & oFolderItem.Name, destination & oFolderItem.Name, True

Set xlobj = Nothing

End If

End If
End If

Next oFolderItem

If a = "" Then
MsgBox "Il n'y a aucun tag pour cette date sélectionnée le: " & testdate & vbCrLf _
& "Veuillez choisir une autre date", vbCritical
Exit Sub
Else
MsgBox "Il y a eu: " & a & " tags qui ont été renommés le: " & testdate & vbCrLf & _
" sans les doublons et sans les tags qui n'ont pas été renommés."
End If

Dim appShell2 As Object, oFolder2 As Object, oFolderItem2 As Object




FolderPath = "D:\Users\Public\IMPORT\TAGSIMPORTAFAIRE\"
Set appShell2 = CreateObject("Shell.Application")
Set oFolder2 = appShell2.Namespace(FolderPath)

Dim rng As Range, cellul As Range
Set rng = Sheets("archivage").Range("z2:z65000")
For Each cellul In rng
If cellul.Value <> "" Then
On Error GoTo suit
b = b + 1
Dim xlobj2 As Object
Set xlobj2 = CreateObject("Scripting.FileSystemObject")
SetAttr FolderPath & cellul.Value, vbNormal
xlobj2.CopyFile FolderPath & cellul.Value, destination & cellul.Value, True

Set xlobj2 = Nothing
End If
suit::

Next cellul

If b = "" Then
Else
MsgBox "Il y a eu: " & b & " tags qui ont été corrigés: " & vbCrLf & _
" et qui ont été sauvegardés sur le disque externe."
End If

Sheets("archivage").Range("z2:z65000") = ""
Exit Sub

2 réponses

Bonjour!!

Please aidez moi!!! je galère avec ce problème d'erreur!!
Merci!!
0
PlacageGranby Messages postés 393 Date d'inscription mercredi 26 mars 2014 Statut Membre Dernière intervention 7 mars 2019 26
25 sept. 2015 à 14:25
Bonjour,

J'ai fait la recherche "VBA erreur 70" sur google, et selon Microsoft.
https://support.microsoft.com/fr-fr/help/147394

CAUSE
Ce problème se produit si le fichier source que vous souhaitez copier est ouvert lorsque vous essayez d'exécuter la macro.


Autre KB qui n'a peut-être pas rapport
https://support.microsoft.com/fr-fr/help/180384
L'erreur d'exécution « 70 » est généralement le résultat d'un problème de sécurité ou d'autorisations. La liste suivante recense des causes possibles de l'erreur d'exécution 70. Elle n'est cependant ni exhaustive, ni définitive.

J'ai regarder un peu si il y a des macro pour tester l'état d'un fichier.
Je vois seulement du code pour tester si un document excel est ouvert ou non, mais rien pour un autre type de fichier.

J'ai aussi tombé sur ce site : http://www.info-3000.com/vbvba/fichiers/
Beaucoup d'exemple de code sur la copie de fichier et différente méthode. On sait jamais.

Malheureusement, je ne suis pas une superbole Excel qui peut détecter les problème à vue. Surtout que ton problème est peut-être plus lié à l'environnement que le code. Donc, a moins de réussir à reproduire le problème sur mon ordi, on peut difficilement t'aider.
0
Bonjour,

Finalement j'ai trouvé ce qui n'allait pas sur mon code:

Ce code:
Dim objDrive As Object
With CreateObject("Scripting.FileSystemObject")
For Each objDrive In .Drives
If objDrive.IsReady Then
If objDrive.VolumeName = "VERBATIM HD" Then
destination = objDrive.Path & "\SAUVEGARDE IMPORT\"

il me donnait l'erreur plus haut.

Je l'ai remplacé par celui ci qui a l'air de bien fonctionner:
Private Declare Function GetVolumeInformation Lib "Kernel32" Alias "GetVolumeInformationA" (ByVal lpRootPathName As String, ByVal lpVolumeNameBuffer As String, ByVal nVolumeNameSize As Long, lpVolumeSerialNumber As Long, lpMaximumComponentLength As Long, lpFileSystemFlags As Long, ByVal lpFileSystemNameBuffer As String, ByVal nFileSystemNameSize As Long) As Long
Function GetVolumeName(ByVal cDrive As String) As String
' http://www.codyx.org/snippet_recuperer-nom-attribue-lecteur-disque-cle-etc_863.aspx
' cDrive = CHAR (lettre) de A à Z
Dim sBuffer As String
Dim iEnd As Integer

sBuffer = Space$(255)
GetVolumeInformation cDrive & ":\", sBuffer, Len(sBuffer), 0&, 0&, 0&, vbNullString, 0&
iEnd = InStr(1, sBuffer, vbNullChar)
If iEnd Then GetVolumeName = Left$(sBuffer, iEnd - 1)
End Function
Function lettreLecteur(nomLecteur As String) As String
Dim l As Long
For l = 1 To 26
If GetVolumeName(Chr(64 + l)) = nomLecteur Then
lettreLecteur = Chr(l + 64)
Exit For
End If
Next l
End Function

Dim r As String, nomLecteur As String
nomLecteur = "VERBATIM HD"
r = lettreLecteur(nomLecteur)
If r <> "" Then
Dim destination As String
destination = r & ":\SAUVEGARDE IMPORT\"
Else
MsgBox ("Lecteur '" & nomLecteur & "' non trouvé."), vbCritical
Exit Sub
End If
0