IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Pb Création sous-dossier et sauvegarde fichier [XL-365]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Février 2021
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Ingénieur commercial

    Informations forums :
    Inscription : Février 2021
    Messages : 9
    Par défaut Pb Création sous-dossier et sauvegarde fichier
    Bonjour,

    Commercial dans une entreprise, j'ai aussi la charge du fichier de chiffrage commercial.

    Ce fichier, sous Excel, permet d'automatiser la saisie, la création d'offre et les différents fichiers en découlant.

    Afin d'homogénéiser l'intitulé et l'organisation des fichiers, j'ai décidé de créer une macro automatisant la sauvegarde du fichier avec le bon intitulé.

    Je n'arrive pas à créer le sous dossier et à enregistrer le fichier, voici le script que j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    Private Sub CommandButton2_Click()
     
    'MsgBox " En cours de développement "
     
    Dim NomFichier As String
    Dim Extension As String
    Dim Rep As String
    Dim TheDate As Date
     
     
    TheDate = Range("B4")
    Extension = ".xlsm"
    Rep = DatePart("m", TheDate) & "-" & DatePart("yyyy", TheDate)
    NomFichier = Range("B9") & " " & Rep & " " & Range("E3") & " " & Range("E12") & " " & Range("G6")
     
     
    If DossierExiste(Rep) = False Then MkDir (ThisWorkbook.Path & "\" & Rep)
     
    If FichierExiste(NomFichier) = False Then
        ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\" & Rep & "\" & NomFichier & Extention
        Else
        MsgBox "Ce fichier Existe déjà !"
    End If
     
    End Sub
    Voici ce qui ce passe quand j'exécute :

    Nom : Capture d’écran 2022-08-29 100453.jpg
Affichages : 702
Taille : 11,7 Ko

    Le débogue me positionne sur l'instruction MkDir.

    Je suis un peu perdu, je pense que c'est une erreur de syntaxe, mais je ne trouve pas laquelle.

    Si quelqu'un a une idée je suis preneur.

    Merci d'avance pour votre aide.

    Cordialement,

  2. #2
    Membre Expert
    Avatar de Igloobel
    Homme Profil pro
    Développeur ERP - VBA et Formateur bureautique
    Inscrit en
    Septembre 2005
    Messages
    1 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur ERP - VBA et Formateur bureautique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 871
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Tiré de l'aide Microsoft :

    MkDir, instruction
    Article
    12/04/2022
    2 minutes de lecture
    1 contributeur


    Crée un répertoire ou un dossier.

    Syntaxe
    Chemin MkDir

    L’argument chemin d’accès requis est une expression de chaîne qui identifie le répertoire ou le dossier à créer. Le path peut inclure le lecteur. Si aucun lecteur n’est spécifié, MkDir crée le répertoire ou le dossier sur le lecteur actif.

    Exemple
    Dans cet exemple, l’instruction MkDir permet de créer un répertoire ou un dossier. Si aucun lecteur n’est spécifié, le nouveau répertoire ou dossier est créé sur le lecteur actif.

    VB

    Copier
    MkDir "MYDIR" ' Make new directory or folder.
    Mais personnellement depuis que j'ai découvert ce tuto, je n'utilise plus que cette façon

    http://warin.developpez.com/access/fichiers/#LI-B

    A+

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Février 2021
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Ingénieur commercial

    Informations forums :
    Inscription : Février 2021
    Messages : 9
    Par défaut
    Bonjour,

    Merci pour ton aide, si cette méthode facilite pas mal de chose, elle ne fonctionne pas dans mon cas, et je viens de découvrir pourquoi.

    Le chemin d'accès ThisWorkbook.Path sort le chemin OneDrive sous une forme type https://blablabla-mySharepoint etc... et du coup m'empêche de manipuler les fichiers.

    Du coup, même la méthode avec la librairie Microsoft Scripting Runtime ne fonctionne pas dans ce cas.

    C'est rageant.

    Par contre si je copie le fichier en local, pas de soucis. Hors, j'aurai aimé que cela marche dans tous les cas mais j'ai peur que ça devienne compliqué pour moi.

    Cordialement,

  4. #4
    Membre Expert
    Avatar de Igloobel
    Homme Profil pro
    Développeur ERP - VBA et Formateur bureautique
    Inscrit en
    Septembre 2005
    Messages
    1 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur ERP - VBA et Formateur bureautique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 871
    Billets dans le blog
    1
    Par défaut
    Je comprends et j'avoue que je ne sais pas si c'est tout simplement possible ou pas

    Si quelqu'un du forum connait la réponse je lui laisse volontiers la main.

    Bonne journée

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Février 2021
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Ingénieur commercial

    Informations forums :
    Inscription : Février 2021
    Messages : 9
    Par défaut
    Re,
    J'ai un début de solution, j'ai trouvé ce script (j'ai traduit les commentaires à l'arrache, c'est assez approximatif) et je l'ai passé de Private à Public :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    Sub TestLocalFullName()
    Dim Z As String, X As String, Y As String
      Z = ActiveWorkbook.FullName
      X = LocalFullName$(Z)
      Y = Dir(LocalFullName(ActiveWorkbook.FullName))
      MsgBox Replace(X, Y, "")
    End Sub
     
    Public Function LocalFullName$(ByVal fullPath$)
    'Trouve le chemin local pour une URL de fichier OneDrive, en utilisant les variables d’environnement de OneDrive
    'Référence https://stackoverflow.com/questions/33734706/excels-fullname-property-with-onedrive
    'Auteurs*: Philip Swannell 2019-01-14, MatChrupczalski 2019-05-19, Horoman 2020-03-29, P.G.Schild 2020-04-02
     
    Dim ii&
    Dim iPos&
    Dim oneDrivePath$
    Dim endFilePath$
     
    If Left(fullPath, 8) = "https://" Then 'Possiblement une URL OneDrive
        If InStr(1, fullPath, "my.sharepoint.com") <> 0 Then 'Commercial OneDrive
            'Pour OneDrive commercial, le chemin d’accès ressemble à «*https://companyName-my.sharepoint.com/personal/userName_domain_com/Documents*» et à «*file.FullName*».
            'Trouver "/Documents" dans une chaîne et tout remplacer avant la fin par un chemin local OneDrive
            iPos = InStr(1, fullPath, "/Documents") + Len("/Documents") 'trouver la position "/Documents" dans l’URL du fichier
            endFilePath = Mid(fullPath, iPos) 'Obtenez le chemin du fichier final sans pointeur dans OneDrive. Incluez le "/"
        Else 'Personal OneDrive
            'Pour OneDrive personnel, le chemin ressemble à "https://d.docs.live.net/d7bbaa########1/" et fichier.FullName
            'Nous pouvons obtenir un chemin de fichier local en remplaçant "https.." jusqu’à la 4ème barre oblique, avec le chemin local OneDrive obtenu à partir du registre
            iPos = 8 'Dernière barre oblique dans https://
            For ii = 1 To 2
                iPos = InStr(iPos + 1, fullPath, "/") 'trouver 4ème barre oblique
            Next ii
            endFilePath = Mid(fullPath, iPos) 'Obtenez le chemin du fichier final sans la racine OneDrive. Inclure le "/"
        End If
        endFilePath = Replace(endFilePath, "/", Application.PathSeparator) 'Remplacer les barres obliques vers l’avant par des barres obliques vers l’arrière (type d’URL vers type Windows)
        For ii = 1 To 3 'Boucle pour voir si le LocalWorkbookName provisoire est le nom d’un fichier qui existe réellement, le cas échéant renvoyer le nom
            oneDrivePath = Environ(Choose(ii, "OneDriveCommercial", "OneDriveConsumer", "OneDrive")) 'Vérifiez les chemins locaux possibles. "OneDrive" devrait être le dernier
            If 0 < Len(oneDrivePath) Then
                LocalFullName = oneDrivePath & endFilePath
                Exit Function 'Succès (c.-à-d. trouvé le bon paramètre Environ)
            End If
        Next ii
        'Peut-être générer une erreur ici lorsque la tentative de conversion vers un nom de fichier local échoue - par ex. pour les fichiers "partagés avec moi"
        LocalFullName = vbNullString
    Else
        LocalFullName = fullPath
    End If
    End Function
    Je l'ai inséré dans un module et tenté de l'appeler avec le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    Private Sub CommandButton2_Click()
     
    'MsgBox " En cours de développement "
     
    Dim NomFichier As String
    Dim Extension As String
    Dim Rep As String
    Dim TheDate As Date
     
    TheDate = Range("B4")
    Extension = ".xlsm"
    Rep = DatePart("m", TheDate) & "-" & DatePart("yyyy", TheDate)
    NomFichier = Range("B9") & " " & Rep & " " & Range("E3") & " " & Range("E12") & " " & Range("G6")
     
    If DossierExiste(Rep) = False Then MkDir (LocalFullName(ThisWorkbook.Path) & "\" & Rep)
     
    If FichierExiste(NomFichier) = False Then
        ActiveWorkbook.SaveAs Filename:=LocalFullName(ThisWorkbook.Path) & "\" & Rep & "\" & NomFichier & Extention
        Else
        MsgBox "Ce fichier Existe déjà !"
    End If
     
    End Sub
    J'ai un résultat, le répertoire et le fichier se créent bien, mais j'ai un message d'erreur : ActiveWorkbook.SaveAs a échoué, en même temps il avait prévenu, mais je pense avoir compris à peu prés le fonctionnement de ce script.

    Mais je ne suis pas sur du fonctionnement global, j'y vais un peu à tâtons. Je vais tenter d'utiliser le FSO avec ça pour supprimer les erreurs et pouvoir tester les dossiers et fichiers correctement.

    Pour info je vous mets les codes des fonctions de vérification que j'ai utilisé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    Public Function DossierExiste(MonDossier As String)
    'par Excel-Malin.com ( https://excel-malin.com )
     
       If Len(Dir(MonDossier, vbDirectory)) > 0 Then
          DossierExiste = True
       Else
          DossierExiste = False
       End If
    End Function
     
    Public Function FichierExiste(MonFichier As String)
    'par Excel-Malin.com ( https://excel-malin.com )
     
    On Error GoTo Erreur
     
       If MonFichier <> "" And Len(Dir(MonFichier)) > 0 Then
          FichierExiste = True
       Else
          FichierExiste = False
       End If
    Exit Function
     
    Erreur:
        FichierExiste = CVErr(xlErrRef)
    End Function
    Ce que je ne comprend pas :

    -L'utilité du $ dans la déclaration de la fonction et des variables
    -Les fonctions FichierExiste et DossierExiste semble ne pas vouloir fonctionner avec LocalFullName
    -A quoi sert TestLocalFullName

    Si vous avez des idées ou des éclaircissements, je suis preneur.

    Merci à vous !

  6. #6
    Expert confirmé Avatar de hyperion13
    Homme Profil pro
    Webplanneur
    Inscrit en
    Octobre 2007
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Réunion

    Informations professionnelles :
    Activité : Webplanneur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 290
    Par défaut
    Salut
    Citation Envoyé par Arcvif Voir le message
    -L'utilité du $ dans la déclaration de la fonction et des variables
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Function LocalFullName$(ByVal fullPath$) = Public Function LocalFullName(ByVal fullPath As String) As String
    Dim ii& = Dim ii As Long
    Dim ii% = Dim ii As Integer
    Dim ii# = Dim ii As Double
    Citation Envoyé par Arcvif Voir le message
    -A quoi sert TestLocalFullName
    La réponse est ici. Ce code vérifie toutes les instances de OneDrive et vérifie où se trouve le fichier.

  7. #7
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 179
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Ce que je ne comprend pas :
    L'utilité du $ dans la déclaration de la fonction et des variables
    C'est un héritage du basic, ancêtre du Visual Basic : Dim A$ est l'équivalent de Dim A As String

    Voici la grille de correspondance extrait de mon "Quick Guide" que je distribue à mes stagiaires lors des formations VBA (voir colonne Symbole)

    Nom : 220829 dvp Variable - Symbole.png
Affichages : 706
Taille : 103,6 Ko
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 11/03/2013, 07h54
  2. Création de dossiers pour joindre fichiers
    Par Remus91 dans le forum IHM
    Réponses: 9
    Dernier message: 10/03/2009, 16h40
  3. Réponses: 1
    Dernier message: 09/03/2009, 16h34
  4. Réponses: 31
    Dernier message: 30/09/2006, 22h08
  5. VBA Word - Création 2 dossiers + 2 sauvegardes
    Par wouebmaster dans le forum VBA Word
    Réponses: 16
    Dernier message: 12/01/2006, 13h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo