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 :

Gérer une variable ou un object sur un autre classeur


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 16
    Points : 13
    Points
    13
    Par défaut Gérer une variable ou un object sur un autre classeur
    Bonjour,

    Mon problème:

    Je souhaite activer la feuille d'un classeur (classeur "source") différent de mon classeur "actif". Une routine sur ce classeur "source" lance un UserForm dès l'activation de la feuille qui m'intéresse qui "prompt" l'utilisateur, l'obligeant à fermer cet UserForm avant que mon code ne continue son exécution.

    Je souhaiterais faire en sorte que l'utilisateur n'ait pas à fermer cet Userform et que le code s'exécute de bout en bout sans interruption. Par ailleurs, il m'est impossible d'agir sur le classeur source, tout doit être gérer sur le classeur "actif".

    Le code:

    Classeur "actif", feuille "active":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Sub Bouton_Click()
     
    Dim wb As Workbook
    Dim passway As String
     
    If XXX.Value = True Then
    passway = "XXXX/XXXX/XXX.xls"
    End If
    Set wb = Application.Workbooks.Open(passway)
    Application.Sheets("YYYYY").Select 'Sur cette feuille, l'UserForm est activé.
     
    'suite du code
     
    End Sub

    Classeur "source", feuille "source":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Global continuer As Integer 
     
    Private Sub Worksheet_Activate() '
     
    If continuer = 0 Then Question.Show 'Question est l'UserForm qui prompt l'utilisateur avec deux boutons "oui" "non".
     
    'suite du code
     
    End Sub

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub CommandButton2_Click() 'Bouton "non"
     
    Question.Hide 'il s'agit de l'action que je voudrais intégrer au classeur "actif".
     
    End Sub
    J'ai essayé toutes les combinaisons pour intégrer "Question.Hide" ou "continuer=1" sur la ligne Application.Sheets("YYYYY").Select, en prenant soin de déclarer toutes variables en global mais sans succès. J'ai aussi essayer les déclaration Const et Static. Mon gros problème est l'impossibilité de modifier quoi que ce soit sur le classeur "source".


    Je serais très reconnaissant pour toute solution ou toute piste pouvant résoudre ce problème.

    Merci d'avance!

    Thomas

  2. #2
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Points : 2 416
    Points
    2 416
    Par défaut
    Bonjour,
    1°)
    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
    Private Sub Bouton_Click()
     
    Dim wb As Workbook
    Dim passway As String
     
        If XXX.Value = True Then
         'Je suppose que les 1er XXX sont les répertoirs ?
             passway = "XXXX/XXXX/XXX.xls"
        End If
    Set wb = Workbooks.Open(passway)
    'Le classeur que tu vient d'ouvrir est wb
         wb.Sheets("YYYYY").Select 'Sur cette feuille, l'UserForm est activé.
     
    'suite du code
     
    End Sub
    2°)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    'Doit être sur un module général pour être global ou public
    Public continuer As Integer 
     
    Private Sub Worksheet_Activate() '
     
        Question.Show 0 'Question est l'UserForm qui prompt l'utilisateur avec deux boutons "oui" "non".
     
    'suite du code
    '.....
    '.....
    Reco:
        DoEvents
        if continuer = 0 then goto Reco 
    End Sub
    Essaye déja ces 2 choses et tu dit.
    A+

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 16
    Points : 13
    Points
    13
    Par défaut
    Merci pour ta réponse.

    Le problème est que je ne doit pas modifier quoi que ce soit sur le classeur que j'ouvre via le code, situé lui sur un autre classeur déjà ouvert par l'utilisateur.

    Très simplement, en modifiant un peu pour plus de clarté:

    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
    Private Sub Bouton_Click()
     
    Dim wb As Workbook
    Dim passway As String
     
        If Checkbox.Value = True Then
             passway = "répertoire/répertoire/Workbook.xls"
        End If
    Set wb = Workbooks.Open(passway)
         wb.Sheets("Sheet").Select 
    'Sur cette feuille, l'UserForm Question est activé, dès que la feuille est
    'sélectionnée "Sub Worksheet_Activate"
    'A ce moment, sans rien modifier  sur le code de "Workbook.xls" 
    'je dois introduire soit "Question.Hide", qui ferme l'UserForm 
    'soit "continuer=1" qui empêche l'activation de l'UserForm. 
    'ça donnerait quelque chose comme wb.Sheets("Sheet").Select (continuer=1) ou '(Question.Hide).
     
    'suite du code
     
    End Sub
    J'espère avoir été un peu plus clair et je te remercie pour le temps que tu me consacre.

    Thomas

  4. #4
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Points : 2 416
    Points
    2 416
    Par défaut
    Re,
    Compliquer ces explications,
    Tu dit que le classeur est déjà ouvert et en plus tu l'ouvre, ça devrait faire une erreur.

    Si le classeur est déja ouvert (dans la même application), pas besoin de passer par un Set, tu peu directement activer la feuille avec le nom du classeur en premier.

    Si tu ne peu rien changer sur l'autre classeur mais que le UF est ouvert en modal il n'y a aucune solution.
    Et Hide ne fait que cacher le UF, pour le supprimer il faut employer Unload
    De plus une variable public n'est public que dans le même classeur.
    Je comprend pas bien ce que tu veux faire.
    A+
    Edit: une solution serrait d'ajouter du code dans le feuille de l'autre classeur avant d'activer la feuille, mais je sais même pas si c'est possible dans un classeur différent.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 16
    Points : 13
    Points
    13
    Par défaut
    Très simplement:

    1) Sur le classeur 1, je lance une macro qui va ouvrir le classeur 2, jusqu'alors fermé.
    2) La macro sélectionne une feuille du classeur deux pour la copié/collé puis l'imprimer.
    3) Dès que cette feuille est sélectionnée, le code du classeur deux lance une routine.
    4) Cette routine active l'UserForm Question si la variable continuer=0.

    Je ne peut rien (pas le droit) modifié sur mon classeur 2.

    Dans la mesure ou mon UserForm est en modal, il n'est pas possible - quoi qu'il arrive d'agir sur celui-ci. Je ne le savais pas et j'ai appris quelque chose.
    Il reste la possibilité d'indiquer à partir du classeur 1 que la variable "continuer" est égale à 1 de manière constante, sur tous les classeurs ouverts.

    C'est pour ça que j'ai pensé à l'origine à un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Global Const continuer as Integer = 1 'dans un module sur le classeur 1
    Mais, sans succès.

    Pour ta dernière piste, un ajout de code temporaire d'un classeur sur un autre, même si celà était possible, celà dépasserait de loin mes capacitées. S'il n'est pas possible de jouer sur la variable "continuer", je passerais à autre chose- tant pis!

    Thomas

  6. #6
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Points : 2 416
    Points
    2 416
    Par défaut
    Attend, pas se décourager aussi vite,
    Quel est la question de ton UF et le traitement de la réponse où est-elle.
    Dans le classeur que tu appel je suppose.
    Dés que le UF est soit Hide soit Unload, tu peu reprendre la main.
    Tu dit

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 16
    Points : 13
    Points
    13
    Par défaut
    Merci beaucoup pour ta patience!

    Le traitement est effectivement dans le classeur que j'appel.
    Sur le classeur que j'appel, l'UserForm est constitué de deux boutons. Il est lancé dès que la feuille qui m'intéresse est activée.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub Worksheet_Activate() 'Activation de la feuille du classeur que j'appel
     
    If continuer = 0 Then Question.Show
     Call UneProcédure
     
    'du code
     
    End Sub


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub CommandButton1_Click() '"Bouton "Oui"
     
     Call UneProcédure
     
    'du code
     
    Question.Hide
     
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub CommandButton2_Click() 'Bouton "Non"
     
    Question.Hide
     
    End Sub
    Je ne met pas la totalité du code par commodité et dans la mesure ou il n'a pas d'impact sur le problème. Je le post si tu estimes que cela peut t'aider.

    Thomas

  8. #8
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Toujours pas clair comme explications.

    Je pense avoir compris que tu veux que, lorsque ton 2e classeur est ouvert par une macro, l'USF ne s'affiche pas.
    Dis-moi si je me trompe.
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

Discussions similaires

  1. Réponses: 9
    Dernier message: 03/07/2006, 18h32
  2. [Forum] Envoyer une variable quand on clique sur un lien
    Par Eisy dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 34
    Dernier message: 17/03/2006, 12h05
  3. Concatener une variable a un object?
    Par critok dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 25/02/2006, 19h38
  4. Envoi d'une variable en shell script sur php
    Par Ponchi dans le forum Langage
    Réponses: 3
    Dernier message: 07/02/2006, 13h54
  5. Réponses: 3
    Dernier message: 07/01/2006, 22h17

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