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 :

[VBA-E]userform sur 2 classeurs


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 38
    Par défaut [VBA-E]userform sur 2 classeurs
    Bonsoir,
    J'ai le problème suivant:
    j'ai un classeur(1) qui, à partir d'une userform se trouvant dans un classeur, ouvre un autre classeur(2).
    Je souhaiterais, après avoir fermé le classeur (2),revenir sur la userform du classeur (1).
    MAIS (c'est là où ça se corse) les solutions suivantes ne peuvent pas être utilisées:

    1) Application.run (nomclasseur1.subpermettantd'ouvrilauserform)
    car les macros seront protégées
    2) mettre la subpermettantd'ouvrilauserform dans workbook.activate du classeur 1: car tout le long du programme je n'arrête pas de faire des aller-retour entre classeur (1) et (2) en cache

    Je suis bloqué et c'est critique pour la fin de mon programme

    Please I need your help !

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Importe l'userform situé dans book2, dans book1 et fais toutes tes manips depuis Book1
    Ça, c'est la solution la plus facile à imaginer. Pour une autre, faut qu'j'réfléchisse
    A+

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 38
    Par défaut
    je ne peux pas faire ce que tu me dis car en fait le classeur 1 est ce que j'appelle le classeur maitre et j'aurais à terme des centaines de "classeur2" donc je souhaite vraiment que la userform reste dans classeur "1".

    pas si simple
    fast

  4. #4
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Si je comprends, sur chacun de tes centaines de classeur2 tu dois pouvoir utiliser leurs userforms indémendamment... C'est ça ? Ou bien tes userforms sont spécifiques à chaque classeur.
    Et ton classeur1, à quoi sert-il ? Dis-nous en plus...

  5. #5
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    Citation Envoyé par fast&furious
    ...
    2) mettre la subpermettantd'ouvrilauserform dans workbook.activate du classeur 1: car tout le long du programme je n'arrête pas de faire des aller-retour entre classeur (1) et (2) en cache...
    c'est quoi que tu appelle faire des aller retour ...? ton code il est ou ..?

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 38
    Par défaut
    Essayons d'être plus clair, sans vous assommer ( ):
    Dans un "classeur maître" j'ai une userform qui contient plusieurs boutons. 1 des boutons permets de créer des classeurs dans lesquels seront stockées les données futures (1 click = 1 classeur créé). Les classeurs sont créés à partir d'un classeur "blank".
    Cela se passe de la manière suivante, schématiquement:

    1)on appuie sur le bouton, cela mets quelques infos dans le classeur maître

    2) cela créé un classeur à partir de blank qui est ensuite sauvegardé sur le disque dur sous un autre nom

    3)L'utilisateur peut se "balader" dans le classeur qui vient de se créer. Il doit entrer quelques données de départ dans ce classeur et le refermer par un bouton "close and save"

    4) et lorsque l'utilisateur referme le classeur je souhaiterais qu'il reviennent sur le "classeur maître" avec la userform affichée.

    Et au fur et à mesure, par un autre bouton de la userform, l'utilisateur entrera des données dans des endroits spécifiés (j'aurais besoin aussi à ces moments là de pouvoir revenir sur le "classeur maître" avec userform affichée)

    J'ai donc beaucoup de code dans le "classeur maître" et un peu de code dans le classeur "blank" (qui gèrent les quelques boutons que j'ai introduit)

    Je vous remercie d'avoir pris le temps de lire mon problème afin d'essayer de le résoudre

    fast

  7. #7
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    C'était donc bien ma question,
    "tu dois pouvoir utiliser leurs userforms indépendamment dans chacun de tes centaines de classeur2"
    Nouvelle question : Les userforms de ces classeurs ont-ils tous la même structure ?
    Parce que, si oui, que te coûterait sur ton classeur principal, d'ajouter un userform identique à ceux de la foultitude de classeurs, qui lui permettrait de faire des "vas et viens" autant que t'en veux.
    A+

  8. #8
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    ben en mettant une procédure publique dans ton 1° classeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Public Sub MonDepart()
       UserForm1.Show
    End Sub

    tu peu ensuite l'exécuter depuis le deuxiéme classeur par un run :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub CommandButton1_Click()
        Application.Run "MesMacros.xls!MonDepart"
     End Sub

  9. #9
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Salut bbil, tu connais pas fast&furious, c'est un compliqué
    Citation Envoyé par Il
    MAIS (c'est là où ça se corse) les solutions suivantes ne peuvent pas être utilisées:
    1) Application.run (nomclasseur1.subpermettantd'ouvrilauserform)
    car les macros seront protégées

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 38
    Par défaut
    ouskel'n'or,
    en fait, c'est bien dans le classeur principal que se trouve la userform. Mon souci c'est de pouvoir la faire apparaître après avoir fermé les sous-classeurs.

    bbil,
    ce que tu me proposes marche (je ne pensais pas qu'on pouvait lancer une sub qui se trouve dans un classeur où les macros sont protégées à partir d'une autre sub. Je pense que cela marche parce que tu m'a indiqué qu'il fallait la déclarer en Public . Merci pour le truc) Mais...

    Afin de pouvoir faire apparaître la userform après avoir fermé le classeur 2, je mets application.run () dans Workbook_beforeclose du 2eme classeur et là, bien sûr, le classeur 2 ne se ferme pas avant que la userform apparaisse.

    En fait, pour que ça marche, il me faudrait un "afterclose" mais là, je vois pas !
    ordi 1 - fast 0

    Si vous avez encore des idées....

    Fast

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 38
    Par défaut
    ouaisousk'ln'or ! en plus d'être compliqué je radote !

    fast

  12. #12
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    C'est tout simple, ouvre tes classeurs depuis l'userform, quand les classeurs sont fermés, ton userform est toujours ouvert.
    Mais je sens que c'est plus compliqué que ça.
    Tu nous expliques

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 38
    Par défaut
    comment sais-tu que c'est + compliqué

    En fait, pour la userform du classeur principal j'ai utilisé les fonctions suivantes:
    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
     
     Private Declare Function GetWindowLongA Lib "User32" _
      (ByVal hWnd As Long, ByVal nIndex As Long) As Long
     
    Private Declare Function SetWindowLongA Lib "User32" _
      (ByVal hWnd As Long, ByVal nIndex As Long, _
      ByVal dwNewLong As Long) As Long
     
    Private Declare Function FindWindowA Lib "User32" _
      (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
     
    Private Sub userform_initialize()
      Dim hWnd As Long
      hWnd = FindWindowA("Thunder" & IIf(Application.Version Like "8*", _
        "X", "D") & "Frame", Me.Caption)
      SetWindowLongA hWnd, -16, GetWindowLongA(hWnd, -16) And &HFFF7FFFF
    End Sub
    afin d'empêcher que les utilisateurs puissent se "balader" dans le classeur principal. Mais si je fais ce que tu me dis, la userform reste apparente quand on arrive dans le sous-classeur et là les utilisateurs ne peuvent ajouter les informations qu'ils sont obligés d'entrer dans ce classeur.

    fast

  14. #14
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Ça s'éclaircit : Tu veux lancer une procédure depuis ton fichier principal et, sans interrompre ta procédure principale, que les utilisateurs puissent, chacun dans son coin, accéder aux classeurs secondaires, fassent leurs petites affaires, puis, enregistrer chaque classeur, les fermer, puis, revenir dans ton userform.
    Si ce n'est pas ça, tu précises, sinon, ma première question : tu ouvres une session Excel pour chaque utilisateur ?
    A+

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 38
    Par défaut
    en fait,je souhaite que l'utilisateur lance la procédure du fichier principal à partir d'une userform. Cette procédure se finit par l'accès d'un des fichiers secondaires. Il fait ensuite ses petites affaires dans le fichier et ensuite il ferme and sauvegardant le fichier secondaire. Et c'est là, qu'il faut que l'on revienne au fichier principal sur la userform.

    merci pour ta patience

    fas

  16. #16
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    essai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Private Sub Workbook_BeforeClose(Cancel As Boolean)
     Application.OnTime Now, "MesMacros.xls!MonDepart"
    End Sub

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 38
    Par défaut
    Ca marche ! Merci bbil !

    Je ne comprends pas trop pourquoi cela marche avec ce code mais l'important c'est que cela marche !
    Je l'ai essayer sur un fichier simple : nickel
    Sur mon fichier ça ne marche pas à tout les coups cela doit venir de mon code (...compliqué comme dirait ouskel'n'or ) que je vais revoir.

    En tout cas merci encore à bbil pour la solution finale et à ouskel'n'or qui m'a permis d'exprimer correctement mon problème


    Bonsoir

    fast

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

Discussions similaires

  1. [Toutes versions] récupérer les données d'un userform sur un classeur ouvert
    Par Grem974 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 27/05/2015, 14h24
  2. [VBA-E] travailler sur deux classeurs
    Par argv666 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 06/09/2006, 10h40
  3. VBA-E comment exécuter un code sur un classeur complet?
    Par djulegnome dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 13/06/2006, 12h29
  4. [VBA-E]travail sur deux classeurs excel
    Par richou dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 04/04/2006, 10h59
  5. [VBA-E]Erreur sur méthode de classeur
    Par vanima dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 20/02/2006, 12h32

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