Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Cdes DOS et Subst

4 réponses
Avatar
Paul Florent
Bonjour à tous,


Sous Access 2000 ou 2003,
je développe des applications qui fonctionnent en réseau au en monoposte
mais pour des facilités de maintenance, je sépare toujours mes apllications
en 2 fichiers dorsal et frontal (MOnAp_D.mdb et MonAp_F.mdb).
Lorsque le fonctionnement se fait en réseau,
je connecte un lecteur réseau "W:" qui pointe sur "Mes documents" partagé du
PC
où se trouve le dorsal MOnAp_D.mdb. Appelon le "PC source".

Pour faire fonctionner le frontal sur le PC source,
je crée un disque virtuel W: par la commande dos
Subs W: "D:\Mes documents" dans le cas où Mes documents contient
MonAp_D.mdb.
Cette commande dos est placée dans un fichier .bat qui séxécute au démarrage
du PC

Je peux aussi lancer l'éxécution du fichier .bat à l'ouverture de mon
application

Private Sub Form_Open(Cancel As Integer)
Shell ("D:\Mes documents\Bat\W.bat")
End Sub

et supprimer W: à la fermeture de l'application

Private Sub Form_Close()
Shell ("D:\Mes documents\Bat\W_off.bat")
End Sub


Mais je préférerais ne pas avoir à me servir de fichier .bat et de tout
exécuter dans Access
dans le style :

Private Sub Form_Open(Cancel As Integer)
If exist(W:\Mes documents) then
Exit sub
Else
Subst W: %USERPR~1%\"Mes documents"
End If
End Sub

Private Sub Form_Close()
Subst W: /d
End Sub

manque de bol, ça ne marche pas, mon code n'est pas correct.
Pourriez vous m'en indiquer un peu plus sur l'éxécution de cdes Dos
à partir du VBA d'Access, et éventuellement me faire des remarques
sur ma façon de procéder pour gérer ma liaison entre mes deux fichiers.

Merci par avance pour votre aide

Paul

4 réponses

Avatar
Gloops
Bonjour,

Attention : si tu ne mets pas de guillemets autour du chemin, Subst va
retenir ce qui vient jusqu'au premier espace.

Tu as donc deux solutions :
- ou tu mets des espaces autour du chemin
- ou tu utilises le chemin court
Pour la deuxième solution, insérer ce qui suit dans un module, puis
utiliser :
Shell "SUBST W: " + NomCourt("C:Documents and Settings")

Bien entendu, à toi de vérifier qu'il n'existe pas déjà de disque W: sur
la machine.

============ Début module ======================= Private Declare Function GetLongPathName Lib "kernel32" Alias _
"GetLongPathNameA" (ByVal lpszShortPath As _
String, _
ByVal lpszLongPath As String, _
ByVal cchBuffer As Long) As Long

Private Declare Function GetShortPathName Lib "kernel32" Alias _
"GetShortPathNameA" (ByVal lpszLongPath As _
String, _
ByVal lpszShortPath As String, _
ByVal cchBuffer As Long) As Long


Public Function NomLong(NomCourt As String) As String
Dim strCheminFichier As String * 250
Dim strNomFichier As String
strCheminFichier = String(250, Chr$(32))
GetLongPathName NomCourt, strCheminFichier, 250
NomLong = Left$(strCheminFichier, InStr(1, strCheminFichier, Chr$(0)))
End Function

Public Function NomCourt(NomLong As String) As String
Dim strCheminFichier As String * 250
strCheminFichier = String(250, Chr$(32))
GetShortPathName NomLong, strCheminFichier, 250
NomCourt = Left$(strCheminFichier, InStr(1, strCheminFichier, Chr$(0)))
End Function
================= Fin module ===================== ___________________________________________
Paul Florent a écrit, le 27/12/2005 09:27 :
je crée un disque virtuel W: par la commande dos
Subs W: "D:Mes documents" dans le cas où Mes documents contient


attention il manque un t

Avatar
Gloops
Gloops a écrit, le 27/12/2005 14:02 :

- ou tu mets des espaces autour du chemin
tu mets des guillemets autour du chemin,


j'imagine que le lecteur avait rectifié ...

Avatar
Paul Florent
Merci pour ta réponse. Je n'ai pas tout compris, mais j'ai fait ça qui
marche :

Private Sub Form_Open(Cancel As Integer)
If Dir("W:") <> Null Then
Exit Sub
Else
Shell "Subst W: D:Mesdoc~1"
End If
End Sub

J'aurais aimé que la ligne ci après marche aussi
Shell "Subst W: %USERPR~1%Mesdoc~1"
mais ça marche pas !
Je ne vois pas où j'ai pu faire une erreur, car avec in fichier .bat, ça
marchait bien
Merci
Paul
Avatar
Gloops
USERPR~1 ?
Mais tu as chopé ça où ?

Logiquement, tu devrais pouvoir t'en sortir avec
Shell "Subst W: " + NomCourt(Environ("USERPROFILE") + "Mes Documents")

à condition, bien sûr, de coller dans un module le code que j'indiquais
dans mon précédent message. Tu sais créer un module, dans Access,
n'est-ce pas ? Et faire un copier/coller aussi ?

Alors il y a aussi la solution avec les guillemets.
Shell "Subst W: " + Chr$(34) + _
Environ$("USERPROFILE") + "Mes Documents" + Chr$(34)

En forme de récapitulation on peut donner deux procédures équivalentes
pour initialiser le disque W:

Public Sub InitW1(Cible As String)
Shell "Subst W: " + NomCourt(Cible)
End Sub

Public Sub InitW1(Cible As String)
Shell "Subst W: " + Chr$(34) + Cible + Chr$(34)
End Sub

Et on peut appeler ça par
InitW? Environ$("USERPROFILE") + "Mes Documents"
(en mettant 1 ou 2 à la place du ?)

Et bien sûr une fois qu'on a fini on peut lancer
Shell "SUBST W: /D"
là il n'y a pas de difficulté.
___________________________________________
Paul Florent a écrit, le 27/12/2005 20:20 :
Merci pour ta réponse. Je n'ai pas tout compris, mais j'ai fait ça qui
marche :

Private Sub Form_Open(Cancel As Integer)
If Dir("W:") <> Null Then
Exit Sub
Else
Shell "Subst W: D:Mesdoc~1"
End If
End Sub

J'aurais aimé que la ligne ci après marche aussi
Shell "Subst W: %USERPR~1%Mesdoc~1"
mais ça marche pas !
Je ne vois pas où j'ai pu faire une erreur, car avec in fichier .bat, ça
marchait bien
Merci
Paul