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 :

Formulaire qui se ferme intempestivement [XL-2016]


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Femme Profil pro
    utilisateur
    Inscrit en
    Janvier 2016
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : utilisateur

    Informations forums :
    Inscription : Janvier 2016
    Messages : 15
    Points : 8
    Points
    8
    Par défaut Formulaire qui se ferme intempestivement
    Bonjour à tous,
    Encore une fois, je vais avoir besoin de vos lumières ! je souhaite, sur une feuille de calcul, afficher grâce à un bouton de commande un chronomètre et une série de boutons. Pour le chronomètre, j'ai trouvé mon bonheur, il fonctionne parfaitement (à vrai dire j'aurais bien été incapable de créer ce formulaire par moi-même) MAIS, si le formulaire-chronomètre s'affiche sans problème, il disparaît dès que j'insère la moindre forme (checkbox, bouton de contrôle ou autre). Auriez-vous une explication pour ce qui demeure pour moi un grand mystère ? Merci par avance pour vos réponses.Classeur2.xlsm

  2. #2
    Invité
    Invité(e)
    Par défaut
    Ce problème ne se produit pas avec les contrôles de formulaire simples

    remplacez le code suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Set Obj = Worksheets("Test").OLEObjects.Add(ClassType:="Forms.CheckBox.1", Link:=False, _
        DisplayAsIcon:=False, Left:=240, Top:=151, _
        Width:=85, Height:=20)
    par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Obj = Worksheets("Test").CheckBoxes.Add(139.5, 100.5, 53.25, 36)

  3. #3
    Futur Membre du Club
    Femme Profil pro
    utilisateur
    Inscrit en
    Janvier 2016
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : utilisateur

    Informations forums :
    Inscription : Janvier 2016
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    Merci Volid pour cette réponse rapide ; je pense que vous me suggérez de remplacer tous mes contrôles ActiveX par des contrôles de formulaire n'est-ce pas ? cela semble effectivement fonctionner mais dans la macro "réelle" il y a également des boutons de commande alors le temps que je code tout cela, avec les mises en forme qui vont avec, cela risque de durer un peu d'autant que je sais que les syntaxes diffèrent pour la mise en forme (style et taille de police notamment) et j'ai tendance à les mélanger. Alors je teste tout cela mais, en attendant, je vous remercie encore.

  4. #4
    Futur Membre du Club
    Femme Profil pro
    utilisateur
    Inscrit en
    Janvier 2016
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : utilisateur

    Informations forums :
    Inscription : Janvier 2016
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    Bon, je reprends cette discussion après avoir effectuer plusieurs tests. En fait, j'ai réussi à faire tourner ma macro autant avec des contrôles de formulaire qu'avec des ActiveX mais, dans les 2 cas, mon problème reste le même dès lors que j'insère dans ma feuille de calcul une macro créée dynamiquement. Je souhaite en effet copier une feuille A vers une feuille B puis, sur cette feuille B, ajouter mon formulaire Chrono, divers contrôles (de formulaire ou ActiveX) puis, de façon dynamique, une macro worksheet_SelectionChange (ainsi que les macros liées aux boutons ActiveX). Et c'est lors de la mise en place de ces macros sur la feuille B que mon formulaire Chrono disparaît. Même si je réduis le problème avec les contrôles de formulaire, il me reste quand même la macro Worksheet_SelectionChange à insérer. J'ai essayé de placer l'appel du formulaire avant l'insertion de la macro ou après et même par l'appel d'un autre module mais rien n'y fait. Auriez-vous une explication ou (encore mieux !) une solution ? Merci à Volid et à tous ceux qui voudront bien me répondre.

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 364
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 364
    Points : 1 979
    Points
    1 979
    Par défaut
    Salut,

    Tu ajoutes "des macros créées dynamiquement", heu ... tu veux dire par injection de code ?
    Dans ce cas, il n'y a pas de surprises:
    Dès que tu touches à la structure du projet (ajout / suppression de fonction / variables globale / constantes globale ou modification de la signature de ces dernières), le projet s'effondre.

    Il y a d'autres moyens de créer du contenu dynamique, celle que je connait passe par les classes.
    J'espères que tu as de bonnes notions de POO.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Je souhaite en effet copier une feuille A vers une feuille B puis, sur cette feuille B, ajouter mon formulaire Chrono,
    La forme chrono appartient au projet VBA et a aucun moment elle n'a été inséré dans une feuille, c'est un dialogue et il n'est pas possible de l'insérer, tout ce qui s"est produit avec votre code c'est que la forme est affichée au-dessus de la feuille mais dès on tente ajouter un contrôle ActiveX, Excel entre en mode création et désactive la forme.

    Utiliser plutôt Frame :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       ActiveSheet.OLEObjects.Add ClassType:="Forms.Frame.1", Link:=False, _
            DisplayAsIcon:=False, Left:=203.25, Top:=26.25, Width:=157.5, Height _
            :=114
    il me reste quand même la macro Worksheet_SelectionChange à insérer. J'ai essayé de placer l'appel du formulaire avant l'insertion de la macro ou après et même par l'appel d'un autre module mais rien n'y fait
    Pour gérer les événements que ce soit pour la feuille ou les contrôles utiliser un module de Class mais le défi eet comment faire fonctionner simultanément le code du chrono avec deux formulaires a moins qu'il ait un seul qui est activé a la fois

  7. #7
    Futur Membre du Club
    Femme Profil pro
    utilisateur
    Inscrit en
    Janvier 2016
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : utilisateur

    Informations forums :
    Inscription : Janvier 2016
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par deedolith Voir le message

    Il y a d'autres moyens de créer du contenu dynamique, celle que je connait passe par les classes.
    J'espères que tu as de bonnes notions de POO.
    Euh non, pas vraiment ! mais Volid me suggère également de passer par un module de Class. J'ai du faire cela 1 ou 2 fois mais je ne maîtrise pas du tout. Je vais quand même chercher mais une marche à suivre, même sommaire, m'aiderait bien. En tout cas, merci pour vos suggestions.

  8. #8
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 054
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 054
    Points : 9 472
    Points
    9 472
    Par défaut
    Hello,
    Citation Envoyé par Volid Voir le message
    mais le défi est comment faire fonctionner simultanément le code du chrono avec deux formulaires a moins qu'il ait un seul qui est activé a la fois
    Il y a un moyen mais ce n'est pas simple pour un utilisateur lambda : utiliser l'addin excel DNA pour lancer un formulaire chrono en dotnet. Dans ce cas le code du timer est complétement indépendant.
    Voici ce que cela peut donner :
    Nom : ChronoXlDna.gif
