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 :

difference d'execution entre dubbugage et mode normal


Sujet :

VBA Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 153
    Par défaut difference d'execution entre dubbugage et mode normal
    Bonjour
    J'ai creé un programme VBA sous access qui me permet de recuperer des données de tous les fichiers excel contenus dans un repertoire.
    Cependant je n'obtiens pas les memes resultats entre le mode dubugage et le mode normal.

    En mode dubugage tout fonctionne correctement alors qu'en mode normal le programme me trouve des doublons.

    Je n'arrive pas a comprendre d'ou vient le probleme.
    Je tiens a preciser que l'import de données ce fait via une macro contenue dans un classeur excel.

    Voila si quelqu'un a une idée.
    Peut etre la vitesse d'execution du programme en mode normal qui fait qu'il fini par se marcher dessus.
    je vais essayer aussi d'utiliser rst.find first pour la comparaison de données.

    voici un bout de mon programme.
    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
     
    Private Sub Commande21_Click()
     
    'importer toutes les factures d'un repertoire
    Dim bd As Database
    Dim reponse As String
    Dim repertoire As String
    Dim fichier As String
    Dim extension As String
    Dim animal As String
    Dim année As Integer
    Dim semaine As String
    Dim i As Integer
    Dim j As Integer
    Dim resultat As String
    Dim Rst As Recordset
    Dim rst1 As Recordset
    'Dim cnt As Connection
    'Dim texte As String
     
    Set bd = CurrentDb 'definition de la base de données de reference (celle en cours)
    Set rst1 = bd.OpenRecordset("doublons", dbOpenDynaset)
    DoCmd.RunSQL "ALTER TABLE factures DROP CONSTRAINT PrimaryKey"
     
    'C:\Documents and Settings\CUMA de l'Onglet\Mes documents\CUMAFACTURE
     i = 0 'initialisation du compteur de factures extraites
     j = 0 'initialisation du compteur de doublons
     
     extension = "*.xls" 'selection de l'extension à rechercher dans le repertoire
     
     animal = InputBox("type d'animal desiré?") 'selection du type de facture à editer
     année = InputBox("quelle année?") 'choix de l'année des factures
     reponse = MsgBox("lancer l'import", vbYesNo, "import des factures") 'demande de confirmation de lancement de la tache
     
     Select Case reponse 'suivant la reponse
     Case vbYes 'si oui
     'MsgBox ("appuyer sur echap pour arreter la tache a tout moment")
        'While GetAsyncKeyState(27) = 0 'tant que la touche echap n'as pas été pressé on poursui la tache
         If animal = "agneaux" Then
            Excel.Workbooks.Open ("E:\agneaux\2008\Facture vierge AGNEAUXP") 'ouverture du fichier contenant la macro
            repertoire = ("E:\agneaux\" & année & "\") 'definition du repertoire de recherche
                ElseIf animal = "bovins" Then
                Excel.Workbooks.Open ("E:\GROSBOVIN\2008\Facture vierge bovinP.xls")
                repertoire = ("E:\GROSBOVIN\" & année & "\")
                    ElseIf animal = "porcs" Then
                    Excel.Workbooks.Open ("E:\Porcs\2008\Facture vierge porcsP.xls")
                    repertoire = ("E:\Porcs\" & année & "\")
                        ElseIf animal = "veaux" Then
                        Excel.Workbooks.Open ("E:\Veaux\2008\Facture vierge veauxP.xls")
                        repertoire = ("E:\Veaux\" & année & "\")
         End If
     
        fichier = Dir(repertoire & extension) 'association du repertoire et l'extension pour obtenir uniquement le nom du fichier
        MsgBox (fichier) 'affichage du premier fichier du repertoire
     
     
         Do Until Left(fichier, 14) = "Facture vierge" Or fichier = "" 'parcours du repertoire
         'MsgBox (fichier)
           Excel.Workbooks.Open (repertoire & fichier) 'ouverture du fichier excel
           Cells(2, 9).Value = "non"
           Select Case animal
     
    Case "bovins"
            Set Rst = bd.OpenRecordset("factures", dbOpenDynaset)
               With Rst
               Do While Not .EOF
               resultat = Rst.Fields("numero facture")
                   If resultat = Mid(Cells(12, 1), 12, 35) Then
                        With rst1
                        rst1.AddNew
                        ![type facture] = Worksheets("Feuil1").Range("I1")
                        ![date facture] = Worksheets("Feuil1").Range("b11")
                        ![numero facture] = Mid(Worksheets("Feuil1").Range("a12"), 12)
                        rst1.Update
                        j = j + 1
                        End With
                        Exit Do
                    Else
                        Rst.MoveNext
                    End If
               Loop
                   If resultat <> Mid(Cells(12, 1), 12, 35) Then
                   Excel.Application.Run ("'Facture vierge bovinP.xls'!extractbovins")
                   Rst.Close
                   Set Rst = Nothing
                   Else
                   Rst.Close
                   Set Rst = Nothing
                   End If
              End With
     
     End Select
           i = i + 1 'incrementation du compteur de factures extraites
           ActiveWorkbook.Close False 'fermeture de fichier precedent en sauvegardant les modifications
           fichier = Dir
          Loop
          rst1.Close 'fermeture du 2ieme recordset
          Set rst1 = Nothing
          MsgBox ("import des données terminées")
          MsgBox ("le nombre de factures importées de: " & i - j)
          If j <> 0 Then
          MsgBox ("nombre de doublons touvées: " & j) 'affichage seulement en cas de doublons
          End If
          Excel.Workbooks.Close
          Excel.Application.Quit
          DoCmd.RunSQL "ALTER TABLE factures ADD CONSTRAINT PrimaryKey PRIMARY KEY ([numero facture])"
     Case vbNo 'si la reponse on est non alors on annule l'operation
     DoCmd.CancelEvent
     End Select
     
     
    End Sub
    Amicalement Scons

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 153
    Par défaut
    J'ai essayer avec une autre syntaxe pour la comparaison des données entre access et excel en utilisant la commande "findfirst".
    Malheuresement rien ne change, toujours le meme problemes.

    voici ma nouvelle syntaxe pour ceux que ca interesse.

    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
     
    Case "bovins"
            Set Rst = bd.OpenRecordset("factures", dbOpenDynaset)
               With Rst
               Do While Not .EOF
               resultat = Rst.Fields("numero facture")
               texte = Mid(Cells(12, 1), 12, 35)
               Rst.FindFirst "[numero facture] like'" & texte & "'"
               If Rst.NoMatch Then
                 Exit Do
               Else
                 With rst1
                 rst1.AddNew
                 ![type facture] = Worksheets("Feuil1").Range("I1")
                 ![date facture] = Worksheets("Feuil1").Range("b11")
                 ![numero facture] = Mid(Worksheets("Feuil1").Range("a12"), 12)
                 rst1.Update
                 j = j + 1
                 End With
                 Exit Do
               End If
               Loop
                   If resultat <> Mid(Cells(12, 1), 12, 35) Then
                   Excel.Application.Run ("'Facture vierge bovinP.xls'!extractbovins")
                   Rst.Close
                   Set Rst = Nothing
                   Else
                   Rst.Close
                   Set Rst = Nothing
                   End If
              End With

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 153
    Par défaut
    Bonjour,
    Bon je suis toujours avec mon probleme d'execution sur les bras.
    Je ne comprend pas pourquoi le programme aboutit correctement en "mode debugage pas a pas" alors qu'il tombe sur des doublons en execution auto.

    Je me suis rendu compte que l'ouverture des fichiers excel ne se fait pas forcement dans l'ordre, peut etre est ce une piste.
    Sauriez vous comment remedier a ce problemes?

    Je voudrais aussi essayer de marquer une pause dans mon code, quelqu'un connaitrait t'il la syntaxe?
    En effet la seule difference entre les deux mode d'execution c'est le temps d'execution.

    Amicalement Scons.

  4. #4
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 153
    Par défaut
    Salut,

    Je suis en train de regarder un peu ton code, mais c'est long, et il est tard, je m'y pencherai un peu plus en détail demain

    Sinon, déjà, voici le code qui équivaut à un "sleep" en C / ShellScript :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    dim nb_ms as double
    dim cpt as double
     
    'nombre de ms à attendre, ici 1 seconde
    nb_ms = 1000
    cpt = Timer()
        Do While cpt + nb_ms > Timer()
            DoEvents
        Loop
    C'est pas un truc très précis, à la ms près, mais ça te permettra de faire quelques tests ^^

    Ensuite, si je devais faire un test, je mettrais un "sleep" de 1 seconde avant chaque ouverture de fichier... mais c'est plus au feeling qu'autre chose que je dis ca

    A+

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour

    Il n'y a peut-être pas besoin de Sleep, il faudrait d'abord tester avec simplement l'instruction DoEvents.

    Celle-ci permet d'attendre qu'un processus en cours se termine avant de passer au suivant.

    L'inconvénient du Sleep, c'est que tu vas régler un temps d'attente, et si ton application doit tourner sur un poste moins puissant, le paramétrage d'attente que tu as mis ne sera peut-être pas suffisant.

    Starec

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 153
    Par défaut
    enfin des reponses!! je n'y croyais plus

    j'ai rajouté une pause dans l'execution de mon prog (en tulisant excel.application.wait) et ca semble fonctionner.
    Mais c'est vrai que ca ralentie beaucoup mon application.
    Je pense que la solution de starec avec le "doevents" pourrait etre interessant.
    Je testerai ca lundi et je vous redirai.

    en tout cas merci pour tout

    Amicalement Scons

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/06/2006, 16h06
  2. [ADO.Net][C#/DataSet] Comment différer l'exécution de méthodes ?
    Par Invité dans le forum Accès aux données
    Réponses: 4
    Dernier message: 26/04/2006, 16h14
  3. Réponses: 1
    Dernier message: 07/10/2005, 23h07
  4. [GUI] Conception différent de exécution
    Par kourdou59 dans le forum JBuilder
    Réponses: 1
    Dernier message: 27/06/2005, 09h54

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