Fermer une boucle VBA à la fermeture d'Excel

lenes14 Messages postés 5 Statut Membre -  
Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

J'aimerais obtenir votre aide en programmation VBA.
Je replace le contexte, j'ai crée plusieurs macros qui me permettent de :
- dès que je clique sur un rectangle 1, une série de formes s'affichent
- dès que je clique une nouvelle fois sur ce rectangle 1, la série de formes disparait
Une boucle est ainsi créée, jusqu'ici pas de souci.
Le problème est que, si je ne reclique pas sur le rectangle 1 avant de fermer/d'enregistrer le fichier excel, les formes sont toujours présentes lorsque je ré-ouvre mon fichier. Ainsi quand je clique sur le rectangle 1, les formes apparaissent sur les formes déjà apparentes.
J'aimerais ainsi pouvoir fermer la boucle (que les formes ne soient plus apparentes) automatiquement à la fermeture/sauvegarde de mon fichier excel (d'autres personnes que moi vont utiliser ce fichier et c'est pourquoi j'ai besoin d'une automatisation). En espérant avoir été clair ! Je précise que je débute vraiment en VBA et que je ne connais pas le langage.
Pourriez-vous m'aider ? :D Merci pour vos réponses !

2 réponses

  1. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
     
    Bonjour,
    Tu peux toujours essayer de lancer ta macro depuis un
    Private Sub Workbook_BeforeClose(Cancel as Boolean)
    

    L'autre solution serait de stocker une variable (dans une cellule cachée par exemple) l'état de ton "rectangle".
    Si il est ouvert ( la cellule vaut 1 par exemple), lorsque tu ouvres le classeur... ça le referme automatiquement.
    Dans ce cas, ce controle est à mettre dans le
    Private Sub Workbook_Open()

    Ou encore mieux... un mixte des deux.
    Comme ça tu es sûr que c'est correctement géré .... même si le classeur se ferme par erreur ou que le processus plante...

    0
    1. lenes14 Messages postés 5 Statut Membre
       
      Bonjour Jordane,
      La solution du beforeclose me semble abordable :

      Voici où j'ai mis le "Private Sub Workbook_BeforeClose(Cancel as Boolean)" mais ça ne fonctionne pas, les formes restent là quand je ré-ouvre le fichier. Pourtant je l'ai mis dans le même module que ma macro. Une suggestion ?

      Pour le stockage de la variable, je suis encore trop débutant pour comprendre ou surtout pour savoir comment faire mais merci.
      0
      1. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830 > lenes14 Messages postés 5 Statut Membre
         
        Déjà... pour poster ton code sur le forum il faut le coller directement et pas nous en mettre une capture écran.
        Voir ici comment faire : https://codes-sources.commentcamarche.net/faq/10686-le-nouveau-codes-sources-comment-ca-marche#balises-code

        Ensuite... il ne suffit pas de mettre les variables à true ou false....
        Il faut appeler le code qui retire tes rectangles...
        Mais sans avoir ton code entier (et collé correctement)... impossible de t'en dire plus.
        0
    2. lenes14 Messages postés 5 Statut Membre
       
      J'ai aussi essayer un "Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)" mais ca ne fonctionne pas non plus, après la sauvegarde les formes n'ont pas disparues. Je pense que je ne mets pas ce qu'il faut entre le private sub et le end sub ou que je ne le mets pas au bon endroit, ou même peut être les deux ?
      0
    3. lenes14 Messages postés 5 Statut Membre
       
      Ah je ne savais pas !.. Voilà ma macro, j'espère que le format convient...

      Public Clic1 As Boolean
      Public Clic2 As Boolean
      Private Sub Workbook_Open()
      Clic1 = False
      Clic2 = False
      End Sub
      Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
      Clic1 = False
      Clic2 = False
      End Sub
      
      Sub RectCLA()
      
      If Clic1 = False Then
      
      ActiveSheet.Shapes.AddShape(msoShapeOval, 132, 588, 32.5, 32.5). Select
              Selection.ShapeRange.Height = 36.2834645669
              Selection.ShapeRange.Width = 36.2834645669
              Selection.Name = "rond_CLA"
              Selection.OnAction = "touscla"
      
      Clic1 = True
      Clic2 = False
      Exit Sub
      
      ElseIf Clic2 = False Then
      
      ActiveSheet.Shapes.Range(Array("trait_CLA")).Select
      Selection.Delete
      
      Clic1 = False
      Clic2 = True
      Exit Sub
      
      End If
      End Sub
      0
      1. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830 > lenes14 Messages postés 5 Statut Membre
         
        Donc un truc du genre
        
        
        '-----------------------------------------------
        ' se code se trouve dans l'objet thisWorkbook
        '-----------------------------------------------
        Private Sub Workbook_Open()
            Clic1 = False
            Clic2 = False
        End Sub
        Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
            Call clear_trait_CLA
        End Sub
        
        


        '-----------------------------------------------
        'Cette partie du code se situe dans un MODULE
        '-----------------------------------------------
        Public Clic1 As Boolean
        Public Clic2 As Boolean
        Sub clear_trait_CLA()
            If Clic2 = False Then
                ActiveSheet.Shapes.Range(Array("trait_CLA")).Select
                Selection.Delete
                Clic1 = False
                Clic2 = True
            End If
        End Sub
        
        Sub RectCLA()
            If Clic1 = False Then
                ActiveSheet.Shapes.AddShape(msoShapeOval, 132, 588, 32.5, 32.5).Select
                Selection.ShapeRange.Height = 36.2834645669
                Selection.ShapeRange.Width = 36.2834645669
                Selection.Name = "rond_CLA"
                Selection.OnAction = "touscla"
                Clic1 = True
                Clic2 = False
            Else
                Call clear_trait_CLA
            End If
        End Sub
        
        0
  2. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 783
     
    Bonjour,

    Une autre solution est de commencer par nettoyer la feuille avant d'ajouter les nouvelles formes, c'est à dire supprimer les anciennes formes.

    Ici, un excellent cours VBA gratuit pour débutant :
    ftp://ftp-developpez.com/bidou/Cours/VBA/formationVBA.pdf

    0
    1. lenes14 Messages postés 5 Statut Membre
       
      Bonjour,
      Cette solution pourrait aussi être une piste mais mon anti-virus bloque votre fichier pdf !
      0
    2. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 783
       
      Changes d'antivirus !
      0