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

VBA Access Discussion :

Erreur sur GetOpenFileName


Sujet :

VBA Access

  1. #1
    Membre du Club
    Erreur sur GetOpenFileName
    Bonjour à tous

    Suite à pb Office sur le PC serveur, j'ai du recharger une image système antérieure datant de "seulement" 2 mois.

    Windows 10 a ensuite effectué quelques mises à jour.

    Du coup, au lancement de mon application ACC97 (Gestion commerciale), une erreur de compilation apparaît sur cette ligne du module "Get_fichier"qui est surlignée sur le debug:

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    Private Declare Function GetOpenFileName Lib "comdlg32.dll" Alias _
                       "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long


    Tout marchait parfaitement bien il y a 2 jours, avant le chargement de cette image ...

    Peut-être que la mise à jour windows a affectée une bibliothèque ou référence VisualBasic ... mais je ne sais pas dans quelle direction chercher

    je précise que mes connaissances en VBA sont basiques

    Merci pour votre aide.

  2. #2
    Rédacteur/Modérateur

    Bonjour,

    en quelle version de windows as-tu évolué ? 32/64 bits ?

    De ce que je lis, je crois voir une histoire de 64bits qui s'immisce dans ton code.

    Tu peux lire ceci qui donne l'exemple exact de ton cas de figure :

    https://arkham46.developpez.com/arti...a64bits/#LIV-A
    Cycle de vie d'un bon programme :
    1/ ca fonctionne 2/ ca s'optimise 3/ ca se refactorise

    Pas de question technique par MP, je ne réponds pas

    Apprendre à programmer avec Access 2016 et Access 2019

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Membre du Club
    Bonjour et merci pour ton aide.

    Je n'ai évolué vers rien de spécial.

    > Je suis en Windows 10Pro x64. J'avais ACC97 pour ma gestion et Word + Excel 2007. Tout fonctionne bien depuis des années
    > J'ai un image système de référence datant de Novembre 2019
    > J'ai voulu changer Word+Excel 2007 pour Word+Excel 2016 sans changer mon Acces 97 : Catastrophe ... des erreurs dans tout le code
    > Du coup, j'ai rechargé l'image de Nov 2019 avec mon office 2007 32bits + Access 97 32bits, ça fonctionne, sauf cette erreur sur ce module

    Merci pour le lien, mais il parle en effet de version d'office 64bits : je ne suis pas concerné

    Et je ne vois pas d'API spéciale à vérifier/activer pour cette fonction GetOpenFileName ....

  4. #4
    Rédacteur/Modérateur

    Je pense avoir vu juste, car tu nous dis
    Citation Envoyé par Fildelyon Voir le message


    > Je suis en Windows 10Pro x64.

    > Du coup, j'ai rechargé l'image de Nov 2019 avec mon office 2007 32bits + Access 97 32bits, ça fonctionne, sauf cette erreur sur ce module
    Peux tu ajouter le PtrSafe dans la ligne de déclaration, car ca semblerait suffire à résoudre ton cas
    Cycle de vie d'un bon programme :
    1/ ca fonctionne 2/ ca s'optimise 3/ ca se refactorise

    Pas de question technique par MP, je ne réponds pas

    Apprendre à programmer avec Access 2016 et Access 2019

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  5. #5
    Membre du Club
    Merci ! je croise les doigts.

    je l'ai placé ci, mais erreur de compil (attendu: Sb ou Function) ... quelle erreur commets-je ?


    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Option Compare Database
    Option Explicit
    
    ' Déclaration de l'API
    Private Declare Sub PathStripPath Lib "shlwapi.dll" Alias "PathStripPathA" (ByVal pszPath As String)
    Private Declare PtrSafe Function GetOpenFileName Lib "comdlg32.dll" Alias _
                       "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
    
     ' Structure du fichier
    Private Type OPENFILENAME

  6. #6
    Rédacteur/Modérateur

    Essaie avec ceci :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    'Déclaration de l'API
    #If VBA7 Then
    Private Declare PtrSafe Function GetOpenFileName Lib "comdlg32.dll" _
       Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
    #Else
    Private Declare Function GetOpenFileName Lib "comdlg32.dll" _
       Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
    #End If


    Que des lignes soient rouges ce n'Est pas nécessairement bloquant pour rouler le code ensuite
    Cycle de vie d'un bon programme :
    1/ ca fonctionne 2/ ca s'optimise 3/ ca se refactorise

    Pas de question technique par MP, je ne réponds pas

    Apprendre à programmer avec Access 2016 et Access 2019

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  7. #7
    Membre du Club
    Et bien il semblerait que tu m'aies enlevé une belle épine du pied ...

    1000 mercis et bravo pour ta disponibilité, ton aide et tes compétences

    Amicales salutations

  8. #8
    Membre du Club
    Re bonjour

    En passant par une autre fonction publique (difficile de tout tester en même temps), j'ai à nouveau une erreur de compil (Sub ou Function non définie) ...

    Ce doit être la même cause que mes messages ci-dessus .... Merci de votre aide à nouveau.

    @Jean-Philippe : j'aurais du te demander des éclaircissements sur tes réponses d'hier : ça m'aurait permis de gratter seul avant de poster cette demande ... désolé :

    la partie rouge est surligné en jaune sur mon code, et la partie bleue est surligné en bleu. Du coup, je joins tout mon code :

    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    Public Function OuvrirUnFichier(Handle As Long, _
                                    titre As String, _
                                    TypeRetour As Byte, _
                                    Optional TitreFiltre As String, _
                                    Optional TypeFichier As String, _
                                    Optional RepParDefaut As String) As String
     ' OuvrirUnFichier est la fonction à utiliser dans votre formulaire pour ouvrir _
     ' la boîte de dialogue de sélection d'un fichier.
     ' Explication des paramètres
        ' Handle = le handle de la fenêtre
        ' Titre = titre de la boîte de dialogue
        ' TypeRetour (définit la valeur, de type String, renvoyée par la fonction)
            ' 1 = chemin complet + nom du fichier
            ' 2 = nom fichier seulement
        ' TitreFiltre = titre du filtre
            ' Exemple: fichier Access
            ' N'utilisez pas cet argument si vous ne voulez spécifier aucun filtre
        ' TypeFichier = extention du fichier (sans le .)
            ' Exemple: MDB
            ' N'utilisez pas cet argument si vous ne voulez spécifier aucun filtre
        ' RepParDefaut = répertoire d'ouverture par défaut
            ' Exemple: C:\windows\system32
            ' Si vous laissez l'argument vide, par défaut il se place dans le répertoire de votre application
    
    Dim StructFile As OPENFILENAME
    Dim sFiltre As String
    
     ' Construction du filtre en fonction des arguments spécifiés
    If Len(TitreFiltre) > 0 And Len(TypeFichier) > 0 Then
      sFiltre = TitreFiltre & " (" & TypeFichier & ")" & Chr$(0) & "*." & TypeFichier & Chr$(0)
    End If
    sFiltre = sFiltre & "Tous (*.*)" & Chr$(0) & "*.*" & Chr$(0)
    
    
     ' Configuration de la boîte de dialogue
      With StructFile
        .lStructSize = Len(StructFile) ' Initialisation de la grosseur de la structure
        .hwndOwner = Handle ' Identification du handle de la fenêtre
        .lpstrFilter = sFiltre ' Application du filtre
        .lpstrFile = String$(254, vbNullChar) ' Initialisation du fichier '0' x 254
        .nMaxFile = 254 ' Taille maximale du fichier
        .lpstrFileTitle = String$(254, vbNullChar) ' Initialisation du nom du fichier '0' x 254
        .nMaxFileTitle = 254  ' Taille maximale du nom du fichier
        .lpstrTitle = titre ' Titre de la boîte de dialogue
        .flags = OFN_HIDEREADONLY  ' Option de la boite de dialogue
        If ((IsNull(RepParDefaut)) Or (RepParDefaut = "")) Then
            RepParDefaut = CurrentDb.Name
            PathStripPath (RepParDefaut)
            .lpstrInitialDir = Left(CurrentDb.Name, Len(CurrentDb.Name) - Len(Mid$(RepParDefaut, 1, _
    InStr(1, RepParDefaut, vbNullChar) - 1)))
            Else: .lpstrInitialDir = RepParDefaut
        End If
      End With
       
    If (GetOpenFileName(StructFile)) Then ' Si un fichier est sélectionné
        Select Case TypeRetour
          Case 1: OuvrirUnFichier = Trim$(Left(StructFile.lpstrFile, InStr(1, StructFile.lpstrFile, vbNullChar) - 1))
          Case 2: OuvrirUnFichier = Trim$(Left(StructFile.lpstrFileTitle, InStr(1, StructFile.lpstrFileTitle, vbNullChar) - 1))
        End Select
      End If
    
    End Function


    Merci d'avance

  9. #9
    Rédacteur/Modérateur

    Salut,

    ca va se jouer dans la 2e partie du tuto je pense, avec les PtrLong
    https://arkham46.developpez.com/arti...a64bits/#LIV-B
    Cycle de vie d'un bon programme :
    1/ ca fonctionne 2/ ca s'optimise 3/ ca se refactorise

    Pas de question technique par MP, je ne réponds pas

    Apprendre à programmer avec Access 2016 et Access 2019

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  10. #10
    Membre du Club
    Merci : je teste

    L'hypothèse est bien que du code 64bits est à présent nécessaire, alors que je n'ai rien changé à la version d'il y a 2 mois ?

    Punaise ... je risque d'être embêté à tous les coins de rue (ou de code plutôt)

    Merci

  11. #11
    Membre du Club
    Bonjour Jean-Philippe

    Clairement, mes problèmes apparaissent à la dernière mise à jour de Windows .... J'ai fait le test
    Je note qu'avant cette dernière mise à jour, seul 'Microsoft Visual C++ redistribuable 2008 x64' est présent, et qu'après, apparaissent 'Microsoft Visual C++ redistribuable 2015-19 x64' et 'Microsoft Visual C++ redistribuable 2015-19 x86'.
    Je les ai désinstallé mais ça ne change rien .... Bref :

    Citation Envoyé par Jean-Philippe André Voir le message
    Salut,

    ca va se jouer dans la 2e partie du tuto je pense, avec les PtrLong
    https://arkham46.developpez.com/arti...a64bits/#LIV-B
    Je ne suis pas expert et comme j'ai du mal à comprendre le code qui me pose problème, je n'arrive pas à adapter ce que je voir sur le tuto.

    J'ai bien compris qu'il fallait tester la présence de VB7 pour déclarer du Long ou PtrLong, mais je ne vois pas du tout où placer tout ça ...

    Pourrais-je bénéficier d'une aide supplémentaire ?

    Merci d'avance.

    MaJ :
    =====================
    Ca semble réglé en recopiant le code du tuto
    =====================

    Merci !