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

Runtime Discussion :

Code VBA plante avec runtime


Sujet :

Runtime

  1. #1
    Membre régulier
    Inscrit en
    Août 2003
    Messages
    228
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 228
    Points : 92
    Points
    92
    Par défaut Code VBA plante avec runtime
    Bonjour,

    le code VBA en module plante mon application access (runtime) sur certain poste :

    Mon code marche super bien en runtime, mais sur un pc sa fait planté mon application. J'ai mis a jour le runtime 2013 sur le poste mais rien a faire.

    Avez-vous une idée? Pensez-vous que c'est le fichier comdlg32.dll?


    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
    Option Compare Database
    Option Explicit
     
    'Déclaration de l'API
    Private Declare Function GetOpenFileName Lib "comdlg32.dll" Alias _
                       "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
     
     'Structure du fichier
    Private Type OPENFILENAME
        lStructSize As Long
        hwndOwner As Long
        hInstance As Long
        lpstrFilter As String
        lpstrCustomFilter As String
        nMaxCustFilter As Long
        nFilterIndex As Long
        lpstrFile As String
        nMaxFile As Long
        lpstrFileTitle As String
        nMaxFileTitle As Long
        lpstrInitialDir As String
        lpstrTitle As String
        flags As Long
        nFileOffset As Integer
        nFileExtension As Integer
        lpstrDefExt As String
        lCustData As Long
        lpfnHook As Long
        lpTemplateName As String
    End Type
     
     'Constantes
    Private Const OFN_READONLY = &H1
    Private Const OFN_OVERWRITEPROMPT = &H2
    Private Const OFN_HIDEREADONLY = &H4
    Private Const OFN_NOCHANGEDIR = &H8
    Private Const OFN_SHOWHELP = &H10
    Private Const OFN_ENABLEHOOK = &H20
    Private Const OFN_ENABLETEMPLATE = &H40
    Private Const OFN_ENABLETEMPLATEHANDLE = &H80
    Private Const OFN_NOVALIDATE = &H100
    Private Const OFN_ALLOWMULTISELECT = &H200
    Private Const OFN_EXTENSIONDIFFERENT = &H400
    Private Const OFN_PATHMUSTEXIST = &H800
    Private Const OFN_FILEMUSTEXIST = &H1000
    Private Const OFN_CREATEPROMPT = &H2000
    Private Const OFN_SHAREAWARE = &H4000
    Private Const OFN_NOREADONLYRETURN = &H8000
    Private Const OFN_NOTESTFILECREATE = &H10000
     
    Private Const OFN_SHAREFALLTHROUGH = 2
    Private Const OFN_SHARENOWARN = 1
    Private Const OFN_SHAREWARN = 0
     
     
    Public Function OuvrirUnFichier(Handle As Long, _
                                    Titre As String, _
                                    TypeRetour As Byte, _
                                    Optional TitreFiltre As String, _
                                    Optional TypeFichier As String) As String
     'OuvrirUnFichier est la fonction a 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 (Me.Hwnd)
        '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
     
    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
      End With
     
      If (GetOpenFileName(StructFile)) Then 'Si un fichier est sélectionné
        Select Case TypeRetour
          Case 1: OuvrirUnFichier = Trim$(StructFile.lpstrFile)
          Case 2: OuvrirUnFichier = Trim$(StructFile.lpstrFileTitle)
        End Select
      End If
     
    End Function
    Commandeur

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    Avec le runtime, il faut impérativement mettre de la gestion d'erreur dans ton code.
    Soit avec un On Error goto ou un événmenet SurErreur du formulaire sinon Access te mets un truc du genre :

    Il y a eu une erreur, j'arrête l'application.
    Tu peux aussi tester (fiable à 99%) ta BD en mode runtime sur une machine avec un vrai Access en ajoute /runtime à la ligne de commande.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  3. #3
    Membre régulier
    Inscrit en
    Août 2003
    Messages
    228
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 228
    Points : 92
    Points
    92
    Par défaut
    Merci de ta reponse,

    Comment utilise-tu ce code? J'ai un peu de mal a mettre en place. Voici mon code ci-dessous

    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
     
    Private Sub Miseajourtable_Click()
     
    DoCmd.SetWarnings False
     
    DoCmd.OpenQuery "RQ-Ajout article"
     
    DoCmd.OpenQuery "RQ-Ajout of"
     
    DoCmd.OpenQuery "RQ-MiseAJour_article"
     
    DoCmd.OpenQuery "RQ-MiseAjourOF"
     
    MsgBox "Mise à jour terminée.", vbInformation
     
    End Function
    Tu peux aussi tester (fiable à 99%) ta BD en mode runtime sur une machine avec un vrai Access en ajoute /runtime à la ligne de commande.
    Sur qu'elle ligne de commande? toute mon application sera en runtime?

    Merci de ton aide
    Commandeur

  4. #4
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    Ici un exemple :

    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
    Private Sub Miseajourtable_Click()
     
        on error goto Err_Miseajourtable_Click
     
        DoCmd.SetWarnings False
     
        DoCmd.OpenQuery "RQ-Ajout article"
     
        DoCmd.OpenQuery "RQ-Ajout of"
     
        DoCmd.OpenQuery "RQ-MiseAJour_article"
     
        DoCmd.OpenQuery "RQ-MiseAjourOF"
     
        DoCmd.SetWarnings true 'recative les alertes de suppression et modification.
     
        MsgBox "Mise à jour terminée.", vbInformation
     
    Exit_Miseajourtable_Click:
        exit sub
     
    Err_Miseajourtable_Click:
        msgbox "Erreur : " & err.number & ", " & err.description, vbexclamation
        resume exit_Miseajourtable_Click
     
    End Function
    Ça c'est "de base".

    Personnellement j'utilise cela :

    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
    Private Sub Miseajourtable_Click()
     
        if not EST_MODE_DEBUG then
            on error goto Err_Miseajourtable_Click
        end if
     
        DoCmd.SetWarnings False
     
        DoCmd.OpenQuery "RQ-Ajout article"
     
        DoCmd.OpenQuery "RQ-Ajout of"
     
        DoCmd.OpenQuery "RQ-MiseAJour_article"
     
        DoCmd.OpenQuery "RQ-MiseAjourOF"
     
        MsgBox "Mise à jour terminée.", vbInformation
     
    Exit_Miseajourtable_Click:
        exit sub
     
    Err_Miseajourtable_Click:
        call AfficherErreurStandard(err)
        resume exit_Miseajourtable_Click
     
    End Function
    dans un module nommé mdlGlobal
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ' Conditionne la gestion des erreurs
    '  True la gestion des erreurs est désactivée
    '  False la gestion des erreurs est activé
    '    Cela permet de trouver plus facilement l'origine de l'erreur.
    '    VBA va s'arrêter sur la ligne qui crée le problème.
    Public Const EST_MODE_DEBUG As Boolean = True
    dans un module nommé mdlErreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Public Sub AfficherErreurStandard(prmErr As ErrObject, Optional prmMess As String = "")
        DoCmd.Hourglass False
        Dim mess As String
     
        If prmMess <> "" Then
            mess = prmMess
            mess = mess & vbNewLine & vbNewLine
        End If
     
        mess = mess & "Erreur : " & prmErr.Number & ", " & prmErr.description
        mess = mess & vbNewLine & vbNewLine & "ATTENTION : Si un traitement était en cours il a sans doute été interrompu et les données affichées pourraient ne pas être correctes."
        MsgBox mess, vbExclamation
    End Sub
    Pour la ligne de commande, il s'agit de la ligne de commande DOS qui lance Access en simulant le mode runtime.

    Exemple de .bat qui fait cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    call "C:\TonCheminVers\MSACCESS.EXE" "X:\TonCheminVersTonAppli\TonAppli.accdb" /runtime
    pause
    Ici de la doc sur les paramètres utilisables, c'est pour 2003 mais cela reste vrai.
    How to use command-line switches in Microsoft Access
    https://support.microsoft.com/en-us/kb/209207

    Et généralement je vend l'idée à mon client qu'avec un VRAI Access, il sera plus heureux (et moi moins embêté par les particularité du runtime).

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  5. #5
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    À propos des DoCmd.SetWarnings.

    Personnellement j'aime bien que ma BD me demande de confirmer les modifications que je vais faire ... car une erreur est toujours possible quand c'est l'humain qui est aux commandes.
    Mais c'est assez gênant dans du code donc voici comment je procède.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dim db as dao.database: set db=currentDB
    call db.querydefs("MaReqSuprresion").execute(dbFailOnError) 'execute sans demander la confirmation MAIS en alertant si il y a eu un problème d'exécution
    db.close: set db=nothing 'Libère la mémoire utilisée par l'objet
    Ma sécurité anti-humain reste en place et mon code s'exécute sans me poser de questions.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 06/06/2016, 18h08
  2. [A-07]: Code VBA sous access RunTime
    Par amazon dans le forum Runtime
    Réponses: 3
    Dernier message: 19/03/2009, 15h47
  3. [Formulaire] code VBA et runtime Access
    Par Frenchguy dans le forum Runtime
    Réponses: 11
    Dernier message: 23/11/2006, 17h09
  4. Débutante - Code VBA pour MsgBox avec actions multiples
    Par kisscool35 dans le forum Access
    Réponses: 5
    Dernier message: 22/08/2006, 17h43
  5. Réponses: 4
    Dernier message: 13/10/2005, 14h44

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