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 :

Difficultés fonctions vérification existance document


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Ingénieur mécanique
    Inscrit en
    Avril 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur mécanique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2018
    Messages : 2
    Par défaut Difficultés fonctions vérification existance document
    Bonjour à tous,

    Ceci est mon premier post donc veuillez m'excuser si je me suis trompé sur la mise en page ou d'une toute autre façon.
    Je débute sur VBA pour la lecture de document et je rencontre un problème.
    J'ai déjà utilisé plusieurs fois des fonctions mais là, j'obtiens le problème : "Compile error: Expected Sub, Fonction, or Property" et je n'arrive pas à le résoudre..
    J'ai besoin de votre aide, je vous en remercie d'avance

    Voici mon premier code qui me permet de faire une lecture de l'ensemble des lignes d'un document :
    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
    'Option Explicit
    Public Sub Lecture_document()
        'Détermination des variables
        Dim intFic As Integer
        Dim strLigne As String, strChemin2 As String
        Dim TestChemin As Variant
        Dim dummy As Boolean
        'FreeFile permet d'obtenir un chiffre de 1 à 255 pour un accès seul
        'FreeFile(1) permet d'avoir un chiffre entre 256 et 512 --> accès partagé
        intFic = FreeFile
        'Obligation de définir strChemin
        strChemin2 = "H:\Macro\GEN6-H22-nutInterfWC-AlStem-JE4-corr.txt"
        Call TestChemin("H:\Macro\GEN6-H22-nutInterfWC-AlStem-JE4-corr.txt")
        If TestChemin = True Then
            'ouverture du fichier
            Open strChemin2 For Input As intFic
            'operation jusqu'à la fin du fichier End Of File
            While Not EOF(intFic)
                'lecture du fichier ligne par ligne
                Line Input #intFic, strLigne
                'MsgBox strLigne
            Wend
            'Peu importe le type de fichier (FreeFile), il faut utiliser Close
            Close intFic
        End If
    End Sub
    Afin de vérifier l'existence du fichier, j'ai repris une fonction créé lors du tutoriel de Christophe Warren https://warin.developpez.com/access/fichiers/#LI-D.
    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
    Function TestChemin(strChemin As String) As Boolean
    'Hyper important d'utiliser ce problème de On Error GoTo pour déterminer le type d'erreur
    'et d'avoir directement le problème en MsgBox
    On Error GoTo err
    Dim oFSO As Scripting.FileSystemObject
    Dim oFld As Scripting.Folder
    Dim oDrv As Scripting.Drive
    Dim strDossiers() As String
    Dim i As Integer
     
    'Instanciation du FSO
    Set oFSO = New Scripting.FileSystemObject
     
    'Accède au disque
    Set oDrv = oFSO.Drives(oFSO.GetDriveName(strChemin))
    'Instancie le dossier racine
    Set oFld = oDrv.RootFolder
    'Découpe le chemin en dossier
    strDossiers = Split(strChemin, "\")
    'Tente d'accéder à chaque sous dossier
    For i = 1 To UBound(strDossiers) - 1
        Set oFld = oFld.SubFolders(strDossiers(i))
    Next i
    TestChemin = True
    fin:
     
        Exit Function
     
    err:
        Select Case err.Number
            Case 5: MsgBox "Le disque n'existe pas"
            Case 76: MsgBox "Impossible de trouver le dossier : " & strDossiers(i)
            Case Else: MsgBox "Erreur inconnue"
        End Select
        Resume fin
    End Function
    Merci pour vos feedback

  2. #2
    Expert confirmé
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Par défaut
    Salut, faire un [F1] sur Dir devrait t'apporter une réponse suffisante et réduire ton code.

  3. #3
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par Joa_VBA Voir le message
    J'ai déjà utilisé plusieurs fois des fonctions mais là, j'obtiens le problème : "Compile error: Expected Sub, Fonction, or Property" et je n'arrive pas à le résoudre..
    A priori, il doit y avoir dans ton code un End Sub ou End Function qui n'est pas à sa place, peut-être une erreur mis à la place d'un Exit Sub.
    ou alors, une faute d'orthographe sur une déclaration Sub ou Function.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut.

    Ton problème vient des lignes suivantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Call TestChemin("H:\Macro\GEN6-H22-nutInterfWC-AlStem-JE4-corr.txt")
        If TestChemin = True Then
    Tu appelles TestChemin comme une procédure alors que c'est une fonction, et ta ligne de test If TestChemin... pose problème puisque testChemin est une fonction et que tu l'utilises comme une variable.

    Utilise plutôt ceci la ligne suivante en remplacement des deux lignes citées:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If TestChemin("H:\Macro\GEN6-H22-nutInterfWC-AlStem-JE4-corr.txt") then
    [EDIT] Commenter la ligne Option Explicit n'est pas une bonne option.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  5. #5
    Candidat au Club
    Homme Profil pro
    Ingénieur mécanique
    Inscrit en
    Avril 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur mécanique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2018
    Messages : 2
    Par défaut Suite
    Bonjour à tous,

    Tout d'abord merci pour avoir pris le temps de me répondre

    Kiki29, oui, ta solution est vraiment la plus simple et celle que je vais utiliser, mais j'aimerai bien utiliser la fonction TestChemin pour déterminer les cas d'erreurs possibles.

    Menhir, j'ai bien vérifié mais aucun manquement de ce côté-là d'où le fait que je suis ici

    Pierre Fauconnier, la solution proposée ne permet pas de résoudre le problème rencontré. Tu as raison sur le fait que je l'utilise comme une variable car après avoir longuement cherché, j'ai continué ma programmation en la définissant en avance comme une variable booléenne dont la valeur est vraie.

    Si jamais quelqu'un a une autre idée afin de comprendre ce qui gêne dans l'utilisation de cette fonction.
    Je suis persuadé que "H:\Macro\.." est bien un String mais comme je vois qu'il y a une <incompatibilité de type>, je suis toujours perdu.

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

    Merci et si jamais vous avez la raison, je suis tout ouïe

  6. #6
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    bonjour,
    ta solution est vraiment la plus simple et celle que je vais utiliser, mais j'aimerai bien utiliser la fonction TestChemin pour déterminer les cas d'erreurs possibles.
    tu peux faire la meme chose avec dir en disequant le chemin par les shash sans utiser FSO
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  7. #7
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    tu pourrais tester tout les etages de l'arborescence du chemin complet (c'est ce que tu souhaite j'ai cru comprendre )
    tu peux t'inspirer de ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub test()
    result = testchemin("H:\fond d'ecran\paysages\paysage2.jpg")
    MsgBox result
    End Sub
    '
    '
    Function testchemin(chemin As String)
    x = Split(chemin, "\")
    For i = 0 To UBound(x)
    texte = texte & x(i) & IIf(i < UBound(x), "\", "")
    Z = Z & texte & "-->" & IIf(Dir(texte, vbDirectory Or vbNormal Or vbSystem Or vbHidden) <> "", " =Ok", " =No") & vbCrLf
    Next
    testchemin = Z
    End Function
    EDIT:
    ou bien ce style de retour
    cela te donne la partie valide du chemin et le chemin non valide
    tu a un retour true/false selon le cas pour une gestion plus simple de la fonction dans une sub
    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
    Option Explicit
    Public Type chem
    en_Defaut As String
    valide As String
    entier As Boolean
    End Type
    '
    Sub test()
    Dim url As chem
    url = testchemin("H:\fond d'ecran\paysageas\paysage2.jpg")
    MsgBox "le chemin de fichier est il bon ?= " & url.entier & vbCrLf & "partie valide du chemin " & url.valide & vbCrLf & "partie non valide " & url.en_Defaut
    End Sub
    '
    '
    Function testchemin(chemin As String) As chem
    Dim c As chem, x, i As Long, texte As String
    x = Split(chemin, "\")
    For i = 0 To UBound(x)
    texte = texte & x(i) & IIf(i < UBound(x), "\", "")
    If Dir(texte, vbDirectory Or vbNormal Or vbSystem Or vbHidden) <> "" Then c.valide = texte
    If Dir(texte, vbDirectory Or vbNormal Or vbSystem Or vbHidden) = "" Then c.en_Defaut = texte
    Next
    If c.en_Defaut = "" Then c.entier = True Else c.entier = False
    testchemin = c
    End Function
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    A la relecture de ta fonction, je plussoie Kiki29 et Patrick sur l'utilisation de DIR (je n'avais pas fait réellement attention à ce que faisait cette fonction).

    Ceci dit, par rapport à ta demande de compréhension du pourquoi du comment avec ta fonction, remets-le code exact que tu as utilisé, car entre ton premier message et celui de tout à l'heure, l'erreur a changé (de Compile error: Expected Sub... vers Incompatibilité de type) (bizarre au passage, le changement de langue).

    Et il est évident que "H:\..." est un string, au passage
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

Discussions similaires

  1. Réponses: 1
    Dernier message: 26/08/2009, 12h27
  2. Réponses: 3
    Dernier message: 05/11/2006, 14h19
  3. fonction mysql() non documentée
    Par nako dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 10/05/2006, 17h18
  4. Réponses: 4
    Dernier message: 23/11/2005, 14h04
  5. Fonction artangente, existes tu en C++??
    Par grozero dans le forum MFC
    Réponses: 5
    Dernier message: 02/05/2005, 16h10

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