Discussion:
Trouver la lettre d'un lecteur dans un fichier "neuf"
Add Reply
ThierryP
2017-02-09 16:34:47 UTC
Réponse
Permalink
Raw Message
Bonjour le forum,

Une question un peu rhétorique, qui n'avait pas de réponse il y a quelques années
en arrière ! Peut-être les choses ont-elles évolué...

J'ai un fichier modèle installé sur plusieurs ordinateurs portables et également sur un mappage réseau.

En créant un nouveau fichier depuis le modèle, y a-t-il un moyen de connaître la lettre de lecteur (à part énumérer tout l'alphabet avec un test d'erreur) ?

Merci d'avance

ThierryP
Geo
2017-02-09 17:12:59 UTC
Réponse
Permalink
Raw Message
Bonjour

J'ai pas tout compris.
La lettre de quoi ?
isabelle
2017-02-09 17:21:09 UTC
Réponse
Permalink
Raw Message
bonjour ThierryP,

lecteur = Left(Application.DefaultFilePath, 1)

isabelle
Post by ThierryP
Bonjour le forum,
Une question un peu rhétorique, qui n'avait pas de réponse il y a quelques années
en arrière ! Peut-être les choses ont-elles évolué...
J'ai un fichier modèle installé sur plusieurs ordinateurs portables et également sur un mappage réseau.
En créant un nouveau fichier depuis le modèle, y a-t-il un moyen de connaître la lettre de lecteur (à part énumérer tout l'alphabet avec un test d'erreur) ?
Merci d'avance
ThierryP
ThierryP
2017-02-10 10:26:57 UTC
Réponse
Permalink
Raw Message
Bonjour Isabelle,

Malheureusement, ta formule me renvoie uniquement le dossier par défaut indiqué dans les options d'Excel.

J'espérais vaguement qu'avec les progrès de Microsoft (non, je plaisante !!) il serait possible de connaître l'emplacement d'origine du modèle .xltm utilisé.

Merci de t'intéresser à mon (petit) souci ;o)

ThierryP
isabelle
2017-02-10 14:55:06 UTC
Réponse
Permalink
Raw Message
bonjour ThierryP,

j'ai trouvé seulement l'emplacement par default

lecteur = Left(Application.TemplatesPath, 1)

en connaissant le nom du modèle tu peut vérifier s'il est présent sur ce lecteur

Sub test()
Dim filePath As Strin
lecteur = Left(Application.TemplatesPath, 1)
filePath = GetTemplatePath(lecteur, "MyTemplate.xltx")
Debug.Print filePath
End Sub

Function GetTemplatePath(drive As String, templateName As String) As String
Dim cmd As String, result As String
cmd = "CMD /C DIR """ & drive & ":\*" & templateName & """ /S /B /A:-D"

On Error Resume Next
result = Split(CreateObject("WScript.Shell").Exec(cmd).StdOut.ReadAll,
vbCrLf)(0)
On Error GoTo 0

If InStr(result, "\") Then
GetTemplatePath = Left(result, InStrRev(result, "\"))
Else
GetTemplatePath = vbNullString
End If
End Function

isabelle
Post by ThierryP
Bonjour Isabelle,
Malheureusement, ta formule me renvoie uniquement le dossier par défaut indiqué dans les options d'Excel.
J'espérais vaguement qu'avec les progrès de Microsoft (non, je plaisante !!) il serait possible de connaître l'emplacement d'origine du modèle .xltm utilisé.
Merci de t'intéresser à mon (petit) souci ;o)
ThierryP
ThierryP
2017-02-10 15:59:44 UTC
Réponse
Permalink
Raw Message
Re-bonjour Isabelle,

Je vais tester ta proposition dès que possible (le week-end approche !)

Si ça continue, je vais avoir plus de solutions que de problèmes !!!!!!
C'est çà le MPFE :-))

Bon week-end,

ThierryP
MichD
2017-02-09 18:09:33 UTC
Réponse
Permalink
Raw Message
Bonjour,

Je ne travaille pas à réseau et un certain nombre de choses que je n'ai pas eu l'occasion de
tester.

Cependant, il y toujours moyen d'ajouter un "NOM" dans la liste du classeur et à ce nom, tu lui
affectes le chemin du modèle.

En macro, pour créer ce "NOM" -->> Son_Chemin

ThisWorkbook.Names.Add "Son_Chemin", ThisWorkbook.Path


Et pour retrouver le lecteur où le fichier a été enregistré :
x = ThisWorkbook.Names("Son_Chemin")
x = Replace(x, "=", "")
x = Replace(x, """", "")
MsgBox Left(x, 1)

Est-ce possible dans ton environnement ?

MichD





