OVH Cloud OVH Cloud

création de répertoire

25 réponses
Avatar
fth
Bonjour,

ci-joint le bout de code qui me pose probleme:
...
NewMigPath = ("d:\MigAppli\") & Mid([AppliPath], 4)
If FolderExists(NewMigPath) = False Then


>>>>>c'est ici que ça calle .... (path/file access error) M'enfin!?
MkDir ("NewMigPath")

Quelqu'un(e) pourrait me dire ou ça coince?

D'avance merci

Frédéric

10 réponses

1 2 3
Avatar
Jessy Sempere [MVP]
Bon

Il serait intéressant de voir ton code complet...
Il y a de forte chance que tu essais de créer un répertoire en mettant
un chemin qui n'est pas valide genre F:TotoToto
alors qu'il faudrait F:TotoToto

Sinon, pour répondre à ton autre question, pour créer des sous répertoire
imbriquer, il te faudra le faire par étape en créant au fur et à mesure
le niveau inférieur le plus proche.

Voici donc un code qui te conviendra :

Function CreateSubDir(strPath As String)
Dim strTmp As String
Dim intPos As Integer
Dim FolderExists As Boolean

FolderExists = True

If IsNull(strPath) Or strPath = "" Then
Else
strTmp = strPath
intPos = InStr(4, strPath, "")
Do While intPos > 0
strTmp = Left(strPath, intPos - 1)
FolderExists = (Len(Dir$(strTmp, vbDirectory)) > 0&)
If FolderExists = False Then MkDir strTmp
intPos = InStr(intPos + 1, strPath, "")
Loop
FolderExists = (Len(Dir$(strPath, vbDirectory)) > 0&)
If FolderExists = False Then MkDir strPath
End If
End Function

@+
Jessy Sempere - Access MVP

------------------------------------
Site @ccess : http://access.jessy.free.fr/
Pour l'efficacité de tous :
http://users.skynet.be/mpfa/
------------------------------------
"fth" a écrit dans le message news:

Re bonjour Eric,

Bien vu pour la fonction FolderExist que je te dépose ci dessous:

Public Function FolderExists(varpath As Variant) As Boolean
On Error Resume Next
If Len(varpath) > 0& Then
FolderExists = (Len(Dir$(varpath, vbDirectory)) > 0&)
End If
End Function

Ceci dit, même sans cette fonction, mkdir me renvoi la mm erreur à savoir
:

'error76'
path not found

Merci pour tout!

Frédéric



"Eric" wrote in message
news:
le ",4" est la pour retirer le f:
Ceci dit, je ne sais pas pq je dois mettre 4, vu qu'il n'y a que 3
caractères à outrepasser ...



re,
La fonction Mid() ou Mid$() te permet de spécifier à partir de quel rang
du caractère tu veux extraire les données de la chaine.
Syntaxe : Mid(LaChaîne, PositionDépart[, Longueur])

Donc tu dois bien préciser 4 puisque le 1er caractère de la chaine
extraite est à la 4eme position dans la chaine à extraire.

On peut voir ta fonction FolderExists() car elle doit être batie sur la
méthode FolderExist d'un objet FileSystemObject qui retourne False si le
répertoire n'est pas trouvé sans générer d'erreur.

Chez Raymond, tu as une page entière avec toutes les méthodes de
Scripting


Runtime

http://officesystem.access.free.fr/scr_scripting_runtime.htm
--
A+
Eric
http://users.skynet.be/mpfa/
Archives :
http://groups.google.fr/group/microsoft.public.fr.access?hl=fr








Avatar
Eric
re,

Une solution, passer par l'API SHCreateDirectoryEx (Windows 2000 et +)

Exemple pour test:
Dans un module de formulaire, copies ca sous la ligne
Option Compare Database

Private Declare Function SHCreateDirectoryEx Lib "shell32" _
Alias "SHCreateDirectoryExA" (ByVal hwnd As Long, _
ByVal pszPath As String, _
ByVal psa As Any) As Long

Puis sur l'évènement click d'un bouton
Private Sub Commande0_Click()
'KPD-Team 2000
'URL: http://www.allapi.net/
'E-Mail:
'create the directory 'c:testdirhellosomethingapiguide'
SHCreateDirectoryEx Me.hwnd, _
"c:testdirhellosomethingapiguide", ByVal 0&
End Sub

Pour ton cas il faudra que tu adaptes le chemin à passer, ce qui donnerait :
...
NewMigPath= "d:MigAppli" & Mid([AppliPath], 4)
SHCreateDirectoryEx Me.hwnd, NewMigPath, ByVal 0&



Re bonjour,

Je viens de lire que la commande mkdir ne permet pas de creer des sub.
Zut alors
ça semble se vérifier quand je fais le test sub1sub2 etc ...

une idée?

Merci

Frédéric


"Jessy Sempere [MVP]" wrote in message
news:42dcbd33$

Re,

Et oui, j'avais pas vu non plus... ;-))

--
@+
Jessy Sempere - Access MVP

------------------------------------
Site @ccess : http://access.jessy.free.fr/
Pour l'efficacité de tous :
http://users.skynet.be/mpfa/
------------------------------------
"Eric" a écrit dans le message news:
#

Bonjour Jessy
Effectivement , je l'ai vu qu'après d'où mon second post
Mais son MkDir ("NewMigPath") n'est pas bon car il ne passe pas la
variable mais une valeur fixe


Bonjour

Je pense que ça vient surtout de l'initialisation de la variable



NewMigPath

Essais de mettre :
NewMigPath = "d:MigAppli" & Mid([AppliPath], 4)

PS : j'ai juste retiré les parenthèses.
--
@+
Jessy Sempere - Access MVP

------------------------------------
Site @ccess : http://access.jessy.free.fr/
Pour l'efficacité de tous :
http://users.skynet.be/mpfa/
------------------------------------









--
A+
Eric
http://users.skynet.be/mpfa/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr




Avatar
Eric
re,
Effectivement MkDir "c:rep1rep2" ne marche pas car rep1 n'existe pas,
d'où l'erreur Chemin d'accès introuvable .
Solution alternative à celle de Jessy en passant par une API, donnée sur
l'autre post.

--
A+
Eric
http://users.skynet.be/mpfa/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr
Avatar
fth
YESSSSSSS ! ! !

Je ne sais comment vous remercier pour vos solutions?

Merci beaucoup!

Frédéric

"Eric" wrote in message
news:
re,

Une solution, passer par l'API SHCreateDirectoryEx (Windows 2000 et +)

Exemple pour test:
Dans un module de formulaire, copies ca sous la ligne
Option Compare Database

Private Declare Function SHCreateDirectoryEx Lib "shell32" _
Alias "SHCreateDirectoryExA" (ByVal hwnd As Long, _
ByVal pszPath As String, _
ByVal psa As Any) As Long

Puis sur l'évènement click d'un bouton
Private Sub Commande0_Click()
'KPD-Team 2000
'URL: http://www.allapi.net/
'E-Mail:
'create the directory 'c:testdirhellosomethingapiguide'
SHCreateDirectoryEx Me.hwnd, _
"c:testdirhellosomethingapiguide", ByVal 0&
End Sub

Pour ton cas il faudra que tu adaptes le chemin à passer, ce qui donnerait
:
...
NewMigPath= "d:MigAppli" & Mid([AppliPath], 4)
SHCreateDirectoryEx Me.hwnd, NewMigPath, ByVal 0&



Re bonjour,

Je viens de lire que la commande mkdir ne permet pas de creer des sub.
Zut alors
ça semble se vérifier quand je fais le test sub1sub2 etc ...

une idée?

Merci

Frédéric


"Jessy Sempere [MVP]" wrote in message
news:42dcbd33$

Re,

Et oui, j'avais pas vu non plus... ;-))

--
@+
Jessy Sempere - Access MVP

------------------------------------
Site @ccess : http://access.jessy.free.fr/
Pour l'efficacité de tous :
http://users.skynet.be/mpfa/
------------------------------------
"Eric" a écrit dans le message news:
#

Bonjour Jessy
Effectivement , je l'ai vu qu'après d'où mon second post
Mais son MkDir ("NewMigPath") n'est pas bon car il ne passe pas la
variable mais une valeur fixe


Bonjour

Je pense que ça vient surtout de l'initialisation de la variable



NewMigPath

Essais de mettre :
NewMigPath = "d:MigAppli" & Mid([AppliPath], 4)

PS : j'ai juste retiré les parenthèses.
--
@+
Jessy Sempere - Access MVP

------------------------------------
Site @ccess : http://access.jessy.free.fr/
Pour l'efficacité de tous :
http://users.skynet.be/mpfa/
------------------------------------









--
A+
Eric
http://users.skynet.be/mpfa/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr






Avatar
fth
Re bonjour Jessy,

voici donc le code avec la dernière modif proposée par Eric.
Je teste ta solution aussi, les deux sont fonctionnelles, c'est génial.
Encore merci

Il me reste maintenant à faire passer chaque fichier de A97 à A2003
...oserais-je abuser?

Merci et bonne journée

Frédéric

Private Sub Command25_Click()
'Commentaires
'ok Selectionner les applis ou [peridicity] est entre 1 et 3; Voir
function DoSql
'ok Creer un repertoire provisoire ("Migration");
'ok dans le répertoire provisoire, recreer l'arborescence d'origine
"migration" & [applipath]; Voir Function SHCreateDirectoryEx
'migrer l'appli [appliName] et la sauver dans le nv répertoire;
'mettre MigOk à "Yes" ;
'Fin de commentaires

NewMigPath = "d:MigAppli" & Mid([AppliPath], 4)
SHCreateDirectoryEx Me.hwnd, NewMigPath, ByVal 0&



End Sub


"Jessy Sempere [MVP]" wrote in message
news:42dd1a35$
Bon

Il serait intéressant de voir ton code complet...
Il y a de forte chance que tu essais de créer un répertoire en mettant
un chemin qui n'est pas valide genre F:TotoToto
alors qu'il faudrait F:TotoToto

Sinon, pour répondre à ton autre question, pour créer des sous répertoire
imbriquer, il te faudra le faire par étape en créant au fur et à mesure
le niveau inférieur le plus proche.

Voici donc un code qui te conviendra :

Function CreateSubDir(strPath As String)
Dim strTmp As String
Dim intPos As Integer
Dim FolderExists As Boolean

FolderExists = True

If IsNull(strPath) Or strPath = "" Then
Else
strTmp = strPath
intPos = InStr(4, strPath, "")
Do While intPos > 0
strTmp = Left(strPath, intPos - 1)
FolderExists = (Len(Dir$(strTmp, vbDirectory)) > 0&)
If FolderExists = False Then MkDir strTmp
intPos = InStr(intPos + 1, strPath, "")
Loop
FolderExists = (Len(Dir$(strPath, vbDirectory)) > 0&)
If FolderExists = False Then MkDir strPath
End If
End Function

@+
Jessy Sempere - Access MVP

------------------------------------
Site @ccess : http://access.jessy.free.fr/
Pour l'efficacité de tous :
http://users.skynet.be/mpfa/
------------------------------------
"fth" a écrit dans le message news:

Re bonjour Eric,

Bien vu pour la fonction FolderExist que je te dépose ci dessous:

Public Function FolderExists(varpath As Variant) As Boolean
On Error Resume Next
If Len(varpath) > 0& Then
FolderExists = (Len(Dir$(varpath, vbDirectory)) > 0&)
End If
End Function

Ceci dit, même sans cette fonction, mkdir me renvoi la mm erreur à savoir
:

'error76'
path not found

Merci pour tout!

Frédéric



"Eric" wrote in message
news:
le ",4" est la pour retirer le f:
Ceci dit, je ne sais pas pq je dois mettre 4, vu qu'il n'y a que 3
caractères à outrepasser ...



re,
La fonction Mid() ou Mid$() te permet de spécifier à partir de quel
rang
du caractère tu veux extraire les données de la chaine.
Syntaxe : Mid(LaChaîne, PositionDépart[, Longueur])

Donc tu dois bien préciser 4 puisque le 1er caractère de la chaine
extraite est à la 4eme position dans la chaine à extraire.

On peut voir ta fonction FolderExists() car elle doit être batie sur la
méthode FolderExist d'un objet FileSystemObject qui retourne False si
le
répertoire n'est pas trouvé sans générer d'erreur.

Chez Raymond, tu as une page entière avec toutes les méthodes de
Scripting


Runtime

http://officesystem.access.free.fr/scr_scripting_runtime.htm
--
A+
Eric
http://users.skynet.be/mpfa/
Archives :
http://groups.google.fr/group/microsoft.public.fr.access?hl=fr












Avatar
Eric
Bonjour Frédéric,

...
Il me reste maintenant à faire passer chaque fichier de A97 à A2003
...oserais-je abuser?



Tu peux utiliser la méthode ConvertAccessProject d'un objet Application.
(Voir dans l'aide pour plus d'infos, notamment sur les constantes de
format de bd)

Sub ConversionBD
Dim MyAcc As Access.Application
Set MyAcc = New Access.Application
MyAcc.ConvertAccessProject "C:TonRepTaBD97.mdb", _
"C:TonRepTaBD2000.mdb", acFileFormatAccess2000
MyAcc.Quit
Set MyAcc = Nothing
End Sub

Toutefois, tu risques d'avoir des erreurs suite à la conversion, donc il
te faudra faire du boulot à la mimine :-( quand même

--
A+
Eric
http://users.skynet.be/mpfa/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr

Avatar
fth
Salut Eric,

Merci pour l'info, je vais la tester tout de suite.
Pour ce qui est des erreurs, je ne penses pas qu'il y en aura bcp et dans ce
cas la, uen table est crée dans la base.
...et oui, va bien falloir y aller un peu à la main ...
mais c'est aussi l'objet de ma mission (donc de mes prestations) ...ce qui
n'est pas (tout à fait) négatif.

Je te tiens au courant pour ta proc

merci

Frédéric


"Eric" wrote in message
news:
Bonjour Frédéric,

...
Il me reste maintenant à faire passer chaque fichier de A97 à A2003
...oserais-je abuser?



Tu peux utiliser la méthode ConvertAccessProject d'un objet Application.
(Voir dans l'aide pour plus d'infos, notamment sur les constantes de
format de bd)

Sub ConversionBD
Dim MyAcc As Access.Application
Set MyAcc = New Access.Application
MyAcc.ConvertAccessProject "C:TonRepTaBD97.mdb", _
"C:TonRepTaBD2000.mdb", acFileFormatAccess2000
MyAcc.Quit
Set MyAcc = Nothing
End Sub

Toutefois, tu risques d'avoir des erreurs suite à la conversion, donc il
te faudra faire du boulot à la mimine :-( quand même

--
A+
Eric
http://users.skynet.be/mpfa/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr



Avatar
fth
Salut Eric,

ta proc fonctionne très bien, merci.
Si je ne me trompe pas, elle prend le fichier ac97 et le convertit en ac2000
ou 2003.

est il possible d'imbriquer le fait qu'avant la conversion, il copie la db
dans le nv repertoire puis fait la conversion?
ça ne va pas creer d'erreur?

D'avance merci

Frédéric


"Eric" wrote in message
news:
Bonjour Frédéric,

...
Il me reste maintenant à faire passer chaque fichier de A97 à A2003
...oserais-je abuser?



Tu peux utiliser la méthode ConvertAccessProject d'un objet Application.
(Voir dans l'aide pour plus d'infos, notamment sur les constantes de
format de bd)

Sub ConversionBD
Dim MyAcc As Access.Application
Set MyAcc = New Access.Application
MyAcc.ConvertAccessProject "C:TonRepTaBD97.mdb", _
"C:TonRepTaBD2000.mdb", acFileFormatAccess2000
MyAcc.Quit
Set MyAcc = Nothing
End Sub

Toutefois, tu risques d'avoir des erreurs suite à la conversion, donc il
te faudra faire du boulot à la mimine :-( quand même

--
A+
Eric
http://users.skynet.be/mpfa/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr



Avatar
Eric
re,

Salut Eric,

ta proc fonctionne très bien, merci.
Si je ne me trompe pas, elle prend le fichier ac97 et le convertit en ac2000
ou 2003.


Oui, je crois qu'elle fait ça ;-)
Je peux pas tester car j'ai seulement Access2K et
ConvertAccessProject n'existe pas


est il possible d'imbriquer le fait qu'avant la conversion, il copie la db
dans le nv repertoire puis fait la conversion?
ça ne va pas creer d'erreur?



Non, je ne pense pas. Par sécurité, je testerai après avoir fait une
copie des rep contenant les bds à convertir.

Puis ta procédure devrait ressembler à un truc du genre:
Attention, les répertoires à créer ne doivent pas exister et les
fichiers convertis doivent avoir des noms différents de fichiers
initiaux. Ne sachant pas comment sont stockés les noms de tes applis, je
me base sur des noms du genre Facturation.mdb dans le code ci-dessous
(je prends pour hypothese une conversion en 2000, donc à toi de changer
la valeur 2000 dans le nom de la nouvelle base si tu optes pour 2002 ou
2003). Ainsi Facturation.mdb devient Facturation2000.mdb

Private Sub Commande0_Click()
Dim MyAcc As Access.Application
Set MyAcc = New Access.Application
Dim rst As DAO.Recordset
' remplir un recordset sur la table appli
' boucler sur le recordset pour créer les rep et convertir les bds
'...
Set rst = CurrentDb.OpenRecordset("SELECT applipath, appliname from
appli")
'Tester si rst ne contient pas d'enregistrements (Bof & Eof) et
'sortir le cas échéant
While Not rst.EOF ' sinon
NewMigPath = "d:MigAppli" & Mid(rst!AppliPath, 4)
SHCreateDirectoryEx Me.hwnd, NewMigPath, ByVal 0&
FileCopy rst!AppliPath & "" & rst!AppliName, _
NewMigPath & "" & rst!AppliName
MyAcc.ConvertAccessProject NewMigPath & "" & rst!AppliName, _
NewMigPath & "" & Left(rst!Appliname,len(rst!appliname)-4) _
"2000.mdb", _
acFileFormatAccess2000
rst.MoveNext
Wend
MyAcc.Quit
Set MyAcc = Nothing
Set rst = Nothing
End Sub

--
A+
Eric
http://users.skynet.be/mpfa/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr

Avatar
Eric
.../...
parti trop vite
J'ai écrit la proc à main levée c'est à dire sans tester mais le code
doit pas être loin de ce que tu dois faire. Sorry pour les erreurs.

--
A+
Eric
http://users.skynet.be/mpfa/
1 2 3