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 :

Pilotage d'Excel, mon code ne marche pas à tous les coups


Sujet :

VBA Access

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 24
    Points : 11
    Points
    11
    Par défaut Pilotage d'Excel, mon code ne marche pas à tous les coups
    Bonjour

    J'ai le même genre de problème que sur cette discussion, sauf que dans mon cas les variable sous - je pense - bien déclarées :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Dim xlApp As Excel.Application
    Dim xlBook As Excel.Workbook
    Dim xlSheet As Excel.Worksheet
     
    Set xlApp = CreateObject("Excel.Application")
    Set xlBook = xlApp.Workbooks.Add(Application.CurrentProject.Path & "\FF_PLANNING_ST.xlsx")
    Set xlSheet = xlBook.Worksheets("Planning")
    oldname = xlBook.FullName
    xlBook.Activate
    xlSheet.Activate
    Et pourtant j'ai le même genre de plantage - pas systématiquement, disons 4 execution sur 5 plantent, et pas toujours au même endroit !

  2. #2
    Membre éclairé Avatar de dumas.blr
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2010
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2010
    Messages : 598
    Points : 879
    Points
    879
    Par défaut
    Bonjour kounta,

    Juste une question
    s'agit-il d'un nouveau classeur Excelou d'un classeur existant ?
    car pour moi quand tu spécifie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set xlBook = xlApp.Workbooks.Add(Application.CurrentProject.Path & "\FF_PLANNING_ST.xlsx")
    C'est que tu veux créer un nouveau classeur excel
    et donc la ligne suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set xlSheet = xlBook.Worksheets("Planning")
    ne pourra pas fonctionner, car si tu ouvre un nouveu classeur, la feuille par défaut se nommera "feuil1" ou "sheet1"
    Il faut donc être cohérent :
    - soit tu cherches la feuille "planning" du classeur existant "FF_PLANNING_ST.xlsx" et dans ce cas la ligne correcte sera
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set xlBook = xlApp.WorkbooksApplication.CurrentProject.Path & "\FF_PLANNING_ST.xlsx")
    soit tu crée une nouvelle feuille dans un nouveau classeur et dans ce cas la syntaxe sera :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set xlSheet = xlBook.Worksheets.Add("Planning")
    Je pense que ton problème vient de là

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 24
    Points : 11
    Points
    11
    Par défaut
    Très intéressant comme réponse, merci dumas.blr !
    En fait, j'ouvre un classeur existant qui sert de modèle, ce classeur source ne devant pas être modifié car il sert de base à chaque execution.
    Dans ce classeur modèle, il y a déjà la feuille "Planning" que je charge dans xlSheet.

    Vous allez me dire: "si le classeur source n'est qu'un modèle, pourquoi ne pas utiliser le format de fichier modèle excel .xlt ?"
    J'ai donc remplacé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set xlBook = xlApp.Workbooks.Add(Application.CurrentProject.Path & "\FF_PLANNING_ST.xlsx")
    par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set xlBook = XlApp.Workbooks.Open(Application.CurrentProject.Path & "\FF_PLANNING_ST.xltx")
    ça plante un peu moins, mais c'est pas encore ça. Je vais essayer selon ta méthode...

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 24
    Points : 11
    Points
    11
    Par défaut
    Bon, ça marche pas, la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set xlBook = xlApp.WorkbooksApplication.CurrentProject.Path & "\FF_PLANNING_ST.xlsx")
    renvoie une erreur 438 "Cet objet ne gère pas cette propriété ou méthode".

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 24
    Points : 11
    Points
    11
    Par défaut
    Je retourne ton truc dans tout les sens mais en fait je ne vois pas où tu veux en venir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set xlBook = xlApp.WorkbooksApplication.CurrentProject.Path & "\FF_PLANNING_ST.xlsx")
    Avec ce code j'affecte un chemin d'accès directement à un workbook, évidemment ça ne marche pas

  6. #6
    Membre éclairé Avatar de dumas.blr
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2010
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2010
    Messages : 598
    Points : 879
    Points
    879
    Par défaut
    Bonjour Kounta,

    Bon, je ne suis pas un pro du VBA sous excel, il faut que je creuse un peu.

    As tu essayé la syntaxe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set xlBook = XlApp.Workbooks.Open(Application.CurrentProject.Path & "\FF_PLANNING_ST.xlsx")
    Car l'ouverture d'un template Excel me semble correspondre à une règle précise, du genre, je créé un nouveau fichier excel à partir du modèle untel

    Dans ce cas (je n'ai pas regardé plus précisément, mais l'aide en ligne doit le spécifier), tu devrait pouvoir utiliser ton instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set xlBook = xlApp.Workbooks.Add(Application.CurrentProject.Path & "\<nom de mon nouveau fichier excel>.xlsx"), <basé sur le modèle>
    Je regarde si j'ai plus d'info et je reviens vers toi

  7. #7
    Membre éclairé Avatar de dumas.blr
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2010
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2010
    Messages : 598
    Points : 879
    Points
    879
    Par défaut
    Voila ce que l'aide en ligne nous dit pour l'ajout d'un nouveau classeur

    Référence du développeur Excel
    Workbooks.Méthode Add
    Cette méthode crée un nouveau classeur, qui devient le classeur actif.
    Syntaxe

    expression.Add(Modèle)

    expression Variable qui représente un objet Workbooks.

    Paramètres

    Nom Obligatoire/Facultatif Type de données Description
    Modèle Facultatif Variante Détermine la façon dont le nouveau classeur est créé. Si cet argument est une chaîne spécifiant le nom d'un fichier Microsoft Excel existant, le nouveau classeur est créé d'après le modèle de ce fichier. Si cet argument est une constante, le nouveau classeur contient une seule feuille du type spécifié. Il peut s'agir d'une des constantes XlWBATemplate suivantes : xlWBATChart, xlWBATExcel4IntlMacroSheet, xlWBATExcel4MacroSheet ou xlWBATWorksheet. Si cet argument est omis, Microsoft Excel crée un nouveau classeur avec un certain nombre de feuilles vierges (ce nombre est défini par la propriété SheetsInNewWorkbook).

    Valeur renvoyée
    Objet Workbook qui représente le nouveau classeur.

  8. #8
    Membre éclairé Avatar de dumas.blr
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2010
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2010
    Messages : 598
    Points : 879
    Points
    879
    Par défaut
    Pour l'ouverture d'un fichier existant

    Workbooks.Open, méthode
    Afficher tout
    Masquer tout
    Cette méthode ouvre un classeur.
    Syntaxe

    expression.Open(FileName, MettreÀJourLiens, LectureSeule, Format, MotDePasse, MotDePasseÉcritureRes, IgnorerLectureSeuleRecommandée, Origine, Séparateur, Modifiable, Notifier, Convertisseur, AjouterAuxDerniersFichiersUtilisés, Local, ChargementEndommagé)

    expression Variable qui représente un objet Workbooks.
    effectivement , l'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set xlBook = xlApp.WorkbooksApplication.CurrentProject.Path & "\FF_PLANNING_ST.xlsx")
    ne marchera que si ton classeur est déjà ouvert

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 24
    Points : 11
    Points
    11
    Par défaut
    Add, Open, .xlts, .xlsx ... rien à faire, j'ai toujours des plantages et des processus EXCEL.EXE résiduels

  10. #10
    Membre éclairé Avatar de dumas.blr
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2010
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2010
    Messages : 598
    Points : 879
    Points
    879
    Par défaut
    Il faut peut-être libérer les process en mettant une instruction du type

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 24
    Points : 11
    Points
    11
    Par défaut
    Je l'ai fait en fin de procedure :
    Code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Set xlSheet = Nothing
    xlBook.Close
    Set xlBook = Nothing
     
    For Each wb In xlApp.Workbooks
        wb.Close SaveChanges:=False
        Set wb = Nothing
    Next
     
    xlApp.Quit
    Set xlApp = Nothing
    Comme j'ai un processus EXCEL.EXE résiduel, la boucle For ... Next était sensée fermer TOUS les classeurs ouverts, mais ça n'a pas résolu mon problème. Et j'ai des plantages intempestifs avec ou sans cette boucle.

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 24
    Points : 11
    Points
    11
    Par défaut
    Le plantage a lieu le plus fréquemment à deux moments de l'execution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If xlSheet.Cells(5, i).Value = "" Then lastcol = i
    et :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    txt = "FF_PLANNING_ST_" & Me.An.Value & "_S" & Me.[Semaine].Value + 1 & ".xlsx"
    rep = xlApp.Application.GetSaveAsFilename(txt, "Classeur Microsoft Excel (*.xlsx), *.xlsx")
    If rep <> False Then
        xlBook.SaveAs FileName:=rep
    End If
    xlBook.Saved = True
    J'ai mis en rouge la partie surlignée par le debogger.

    Pourtant il n'y a aucune erreur dans les variables.
    Le message d'erreur le plus fréquent est 462 "Le serveur est indisponible" alors que tout est fait en local (ce message devrait apparaître lorsqu'on utilise CreateObject avec un fichier en réseau et que la connexion est perdue, ce n'est pas le cas ici). C'est comme si le lien avec xlApp était perdu subitement !

Discussions similaires

  1. Fonction Find ne marche pas à tous les coups...
    Par silvere123 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 01/08/2012, 16h54
  2. [AC-2007] pourquoi mon code ne marche pas
    Par erebios dans le forum VBA Access
    Réponses: 16
    Dernier message: 05/05/2010, 00h43
  3. [PHP 5.2] Shell_exec ne marche pas à tous les coups
    Par stundman dans le forum Langage
    Réponses: 3
    Dernier message: 14/04/2010, 18h21
  4. diaporama: pourquoi mon code ne marche pas
    Par secondechance dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 01/05/2009, 03h04
  5. [VBA-E] mon code ne marche pas sur un autre PC
    Par yannph dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 09/01/2006, 22h03

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