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

Access Discussion :

Récupérer sous access une liste de fichiers sélectionnés


Sujet :

Access

  1. #1
    moq
    moq est déconnecté
    Futur Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 12
    Points : 8
    Points
    8
    Par défaut Récupérer sous access une liste de fichiers sélectionnés
    Bonjour,

    J'ai une base access où j'utilise la fonction "getopenfilename" pour récupérer une liste de fichiers. Or le problème est que cette fonction est limitée à 255 caractères ce qui me pose problème.

    Mon idée est d’utiliser une appli vb que je lance de access, qui m’affiche une fenêtre de sélection de fichiers et qui me renvoie la liste des fichiers sélectionnés dans une variable que je récupère sous access.

    J’ai essayé avec une DLL active X. J’arrive bien à l’appeler de access et à récupérer une valeur mais j’arrive pas dans cette DLL à ouvrir un formulaire vb qui me permettrait de sélectionner des fichiers.

    Voilà mon problème, si quelqu’un à une idée car là je sèche complètement.

    Merci

    Moq

  2. #2
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 123
    Points : 12 172
    Points
    12 172
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    Je ne sais pas si j'ai bien compris mais je crois que oui.
    Tu sais à mon âge, je commence à gâter
    Donc tu veux la liste de plusieurs fichiers sélectionnés dans une boite de dialogue Ouvrir, c'est ça ???
    Si oui, alors tu peux utiliser ce code:
    Dans un Module:
    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
    Option Explicit
     
    Public Type OPENFILENAME
      nStructSize       As Long
      hWndOwner         As Long
      hInstance         As Long
      sFilter           As String
      sCustomFilter     As String
      nMaxCustFilter    As Long
      nFilterIndex      As Long
      sFile             As String
      nMaxFile          As Long
      sFileTitle        As String
      nMaxTitle         As Long
      sInitialDir       As String
      sDialogTitle      As String
      flags             As Long
      nFileOffset       As Integer
      nFileExtension    As Integer
      sDefFileExt       As String
      nCustData         As Long
      fnHook            As Long
      sTemplateName     As String
    End Type
     
    Public Const OFN_ALLOWMULTISELECT            As Long = &H200
    Public Const OFN_CREATEPROMPT                As Long = &H2000
    Public Const OFN_ENABLEHOOK                  As Long = &H20
    Public Const OFN_ENABLETEMPLATE              As Long = &H40
    Public Const OFN_ENABLETEMPLATEHANDLE        As Long = &H80
    Public Const OFN_EXPLORER                    As Long = &H80000
    Public Const OFN_EXTENSIONDIFFERENT          As Long = &H400
    Public Const OFN_FILEMUSTEXIST               As Long = &H1000
    Public Const OFN_HIDEREADONLY                As Long = &H4
    Public Const OFN_LONGNAMES                   As Long = &H200000
    Public Const OFN_NOCHANGEDIR                 As Long = &H8
    Public Const OFN_NODEREFERENCELINKS          As Long = &H100000
    Public Const OFN_NOLONGNAMES                 As Long = &H40000
    Public Const OFN_NONETWORKBUTTON             As Long = &H20000
    Public Const OFN_NOREADONLYRETURN            As Long = &H8000&
    Public Const OFN_NOTESTFILECREATE            As Long = &H10000
    Public Const OFN_NOVALIDATE                  As Long = &H100
    Public Const OFN_OVERWRITEPROMPT             As Long = &H2
    Public Const OFN_PATHMUSTEXIST               As Long = &H800
    Public Const OFN_READONLY                    As Long = &H1
    Public Const OFN_SHAREAWARE                  As Long = &H4000
    Public Const OFN_SHAREFALLTHROUGH            As Long = 2
    Public Const OFN_SHARENOWARN                 As Long = 1
    Public Const OFN_SHAREWARN                   As Long = 0
    Public Const OFN_SHOWHELP                    As Long = &H10
    Public Const OFS_MAXPATHNAME                 As Long = 260
     
    Public Const OFS_FILE_OPEN_FLAGS = OFN_EXPLORER Or OFN_LONGNAMES Or OFN_CREATEPROMPT Or OFN_NODEREFERENCELINKS
    Public Const OFS_FILE_SAVE_FLAGS = OFN_EXPLORER Or OFN_LONGNAMES Or OFN_OVERWRITEPROMPT Or OFN_HIDEREADONLY
     
    Public OFN As OPENFILENAME
     
    Public Declare Function GetOpenFileName Lib "comdlg32" Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
    Dans ton Form:
    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
    Option Explicit
     
    Private Sub SelectAllFiles()
    Dim sFilters As String
    Dim I As Long
    Dim sBuffer As String
    Dim aFiles() As String
     
        sFilters = "Text Files" & vbNullChar & "*.txt" & vbNullChar & "All Files" & vbNullChar & "*.*" & vbNullChar & vbNullChar
        With OFN
            .nStructSize = Len(OFN)
            .hWndOwner = Me.hWnd
            .sFilter = sFilters
            .nFilterIndex = 1
            .sFile = "Untitled.bas" & Space(1024) & vbNullChar & vbNullChar
            .nMaxFile = Len(.sFile)
            .sDefFileExt = "bas" & vbNullChar & vbNullChar
            .sFileTitle = vbNullChar & Space(512) & vbNullChar & vbNullChar
            .nMaxTitle = Len(OFN.sFileTitle)
            .sInitialDir = "C:\WINDOWS" & vbNullChar & vbNullChar
            .sDialogTitle = "Sélection des fichiers"
            .flags = OFS_FILE_OPEN_FLAGS Or OFN_ALLOWMULTISELECT
        End With
     
        If GetOpenFileName(OFN) Then
            sBuffer = Trim(Left(OFN.sFile, Len(OFN.sFile) - 2))
            aFiles = Split(sBuffer, vbNullChar)
            For I = LBound(aFiles) To UBound(aFiles)
                Debug.Print aFiles(I)
            Next
        End If
    End Sub
    Donc tu fais une sélection multiple et tu utilises le tableau aFiles pour récupérer tes noms de fichiers...
    Argy

  3. #3
    moq
    moq est déconnecté
    Futur Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 12
    Points : 8
    Points
    8
    Par défaut [VB] Sélection multiple de fichiers
    Merci Argyronet de ta réponse mais le problème est que la solution que tu me proposes est celle que j'ai utilisée.

    J'ai une base access où j'utilise la fonction "getopenfilename" pour récupérer une liste de fichiers. Or le problème est que cette fonction est limitée à 255 caractères ce qui me pose problème.
    C'est pourquoi je suis partie dans une solution vb

    Mon idée est d’utiliser une appli vb que je lance de access, qui m’affiche une fenêtre de sélection de fichiers et qui me renvoie la liste des fichiers sélectionnés dans une variable que je récupère sous access.
    Et mon problème concerne donc une application vb que je veux appeler de access mais que j'aurais très bien pût appeler de Word, Excel d'où ma surprise d'avoir été déplacé sur le forum Access

    Mais encore merci de ta réponse et si quelqu'un à une idée ... notamment sur les DLL

    Moq

  4. #4
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 123
    Points : 12 172
    Points
    12 172
    Billets dans le blog
    5
    Par défaut
    Avec ce que je t'ai posté, tu dépasses 255 mais tu es plafonné à 1024...
    As tu tant de fichiers que cela à sélectionner ?
    Si oui alors il faut que tu changes de philosophie avec SHBrowseForFolder() ou tu choisis la directory et avec un Do While tu rappatries tous les fichiers (de façon récursive ou non) qui y sont logés...
    Le getOpenFileName n'est pas prévu pour sélectionner autant de fichiers considérant à titre d'exemple que si tu t'en sers pour Word, tu ne peux pas ouvrir autant de fichiers que tu puisses en modifier en même temps...
    Qu'en penses-tu ?

    Argy

  5. #5
    moq
    moq est déconnecté
    Futur Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    C'est gentil de t'occuper de mon cas.

    J'ai essayé ton code et c'est vrai que je peux sélectionner plus de fichier mais c'est pas encore suffisant ! L'utilisateur de la base s'en sert pour enregistrer les fichiers CAO (CATIA V4, IGES, ....) qu'il transmet au client par e-mail, numéris, ftp, ... ou sur CD et dans ce cas là il loge un paquet de fichiers avec des noms à rallonge.

    En ce qui concerne la fonction SHBrowseForFolder() je l'avais déjà utilisée mais je m'en rappelais plus

    Je vais donc suivre tes conseils et essayer de faire un formulaire sous access avec des listes pour sélectionner le dossier et les fichiers. Ca devrait le faire.

    Mais je suis un peu décu, ca me plaisait bien la solution de la dll vb qui renvoit une liste de fichiers surtout avec les fonctionnalités qu'offre vb (drivelistbox, dirlistbox, filelistbox). Si quelqu'un sait comment faire ...

    Merci à toi Argyronet.

    Bon WE

    Moq

  6. #6
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 123
    Points : 12 172
    Points
    12 172
    Billets dans le blog
    5
    Par défaut
    Ah, alors si effectivement tu utilises des contrôils de type FileListBox et compagnie, alors une autre perspective t'est offerte. Le FileListBox se comporte comme un combo où tu disposes de la propriétés ListCount et où tu es autorisé à faire une sélection multiple. Ensuite avec une boucle For/Next associée à la propriété Selected(n)=True tu peux aisément remplir une liste à expédier par mail...
    Pas besoin de DLL et encore moins de SHBrowseForFolder.

    Argy

  7. #7
    moq
    moq est déconnecté
    Futur Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    Bonjour Argyronet,

    Je suis partie sur un formulaire access et utilise la fonction SHBrowseForFolder() parce que le probléme des FileListBox et cie c'est que ca fait activer des références à des composants vb et pour la distribution des appli derrière ...

    Par conre, sur la fonction SHBrowseForFolder(), j'ai un petit problème : je souhaite que ma boîte de sélection de dossier se mette sur un dossier par défaut mais je ne sais pas les valeurs que je doit passer dans les variables de la fonction BrowseCallbackProc. Est-ce que tu peux m'expliquer si tu sais ?

    Je mets le code que j'utilise :

    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    Option Explicit
     
    Private Const BIF_STATUSTEXT = &H4&
    Private Const BIF_RETURNONLYFSDIRS = 1
    Private Const BIF_DONTGOBELOWDOMAIN = 2
    Private Const MAX_PATH = 260
     
    Private Const WM_USER = &H400
    Private Const BFFM_INITIALIZED = 1
    Private Const BFFM_SELCHANGED = 2
    Private Const BFFM_SETSTATUSTEXT = (WM_USER + 100)
    Private Const BFFM_SETSELECTION = (WM_USER + 102)
     
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String) As Long
    Private Declare Function SHBrowseForFolder Lib "shell32" (lpbi As BrowseInfo) As Long
    Private Declare Function SHGetPathFromIDList Lib "shell32" (ByVal pidList As Long, ByVal lpBuffer As String) As Long
    Private Declare Function lstrcat Lib "kernel32" Alias "lstrcatA" (ByVal lpString1 As String, ByVal lpString2 As String) As Long
     
    Private Type BrowseInfo
        hWndOwner As Long
        pIDLRoot As Long
        pszDisplayName As Long
        lpszTitle As Long
        ulFlags As Long
        lpfnCallback As Long
        lParam As Long
        iImage As Long
    End Type
     
    Private m_CurrentDirectory As String 'The current directory
     
    Public Function GetFolder(owner As Form, Title As String, StartDir As String) As String
    'ouvre la boite de dialogue sélectionnant un dossier
     
    Dim lpIDList As Long
    Dim szTitle As String
    Dim sBuffer As String
    Dim tBrowseInfo As BrowseInfo
    m_CurrentDirectory = StartDir & vbNullChar
     
    szTitle = Title
    With tBrowseInfo
        .hWndOwner = owner.hWnd
        .lpszTitle = lstrcat(szTitle, "")
        .ulFlags = BIF_RETURNONLYFSDIRS + BIF_DONTGOBELOWDOMAIN + BIF_STATUSTEXT
        '.lpfnCallback = GetAddressofFunction(BrowseCallbackProc(BFFM_ENABLEOK, BFFM_INITIALIZED, 0, 0))  'get address of function.
    End With
     
    lpIDList = SHBrowseForFolder(tBrowseInfo)
    If (lpIDList) Then
        sBuffer = Space(MAX_PATH)
        SHGetPathFromIDList lpIDList, sBuffer
        sBuffer = Left(sBuffer, InStr(sBuffer, vbNullChar) - 1)
        GetFolder = sBuffer
    Else
        GetFolder = ""
    End If
     
    End Function
     
    Private Function BrowseCallbackProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal lp As Long, ByVal pData As Long) As Long
     
    Dim lpIDList As Long
    Dim ret As Long
    Dim sBuffer As String
     
    On Error Resume Next 'Sugested by MS to prevent an error from
    'propagating back into the calling process.
     
    Select Case uMsg
     
        Case BFFM_INITIALIZED
            Call SendMessage(hWnd, BFFM_SETSELECTION, 1, m_CurrentDirectory)
        Case BFFM_SELCHANGED
            sBuffer = Space(MAX_PATH)
            ret = SHGetPathFromIDList(lp, sBuffer)
            If ret = 1 Then
                Call SendMessage(hWnd, BFFM_SETSTATUSTEXT, 0, sBuffer)
            End If
    End Select
     
    BrowseCallbackProc = 0
     
    End Function
     
    ' This function allows you to assign a function pointer to a vaiable.
    Private Function GetAddressofFunction(add As Long) As Long
        GetAddressofFunction = add
    End Function
    Merci

    Moq

  8. #8
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 123
    Points : 12 172
    Points
    12 172
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    Bon, utilise plutôt ce bloc de code fonctionnel...

    Dans un module:
    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    Option Explicit
     
    Private Const WM_USER = &H400
    Private Const BIF_STATUSTEXT = &H4
    Private Const BFFM_SELCHANGED = 2
    Private Const BFFM_INITIALIZED = 1
    Private Const BFFM_SETSTATUSTEXT = (WM_USER + 100)
    Private Const BFFM_SETSELECTION = (WM_USER + 102)
    Private Const BIF_RETURNONLYFSDIRS = &H1
    Private Const BIF_BROWSEINCLUDEFILES = &H4000
     
    Private Type BrowseInfo
      hWndOwner      As Long
      pIDLRoot       As Long
      pszDisplayName As Long
      lpszTitle      As Long
      ulFlags        As Long
      lpfnCallback   As Long
      lParam         As Long
      iImage         As Long
    End Type
     
    Private Declare Sub CoTaskMemFree Lib "ole32.dll" (ByVal hMem As Long)
    Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal HWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String) As Long
    Private Declare Function SHBrowseForFolder Lib "shell32.dll" (lpbi As BrowseInfo) As Long
    Private Declare Function SHGetPathFromIDList Lib "shell32.dll" (ByVal pidList As Long, ByVal lpBuffer As String) As Long
    Private Declare Function lstrcat Lib "kernel32.dll" Alias "lstrcatA" (ByVal lpString1 As String, ByVal lpString2 As String) As Long
     
    Private sTargetFolder As String
     
    Private Function GetAddressOfFunction(ByRef Address As Long) As Long
      GetAddressOfFunction = Address
    End Function
     
    Public Function ShowDialogFolders(ByVal WelcomeTitle As String, ByVal DefaultFolder As String) As String
    Dim lSHFolder As Long
    Dim sBuffer As String
    Dim tBROWSE_INFO As BrowseInfo
     
      sTargetFolder = IIf(Len(DefaultFolder) > 0, DefaultFolder & vbNullChar, vbNullChar)
      With tBROWSE_INFO
        .lpszTitle = lstrcat(WelcomeTitle, vbNullString)
        .lpfnCallback = GetAddressOfFunction(AddressOf BrowseCallbackProc)
        .ulFlags = BIF_STATUSTEXT + BIF_RETURNONLYFSDIRS
        .hWndOwner = 0
      End With
     
      lSHFolder = SHBrowseForFolder(tBROWSE_INFO)
     
      If (lSHFolder) Then
        sBuffer = Space(MAX_PATH)
        SHGetPathFromIDList lSHFolder, sBuffer
        CoTaskMemFree lSHFolder
        ShowDialogFolders = TrimNullChar(sBuffer)
      Else
        ShowDialogFolders = ""
      End If
    End Function
     
    Private Function BrowseCallbackProc(ByVal HWnd As Long, ByVal uMsg As Long, ByVal lp As Long, ByVal pData As Long) As Long
    Dim lSHFolder As Long
    Dim lReturn As Long
    Dim sBuffer As String
     
      On Error Resume Next
      Select Case uMsg
        Case BFFM_INITIALIZED
          SendMessage HWnd, BFFM_SETSELECTION, 1, sTargetFolder
        Case BFFM_SELCHANGED
          sBuffer = Space(MAX_PATH)
          lReturn = SHGetPathFromIDList(lp, sBuffer)
          If lReturn = 1 Then SendMessage HWnd, BFFM_SETSTATUSTEXT, 0, sBuffer
      End Select
      BrowseCallbackProc = 0
    End Function
     
    Function TrimNullChar(ByVal PathBuffer As String) As String
    Dim nPos As Long
     
        nPos = InStr(PathBuffer, vbNullChar)
        TrimNullChar = IIf(nPos > 0, Left(PathBuffer, nPos - 1), PathBuffer)
    End Function
    Dans ton Form sur l'Event OnClick du bouton concerné:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub SelectTheDirectory()
    Dim sSourceFileFolder As String
     
        sSourceFileFolder = ShowDialogFolders("Veuillez sélectionner un dossier", "C:\WINNT\system32\drivers")
     
    End Sub
    A+

    Argy

  9. #9
    moq
    moq est déconnecté
    Futur Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    Bonjour,

    J'ai encore le même problème : ca bloque à la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lpfnCallback = GetAddressOfFunction(AddressOf BrowseCallbackProc)
    Qu'est que tu mets comme valeur ou variable à la place de AddressOf BrowseCallbackProc ? A moins que AddressOf est une fonction et dans ce cas là access (97 dans mon cas) ne la connait pas.

    moq

  10. #10
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 123
    Points : 12 172
    Points
    12 172
    Billets dans le blog
    5
    Par défaut
    Ah, tu es sur Office 97... Tu es dur, tout de même
    Bon, on peut pas faire des miracles car 97 ne supporte pas les appels de type AddressOf qui permet d'obtenir le pointeur d'une fonction.
    Cela m'a, il y a qq temps, posé un problème sur lequel d'autres personnes ont été confrontées. J'ai pu donc (RE)mettre la main sur le bout de code...
    Donc pour parer à cette faille voici le code complet adapté pour TA DEMANDE. Bien entendu, c'est pour 97. (A, il te faudra te procurer vba332.dll si tu ne l'as pas).

    Dans un module:

    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    Option Explicit 
     
    Private Const WM_USER = &H400 
    Private Const BIF_STATUSTEXT = &H4 
    Private Const BFFM_SELCHANGED = 2 
    Private Const BFFM_INITIALIZED = 1 
    Private Const BFFM_SETSTATUSTEXT = (WM_USER + 100) 
    Private Const BFFM_SETSELECTION = (WM_USER + 102) 
    Private Const BIF_RETURNONLYFSDIRS = &H1 
    Private Const BIF_BROWSEINCLUDEFILES = &H4000 
     
    Private Type BrowseInfo 
      hWndOwner      As Long 
      pIDLRoot       As Long 
      pszDisplayName As Long 
      lpszTitle      As Long 
      ulFlags        As Long 
      lpfnCallback   As Long 
      lParam         As Long 
      iImage         As Long 
    End Type 
     
    Private Declare Sub CoTaskMemFree Lib "ole32.dll" (ByVal hMem As Long) 
    Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal HWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String) As Long 
    Private Declare Function SHBrowseForFolder Lib "shell32.dll" (lpbi As BrowseInfo) As Long 
    Private Declare Function SHGetPathFromIDList Lib "shell32.dll" (ByVal pidList As Long, ByVal lpBuffer As String) As Long 
    Private Declare Function lstrcat Lib "kernel32.dll" Alias "lstrcatA" (ByVal lpString1 As String, ByVal lpString2 As String) As Long 
     
    'Api's pour AddressOf 97
    Private Declare Function GetCurrentVbaProject Lib "vba332.dll" Alias "EbGetExecutingProj" (hProject As Long) As Long
    Private Declare Function GetFuncID Lib "vba332.dll" Alias "TipGetFunctionId" (ByVal hProject As Long, ByVal strFunctionName As String, ByRef strFunctionId As String) As Long
    Private Declare Function GetAddr Lib "vba332.dll" Alias "TipGetLpfnOfFunctionId" (ByVal hProject As Long, ByVal strFunctionId As String, ByRef lpfunction As Long) As Long
     
     
    Private sTargetFolder As String 
     
    Private Function GetAddressOfFunction(ByRef Address As Long) As Long 
      GetAddressOfFunction = Address 
    End Function 
     
    Private Function AddressOf97(strFuncName As String) As Long
        Dim hProject As Long
        Dim lngResult As Long
        Dim strID As String
        Dim lpfunction As Long
        Dim strFuncNameUnicode As String
     
        Const NO_ERROR = 0
     
        ' Conversion Unicode
        strFuncNameUnicode = StrConv(strFuncName, vbUnicode)
     
        ' handle du projet VBA en cours
        Call GetCurrentVbaProject(hProject)
     
        ' Espérant biensûr qu'il est > 0
        If hProject <> 0 Then
            ' Obtention de l'ID de la fonction
            lngResult = GetFuncID(hProject, strFuncNameUnicode, strID)
            'Et on vérifie que lngResult <>0 à cause d'un GPF potentiel si la fonction concernée n'existe pas
            If lngResult = NO_ERROR Then
                ' On obtient alors le pointeur
                lngResult = GetAddr(hProject, strID, lpfunction)
     
                If lngResult = NO_ERROR Then
                    AddressOf97 = lpfunction
                End If
            End If
        End If
    End Function
     
    Public Function ShowDialogFolders(ByVal WelcomeTitle As String, ByVal DefaultFolder As String) As String 
    Dim lSHFolder As Long 
    Dim sBuffer As String 
    Dim tBROWSE_INFO As BrowseInfo 
     
      sTargetFolder = IIf(Len(DefaultFolder) > 0, DefaultFolder & vbNullChar, vbNullChar) 
      With tBROWSE_INFO 
        .lpszTitle = lstrcat(WelcomeTitle, vbNullString) 
        .lpfnCallback = GetAddressOfFunction(AddressOf97("BrowseCallbackProc")) 
        .ulFlags = BIF_STATUSTEXT + BIF_RETURNONLYFSDIRS 
        .hWndOwner = 0 
      End With 
     
      lSHFolder = SHBrowseForFolder(tBROWSE_INFO) 
     
      If (lSHFolder) Then 
        sBuffer = Space(260) 
        SHGetPathFromIDList lSHFolder, sBuffer 
        CoTaskMemFree lSHFolder 
        ShowDialogFolders = TrimNullChar(sBuffer) 
      Else 
        ShowDialogFolders = "" 
      End If 
    End Function 
     
    Private Function BrowseCallbackProc(ByVal HWnd As Long, ByVal uMsg As Long, ByVal lp As Long, ByVal pData As Long) As Long 
    Dim lSHFolder As Long 
    Dim lReturn As Long 
    Dim sBuffer As String 
     
      On Error Resume Next 
      Select Case uMsg 
        Case BFFM_INITIALIZED 
          SendMessage HWnd, BFFM_SETSELECTION, 1, sTargetFolder 
        Case BFFM_SELCHANGED 
          sBuffer = Space(260) 
          lReturn = SHGetPathFromIDList(lp, sBuffer) 
          If lReturn = 1 Then SendMessage HWnd, BFFM_SETSTATUSTEXT, 0, sBuffer 
      End Select 
      BrowseCallbackProc = 0 
    End Function 
     
    Function TrimNullChar(ByVal PathBuffer As String) As String 
    Dim nPos As Long 
     
        nPos = InStr(PathBuffer, vbNullChar) 
        TrimNullChar = IIf(nPos > 0, Left(PathBuffer, nPos - 1), PathBuffer) 
    End Function

    Dans ton Form sur l'Event OnClick du bouton concerné:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub SelectTheDirectory() 
    Dim sSourceFileFolder As String 
     
        sSourceFileFolder = ShowDialogFolders("Veuillez sélectionner un dossier", "C:\Program Files\Microsoft Office 97\Office") 
     
    End Sub
    A+

    Argy

  11. #11
    moq
    moq est déconnecté
    Futur Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    Bravo !

    Ca marche nickel.

    Il me reste à finir mon formulaire pour pouvoir boucler cette histoire.

    Encore merci

    Moq

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 30/08/2007, 09h12
  2. Réponses: 0
    Dernier message: 01/08/2007, 12h12
  3. Réponses: 2
    Dernier message: 20/06/2007, 10h34
  4. Réponses: 63
    Dernier message: 06/07/2006, 15h29
  5. [VB]Récupérer une liste de fichiers
    Par yaya54 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 20/02/2006, 16h03

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