ACCESS VBA Problème de réinitialisation

Résolu
charlie9277 Messages postés 4 Date d'inscription vendredi 27 février 2009 Statut Membre Dernière intervention 27 février 2009 - 27 févr. 2009 à 10:06
charlie9277 Messages postés 4 Date d'inscription vendredi 27 février 2009 Statut Membre Dernière intervention 27 février 2009 - 27 févr. 2009 à 15:45
Bonjour à tous,

Cela fait maintenant deux jours que je n'arrive pas à résoudre mon bug.
J'ai parcouru beaucoup de forum mais sans réponse. Alors je me lance, voici mon problème:

Quand j'éxécute mon code une première fois tout se passe bien.
Quand je l'éxécute une deuxième fois sans sortir de Access, il plante sur la ligne 'ActiveWindow.DisplayGridlines = False' en erreur "Erreur d'exécution '91': Variable objet ou variable de bloc With non définie".


Par contre, si je réinitialise le code entre les deux éxécution (bouton carré dans la fenêtre éditeur) alors la deuxième éxécution se passe correctement.


Franchement, je n'y comprend rien. Je fais bien attention à tout quitter correctement mais il manque quelque chose .... J'espère que quelqu'un pourra m'aider. Merci d'avance pour votre aide.


Voici le code simplifié mais qui montre le bug:



Private Sub Rapport_Maintenance_Review_Click()



    Dim MonAppliExcel                   As Excel.Application
    Dim Rapport                         As Excel.Workbook
    Dim MaFeuilleExcel                  As Excel.Worksheet



    Set MonAppliExcel = New Excel.Application
    Set Rapport = MonAppliExcel.Workbooks.Add
    Set MaFeuilleExcel = Rapport.ActiveSheet
    MonAppliExcel.Visible = True
    
    ActiveWindow.DisplayGridlines = False
   
    Rapport.SaveAs "C:\Temp\Rapport.xls", , , , , False
    Rapport.Close
           
    MonAppliExcel.Application.Quit
           
    'Libération des ressources
    Set MaFeuilleExcel = Nothing
    Set Rapport = Nothing
    Set MonAppliExcel = Nothing
   
End Sub


 

7 réponses

hebus16 Messages postés 80 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 2 octobre 2009 1
27 févr. 2009 à 10:41
Salut,

  je suis pas sur de ce que je vais ecrire ... pour résumé ta ligne

ActiveWindow.DisplayGridlines = False

fait appel à une propriété qui n'existe pas pour la vraie fenêtre active. Essaye de faire un MaFeuilleExcel.Activate plutot

Après il faut voir avec le debuggeur ce qui est actif au moment où ca passe sur cette ligne

Sinon mets ton vrai code qu'on puisse tester

Hebus
3
charlie9277 Messages postés 4 Date d'inscription vendredi 27 février 2009 Statut Membre Dernière intervention 27 février 2009
27 févr. 2009 à 14:11
J'ai essayé avec MaFeuilleExcel.Activate mais ça ne change rien.

Si je mets cette ligne en commentaire, il buggera à la prochaine sélection Range quelques lignes plus bas sauf si je réinitialise le code avec le bouton carré !!!!

Au fait, merci beaucoup pour ton aide.

Voici une plus grande partie du code:

