Excel.ActiveWorkbook.SaveAs erreur 91 "Variable objet ou variable de bloc with non.."

kraenys

XLDnaute Junior
Bonjour à toute la communauté,
J'en reviens une nouvelle fois à vous pour un message d'erreur dont je ne comprends pas la provenance.

Je ne vais malheureusement pas pouvoir joindre mon fichier, étant donné que c'est depuis du VBA Access et que mon fichier fait à l'heure actuelle 1227Mo... :eek:

Par conséquent, je vais essayer d'expliquer au plus simple le problème.

Pour mon entreprise, je dois créer des requêtes depuis ma base Access pour ensuite les exporter sous Excel et exécuter des macros dedan.

La macro qui me pose problème est située depuis access.
Code:
Function ExportXLS_test()


'   Objets Access
Dim dbsBase As DAO.Database
Dim rstRequete As DAO.Recordset
Dim fld As DAO.Field

'   Objets Excel
Dim appexcel As Object
Dim wbkRequete As Object
Dim wksRequete As Object


'   Variables de boucles
Dim intLig As Long
Dim intCol As Long

'   Création du classeur Excel
Set appexcel = CreateObject("Excel.application")
Set wbkRequete = appexcel.Workbooks.Add
Set wksRequete = appexcel.ActiveSheet
appexcel.Visible = True

'   Ouverture de la table
Set dbsBase = DBEngine.OpenDatabase("C:\Users\F54174\Documents\DUMP_EAM.accdb")
Set rstRequete = dbsBase.OpenRecordset("Export_access", dbOpenDynaset)

'   Mise à jour de la feuille active
With wksRequete

' Mise à jour des PMRQ et mise à jour de la requête Export-access




'  En-têtes de colonnes renseignées à partir des noms de champs
   intCol = 1
   For Each fld In rstRequete.Fields
      .Cells(1, intCol).Value = fld.Name
      intCol = intCol + 1
   Next fld
   
'   Parcours des enregistrements
'   Ajout d’une ligne par enregistrement
   intLig = 2
   Do While Not rstRequete.EOF
      intCol = 1
      For Each fld In rstRequete.Fields
         .Cells(intLig, intCol).Value = rstRequete(intCol - 1)
         intCol = intCol + 1
      Next fld
      intLig = intLig + 1
      rstRequete.MoveNext
   Loop
'   Affectation d’un nom à la feuille Excel
   .Name = "Export_access"
End With

'   Fermeture des objets Access
rstRequete.Close
dbsBase.Close

'   Activation du classeur dans Excel
appexcel.ActiveWindow.Activate

appexcel.Visible = True
'Call Macro_xlsm
appexcel.Run ("modèle.xlsm!Macro_debut")
Excel.ActiveWorkbook.SaveAs FileName:= _
        "C:\Users\F54174\Documents\" & "Export_access" & ".xlsm", FileFormat _
        :=xlOpenXMLWorkbookMacroEnabled, CreateBackup:=True 'Puis on sauvegarde le fichier complet
Excel.Workbooks("modèle.xlsm").Close
Excel.Workbooks("Export_access.xlsm").Close
Excel.Application.Quit
Set appexcel = Nothing
Call ExportXLS_test2
End Function

La première Exécution se passe sans le moindre problème, et c'est lorsque je fais
Code:
Call ExportXLS_test2
que j'ai "Erreur 91, Variable objet ou variable de bloc with non défini." ici:
Code:
Excel.ActiveWorkbook.SaveAs FileName:= _
        "C:\Users\F54174\Documents\" & "requete2" & ".xlsm", FileFormat _
        :=xlOpenXMLWorkbookMacroEnabled, CreateBackup:=True 'Puis on sauvegarde le fichier complet