Affichages : 76
Taille : 451,3 Ko

    Le code VBA pour lancer le formulaire chrono :

    '
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Affichage du chrono
      Dim chrono As Object
     Set chrono = CreateObject("XlDnaLib.Chrono")
     chrono.Init 0
    Ami calmant, J.P

  9. #9
    Invité
    Invité(e)
    Par défaut
    J'ai remarqué si le code est exécuté a partir d'un d'autre classeur la fiche ne se ferme pas, le problème se produit lors de l'appel de OLEObjects.Add pour insérer dynamiquement des contrôles dans la feuille

  10. #10
    Futur Membre du Club
    Femme Profil pro
    utilisateur
    Inscrit en
    Janvier 2016
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : utilisateur

    Informations forums :
    Inscription : Janvier 2016
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    Bonjour à tous,
    Volid, le problème ne vient pas des contrôles en eux-même mais de leur insertion par macro ; comme le dit justement deedolith "Dès que tu touches à la structure du projet (ajout / suppression de fonction / variables globale / constantes globale ou modification de la signature de ces dernières), le projet s'effondre." C'est ce qui se produit même lors de l'ajout d'un simple worksheet_SelectionChange.
    La solution de jurassic pork est tentante sauf qu'elle s'adresse malheureusement à une utilisatrice lambda. Je peux toujours télécharger Excel-Dna et mettre dans ma macro le code pour afficher le chrono mais entre les 2 ??? Créer une librairie XlDnaLib.Chrono ? et qu'est-ce que je mets dedans ? Comment faire le lien avec Excel (s'agit-il d'un complément ?) Beaucoup de questions auxquelles je n'ai malheureusement pas de réponse.
    Encore un peu d'aide pour me mettre sur la voie svp ... et encore merci à tous

  11. #11
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 054
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 054
    Points : 9 472
    Points
    9 472
    Par défaut
    Hello Chris005,
    effectivement c'est un complément que je pourrais mettre en pièces jointes (la version 64 bits et 32 bits) mais le souci c'est que tu ne pourras pas modifier l'aspect du formulaire chronomètre sauf si tu me dis ce que tu aimerais pouvoir modifier et que je pourrais mettre dans les paramètres d'initialisation. Exemple : position d'apparition sur l'écran , couleurs , incrémenter de x ou décrémenter de x jusqu'à zéro,. Pour l'instant un seul paramètre , la valeur de départ et le chronomètre n'affiche que les minutes , secondes. A quoi va servir le chronomètre ?
    Ne pas oublier qu'aussi sous windows 11 l'application Horloge possède un chronomètre :
    Nom : HorlogeWin11.png