Private Sub Rapport_Maintenance_Review_Click()




    Dim MaBD                            As Database
    Dim Liste_Ticket                    As Recordset
    Dim Liste_Actions                   As Recordset
    Dim Liste_Temp                      As Recordset
    Dim MonAppliExcel                   As Excel.Application
    Dim Rapport                         As Excel.Workbook
    Dim MaFeuilleExcel                  As Excel.Worksheet
    Dim Ligne                           As Integer
           
    Ligne = 2





    'Ouverture de la connexion à la BDB
    Set MaBD = CurrentDb()





    Set MonAppliExcel = New Excel.Application
    Set Rapport = MonAppliExcel.Workbooks.Add
    Set MaFeuilleExcel = Rapport.ActiveSheet
    MonAppliExcel.Visible = True
   
    MaFeuilleExcel.Name = "Pending Items for " & Me.Liste_Entity.Value
   
    MaFeuilleExcel.Activate
   
    ActiveWindow.DisplayGridlines = False
   
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''01 - DEFECT'''''''''''''''''''''''''''''
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' Recherche des tickets    MonSql "SELECT * FROM Tickets WHERE Type ""01 - Defect"" AND Entity = """ & Me.Liste_Entity.Value & """;"
    Set Liste_Ticket = MaBD.OpenRecordset(MonSql, dbOpenSnapshot)
             
    If Liste_Ticket.RecordCount <> 0 Then
        'Préparation de l'en-tête
        MaFeuilleExcel.Cells(Ligne, 1).Value = "DEFECTS"
        MaFeuilleExcel.Cells(Ligne, 1).Font.Bold = True
        Ligne = Ligne + 1
        MaFeuilleExcel.Cells(Ligne, 1).Value = "Id"
        MaFeuilleExcel.Cells(Ligne, 2).Value = "Headline"
        MaFeuilleExcel.Cells(Ligne, 3).Value = "Description"
        MaFeuilleExcel.Cells(Ligne, 4).Value = "Severity"
        MaFeuilleExcel.Cells(Ligne, 5).Value = "State"
        MaFeuilleExcel.Cells(Ligne, 6).Value = "LastSubmitDate"
        MaFeuilleExcel.Cells(Ligne, 7).Value = "Owner"
        MaFeuilleExcel.Cells(Ligne, 8).Value = "Comment"
        MaFeuilleExcel.Cells(Ligne, 9).Value = "Action(s)"
       
                       
        MaFeuilleExcel.Range(MaFeuilleExcel.Cells(Ligne, 9), MaFeuilleExcel.Cells(Ligne, 11)).Select
        With Selection
            .HorizontalAlignment = xlLeft
            .VerticalAlignment = xlCenter
            .MergeCells = True
        End With
       
        MaFeuilleExcel.Range(MaFeuilleExcel.Cells(Ligne, 1), MaFeuilleExcel.Cells(Ligne, 9)).Select
        MaFeuilleExcel.Cells(Ligne, 9).Activate
        Selection.Font.Bold = True
        With Selection.Interior
            .ColorIndex = 1
            .Pattern = xlSolid
        End With
        Selection.Font.ColorIndex = 2
        Ligne = Ligne + 1
   
        'Sélection du defect
        Liste_Ticket.MoveFirst
        While Not Liste_Ticket.EOF            MonSql "SELECT * FROM Actions WHERE Id_Tâche """ & Liste_Ticket("Id") & """;"
            Set Liste_Actions = MaBD.OpenRecordset(MonSql, dbOpenSnapshot)
            If Liste_Actions.RecordCount <> 0 Then
                While Not Liste_Actions.EOF
                    MaFeuilleExcel.Cells(Ligne, 9).FormulaR1C1 = Liste_Actions("Date_Création")
                    MaFeuilleExcel.Cells(Ligne, 10).FormulaR1C1 = Liste_Actions("Libellé_Action")
                    MaFeuilleExcel.Cells(Ligne, 11).FormulaR1C1 = Liste_Actions("Qui")
                    Ligne = Ligne + 1
                    Liste_Actions.MoveNext
                Wend
                If Liste_Actions.RecordCount > 1 Then
                    'Fusion des lignes du defect
                    MaFeuilleExcel.Range(MaFeuilleExcel.Cells(Ligne - Liste_Actions.RecordCount, 1), MaFeuilleExcel.Cells(Ligne - 1, 1)).Select
                    With Selection
                        .HorizontalAlignment = xlLeft
                        .VerticalAlignment = xlCenter
                        .MergeCells = True
                    End With
                    MaFeuilleExcel.Range(MaFeuilleExcel.Cells(Ligne - Liste_Actions.RecordCount, 2), MaFeuilleExcel.Cells(Ligne - 1, 2)).Select
                    With Selection
                        .HorizontalAlignment = xlLeft
                        .VerticalAlignment = xlCenter
                        .MergeCells = True
                    End With
                    MaFeuilleExcel.Range(MaFeuilleExcel.Cells(Ligne - Liste_Actions.RecordCount, 3), MaFeuilleExcel.Cells(Ligne - 1, 3)).Select
                    With Selection
                        .HorizontalAlignment = xlLeft
                        .VerticalAlignment = xlCenter
                        .MergeCells = True
                    End With
                    MaFeuilleExcel.Range(MaFeuilleExcel.Cells(Ligne - Liste_Actions.RecordCount, 4), MaFeuilleExcel.Cells(Ligne - 1, 4)).Select
                    With Selection
                        .HorizontalAlignment = xlLeft
                        .VerticalAlignment = xlCenter
                        .MergeCells = True
                    End With
                    MaFeuilleExcel.Range(MaFeuilleExcel.Cells(Ligne - Liste_Actions.RecordCount, 5), MaFeuilleExcel.Cells(Ligne - 1, 5)).Select
                    With Selection
                        .HorizontalAlignment = xlLeft
                        .VerticalAlignment = xlCenter
                        .MergeCells = True
                    End With
                    MaFeuilleExcel.Range(MaFeuilleExcel.Cells(Ligne - Liste_Actions.RecordCount, 6), MaFeuilleExcel.Cells(Ligne - 1, 6)).Select
                    With Selection
                        .HorizontalAlignment = xlLeft
                        .VerticalAlignment = xlCenter
                        .MergeCells = True
                    End With
                    MaFeuilleExcel.Range(MaFeuilleExcel.Cells(Ligne - Liste_Actions.RecordCount, 7), MaFeuilleExcel.Cells(Ligne - 1, 7)).Select
                    With Selection
                        .HorizontalAlignment = xlLeft
                        .VerticalAlignment = xlCenter
                        .MergeCells = True
                    End With
                    MaFeuilleExcel.Range(MaFeuilleExcel.Cells(Ligne - Liste_Actions.RecordCount, 8), MaFeuilleExcel.Cells(Ligne - 1, 8)).Select
                    With Selection
                        .HorizontalAlignment = xlLeft
                        .VerticalAlignment = xlCenter
                        .MergeCells = True
                    End With
                End If
            End If
            'Ecriture des informations pour le defect
            MaFeuilleExcel.Cells(Ligne - Liste_Actions.RecordCount, 1).FormulaR1C1 = Liste_Ticket("Id")
            MaFeuilleExcel.Cells(Ligne - Liste_Actions.RecordCount, 2).FormulaR1C1 = Liste_Ticket("Headline")
            MaFeuilleExcel.Cells(Ligne - Liste_Actions.RecordCount, 3).FormulaR1C1 = Replace(Liste_Ticket("Description"), "€", Chr(10))
            MaFeuilleExcel.Cells(Ligne - Liste_Actions.RecordCount, 4).FormulaR1C1 = Liste_Ticket("Severity")
            MaFeuilleExcel.Cells(Ligne - Liste_Actions.RecordCount, 5).FormulaR1C1 = Liste_Ticket("State")
            MaFeuilleExcel.Cells(Ligne - Liste_Actions.RecordCount, 6).FormulaR1C1 = Liste_Ticket("LastSubmitDate")
            MaFeuilleExcel.Cells(Ligne - Liste_Actions.RecordCount, 7).FormulaR1C1 = "A compléter"
            MaFeuilleExcel.Cells(Ligne - Liste_Actions.RecordCount, 8).FormulaR1C1 = Liste_Ticket("Comments")
            If Liste_Actions.RecordCount <> 0 Then
                Ligne = Ligne + 0
            Else
                Ligne = Ligne + 1
            End If
            Liste_Ticket.MoveNext
        Wend
                   MonSql "SELECT * FROM Tickets LEFT JOIN Actions ON Tickets.[Id] Actions.[Id_Tâche] WHERE Tickets.[Entity] = """ & Me.Liste_Entity.Value & """ AND Tickets.[Type] = ""01 - Defect"";"
        Set Liste_Temp = MaBD.OpenRecordset(MonSql, dbOpenSnapshot)
        Liste_Temp.MoveLast
         
        MaFeuilleExcel.Range(MaFeuilleExcel.Cells(Ligne - Liste_Temp.RecordCount, 1), MaFeuilleExcel.Cells(Ligne - 1, 11)).Select
        Selection.Borders(xlDiagonalDown).LineStyle = xlNone
        Selection.Borders(xlDiagonalUp).LineStyle = xlNone
        With Selection.Borders(xlEdgeLeft)
            .LineStyle = xlContinuous
            .Weight = xlHairline
            .ColorIndex = xlAutomatic
        End With
        With Selection.Borders(xlEdgeTop)
            .LineStyle = xlContinuous
            .Weight = xlHairline
            .ColorIndex = xlAutomatic
        End With
        With Selection.Borders(xlEdgeBottom)
            .LineStyle = xlContinuous
            .Weight = xlHairline
            .ColorIndex = xlAutomatic
        End With
        With Selection.Borders(xlEdgeRight)
            .LineStyle = xlContinuous
            .Weight = xlHairline
            .ColorIndex = xlAutomatic
        End With
        With Selection.Borders(xlInsideVertical)
            .LineStyle = xlContinuous
            .Weight = xlHairline
            .ColorIndex = xlAutomatic
        End With
        If Liste_Temp.RecordCount > 1 Then
            With Selection.Borders(xlInsideHorizontal)
                .LineStyle = xlContinuous
                .Weight = xlHairline
                .ColorIndex = xlAutomatic
            End With
        End If
       
        Liste_Temp.Close
        Liste_Ticket.Close
        Ligne = Ligne + 3
   
    End If





'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
   
    Rapport.SaveAs "C:\Documents and Settings\m-dupuis\Desktop\Defects list\Rapport_" & Me.Liste_Entity.Value & "_" & Format(Date, "yyyymmdd") & ".xls", , , , , False
    Rapport.Close
           
    MonAppliExcel.Application.Quit
           
    'Fermeture de la BDB, des Recordset et du fichier excel
    Set MaFeuilleExcel = Nothing
    Set Rapport = Nothing
    Set MonAppliExcel = Nothing
    Liste_Ticket.Close
    MaBD.Close
   
    MsgBox "Rapport généré avec succès", vbInformation
    Exit Sub
   
End Sub
3
hebus16 Messages postés 80 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 2 octobre 2009 1
27 févr. 2009 à 14:33
avec la commande problématique tu souhaites effacer le quadrillage de ta feuille Excel ? quels sont les types de fichiers qui sont traité stp ?
3
hebus16 Messages postés 80 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 2 octobre 2009 1
27 févr. 2009 à 14:43
ahhhh aussi une autre chose, j'aimerai comprendre :

tu as une application Access qui doit te faire un compte rendu des infos qu'elles possèdent dans un fichier Excel. Le truc que je comprends pas c'est cette dernière ligne :

   MaBD.Close

Tu fermes ton appli après l'appui sur le bouton ? C'était pas plutôt un Recordset que tu souhaitais fermer ?  Il est possible que ca vienne de là
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
charlie9277 Messages postés 4 Date d'inscription vendredi 27 février 2009 Statut Membre Dernière intervention 27 février 2009
27 févr. 2009 à 15:05
<li>Effectivement, j'ai une base de donnée sous access dont j'extraie des infos que je colle dans un fichier excel.</li>
<li>La première commande bloquante sert bien à enlever le quadrillage de la feuille excel.</li>
<li>J'ai essayé en enlevant MaBD.Closemais ça bugue toujours</li>

Mais en fait ce qui bloque n'est pas la commande en soi mais la partie "ActiveWindow".
Si tu mets cette ligne en commentaire, il va bloquer sur "MaFeuilleExcel.Range....".
C'est comme si le pointeur "MaFeuilleExcel" de la 1er execution existe toujours lors de la 2ème execution.
C'est pour ça que si j'active le bouton réinitialiser le code entre les deux execution, tout se passe bien.
Il y a un objet qui reste mais je n'arrive pas à mettre la main dessus.
3
hebus16 Messages postés 80 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 2 octobre 2009 1
27 févr. 2009 à 15:18
c'est vraiment bizarre ... car si c'etait vraiment un soucis comme tu le decris il planterait juste après la création sur un MaFeuilleExcel.Cells ...

Mets des espions sur tes données Mafeuille et Monrapport pour voir ce qu'il possède réellement entre les deux executions

là je dois avouer que tu as une bizarrerie
3
charlie9277 Messages postés 4 Date d'inscription vendredi 27 février 2009 Statut Membre Dernière intervention 27 février 2009
27 févr. 2009 à 15:45
MonAppliExcel prend les valeurs suivantes:
   1- <Hors du contexte> (avant l'éxécution de la macro)
   2- Nothing (au début de la macro)
   3- "Microsoft Excel" (à l'initialisation de la variable)
   4- Nothing (je le positionne à la fin de la macro)
   5- <Hors du contexte> (la macro est finie)

Par contre, pour "Rapport" et "MaFeuilleExcel", j'obtiens:
   1- <Hors du contexte> (avant l'éxécution de la macro)
   2- Nothing (au début de la macro)
   3- "" (à l'initialisation de la variable)
   4- Nothing (je le positionne à la fin de la macro)
   5- <Hors du contexte> (la macro est finie)

C'est bizarre que ces variables soient positionnées à chaine vide ???
Je m'attendais à leur valeur par défaut genre "classeur1" et "Feui1".
3
Rejoignez-nous