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

Macros et VBA Excel Discussion :

Bug aléatoire Access / Excel


Sujet :

Macros et VBA Excel

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 304
    Points : 94
    Points
    94
    Par défaut Bug aléatoire Access / Excel
    Bonjour à tous, j'espère que vous allez m'aider car j'ai un beug qui intervient quelque fois et que je ne sais pas comment résoudre. D'ailleurs je n'arrive pas à le reproduire systématiquement, je n'ai pas encore détecter le cas provoquant ce beug.
    Vous imaginez bien que je ne suis pas à l'aise car je me dit que ça pourra très bien arriver avec les utilisateurs...

    j'ai une base access d'un côté et des fichiers excel de l'autre. Deux fonctionnalitées, l'une est de charger dans Access le contenu des fichiers excel et l'autre d'effectuer un export dans excel du contenu des tables access.

    Pour faire simple, j'ai donc deux boutons sur mon formulaire, un bouton chargement access et un bouton export excel.

    Pour le chargement, j'ouvre des fichiers excel (plusieurs) je l'ai parcourt et je charge dans Access.

    Pour l'export, je crée un fichier excel et je l'alimente a l'aide d'un recordset.

    Le beug, c'est que parfois, quand je lance la fonctionnalité de chargement, le fichier a importer s'ouvre mais il y a également un autre fichier excel qui s'ouvre.
    cet autre fichier excel s'appelle book1 et contient une ligne dont le contenu se trouve dans la base access. Ensuite ça me demande si je veux enregistrer les changements du fichier book 1 et ça fait planter mon chargement mais je ne sais plus sur quel ligne de code...
    Je me doute donc que quelque chose n'est pas ok, et je soupçonne que ce fichier book1 a été crée lors d'un export vers excel...et qui a peut etre été mal fermé..
    Je dis ça car le nom de l'onglet est le meme que celui que je nomme dans la fonctionnalité d'export vers excel.

    Bon je suis pas un expert, j'ai crée le code en regardant les syntaxe sur ce site.
    Je voudrais déja vérifier avec vous que le code est correct, propre et que c'est bien comme ça qu'on travaille avec des fichiers excel.

    Procédure de chargement :
    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
     
    Private Sub CmdChargementActiviteService_Click()
     
        Set xls = FnOuvrirFichierXls(CurrentProject.Path & "\" & RepertoirePA & "\" & NomFichier)
     
        'Activer onglet "projet"
        xls.Sheets("projet").Activate
     
            'Parcourt des activitées
            While xls.Cells(iNumLigne, 3) <> "fin"
     
                'remplir table budget
                SQLInsertion = "INSERT INTO budget (Type, Producteur,Periode, niveauActivite1, niveauActivite2, niveauActivite3, niveauActivite4, Nature, IndicateurVariabilite, TotalJH, Montant, ModeAllocation, CentreSolutionFinanceJH, CentreSolutionFinanceMontant, CentreSolutionRHJH,CentreSolutionRHMontant, CentreSolutionSiègeSupportJH,CentreSolutionSiègeSupportMontant, CentreDeServicesJH,CentreDeServicesMontant, CentreDeProductionJH,CentreDeProductionMontant,  DSICentraleJH, DSICentraleMontant)" _
                & "VALUES ('" & strType & "','" & xls.Cells(NumLigneDebut, 1) & "','" & xls.Cells(NumLigneDebut, 2) & "','" & Replace(xls.Cells(iNumLigne, 3), "'", "''") & "','" & Replace(xls.Cells(iNumLigne, 4), "'", "''") & "','" & Replace(xls.Cells(iNumLigne, 5), "'", "''") & "','" & Replace(xls.Cells(iNumLigne, 6), "'", "''") & "','" & strNature & "','" & strIndicateurVariabilite & "','" & xls.Cells(iNumLigne, 7) & "'," & iTJMBrut * xls.Cells(iNumLigne, 7) & ",'" & xls.Cells(iNumLigne, 9) & "','" & DestCSFJH & "','" & DestCSFMontant & "','" & DestCSRHJH & "','" & DestCSRHMontant & "','" & DestCSSSJH & "','" & DestCSSSMontant & "','" & DestCSJH & "','" & DestCSMontant & "','" & DestCPJH & "','" & DestCPMontant & "','" & DestDSIJH & "','" & DestDSIMontant & "')"
     
                'MsgBox SQLInsertion
                DoCmd.RunSQL SQLInsertion
     
        Call FnFermerFichierXls(xls)
     
     
    'ouverture du fichier des sous activitées
    Set xls = FnOuvrirFichierXls(CurrentProject.Path & "\" & RepertoirePlanRH & "\" & FichierPlanRH)
     
    xls.Sheets("Sous-activité").Activate
     
    SQL ...
        'MsgBox SQLInsertion
        DoCmd.RunSQL SQLInsertion
     
    Call FnFermerFichierXls(xls)
     
    End Sub
    Procédure d'export :
    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
     
    Private Sub CmdExporterBudget_Click()
     
    If IsNull(txtPeriode.Value) = False Then
        SQLBudget = "SELECT * FROM Budget WHERE periode = '" & txtPeriode.Value & "'"
        'MsgBox SQLBudget
    End If
     
     
    'initialisation des variables
    iNumLigneDebut = 2
     
    Set rs = CurrentDb.OpenRecordset(SQLBudget)
    If rs.RecordCount = 0 Then
        MsgBox "aucun résultat pour la recherche"
        Exit Sub
    End If
     
    rs.MoveFirst
     
    'Fichier déja présent ?
    If Dir(CurrentProject.Path & "\Budget.xlsx", vbHidden) <> "" Then
        If MsgBox("Un export a déja été réalisé pour cette période et ce producteur, voulez-vous l'écraser ?", vbYesNo) = vbYes Then
            'Le fichier est il ouvert
            If IsFileOpen(CurrentProject.Path & "\Budget.xlsx") = True Then
                MsgBox "Veuillez fermer le fichier budget puis relancer le traitement"
                Exit Sub
            Else
                'supprimer le fichier
                Kill (CurrentProject.Path & "\Budget.xlsx")
            End If
        Else
            Exit Sub
        End If
    End If
     
    Workbooks.Add
    Sheets("sheet1").Select
    Sheets("sheet1").Name = "Budget"
    Sheets("budget").Activate
     
    'Création entete
    Sheets("budget").Cells(1, 1) = "Producteur"
    .......
     
    While Not rs.EOF
        Sheets("budget").Cells(iNumLigneDebut, 1) = (rs!Producteur)
    .......    
        rs.MoveNext
        iNumLigneDebut = iNumLigneDebut + 1
    Wend
     
     
    ActiveWorkbook.SaveAs FileName:=CurrentProject.Path & "\Budget"
    ActiveWorkbook.Close
     
    MsgBox "Export terminé"
     
     
    end sub
    Les procédures ouverture et fermeture d'un fichier excel :
    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
     
     
    Public Function FnOuvrirFichierXls(CheminFichier As String) As Excel.Application
     
    Dim xls As Excel.Application
     
    Set xls = CreateObject("Excel.Application")
    xls.Workbooks.Open CheminFichier
    xls.Visible = True
     
    Set FnOuvrirFichierXls = xls
     
    End Function
     
     
    Public Sub FnFermerFichierXls(ByVal objFichierXls As Excel.Application)
     
    objFichierXls.ActiveWorkbook.Save
    objFichierXls.Workbooks.Close
    objFichierXls.Quit
     
    Set objFichierXls = Nothing
     
    End Sub
    Si vous pouviez déja me dire si la manière dont j'ouvre et je ferme les fichiers excel est correct, et si la manière dont je crée les fichiers excel est correct également ?

    Merci beaucoup de votre aide, je sais pas comment résoudre ce probleme aléatoire...

    Merci

  2. #2
    Membre chevronné
    Inscrit en
    Août 2006
    Messages
    1 588
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 1 588
    Points : 2 178
    Points
    2 178
    Par défaut
    Bonsoir,
    la fonction d'ouverture de fichier Excel (FnOuvrirFichierXls) est sans doute de trop car Workbooks.open dans le corps de la fonction principale suffirait
    Le passage de l'objet Excel.Application en variable me semble suspect.
    Idem pour la fermeture.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 304
    Points : 94
    Points
    94
    Par défaut
    Bonjour merci pour ta réponse. OK je supprime les fonctions d'ouvertures et de procédures du fichier.
    Mais peux-tu m'en dire d'avantage, ai-je besoin de déclarer un objet excel.application ou bien je fait juste un woorbook.open puis close puis save ?

    merci de votre aide

    Bonjour, en regardant un autre code d'ouverture d'excel, j'ai vu qu'on pouvait déclarer un objet de type woorbook et lui affecté l'ouverture du fichier.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set xlBook = xlApp.Workbooks.Open (chemin)
    alors que moi je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Set xls = CreateObject("Excel.Application")
    xls.Workbooks.Open (CurrentProject.Path & "\" & RepertoireService & "\" & FichierService)
    est-ce que ça pourrait venir de là mon problème de book1 qui s'ouvre ?

    Quelle différence entre créer un objet de type woorkbook ou non ?

    Merci

    Si quelqu'un qui s'y connait pourrait me dire si c'est plus propre de créer un objet de type workbook et si mon problème pourrait venir de là, ça serait super cool, merci beaucoup à ceux qui voudraient bien m'aider.

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 304
    Points : 94
    Points
    94
    Par défaut
    bonjour, je suis retombé sur le bug...
    J'ai virer les fonctions d'ouverture et de fermeture du fichier excel.
    J'ouvre et je ferme dans le corps de procédure principal :
    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
     
    'ouverture du fichier
    Set xls = CreateObject("Excel.Application")
    Set xlsClasseur = xls.Workbooks.Open(CurrentProject.Path & "\" & RepertoireTJMChargé & "\" & FichierTJMChargé)
    xls.Visible = False
    xls.DisplayAlerts = False
     
    'Activer onglet "projet"
    Set xlsFeuille = xlsClasseur.Worksheets("TJM Chargé")
    xlsFeuille.Activate
     
    .....
     
     
    'Fermeture fichier excel
    xlsClasseur.Close
    xls.Quit
    Set xls = Nothing
    Set xlsClasseur = Nothing
    Set xlsFeuille = Nothing
    Le bug est survenu a l'exécution de ce 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
     
    While Not rs.EOF
     
        'Création fichier facture par client
        Set xls = CreateObject("Excel.Application")
     
        Set xlsClasseur = xls.Workbooks.Add
        Set xlsFeuille = xlsClasseur.Worksheets(1)
     
        'Ecriture nom client et periode dans le fichier excel
        xlsFeuille.Cells(1, 1).Value = "Client : "
        xlsFeuille.Cells(1, 2).Value = (rs!ClientNiveau3)
        xlsFeuille.Columns.AutoFit
    .................
     
        'Enregistrer le fichier facture par client
        xlsClasseur.SaveAs FileName:=CurrentProject.Path & "\Facture\Facture" & Replace(rs!ClientNiveau3, "*", "étoile") & ".xlsx"
        xlsClasseur.Close
        xls.Quit
     
        Set xls = Nothing
        Set xlsClasseur = Nothing
        Set xlsFeuille = Nothing
     
        rs.MoveNext
    Wend

    Si quelqu'un peut m'aider je suis preneur merci a tous

  5. #5
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 015
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 015
    Points : 24 548
    Points
    24 548
    Par défaut
    Le bug se produit avec du code Excel et sur Excel. Pourquoi le poster dans Access ? Je transfère.

    Tu auras peut-être une réponse.

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 304
    Points : 94
    Points
    94
    Par défaut
    Loufab,

    c'est dans un formulaire access que j'ai ce code et non pas dans une macro excel.

    mais si en le transferant j'aurais plus de réponse ok pas de soucis.

    Merci

  7. #7
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 015
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 015
    Points : 24 548
    Points
    24 548
    Par défaut
    Tu devrais te documenter sur l'Automation.

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 304
    Points : 94
    Points
    94
    Par défaut
    Loufab je ne comprends pas trop ta réponse, pourquoi dis-tu ça ?

    Sinon ok j'ai fait une recherche dans le forum sur le mot automation (je ne sais pas ce que c'est) et je n'ai pas trouvé grand chose.

    as-tu des tutoriels ou topic interessant ?

    merci.

  9. #9
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 015
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 015
    Points : 24 548
    Points
    24 548
    Par défaut
    Oui beaucoup de liens sur le sujet :

    [ame="http://www.google.fr/search?source=ig&hl=fr&rlz=1G1GGLQ_FRZZ296&q=automation&aq=f&aqi=g2g-s1g7&aql=&oq="]automation - Recherche Google[/ame]

    Il y a plus simplement :


    Ta recherche doit être en panne.
    http://www.developpez.net/forums/sea...archid=7250145

  10. #10
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Pour ton code, tu peux créer une seule instance Excel (et pas à chaque boucle)

    Pour le nom du fichier, est tu sûr qu'il ne comporte pas certains caractères interdits

    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
    Dim Fichier As String
     
    '.....
    'Création fichier facture par client
    Set xls = CreateObject("Excel.Application")
    While Not rs.EOF
        Set xlsClasseur = xls.Workbooks.Add(1)
        Set xlsFeuille = xlsClasseur.Worksheets(1)
        'Ecriture nom client et periode dans le fichier excel
        With xlsFeuille
            .Cells(1, 1).Value = "Client : "
            .Cells(1, 2).Value = rs!ClientNiveau3
            .Columns.AutoFit
            '.................
        End With
        'Enregistrer le fichier facture par client
        Fichier = Replace(rs!ClientNiveau3, "*", "étoile")
        MsgBox Fichier
        xlsClasseur.SaveAs Filename:=CurrentProject.Path & "\Facture\Facture" & Fichier & ".xlsx"
        xlsClasseur.Close
        Set xlsClasseur = Nothing
        Set xlsFeuille = Nothing
        rs.MoveNext
    Wend
    xls.Quit
    Set xls = Nothing

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 304
    Points : 94
    Points
    94
    Par défaut
    Bonjour mercatog et merci de ton aide.

    En effet je crée plusieurs fois une instance excel, je modifie ça déja mais je ne pense pas que ça vienne de là car je libère en fin de boucle avec
    Sinon oui le nom de fichier peut contenir une * mais je le gère en faisant un replace donc pas d'erreur à l'enregistrement du fichier.

    D'autres idées ?

    Merci

  12. #12
    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,

    Très souvent, et du fait d'une codification non qualifiée correctement, les instances Excel ne se ferment pas correctement d'où des trâces d'EXCEL.EXE qui persistent dans la liste des processus. Difficile alors de savoir lequel est encore utilisé.
    Dans le processus d'exécution d'une séquence d'échange de données Access/Excel, on créé toujours une nouvelle instance (attention aux boucles).

    On en prend alors le HWnd dans un Long et ensuite, si l'instance persiste, c'est qu'effectivement la méthode Quit() n'a pas fonctionné et ce, même si l'objet est mis à Nothing...

    Il faut donc tuer le processus à l'aide des API idoines qui selon le mode d'ouverture (Par Shell() ou Automation) seront respectivement GetWindowThreadProcessId() et/ou OpenProcess(),TerminateProcess(), CloseHandle().

    Il y a de nombreux exemples et sujets correlatifs sur le forum.

    Argy

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 304
    Points : 94
    Points
    94
    Par défaut
    Bonjour Argyronet, et merci pour la réponse.
    je vais spécifier le fileformat d'orénavent et faire attention aux instances crées (dans les boucles), peu être que cacorrigera mon problème.

    En ce qui concerne le processus qui tourne toujours après exécution, j'ai déja vu les posts sur le forum concernant ce problème.
    J'ai vérifier après chaque utilisation de mon appli et aucun processus ne tourne. Donc ca ne devrait pas venir de la.
    Je vous tient au courant.

Discussions similaires

  1. [Access][Excel]en vb
    Par elasfer dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 16/10/2005, 20h37
  2. [VBA] Access Excel
    Par mariobedard dans le forum Access
    Réponses: 3
    Dernier message: 06/10/2005, 11h12
  3. PB export date et lien hypertexte d'access à excel
    Par Celia1303 dans le forum Access
    Réponses: 2
    Dernier message: 05/10/2005, 17h09
  4. Access - Excel - Serveur RPC
    Par lorang dans le forum Access
    Réponses: 29
    Dernier message: 23/02/2005, 15h14
  5. [VBA] Access-> Excel Format de cellule
    Par toflofr dans le forum VBA Access
    Réponses: 19
    Dernier message: 31/07/2003, 14h26

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