Les modifications sont mineures d'un fichier à l'autre ( remplacer "Export_access" par la table à exporter en question, puis modifier le nom à enregistrer dans "C:\Users\F54174\Documents\" & "Export_access" & ".xlsm" par la table à exporter, c'est tout.)
Ce qui donne le code suivant:
Code:
Function ExportXLS_test2()


'   Objets Access
Dim dbsBase As DAO.Database
Dim rstRequete As DAO.Recordset
Dim fld As DAO.Field

'   Objets Excel
Dim appexcel As Object
Dim wbkRequete As Object
Dim wksRequete As Object


'   Variables de boucles
Dim intLig As Long
Dim intCol As Long

'   Création du classeur Excel
Set appexcel = CreateObject("Excel.application")
Set wbkRequete = appexcel.Workbooks.Add
Set wksRequete = appexcel.ActiveSheet
appexcel.Visible = True

'   Ouverture de la table
Set dbsBase = DBEngine.OpenDatabase("C:\Users\F54174\Documents\DUMP_EAM.accdb")
Set rstRequete = dbsBase.OpenRecordset("Requête2", dbOpenDynaset)

'   Mise à jour de la feuille active
With wksRequete

' Mise à jour des PMRQ et mise à jour de la requête Export-access




'  En-têtes de colonnes renseignées à partir des noms de champs
   intCol = 1
   For Each fld In rstRequete.Fields
      .Cells(1, intCol).Value = fld.Name
      intCol = intCol + 1
   Next fld
   
'   Parcours des enregistrements
'   Ajout d’une ligne par enregistrement
   intLig = 2
   Do While Not rstRequete.EOF
      intCol = 1
      For Each fld In rstRequete.Fields
         .Cells(intLig, intCol).Value = rstRequete(intCol - 1)
         intCol = intCol + 1
      Next fld
      intLig = intLig + 1
      rstRequete.MoveNext
   Loop
'   Affectation d’un nom à la feuille Excel
   .Name = "Export_access"
End With

'   Fermeture des objets Access
rstRequete.Close
dbsBase.Close

'   Activation du classeur dans Excel
appexcel.ActiveWindow.Activate

appexcel.Visible = True
'Call Macro_xlsm
appexcel.Run ("modèle.xlsm!Macro_debut")
Excel.ActiveWorkbook.SaveAs FileName:= _
        "C:\Users\F54174\Documents\" & "requete2" & ".xlsm", FileFormat _
        :=xlOpenXMLWorkbookMacroEnabled, CreateBackup:=True 'Puis on sauvegarde le fichier complet
Excel.Workbooks("modèle.xlsm").Close
Excel.Workbooks("requete2.xlsm").Close
Excel.Application.Quit
Set appexcel = Nothing
End Function

Sans fichier, j'en conviens que c'est compliqué de m'aider et je comprendrai très bien qu'on ne puisse pas me donner de solutions "toute cuite", mais si vous avez au moins une idée de pourquoi cette erreur 91, ça m'aidera dejà beaucoup.
Je serai tenté de penser que cette erreur viens d'un problème de libération de mémoire ou d'une variable non réutilisable directement peut-être?

Merci d'avance,
Bonne journée.

Kraenys
 
Dernière édition:

Pierrot93

XLDnaute Barbatruc
Re : Excel.ActiveWorkbook.SaveAs erreur 91 "Variable objet ou variable de bloc with n

Bonjour,

peut être ceci... fonctionne chez moi sur un autre chemin valide :
Code:
Excel.ActiveWorkbook.SaveAs Filename:= _
        "C:\Users\F54174\Documents\" & "Export_access", FileFormat _
        :=xlOpenXMLWorkbookMacroEnabled, CreateBackup:=True 'Puis on sauvegarde le fichier complet

bon après midi
@+
 

kraenys

XLDnaute Junior
Re : Excel.ActiveWorkbook.SaveAs erreur 91 "Variable objet ou variable de bloc with n

Bonjour Pierrot93, merci pour ta réponse extrêmement rapide, je vais tester et vous tiens au courant sous peu.

Bon après midi.

Kraenys
 
Dernière édition:

kraenys

XLDnaute Junior
Re : Excel.ActiveWorkbook.SaveAs erreur 91 "Variable objet ou variable de bloc with n

Après test et remplacement dans les deux fonctions, la première ExportXLS_test fonctionne toujours sans aucun problème.
Par contre, la seconde m'affiche toujours le même message d'erreur au même endroit:
Code:
Excel.ActiveWorkbook.SaveAs FileName:= _
        "C:\Users\F54174\Documents\" & "requete2", FileFormat _
        :=xlOpenXMLWorkbookMacroEnabled, CreateBackup:=True 'Puis on sauvegarde le fichier complet

Le reste de la macro fonctionne, c'est juste lors de l'enregistrement du fichier Excel qu'il y a le problème.

Si à tout hasard une autre raison potentielle vous viendrai, je la testerai avec plaisir et continue également de mon coté à tester des solutions.

Edit: Un détail qui me reviens qui vous intéressa peut-être, lorsque je décide d'inverser l'ordre d'exécution, c'est à dire d'abord exportXLS_test2 puis exportXLS_test, j'ai la même erreur, au même endroit, mais dans exportXLS_test cette fois et non dans exportXLS_test2. Le code en lui même est donc juste, c'est l'enchainement des deux qui semble ne pas passer?

Merci de votre aide,

Bien à vous.

Kraenys
 
Dernière édition:

kraenys

XLDnaute Junior
Re : Excel.ActiveWorkbook.SaveAs erreur 91 "Variable objet ou variable de bloc with n

Je vais supprimer
Code:
 CreateBackup:=True
pour tester.

Concernant le fait d'utiliser Function et non procédure, c'est parceque ça me permet de l'appeler depuis une macro Access, ce qui plante lorsque c'est une procédure "sub".


Edit: La suppression de
Code:
 CreateBackup:=True
ne change malheureusement rien, je continu de chercher :confused:
 
Dernière édition:

Pierrot93

XLDnaute Barbatruc
Re : Excel.ActiveWorkbook.SaveAs erreur 91 "Variable objet ou variable de bloc with n

Re,

As tu essayé comme ceci :
Code:
appexcel.ActiveWorkbook.SaveAs Filename:= _
        "C:\Users\F54174\Documents\" & "Export_access", FileFormat _
        :=xlOpenXMLWorkbookMacroEnabled
 

kraenys

XLDnaute Junior
Re : Excel.ActiveWorkbook.SaveAs erreur 91 "Variable objet ou variable de bloc with n

Bonjour Pierrot93.

C'est super, ça fonctionne. En fait, j'ai cherché un peu plus en détail et on avait un problème, l'ActiveWorkbook renvoyait une valeur vide lorsqu'on passait à la deuxième fonction. Du coup, on pouvait difficilement faire un "enregistrer sous" d'une valeur vide...

Voici donc le code une fois un peu arrangé et modifié:

Code:
'   Activation du classeur dans Excel
appexcel.ActiveWindow.Activate

appexcel.Visible = True
'Call Macro_xlsm
appexcel.Run ("modèle.xlsm!Macro_debut")
wbkRequete.SaveAs FileName:= _
        "C:\Users\F54174\Documents\" & "Export_access", FileFormat _
        :=xlOpenXMLWorkbookMacroEnabled 'Puis on sauvegarde le fichier complet
wbkRequete.Close
appexcel.ActiveWorkbook.Close
appexcel.Application.Quit
Set appexcel = Nothing
Call ExportXLS_test2
End Function

Merci pour tout, j'aurai jamais imaginé résoudre mon problème en une journée!


Edit:
Une petite question me vient en tête pour finaliser le code. Connaissez-vous un moyen de remplacer "Export_access"
dans le SaveAs par une variable (ici représentée par un simple "Export_access" qui vaudra une variable ensuite), celle contenue dans
Code:
Set rstRequete = dbsBase.OpenRecordset("Export_access", dbOpenDynaset)

Celà me permettrai d'avoir une forme un peu plus automatique de ma fonction^^

Encore merci de votre aide qui m'a étée précieuse!

Bien à vous,

Kraenys
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 198
Messages
2 086 145
Membres
103 130
dernier inscrit
FRCRUNGR