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 :

Référence VBA à un modèle ouvert


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2008
    Messages : 19
    Par défaut Référence VBA à un modèle ouvert
    Bonjour à tous,

    Ouvrir un modèle Excel modele.xlt à partir de l'explorateur de Windows crée un fichier modele<N>.xls avec un numéro N qui s'incrémente à chaque ouverture.
    Que dois-je mettre dans ce bout de code pour accéder à la valeur d'un range donné :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Workbooks("?").Worksheets("une feuille").Range("A1").Value
    ?

    Avec la syntaxe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets("une feuille").Range("A1").Value
    , ça ne marche pas vraiment ("l'indice n'appartient pas à la sélection"), sûrement à cause de l'ambiguité (il ne sait sur quel classeur il se trouve)

    Merci d'avance

    Etienne

  2. #2
    Membre émérite Avatar de sabzzz
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    748
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 748
    Par défaut
    bonjour Etienne,

    en ouvrant un nouveau fichier, c'est automatiquement celui-ci qui est actif dans l'application.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim fichier As Object
    Set fichier = ActiveWorkbook.ActiveSheet
    x = fichier.Range("E1")

  3. #3
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2008
    Messages : 19
    Par défaut
    Bonjour et merci de ta réponse.
    En fait, mon code est assez complexe et je manipule bcp de classeurs, donc il est possible que mon classeur ne soit plus actif.
    Voici le code qui pose réellement 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
    Public Function UpdateNbRapports(displayOnly As Boolean) As Integer
    'Ici mise à jour du nombre de rapports édités
    '[...]
        Select Case nbRapports
            Case 0:
                Worksheets("Scan").Range("N1").Value = "Pas de rapport"
            Case 1:
                Worksheets("Scan").Range("N1").Value = "1 rapport"
            Case Is > 1:
                Worksheets("Scan").Range("N1").Value = CStr(nbRapports) & " rapports"
        End Select
     
    UpdateNbRapports = nbRapports
    End Function
    Quel que soit le "case" où il passe, il sort illico de la fonction, sans aller jusqu'à la ligne de retour...

    Une idée ?

    Merci

    Etienne

    A noter aussi que le problème ne se présente pas toujours...
    En fait, ça semble dépendre d'où se situe l'appel de la fonction.

  4. #4
    Membre émérite Avatar de sabzzz
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    748
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 748
    Par défaut
    bonjour Etienne,

    Quel que soit le "case" où il passe, il sort illico de la fonction, sans aller jusqu'à la ligne de retour...
    c'est difficile de répondre sans voir à quoi fait référence la variable nbRapports, mais si aucun cas n'est valide soit nbRapports < 0
    soit nbRapports = du texte ou autre chose ?
    execute le code en mode pas à pas et place ton curseur sur la variable nbRapports pour voir son contenu.

  5. #5
    Expert confirmé
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Par défaut
    Bonjour,


    Que dois-je mettre dans ce bout de code pour accéder à la valeur d'un range donné :
    En fait il s’agit de savoir où est le code et à qui il s’adresse ?

    Le code est-il dans le classeur qui s’exécute ?

    A noter que si pour faire appel au classeur qui contient le code maître, il est tout indiqué d’utiliser la propriété Thisworkbook qui te renvoie le classeur Objet qui contient le code alors que ActiveWorkbook renvoie le classeur actif, ce qui peut se révéler très aléatoire dans certaines situations…


    Dans ton cas il faut donc peut-être être plus explicite et ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets("Scan").Range("N1").Value = "Pas de rapport"
    mettre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Classeurxx.Worksheets("Scan").Range("N1").Value = "Pas de rapport"
    d'un autre côté, une fonction est censée ne renvoyer qu'une valeur... donc cet extrait de code n'est pas forcément au bon endroit...

    Cordialement,

    Didier

  6. #6
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2008
    Messages : 19
    Par défaut
    @sabzzz : la variable nbRapports présente bien des valeurs cohérentes (entier), et en fait le prog entre bien dans les "case" comme il se doit. Seulement, dès qu'il passe sur la ligne de la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets("Scan").Range("N1").Value = "Pas de rapport"
    il sort tout de suite de la function.

    @Ormonth : le code est situé dans un module "Utilitaires" inclus dans le workbook de modèle.
    L'appel qui pose pb se trouve dans un autre module du même classeur :
    dim rapports as Integer
    rapports = 0
    rapports = Utilitaires.UpdateNbRapports
    //rapports reste à 0

    Merci de vos réponses

  7. #7
    Expert confirmé
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Par défaut
    Ouvrir un modèle Excel modele.xlt
    quand tu fais ça, tu ouvres effectivement un nouveau classeur qui n'a ensuite aucun rapport avec le modèle (qui lui n'a pas été ouvert, heureusement !), si ce n'est qu'il en est l'image exacte au moment de l'ouverture avant que de possibles instructions du WorkbookOpen opèrent des changements....

    donc , je ne comprend pas ceci

    le code est situé dans un module "Utilitaires" inclus dans le Workbook de modèle.
    cordialement,

    Didier

  8. #8
    Membre émérite Avatar de sabzzz
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    748
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 748
    Par défaut
    le module "Utilitaires" est un module standard ou un module de classe ?

  9. #9
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2008
    Messages : 19
    Par défaut
    @Ormonth : exact, en fait je faisais allusion au classeur issu du modèle (modele1.xls)
    @sabzzz : je n'ai que des modules standard dans cette appli

    Merci

  10. #10
    Expert confirmé
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Par défaut
    L'important est là :

    Avec la syntaxe Worksheets("une feuille").Range("A1").Value, ça ne marche pas vraiment ("l'indice n'appartient pas à la sélection")
    as-tu testé ainsi :

    mettre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    Classeurxx.Worksheets("Scan").Range("N1").Value = "Pas de rapport"
    mets le nom du classeur avant celui de la feuille..
    Le message indique qu'il ne trouve pas la feuille, mets un point d'arrêt sur la ligne et tapes ? Worksheets("Scan").Range("N1").Value dans la fenêtre d'exécution de ton éditeur vba, tu verras ce qu'il répond, attention si pas de message d'erreur et que la cellule est vide, tu auras un blanc..

    Didier

  11. #11
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2008
    Messages : 19
    Par défaut
    Ormonth,

    en fait, le problème est justement ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Classeurxx.Worksheets("Scan").Range("N1").Value = "Pas de rapport"
    Etant donné que Classeurxx est un modèle, lors de son ouverture, on ne connaitra pas le nom du XLS qui est généré...
    Donc difficile d'y faire référence.

    Une idée ?

    Merci

    PS : désolé si je ne répond pas après mardi soir, ce sont mes horaires de stage qui le veulent

  12. #12
    Expert confirmé
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Par défaut
    on ne connaitra pas le nom du XLS qui est généré...
    Donc difficile d'y faire référence.
    Vu que c'est le classeur qui contient le code, tu peux y faire référence en tant qu'objet par ThisWorkbook (voir dans l'aide vba la différence entre Thisworkbook et ActivWorkbook).
    ps : revois mon post de 15h12..

    PS : désolé si je ne répond pas après mardi soir, ce sont mes horaires de stage qui le veulent
    ça c'est sympa de le préciser

    cordialement,

    Didier

  13. #13
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2008
    Messages : 19
    Par défaut
    Ormonth,

    Merci de ta réponse, la solution en utilisant ThisWorkbook fonctionne au poil !

    Merci de ton aide,

    Etienne

  14. #14
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2008
    Messages : 19
    Par défaut
    Comment mettre le tag "résolu" ??
    je ne trouve pas dans la FAQ

  15. #15
    Expert confirmé
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Par défaut
    Tu cliques sur le bouton résolu en bas de la fenêtre

    c'est bien de t'en soucier !

    Didier

Discussions similaires

  1. Récupérer référence d'une popup ouverte précédemment
    Par Ougha dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 20/09/2007, 16h01
  2. Réponses: 3
    Dernier message: 08/08/2007, 11h40
  3. [VBA-E] Application ouverte ?
    Par alex_95 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 26/03/2007, 15h44
  4. Référence VBA manquante Access 2000
    Par p'tite Sandrine dans le forum VBA Access
    Réponses: 2
    Dernier message: 27/11/2006, 13h47
  5. [VBA-A] Applications ouvertes
    Par TiT0f dans le forum VBA Access
    Réponses: 18
    Dernier message: 09/06/2006, 09h06

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