"ThierryP" a écrit dans le message de groupe de discussion :
13aa833f-4490-4d51-b6de-***@googlegroups.com...

Bonjour le forum,

Une question un peu rhétorique, qui n'avait pas de réponse il y a quelques années
en arrière ! Peut-être les choses ont-elles évolué...

J'ai un fichier modèle installé sur plusieurs ordinateurs portables et également sur un mappage
réseau.

En créant un nouveau fichier depuis le modèle, y a-t-il un moyen de connaître la lettre de
lecteur (à part énumérer tout l'alphabet avec un test d'erreur) ?

Merci d'avance

ThierryP
ThierryP
2017-02-10 10:57:35 UTC
Réponse
Permalink
Raw Message
Bonjour Denis,

Effectivement ta solution fonctionne avec une seule limitation : une fois le modèle copié sur un PC, il faut l'ouvrir en tant modèle et le sauvegarder pour que le chemin soit affecté au "NOM".... mais ce n'est pas vraiment un gros problème.

Merci pour l'astuce,

ThierryP
MichD
2017-02-10 11:47:46 UTC
Réponse
Permalink
Raw Message
Si tu utilises cet événement pour créer le "NOM", que tu places dans le ThisWorkbook de ton
fichier modèle,, le NOM devrait toujours représenter le chemin du fichier.

'--------------------
Private Sub Workbook_AfterSave(ByVal Success As Boolean)
if success = true then
'Mise à jour du NOM
End if
End Sub
'--------------------

MichD
MichD
2017-02-10 13:13:57 UTC
Réponse
Permalink
Raw Message
Je n'ai pas testé, mais avec ceci dans ton thisWorkbook, devrait régler ton problème!

'Déclaration de la variable dans le haut du Thisworkook
Dim FirstTime As Long
'-------------------------------------------
Private Sub Workbook_AfterSave(ByVal Success As Boolean)
If Success = True Then
ThisWorkbook.Names.Add "Son_Chemin", ThisWorkbook.Path
FirstTime = 0
Me.Save
End If
End Sub
'-------------------------------------------
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
If SaveAsUI = True Then
FirstTime = 1
End If
End Sub
'-------------------------------------------

MichD
MichD
2017-02-10 14:05:58 UTC
Réponse
Permalink
Raw Message
Cette ligne de code "If Success = True Then" devrait plutôt s'écrire ainsi :

"If Success = True And FirstTime = 1 Then"

MichD



'Déclaration de la variable dans le haut du Thisworkook
Dim FirstTime As Long
'-------------------------------------------
Private Sub Workbook_AfterSave(ByVal Success As Boolean)
If Success = True And FirstTime = 1 Then
ThisWorkbook.Names.Add "Son_Chemin", ThisWorkbook.Path
FirstTime = 0
Me.Save
End If
End Sub
'-------------------------------------------
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
If SaveAsUI = True Then
FirstTime = 1
End If
End Sub
'-------------------------------------------

MichD
JièL
2017-02-10 15:11:48 UTC
Réponse
Permalink
Raw Message
Mon petit grain de sel
Post by MichD
"If Success = True And FirstTime = 1 Then"
ou encore
If Success And FirstTime = 1 Then

Parce que avant de vérifier la condition, celle ci est évalué et ensuite
comparé à ce qui est derrière le =
donc, si Success contient True c'est un peu comme si on écrivait
If True = True Then

Pour les extras fainéants, on pourrait presque écrire
If Success And FirstTime Then
à condition que firstime ne soit qu'un drapeau qui pendait la valeur 0
ou autre chose car 0 = False et autre chose = true :-)
--
JièL fainéant de première
MichD
2017-02-10 15:50:28 UTC
Réponse
Permalink
Raw Message
Post by MichD
"If Success = True And FirstTime = 1 Then"
ou encore
If Success And FirstTime = 1 Then

OU encore :
If Success * FirstTime = 1 Then
(2 caractères en moins) ;-)

Merci Jiel, je connais cette syntaxe. Mais comme les réponses s'adressent pas seulement à une
personne, la syntaxe longue permet au maximum de gens de suivre les échanges plus facilement.

MichD
MichD
2017-02-10 15:56:04 UTC
Réponse
Permalink
Raw Message
If Success * FirstTime = 1 Then

devrait plutôt s'écrire : If Success * FirstTime = -1 Then

Car la valeur de true en VBA est égale à -1

MichD
JièL
2017-02-10 16:08:42 UTC
Réponse
Permalink
Raw Message
Post by MichD
If Success * FirstTime = 1 Then
devrait plutôt s'écrire : If Success * FirstTime = -1 Then
En fait ça n'a aucune importance, c'est juste différent de faux, donc de 0.

