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 :

Lire un fichier Excel ouvert depuis Arena Simulation Model


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Mars 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2018
    Messages : 5
    Par défaut Lire un fichier Excel ouvert depuis Arena Simulation Model
    Bonjour à tous,

    J'aimerai depuis Arena qui incorpore VBA et ActiveX, lire des donnéees dans un workbook Excel qui sera déja ouvert. Voici comment je m'y prend pour l'instant dans un module Event dans Arena qui se lance quand je lance Arena depuis ma macro VBA du dit workbook:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Option Explicit
    Dim XL As New Excel.Application
    Dim w As Excel.Workbook
    Dim wS As Excel.Worksheet
    Dim fileName As String
     
    Private Sub ModelLogic_RunBegin()   
        fileName = ThisDocument.Model.Path + "ProductionPlan.xlsm"
        'MsgBox "" & ThisDocument.Model.Path
        Set XL = GetObject("", "Excel.Application")
        MsgBox "" & XL.Workbooks("ProductionPlan.xlsm").Worksheets("Input").Cells(3, 3).value 'simple test pour vérifier mon accès
     
    End Sub
    Seulement ma dernière ligne ne fonctionne pas Run Time Error 9: Subscript out of range
    J'ai essayé plusieurs variantes de cette ligne pour vérifier et le problème vient de l'appel de Workbooks("ProductionPlan.xlsm") je pense..
    Je pense que le problème est assez bête mais j'ai épuisé toutes mes idées et ce que je trouvais sur internet..

    Si quelqu'un saurait m'aider ce serait avec grand plaisir !

  2. #2
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    ton classeur est ouvert par une application tiers
    il est donc fort probable qu'elle ouvre ton classeur dans une autre instance que le classeur contenant ta macro
    parti de la getobject ("",exel.application) devrait te retourner la collection des instances de l'application excel

    il n'est pas forcé (certainement meme) que ce soit la premiere instance de excel
    parti de la ton xl.workbook("blabla").range...... te renvoir une erreur

    je pense qu'il faut boucler sur les instances et tester si le classeur recherché est ouvert dans chaque instances
    d'autre affirmeront ou infirmeront
    a mediter

    EDIT:
    apres tests effectivement getobject("","excel.application") ne renvoie que l'instance de l'application excel dans la quelle se trouve le classeur macro
    donc walouh pour getobject

    tres étonnant comment reagi getobject en vba VS vbscript

    j'avais apporté un debut de reponse pour le meme genre de question ICI
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  3. #3
    Membre à l'essai
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Mars 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2018
    Messages : 5
    Par défaut
    Merci de ta réponse ! J'ai regardé ton lien vers l'autre sujet.. Je t'avous que j'y suis un peu perdu. Je me débrouille en VBA dans mes magouilles habituels disons mais ces histoires d'objets, d'instances etc je suis un peu perdu.. (J'ai copié betement ton code et essayé de lancer le test mais j'ai eu une erreur..)

    Voici ce que j'utilise dans mon fichier Excel ouvert manuellement pour lancer Arena :
    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
    Sub RunArenaSimulation()
        'Declare variables
        Dim oArenaApp As Arena.Application
        Dim oModel As Arena.Model, oSIMAN As Arena.SIMAN
        Dim oModule As Arena.Module
        Dim ModName As String
     
        'Start Arena, open model, make Arena active & visible
        Set oArenaApp = CreateObject("Arena.Application")
        ModName = ThisWorkbook.Path + "\SimulationFactory.doe"
        Set oModel = oArenaApp.Models.Open(ModName)
        Set oSIMAN = oModel.SIMAN
        oArenaApp.Activate
     
        oArenaApp.Visible = True
     
        'Run model in batch mode and send results back to Excel
        oModel.BatchMode = False ' Turn off animation = True
        oModel.QuietMode = True ' Do not ask final question = True
        oModel.Go (smGoWait) ' Suspend VB until run ends
     
        'End model run and exit Arena
        oModel.End
        'oArenaApp.Quit
    End Sub
    En changeant quelques trucs, l'event de lancer la simulation me lance cette macro dans Arena :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Dim xl As New Excel.Application
    Dim fileName As String
     
    Private Sub ModelLogic_RunBegin()
        fileName = ThisDocument.Model.Path + "ProductionPlan.xlsm"
        xl.Visible = True
        xl.Workbooks.Open fileName
        MsgBox "" & xl.Workbooks("ProductionPlan.xlsm").Worksheets("Input").Cells(3, 3).value
    End Sub
    Ce code ci fonctionne mais m'ouvre un second Excel en lecture seule.. (Mais après l'étape de lecture, j'aimerai écrire dans mon excel les résultats de la simulation, j'ai donc ni le droit et 2 mêmes fichiers excel ouverts..

    Aurais tu la patience de m'expliquer un peu ce que tu en penses ? Sans trop employer de jargons de programmations je t'en prie

    Je pense que tu as compris l'idée, mon idée ultime est d'Excel, lancer une simulation Arena qui devra aller lire les données inputs, écrire dans l'excel les outputs et se refermer gentiment. (Voir même garder tout ce process avec Arena en non visible par l'utilisateur (mais je verrai ca plus tard ) Penses tu la chose faisable ?

    Merci à toi

  4. #4
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Bonjour !

    Citation Envoyé par Whtekenta Voir le message
    Seulement ma dernière ligne ne fonctionne pas Run Time Error 9: Subscript out of range
    Soit erreur sur le nom du classeur
    soit il n'existe pas dans l'instance pointée par la variable XL
    ce qui serait tout à fait normal dans le cas de plusieurs instances ouvertes !
    Dans ce cas il ne faut pas chercher l'application mais le chemin complet du fichier via la fonction GetObject

    ___________________________________________________________________________________________________________
    Je suis Paris, Egypte, Nigeria, New-York, Mogadicio, Barcelone, London, Manchester, Stockholm, Istanbul, Berlin, Nice, Bruxelles, Charlie, …

  5. #5
    Membre à l'essai
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Mars 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2018
    Messages : 5
    Par défaut
    Citation Envoyé par Marc-L Voir le message
    Bonjour !
    [/INDENT]
    Soit erreur sur le nom du classeur
    soit il n'existe pas dans l'instance pointée par la variable XL
    ce qui serait tout à fait normal dans le cas de plusieurs instances ouvertes !
    Dans ce cas il ne faut pas chercher l'application mais le chemin complet du fichier via la fonction GetObject

    ___________________________________________________________________________________________________________
    Je suis Paris, Egypte, Nigeria, New-York, Mogadicio, Barcelone, London, Manchester, Stockholm, Istanbul, Berlin, Nice, Bruxelles, Charlie, …
    J'ai donc essayé ce code ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Dim xl As Excel.Application
    Dim w As Excel.Workbook
    Dim wS As Excel.Worksheet
    Dim fileName As String
     
    Private Sub ModelLogic_RunBegin()
     
        fileName = ThisDocument.Model.Path + "ProductionPlan.xlsm"
        MsgBox "" & fileName
        Set xl = GetObject(fileName, "Excel.Application")
        MsgBox "" & Workbooks("ProductionPlan.xlsm").Worksheets("Input").Cells(3, 3).value
    End Sub
    (Je suis sur que ma string fileName est correcte pour atteindre mon fichier)
    J'ai l'erreur Run time error 432: File name or class name not found during Automation operation

    si j'écris ma ligne de cette facon : Set xl = GetObject(fileName, Excel.Application)
    J'obtiens cette erreur Run time error 429: ActiveX component can't create object

    si je change mon code en :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub ModelLogic_RunBegin()
        fileName = ThisDocument.Model.Path + "ProductionPlan.xlsm"
        MsgBox "" & fileName
        Workbooks.Open fileName
        MsgBox "" & Workbooks("ProductionPlan.xlsm").Worksheets("Input").Cells(3, 3).value
        Workbooks("ProductionPlan.xlsm").Worksheets("Input").Cells(7, 7).value = 15
    End Sub
    Ma deuxieme Msgbox fonctionne et m'affiche la valeur que j'ai dans mon workbook. Et la dernière ligne ne fait rien dans mon workbook mais se compile et s’exécute. Une fois fini si je ferme mon excel un second excel s'affiche avec le message que Excel est maintenant dispo, est ce que je veux l'ouvrir en lecture-écriture ? En mettant oui l'excel s'ouvre et ma valeur d'écriture 15 est bien présente. J'en conclue donc que ce problème d'instance est bien ce que je rencontre. Cette dernière partie n'est pas ce que je recherche et n'est que le fruit de mes bidouilles pour essayer de comprendre le problème...

    Bref ducoup, est ce que j'utilise la fonction GetObject mal dans mes premiers exemples ?

    Merci beaucoup de votre aide

  6. #6
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Citation Envoyé par Whtekenta Voir le message
    est ce que j'utilise la fonction GetObject mal dans mes premiers exemples ?
    Oui car le fichier doit être renseigné seul dans cette fonction …
    Et en espérant qu'il soit ouvert uniquement dans une seule des instances !
    Logiquement il ne devrait pas y avoir plusieurs instances d'ouvertes en même temps mais bon …

  7. #7
    Membre à l'essai
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Mars 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2018
    Messages : 5
    Par défaut
    Citation Envoyé par Marc-L Voir le message
    Oui car le fichier doit être renseigné seul dans cette fonction …
    Et en espérant qu'il soit ouvert uniquement dans une seule des instances !
    Logiquement il ne devrait pas y avoir plusieurs instances d'ouvertes en même temps mais bon …
    Si j'ai bien compris donc utiliser 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
    Dim xl As Excel.Application
    Dim w As Excel.Workbook
    Dim wS As Excel.Worksheet
    Dim fileName As String
     
    Private Sub ModelLogic_RunBegin()
     
        fileName = ThisDocument.Model.Path + "ProductionPlan.xlsm"
        MsgBox "" & fileName
        Set xl = GetObject(fileName)
        MsgBox "" & xl.Workbooks("ProductionPlan.xlsm").Worksheets("Input").Cells(3, 3).value
        xl.Workbooks("ProductionPlan.xlsm").Worksheets("Input").Cells(7, 7).value = 15
    End Sub
    Cela me renvoit l'erreur Run-time error '13' : Type mismatch

    J'ai essayé cette variante de ligne de code (mon fichier Arena et Excel sont dans le même dossier) :
    Set xl = GetObject("ProductionPlan.xlsm")
    mais j'obtiens Run-time error Automation error Invalid syntax

    Je ne saisis pas vraiment ces histoires d'instances mais je pense que c'est mon cas. J'ouvre Arena et lance la simulation qui lance ce code par évènement, en lancant ma macro VBA situé dans ce dit fichier ProductionPlan.xlsm...

  8. #8
    Membre à l'essai
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Mars 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2018
    Messages : 5
    Par défaut
    Citation Envoyé par Whtekenta Voir le message
    Cela me renvoit l'erreur Run-time error '13' : Type mismatch
    J'ai rereregardé encore la definition de la fonction getObject et en changeant :
    dim xl as Excel.Application
    en
    dim xl as Object

    il s'avère que cela fonctionne ! (L'aide de Arena simulation disait pourtant d'utiliser as Excel.Application... )
    Merci beaucoup de votre aide je vais pouvoir continué de travailler ca jusqu'au prochain nœud rencontré

  9. #9
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut

    Vérifier le contenu de la variable fileName, à comparer avec la propriété FullName d'un classeur ouvert dans Excel …
    Si la fonction Dir(fileName) renvoie une chaine vide alors le fichier n'existe pas (ou erreur dans fileName).

    La variante ne pouvant fonctionner sans le disque ni le répertoire du fichier ! (sauf si dans le dossier en cours …)

    Et oui un classeur n'est pas une application !

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

Discussions similaires

  1. vérification fichier excel ouvert (depuis word)
    Par Invité dans le forum VBA Word
    Réponses: 1
    Dernier message: 08/11/2016, 12h31
  2. Lire un fichier excel déja ouvert
    Par sihammaster dans le forum VB.NET
    Réponses: 2
    Dernier message: 01/06/2011, 16h50
  3. [C#]Lire un fichier excel 2007 déjà ouvert
    Par dinier dans le forum C#
    Réponses: 7
    Dernier message: 23/02/2010, 20h13
  4. [Lamp] Lire un fichier Excel depuis LAMP
    Par thieum dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 13/06/2007, 09h10
  5. [CSV] Ecrire et Lire un fichier Excel depuis PHP
    Par cocaetjusdorange dans le forum Langage
    Réponses: 7
    Dernier message: 08/02/2006, 11h10

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