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

VBA Access Discussion :

Executer et/ou ouvrir un fichier en VBA sous access 2000


Sujet :

VBA Access

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 188
    Points : 98
    Points
    98
    Par défaut [A-00] Executer et/ou ouvrir un fichier en VBA
    Bonjour,

    Je déterre un topic…

    J'utilise Mapinfo 9 et Access 2000.

    J'ai créé un certain nombre de fichiers MBX, qui exécutent des actions sur diverses couches de Mapinfo.

    J'ai fait deux version de ces MBX. Une première avec un bouton dans la barre d'outil MI et l'autre sans bouton.

    Que je clique sur le bouton, ou que j'aille dans le gestionnaire des fichiers pour cliquer sur le fichier MBX qui ne possède pas de bouton, le résultat est le même.

    Je voudrait donc créer une macro qui exécute une fonction dans un module, dont le résultat serrait le même que si j'allais dans le gestionnaire des fichiers pour cliquer sur le fichier MBX sans bouton.

    Cela fait deux semaines que j'ai découvert ce topic quelques lignes plus bas.
    http://www.developpez.net/forums/d46...df-access-vba/
    et que je tentes d'utiliser le code qui, je le suppose, fonctionne aussi pour n'importe quel autre type de fichier.

    Malheureusement, même après avoir suivi les instructions, qui semblent être reprises sur plusieurs sites et forum, je n'arrive à rien.

    Access stoppe et indique un problème de compilation. Il me propose de recompiler et recommencer.
    Le débogueur ne s'exécute même pas, donc je n'ai pas d'idée de l'origine du problème.

    Je n'ai pas non plus pu utiliser la fonction "dim Ret as Variant" puisque j'ai aussi eu le message d'erreur de compilation.

    Ceci-dit, je n'ai pas une grosse expérience en VBA (ni-même une moyenne d'ailleurs, mais il parait que ce n'est pas la taille qui compte mais la façon d'ont on s'en sert … mais je m'égares…)

    Ainsi, malgré les nombreux exemples que j'ai trouvé sur le net et notamment dans ce forum, je ne suis toujours pas arrivé à mes fins puisqu'il y a de fortes chances que je n'ai pas mis l'ensemble du code necessaire au bon fonctionnement .

    Aussi, où pourrait-je trouver un exemple de code complet pour cette fonction, version VBA pour les plus que nuls.

    D'avance merci.

    PS : j'ai essayé de poster sur le topic en question, avant de me rendre compte de sa fermeture... Désolé !

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 188
    Points : 98
    Points
    98
    Par défaut
    Bonjour,

    Personne ?

    On m'a preté 4 bouquins sur VBA, mais pas un seul exemple.

    Même quand je recopie un exemple d'utilisation sur le site de Microsoft, j'ai une erreur de syntaxe !

    Même pas une idée…

    Encore merci.

  3. #3
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 044
    Points
    16 044
    Par défaut
    Bonjour,

    As-tu la possibilité de poster ta base ?

    Domi2

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 188
    Points : 98
    Points
    98
    Par défaut
    Ben, non

    Elle est plutôt volumineuse.

    Mais ce que je recherche c'est un exemple de module avec le code déja saisi.

    Comme ça je n'aurrais plus qu'à mettre le fichier qui m'interesse à la place du fichier exemple.

    Un peu comme dans le lien que je site plus haut, suaf que je ne suis pas arrivé à le faire marcher.

    J'ai aussi trouvé ça
    http://www.clarion.free.fr/public_ht.../shellexe.html
    http://msdn.microsoft.com/en-us/libr...53(VS.85).aspx
    http://support.microsoft.com/kb/147807/fr

    Mais je ne suis mêmen pas arrivé à les transformer en fonction executables depuis une macro.

    Tant pis, voir tant mieux si je doit constituer un module dédié à cette fonctionalité.

    Il faut juste que je puisse l'appeller depuis une macro.

    Encore merci.

  5. #5
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 044
    Points
    16 044
    Par défaut
    Bonjour,

    Code à coller dans un module standard :

    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
    Option Compare Database
    Option Explicit
     
    Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" ( _
            ByVal hwnd As Long, _
            ByVal lpOperation As String, _
            ByVal lpFile As String, _
            ByVal lpParameters As String, _
            ByVal lpDirectory As String, _
            ByVal nShowCmd As Long) As Long
     
    Public Enum TypeOuverture
     
        imprimer = 1
        ouvrir = 2
     
    End Enum
     
    Public Sub OuvrirDocument(strCheminFichier As String, Optional Action As TypeOuverture = 2)
     
    '--------------------------------------------------------------------------------------------
    ' Projet          : Interface Windows
    ' Auteurs         : Romain Puyfoulhoux - http://access.developpez.com
    '                   Christophe Warin (Tofalu) - http://access.developpez.com
    '                   pour la gestion des erreurs
    ' Version / Date  : 1.0 / 01.01.2008
    ' Révision / Date : 1.1 / 11.03.2008 - Modification de l'appel - énumération + passage
    '                                      optionnel du type d'action (ouverture ou impression,
    '                                      mode ouverture par défaut
    '
    ' Commentaires    : Permet d'ouvrir un fichier sans déclarer l'application a utiliser
    '
    '                   Exemple d'appel :
    '                   Call OuvrirDocument ("C:\Projets Access\Exemple.doc", ouvrir)
    '
    ' Lien            : http://access.developpez.com/faq/?page=Automation#shellexecute
    '--------------------------------------------------------------------------------------------
     
        'Déclaration de la variable
        Dim strDescriptionErreur As String
     
        Select Case ShellExecute(0, IIf(Action = ouvrir, "open", "print"), strCheminFichier, vbNullString, vbNullString, 1)
     
            Case 0: strDescriptionErreur = "Le système manque de mémoire ou de ressources, l'exécutable est corrompu ou réallocations non valides."
            Case 2: strDescriptionErreur = "Fichier non trouvé."
            Case 3: strDescriptionErreur = "Chemin non trouvé."
            Case 5: strDescriptionErreur = "Une tentative a été faite pour se lier dynamiquement à une tache, ou il y a eu une erreur de partage ou de protection réseau."
            Case 6: strDescriptionErreur = "La librairie requiert des segments de données séparés pour chaque tâche."
            Case 8: strDescriptionErreur = "Il n 'y a pas assez de mémoire disponible pour lancer l'application."
            Case 10: strDescriptionErreur = "Version de Windows incorrecte."
            Case 11: strDescriptionErreur = "Le fichier exécutable n'est pas correct, il se peut que ce ne soit pas une application Windows, ou qu'il y ait une erreur dans le fichier .EXE;"
            Case 12: strDescriptionErreur = "L'application a été conçue pour un autre système d'exploitation."
            Case 13: strDescriptionErreur = "L'application a été conçue pour MS-DOS 4.0."
            Case 14: strDescriptionErreur = "Le type de fichier exécutable est inconnu."
            Case 15: strDescriptionErreur = "Tentative de chargement d'une application en mode réel."
            Case 16: strDescriptionErreur = "Tentative de charger une seconde instance d'un fichier exécutable contenant plusieurs segments de données qui ne sont pas marqués en lecture seule."
            Case 19: strDescriptionErreur = "Tentative de charger un fichier exécutable compressé. Le fichier doit être décompressé avant d'être chargé."
            Case 20: strDescriptionErreur = "Fichier de librairie liée dynamiquement (DLL) incorrect, une des DLLs requise pour exécuter cette application est corrompue."
            Case 21: strDescriptionErreur = "L'application requiert les extensions Microsoft Windows 32-bit."
            Case 31: strDescriptionErreur = "Il n 'y a pas d'association pour le type de fichier spécifié, ou il n'y a pas d'association pour l'action choisie pour le type de fichier choisi."
     
        End Select
     
        If strDescriptionErreur <> "" Then
     
            MsgBox strDescriptionErreur
     
        End If
     
    End Sub
    L'exemple d'appel est en remarque.

    Comment veux-tu exécuter le code ? Sur clic d'un bouton ?

    Domi2

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 188
    Points : 98
    Points
    98
    Par défaut
    Merci.

    De mon côté j'ai bourriné sur la recherche et j'ai finalement trouvé ceci :
    http://support.microsoft.com/kb/170918/fr

    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
     
    Option Explicit
     
          Private Declare Function ShellExecute Lib "shell32.dll" Alias _
          "ShellExecuteA" (ByVal hwnd As Long, ByVal lpszOp As _
          String, ByVal lpszFile As String, ByVal lpszParams As String, _
          ByVal lpszDir As String, ByVal FsShowCmd As Long) As Long
     
          Private Declare Function GetDesktopWindow Lib "user32" () As Long
     
          Const SW_SHOWNORMAL = 1
     
          Const SE_ERR_FNF = 2&
          Const SE_ERR_PNF = 3&
          Const SE_ERR_ACCESSDENIED = 5&
          Const SE_ERR_OOM = 8&
          Const SE_ERR_DLLNOTFOUND = 32&
          Const SE_ERR_SHARE = 26&
          Const SE_ERR_ASSOCINCOMPLETE = 27&
          Const SE_ERR_DDETIMEOUT = 28&
          Const SE_ERR_DDEFAIL = 29&
          Const SE_ERR_DDEBUSY = 30&
          Const SE_ERR_NOASSOC = 31&
          Const ERROR_BAD_FORMAT = 11&
     
          Function StartDoc(DocName As String) As Long
              Dim Scr_hDC As Long
              Scr_hDC = GetDesktopWindow()
              StartDoc = ShellExecute(Scr_hDC, "Open", DocName, _
              "", "C:\", SW_SHOWNORMAL)
          End Function
     
          Private Sub Form_Click()
              Dim r As Long, msg As String
              r = StartDoc("C:\WINDOWS\ARCADE.BMP")
              If r <= 32 Then
                  'There was an error
                  Select Case r
                      Case SE_ERR_FNF
                          msg = "File not found"
                      Case SE_ERR_PNF
                          msg = "Path not found"
                      Case SE_ERR_ACCESSDENIED
                          msg = "Access denied"
                      Case SE_ERR_OOM
                          msg = "Out of memory"
                      Case SE_ERR_DLLNOTFOUND
                          msg = "DLL not found"
                      Case SE_ERR_SHARE
                          msg = "A sharing violation occurred"
                      Case SE_ERR_ASSOCINCOMPLETE
                          msg = "Incomplete or invalid file association"
                      Case SE_ERR_DDETIMEOUT
                          msg = "DDE Time out"
                      Case SE_ERR_DDEFAIL
                          msg = "DDE transaction failed"
                      Case SE_ERR_DDEBUSY
                          msg = "DDE busy"
                      Case SE_ERR_NOASSOC
                          msg = "No association for file extension"
                      Case ERROR_BAD_FORMAT
                          msg = "Invalid EXE file or error in EXE image"
                      Case Else
                          msg = "Unknown error"
                  End Select
                  MsgBox msg
              End If
          End Sub
    Alors, en fait, le code ci-dessus est conçu pour être enregistré dans le visual basic d'un formulaire.

    Quand on clique sur le selecteur d'enregistrement du formulaire, le module ce déclenche.

    Il faut juste indiquer à la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    r = StartDoc("C:\WINDOWS\ARCADE.BMP")
    le chemin complet du fichier à executer à la place de "C:\WINDOWS\ARCADE.BMP"

    Comme je souhaite déclencher cette fonction depuis une macro, j'ai remplacé la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Sub Form_Click()
    Qui permet de déclencher le code en cliquant sur un formulaire Par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Function NomDeFonction()
    Où NomDeFonction est à remplacer par n'importe quel nom, que l'on retrouvera dans la liste des fonctions de la base, éxecutables en code depuis une macro.
    et la dernière ligne
    par
    Par contre, impossible de faire marcher le premier exemple, qui semblais plus light, même après avoir compris comment il fallait s'en servir.
    http://support.microsoft.com/kb/147807/fr
    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
    Option Explicit
     
          Const SW_SHOWNORMAL = 1
     
          Private Declare Function ShellExecute Lib "shell.dll" (ByVal hwnd%, _
          ByVal lpszOp$, ByVal lpszFile$, ByVal spszParams$, ByVal _
          lpszDir$, ByVal fsShowCmd%) As Integer
     
          Private Declare Function GetDesktopWindow Lib "USER" () As Integer
     
          Function StartDoc(DocName As String) As Integer
             Dim Scr_hDC As Integer
             Scr_hDC = GetDesktopWindow()
             StartDoc = ShellExecute(Scr_hDC, "Open", DocName, "", "C:\", _
             SW_SHOWNORMAL)
          End Function
     
          Sub Form_Click()
             Dim r As Integer
             r = StartDoc("C:\WINDOWS\ARCADE.BMP")
          End Sub
    ça bogue et me dit que le fichier "USER" est introuvable. J'ai essayé de le remplacer par "user32" mais après c'est le fichier "shell.dll" qui est déclaré introuvable...

    Les deux codes les plus long ont pour eux la gestion en clair des erreurs.

    Je penses que ça devrait servir à pas mal de monde.

    En tous cas merci.

  7. #7
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 044
    Points
    16 044
    Par défaut
    Re,

    Tu as essayé le code que je t'ai donné ?

    En utilisant tes autres procédures, qui me semblent parfaitement correctes...

    Domi2

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 188
    Points : 98
    Points
    98
    Par défaut
    Heu...

    Désolé, mais où est ce que je met le nom du fichier à ouvrir ?

    Par ailleurs, je confirme que je n'aarive pas à utiliser le plus court des éléments de code que j'ai trouvé.

    Encore merci.

  9. #9
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 044
    Points
    16 044
    Par défaut
    Re,

    Dans une macro, une action ExécuterCode, avec dans le nom de fonction, pour reprendre ton exemple, NomDeFonction(), fonction qui doit être placée dans un module standard également.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Public Function NomDeFunction()
     
        Call OuvrirDocument ("C:\LeChemin\Test.mbx", ouvrir)
     
    End Function
    C'est tout, le paramètre "ouvrir" est optionnel, c'est le mode par défaut.

    Domi2

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 188
    Points : 98
    Points
    98
    Par défaut
    Bonjour,

    Bon OK, j'ai pigé, je crois...

    Il faut donc combiner la première partie du code qui prépare l'action, avec la seconde partie du code qui la déclenche, et on rentre le document voulu dans cette seconde partie.

    En toute modestie, celui que j'ai trouvé à l'avantage d'être opérationel tel quel...

    Reste une dernière question...

    Je sais que le dernier paramètre sert à choisir la façon dont se comporte la fenêtre de l'application executée.

    Mais les explication que j'ai proposent des caractères et non un chiffre pour selectionner le mode d'affichage.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SW_HIDE  	EQUATE(0)  	Cache la fenêtre spécifiée, et active une autre fenêtre.
    SW_SHOWNORMAL 	EQUATE(1) 	Active et affiche la fenêtre, en la restaurant à sa position et à sa taille normale. Utilisé en général pour le premier affichage d'une fenêtre.
    SW_NORMAL 	EQUATE(1) 	 
    SW_SHOWMINIMIZED 	EQUATE(2) 	Active la fenêtre et la réduit.
    SW_SHOWMAXIMIZED 	EQUATE(3) 	Active la fenêtre, et l'agrandit.
    SW_MAXIMIZE 	EQUATE(3) 	Agrandit la fenêtre spécifiée.
    SW_SHOWNOACTIVATE 	EQUATE(4) 	Affiche la fenêtre à sa taille et position les plus récentes, la fenêtre active reste active.
    SW_SHOW 	EQUATE(5) 	Active la fenêtre et l'affiche à sa taille et position précédente
    SW_MINIMIZE 	EQUATE(6) 	Réduit la fenêtre spécifiée et active la fenêtre de niveau supérieur suivante.
    SW_SHOWMINNOACTIVE 	EQUATE(7) 	Réduit la fenêtre, la fenêtre active reste active.
    SW_SHOWNA 	EQUATE(8) 	Affiche la fenêtre dans son état actuel, la fenêtre active reste active.
    SW_RESTORE 	EQUATE(9) 	Active la fenêtre et restaure son affichage à sa taille et position précédente.
    SW_SHOWDEFAULT 	EQUATE(10) 	Restaure les paramètres par défaut de la fenêtre, lors de sa création.
    SW_MAX 	EQUATE(10)
    Est ce que reporter ce chiffre dans les paramètre de ShellExecute est suffisant, ou bien faut-il aussi remplacer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Const SW_SHOWNORMAL = 1
    Par, par exmple

    Encore merci

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 188
    Points : 98
    Points
    98
    Par défaut
    Bonjour.

    Faute de nouvelle réponse, je clôture ce message.

    Merci de votre aide à tous.

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

Discussions similaires

  1. ouvrir un fichier par vba
    Par must04 dans le forum Général VBA
    Réponses: 3
    Dernier message: 28/09/2010, 11h55
  2. Génération de rectangles par VBA sous ACCESS 2000
    Par keketteboy dans le forum VBA Access
    Réponses: 13
    Dernier message: 11/09/2008, 16h46
  3. Réponses: 1
    Dernier message: 27/05/2008, 18h43
  4. [VBA - Outlook] Ouvrir un fichier en VBA
    Par crashyear dans le forum VBA Outlook
    Réponses: 1
    Dernier message: 06/02/2007, 12h25
  5. Réponses: 9
    Dernier message: 20/06/2005, 16h47

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