donc :
If Success * FirstTime Then
c'est moi k'a la plus courte, na :-)

Ceci dit, ça devient un peu compliqué à lire :-)
--
Jièl plikécon
ThierryP
2017-02-10 15:53:20 UTC
Réponse
Permalink
Raw Message
Bonjour JièL,

Toi aussi tu es dans l'humour du vendredi après-midi.... "un drapeau qui pendait" c'est pas du VBA çà !!

Bon week-end, je crois qu'il s'impose ;o))

ThierryP
Post by JièL
Mon petit grain de sel
"""
Post by JièL
à condition que firstime ne soit qu'un drapeau qui pendait la valeur 0
--
JièL fainéant de première
ThierryP
2017-02-10 14:33:26 UTC
Réponse
Permalink
Raw Message
Re_bonjour,

Ton idée du "NOM" à ajouter est la bonne !
Et avec ce que tu m'as indiqué dans tes posts suivants, je vais m'en sortir !

Et ça m'a permis de découvrir le "AfterSave" ! Parce que je ne connaissais que l'après-rasage... (humour débile d'un vendredi après-midi)

Merci du coup de main

ThierryP
MichD
2017-02-10 15:45:34 UTC
Réponse
Permalink
Raw Message
En passant, lorsque tu crées un NOM, tu peux le rendre non accessible dans la fenêtre des
"NOMS" dans l'interface de calcul empêchant l'usager de supprimer volontairement ou
involontairement le NOM qui va générer une erreur!

IL s'agit d'utiliser le paramètre "visible" comme ceci :

Names.Add Name:="toto", Visible:=False

MichD
ThierryP
2017-02-10 15:55:22 UTC
Réponse
Permalink
Raw Message
Décidément infatigable !!

Effectivement c'est une bonne idée.... les utilisateurs font parfois des choses étranges !

En tous cas, le froid d'outre-mare n'engourdit pas les neurones (et ça vaut pour Isabelle aussi !!)

Merci,

ThierryP
MichD
2017-02-10 11:12:17 UTC
Réponse
Permalink
Raw Message
Voici un truc de ma bibliothèque que je n'ai jamais eu l'occasion de tester comme je ne
travaille pas à partir d'un réseau.

Ce qui suit sert à déterminer le répertoire par défaut sur un réseau. Pour remplacer les
fonctions ChDrive et ChDir.


'une procédure pour remplacer ChDir avec un lecteur/répertoire réseau

'Déclaration de l'API dans le haut d'un module standard:
Declare PtrSafe Function SetCurrentDirectory Lib "kernel32" _
Alias "SetCurrentDirectoryA" (ByVal lpPathName As String) As Long

'====================
Sub ChDirNet(szPath As String)
'collectif, d'après Laurent Longre, mpep
Dim lReturn As Long
lReturn = SetCurrentDirectoryA(szPath)
If lReturn = 0 Then Err.Raise vbObjectError + 1, "Error setting path."
End Sub
'====================


'Example of usage
'====================
Sub GetFile()
On Error GoTo ErrHandler
ChDirNet "\\LOGD0FILES\OGILVTW\Docs\Temp"
Exit Sub
ErrHandler:
MsgBox "Couldn't set path"
End Sub
'====================

Je crois que ChDir échoue à activer un répertoire sur une machine distante. Le
code ci-dessous est souvent donné comme solution à ce problème sur le forum
anglophone (mais je crois bien que l'idée d'utiliser l'API SetCurrentDirectoryA
a été lancée par Laurent Longre).


MichD
JièL
2017-02-10 16:16:39 UTC
Réponse
Permalink
Raw Message
Post by MichD
Je ne travaille pas à réseau
Qu'importe, tu peux faire comme si avec toi même
Avec l'explorateur, clic droit sur un dossier, Propriétés, onglet
Partage, bouton Partage avancé, coche "Partager ce dossier" et donne lui
éventuellement un nom.

(nb : le partage simple (ou "Partage avec") est une galère)

Va dans Réseau, choisi ton PC, tu devrais voir ton partage et donc
"Connecter un lecteur réseau" en faisant un clic droit dessus
--
JièL ray zo t'heurt
ThierryP
2017-02-16 17:02:23 UTC
Réponse
Permalink
Raw Message
Bonsoir,

Désolé de ne pas avoir répondu plus tôt...

Isabelle : Ta proposition fonctionne, mais comme les modèles ne sont jamais sur le C (je partitionne toujours les machines), je dois boucler sur les quelques lettres de lecteur possibles et c'est un peu lourd.

Du coup, j'ai adopté la solution de Denis, qui me va bien.

Merci les cousins !

ThierryP

Loading...