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 :

Génération fichier Excel via formulaire: Erreur 1004 sur Calculation=xlCalculationManual [AC-2003]


Sujet :

VBA Access

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 56
    Points : 53
    Points
    53
    Par défaut Génération fichier Excel via formulaire: Erreur 1004 sur Calculation=xlCalculationManual
    Bonjour

    Dans ma base access 2003, j'utilise un formulaire pour générer un fichier Excel assez lourd (contenant beaucoup de données, de formules, de mise en forme, de feuilles etc. En gros, un fichier de 1 Mo) grâce à du VBA.
    Sans optimisation, il fallait 33 secondes à mon dual core pour générer le fichier.
    En utilisant exc.Calculation = xlCalculationManual et exc.ScreenUpdating = False je passe à 8 sec pour la génération, ce qui n'est vraiment pas négligeable.
    Le problème est qu'exactement une fois sur deux, la ligne
    exc.Calculation = xlCalculationManual
    me génère une Erreur d'exécution '1004': La méthode 'Calculation' de l'objet '_Application' a échoué. (exc.Calculation = <Incompatibilité de type>)

    J'ai effectué pas mal de recherches, et j'ai essayé les méthodes suivantes:
    • Créer le workbook avant
    • Sélectionner un Range avant

    Mais rien n'a faire, une fois sur deux l'erreur reviens. J'ai aussi remarqué qu'après la génération de mon fichier, dans les processus, EXCEL était toujours présent.
    Ici les principales lignes de mon code (début / fin ):

    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
    Private Sub CreerFichierContraintes_Click()
        Dim exc As New Excel.Application
        Set exc = CreateObject("Excel.Application")
        Workbooks.Add 'rajoute trois feuilles
        exc.ScreenUpdating = False
        'On Error Resume Next
        Range("A1").Select
        exc.Calculation = xlCalculationManual   '--> Erreur 1004 une fois sur deux.
     
        'Manipulations sur le fichier ...
        '800 lignes plus tard:
     
        exc.Calculation = xlCalculationAutomatic
        exc.ScreenUpdating = True
        ActiveWorkbook.SaveAs Filename:=file, FileFormat:= _
        xlNormal, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False _
        , CreateBackup:=False
        ActiveWorkbook.Close
        exc.Quit
     
    End Sub
    En rajoutant Application.Close, cela me ferme Access :/
    Comment: éviter d'avoir des processus Excel qui s'accumulent, et comment éviter cette erreur une fois sur deux?

    Merci beaucoup d'avance

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 365
    Points : 23 835
    Points
    23 835
    Par défaut
    T'es-tu assuré que ton Excel était visible avant d'envoyer le .quit ? Si tu ne fais pas cela, le Excel peut rester caché en mémoire.

    Note qu'il peut être très dificile de fermer Excel à partir de Access. Il y a pluseiurs postes sur ce site qui traite du problème. Parfois la seule, et bien triste, solution c'est de 'tuer' le process Excel qui est en mémoire.

    Ton problème, c'est systématiquement une fois sur deux ou en moyenne une fois sur deux ?

    Une solution serait peut-être de faire les traitements Excel à partir de Excel. C-à-d de créer une macro Excel et de l'exécuter avec une commande shell "Excel". Ça peut être un peu accrobatique mais cela évite d'avoir un pointeur vers Excel dans ton Access.

    A+

  3. #3
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Bonsoir.

    Pour les processus qui s'accumulent, je crois que tu ouvres 2 fois Excel : ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim exc As New Excel.Application
    puisque tu as utilisé le mot New, et là
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set exc = CreateObject("Excel.Application")
    Perso, je préfère
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim xlApp as Excel.Application
    ...
    Set xlApp = New Excel.Application
    Ensuite, il faut être plus précis comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set oWbl = xlApp.Workbooks.Add
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    oWbk.Worksheets("NomFeuille").Range("A1") ...
    Corrige et regarde si l'erreur aléatoire persiste.

    Cordialement,

    PGZ

  4. #4
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 768
    Points
    7 768
    Par défaut
    Bonsoir,

    Je suis d'accord avec PGZ
    Citation Envoyé par pgz Voir le message
    Ensuite, il faut être plus précis comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set oWbl = xlApp.Workbooks.Add
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    oWbk.Worksheets("NomFeuille").Range("A1") ...
    Une syntaxe explicite est préférable lorsqu'on fait de l'automation, sinon on se heurte à des problèmes de libération de variables objets, qui ont pour conséquence de laisser le processus actif en mémoire.
    Conseil allant dans le même sens ici.
    Une syntaxe explicite signifie que l'on part d'une variable objet, pour arriver au membre (méthode ou propriété) souhaité.
    Par exemple cette ligne n'est pas bonne parce qu'elle commence directement par une méthode, sans préciser à quel variable objet elle se rapporte.
    A+

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 56
    Points : 53
    Points
    53
    Par défaut
    Bonjour,

    Tout d'abord, merci pour vos réponses.

    C'est bien exactement une fois sur deux que l'erreur apparait.
    Quand je génère un première fichier Excel, tout marche bien, mais un EXCEL reste dans les processus. Je génère un second fichier, et là dès le début, erreur. Un second processus Excel est généré. Je termine la sub et je reclique sur mon bouton pour regénérer ce deuxième fichier. Là pas d'erreur. Un troisieme processus est créé... et ainsi de suite.

    Sinon non, excel n'est pas visible ... Et j'ai besoin d'effectuer toutes mes manipulations dans access et non dans une macro car je formate et j'injecte des valeurs en fonction de résultats de recordsets.

    Quant au Set exc = CreateObject("Excel.Application"), l'erreur est présente avec ou sans.

    Je suis actuellement en train de revoir tout mon code pour régler ce problème de référence dont j'étais conscient mais qui me facilitait le codage.
    Là je remplace tout avec des With WBl.Worksheets(i) ..

    Je vous tiens au courant,

    Merci encore

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 56
    Points : 53
    Points
    53
    Par défaut
    Super, ça marche à chaque coup sans grincher, et les processus Excel disparaissent à la fin de la sub. Et je passe même de 8s à 7s pour générer mon fichier.

    Merci à vous deux de m'avoir mis sur la piste.

    Voilà comment j'ai structuré mon code pour corriger ce problème:

    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 xlApp As Excel.Application
        Dim oWbl As Excel.Workbook
        Set xlApp = New Excel.Application
        Set oWbl = xlApp.Workbooks.Add
        xlApp.ScreenUpdating = False
        xlApp.Calculation = xlCalculationManual
     
        "[.....]"
     
        For i = 0 To UBound(Onglets)
            With oWbl.Worksheets(Onglets(i))
                .Cells( etc...
            End With
        Next i
     
        xlApp.Calculation = xlCalculationAutomatic
        xlApp.ScreenUpdating = True
        oWbl.SaveAs Filename:=file, FileFormat:= _
        xlNormal, Password:="", WriteResPassword:="",     ReadOnlyRecommended:=False _
        , CreateBackup:=False
        oWbl.Close
        xlApp.Quit
        DoCmd.SetWarnings True
     
    End Sub

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

Discussions similaires

  1. [XL-2010] Erreur 1004 sur un fichier pour envoyer un mail lotus via excel
    Par ALEX60 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 15/10/2013, 14h01
  2. Réponses: 8
    Dernier message: 18/01/2012, 14h16
  3. Réponses: 8
    Dernier message: 25/01/2008, 11h48
  4. Erreur 1004 sur "fichier - quitter"
    Par sabotage dans le forum Macros et VBA Excel
    Réponses: 20
    Dernier message: 22/08/2007, 18h01
  5. Script d'envoie d'un fichier excel via un formulaire
    Par Morphine.Nw dans le forum ASP
    Réponses: 4
    Dernier message: 26/01/2006, 13h08

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