Affichages : 70
Taille : 39,8 Ko

  12. #12
    Futur Membre du Club
    Femme Profil pro
    utilisateur
    Inscrit en
    Janvier 2016
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : utilisateur

    Informations forums :
    Inscription : Janvier 2016
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    Merci jurassic pork pour cette proposition. Je ne veux pourtant pas abuser de ton temps car il ne s'agit que d'insérer le chronomètre dans un jeu pour savoir combien de temps un joueur met à résoudre un problème. Tu vois, rien de bien vital dans tout cela.
    Cependant, si tu es prêt à "jouer le jeu", je positionne actuellement le formulaire avec la commande FrmChrono.move 845, 160, 134, 91 et il affiche hh:mm:ss ainsi qu'un bouton Start/stop et un bouton RAZ. L'idéal serait de pouvoir déclencher ces boutons par macro, au lancement et à la fin du jeu (il n'est alors même pas besoin de les afficher) ; peut-on également modifier sa position par la suite ou est-elle figée ?
    Encore une fois, si cela te prend trop de temps ou si tu n'en vois pas l'utilité, laisse tomber ; c'est déjà très sympa de m'avoir répondu.
    Images attachées Images attachées  

  13. #13
    Invité
    Invité(e)
    Par défaut
    C'est ce qui se produit même lors de l'ajout d'un simple worksheet_SelectionChange.
    Pour prendre en charge l'ensemble des feuilles du classeur utiliser plutôt Workbook_SheetSelectionChange une fois pour toutes
    Dernière modification par Invité ; 14/06/2024 à 14h17.

  14. #14
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 054
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 054
    Points : 9 472
    Points
    9 472
    Par défaut
    En pièce jointe un fichier compressé qui contient un répertoire incluant les compléments 64 bits et 32 bits pour afficher le chronomètre ( fichier xll). Les fichiers dna doivent être au même endroit que les fichiers xll). Excel Dna est inclus dans les xll.
    Voici le code à inclure dans un module VBA pour initialiser, positionner, démarrer le chrono, arrêter le chrono, cacher les boutons , remettre à zéro le chrono.
    L'objet chrono est déclaré en global . Il ne faut l'initialiser qu'une fois. Il est détruit quand on ferme le formulaire par la croix.
    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
    26
    Global chrono As Object
     
    Sub InitChrono()
     Set chrono = CreateObject("XlDnaLib.Chrono")
     chrono.Init 0, 800, 300, False  ' temps initial , position x , position y , cacherboutons
     End Sub
     
    Sub PositionChrono()
      chrono.Position 100, 100
    End Sub
     
    Sub CacherBoutons()
      chrono.CacherBoutons True
    End Sub
     
    Sub StartTimer()
       chrono.Start
    End Sub
     
    Sub StopTimer()
       chrono.Stop
    End Sub
     
    Sub RazTimer()
       chrono.Raz
    End Sub
    Ami calmant, J.P
    Fichiers attachés Fichiers attachés

  15. #15
    Futur Membre du Club
    Femme Profil pro
    utilisateur
    Inscrit en
    Janvier 2016
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : utilisateur

    Informations forums :
    Inscription : Janvier 2016
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    Merci jurassic pork, je teste ce week-end et je te tiens informé.

  16. #16
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 054
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 054
    Points : 9 472
    Points
    9 472
    Par défaut
    Hello,
    j'ai un peu plus cerné le problème initial de la discussion avec le OleObjects.Add car si je fais un InitChrono dans le code du bouton CommandButton 1 avec le OleObjects.Add dans la même commande, cela ne fonctionne pas car la variable globale chrono initialisée par InitChrono se remet à Nothing à l'exécution du OleObjects.Add (même genre de problème que le formulaire VBA FrmChrono qui se ferme ). Si le InitChrono ou le FrmChrono.Show vbModeless sont dans une procédure d'un autre bouton de commande où il n' y a pas de OleObjects.Add cela fonctionne. On dirait que c'est le fait que le code VBA qui ajoute un activeX à la feuille sur laquelle le code VBA est défini qui pose problème.
    Si on met le OleObjects.Add dans un code d'une autre feuille ou dans un module VBA, il n' y a pas de problème. Attention ne pas mettre l'appel de ce code dans un code de la feuille où on ajoute l'activeX.


    Ami calmant, J.P

  17. #17
    Futur Membre du Club
    Femme Profil pro
    utilisateur
    Inscrit en
    Janvier 2016
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : utilisateur

    Informations forums :
    Inscription : Janvier 2016
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    Bonjour jurassic pork,
    J'ai testé ta 1ère solution qui fonctionne (presque) parfaitement. J'ai réussi à initialiser le chrono dans ma procédure initiale mais celle-ci appelle une procédure de vérification et dans cette dernière je n'arrive pas à arrêter le chrono : "Erreur d'exécution 91 - Variable objet ou variable de bloc With non définie" sur la commande Chrono.Stop. Idem sur Chrono.raz. J'ai du louper une marche ...
    Je reprends mes essais puis je testerai ensuite ta 2ème solution. Je ne manquerai pas de te tenir informé et encore merci.

  18. #18
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 054
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 054
    Points : 9 472
    Points
    9 472
    Par défaut
    Hello Chris005,
    Citation Envoyé par Chris005 Voir le message
    J'ai testé ta 1ère solution qui fonctionne (presque) parfaitement. J'ai réussi à initialiser le chrono dans ma procédure initiale mais celle-ci appelle une procédure de vérification et dans cette dernière je n'arrive pas à arrêter le chrono : "Erreur d'exécution 91 - Variable objet ou variable de bloc With non définie" sur la commande Chrono.Stop. Idem sur Chrono.raz. J'ai du louper une marche
    Cela ressemble au problème que j'évoque dans mon message précédent : La variable chrono qui se remet à Nothing.
    Peux-tu montrer tes codes VBA et dans quoi ils sont (feuille, module)?
    Ami calmant, J.P

  19. #19
    Invité
    Invité(e)
    Par défaut
    J'ai bien précisé dans un message précédent que le code fonctionne sans problème si le chrono est lancé partir d'un autre classeur, la solution la plus simple est de placer le chrono dans un addin excel xlam

  20. #20
    Futur Membre du Club
    Femme Profil pro
    utilisateur
    Inscrit en
    Janvier 2016
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : utilisateur

    Informations forums :
    Inscription : Janvier 2016
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par Volid Voir le message
    J'ai bien précisé dans un message précédent que le code fonctionne sans problème si le chrono est lancé partir d'un autre classeur, la solution la plus simple est de placer le chrono dans un addin excel xlam
    Bonsoir à tous, Effectivement, Volid, ta solution a l'avantage d'être à ma portée et j'ai réussi à la faire fonctionner. J'ai créé un .xlam avec les macros permettant d'afficher, démarrer, arrêter et réinitialiser le chrono et j'appelle ces macros avec application.run ; je ne sais pas si c'est très orthodoxe mais c'est simple et efficace.
    Encore merci à tous pour votre aide.

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

Discussions similaires

  1. formulaire qui s'ouvre, se ferme et .. se réouvre
    Par emulamateur dans le forum IHM
    Réponses: 4
    Dernier message: 18/08/2012, 16h16
  2. [AC-2003] Probleme Formulaire qui ce ferme lors de clic
    Par scado dans le forum IHM
    Réponses: 1
    Dernier message: 21/01/2010, 17h02
  3. Réponses: 1
    Dernier message: 05/10/2007, 15h03
  4. Formulaire qui ferme la base
    Par ade94 dans le forum IHM
    Réponses: 1
    Dernier message: 07/09/2007, 18h23
  5. Formulaire qui ne se ferme pas.
    Par Smint dans le forum Access
    Réponses: 7
    Dernier message: 02/06/2006, 10h34

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