Mémoriser l'état d'une variable

Bonjour

J'ai un fichier dans lequel j'ai des ligne de titres.Afin de délimiter les zones qui correspondent à chaque titre j'ai créé une macro qui me permet de trouver les lignes de titres.L'objectif étant de masquer telle ou telle zone en fonction de case à cocher.

Je souhaiterai pouvoir mémoriser l'emplacement de chaque ligne de titre afin de délimiter mes différentes zones.

Voici mon code actuel :

Sub Essai()

Dim Page1 As Worksheet
Dim DernLignePage1 As String
Dim LigneDeTitre As Range
Dim Titre As String

Set Page1 = Sheets("Page1")
DernLignePage1 = Page1.Range("A" & Rows.Count).End(xlUp).Row

    With Page1.Range("A1:A" & (DernLignePage1))
      Set LigneDeTitre = .Find("#", LookIn:=xlValues)
      If Not LigneDeTitre Is Nothing Then
        PremierTrouve = LigneDeTitre.Address
        Do
            Titre = LigneDeTitre.Offset(0, 1)
            MsgBox Titre & " Ligne : " & LigneDeTitre.Row
            Set LigneDeTitre = .FindNext(LigneDeTitre)
        Loop While Not LigneDeTitre Is Nothing And LigneDeTitre.Address <> PremierTrouve
      End If
    End With
End Sub

Ma question est la suivante : comment faire pour qu'à chaque fois que ma variable Titre change de valeur je puisse mémoriser son état dans une autre variable (par exemple si la variable Titre à pour valeur Titre2 je crée une nouvelle variable Titre2.).

Je pense qu'il faut passer par une variable tableau mais je ne vois pas comment faire.

Ci joint mon fichier :

Merci pour votre aide

Bonjour DragScorpion, bonjour le forum,

Le code ci-dessous stocke dans le tableau de variable Titre toutes les variables :

Sub Essai()
Dim Page1 As Worksheet
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim I As Byte 'déclare la variable I (Incrément)
Dim J As Byte 'déclare la variable J (incrément)
Dim Titre() As Variant 'déclare le tableau de variables indexées Titre

Set Page1 = Sheets("Page1")
TV = Page1.Range("A1").CurrentRegion 'définit le tableau des valeur TV
J = 1 'initialise la variable J
For I = 1 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeurs TV
    If TV(I, 1) = "#" Then 'condition : si la donnée ligne I colonne 1 de TV est ágale à "#"
        ReDim Preserve Titre(J) 'redimensionne le tableau Titre
        Titre(J) = TV(I, 2) 'récupère dans la variable indexée Titre(J) la donnée ligne I colonne 2
        J = J + 1 'incrémente J
    End If 'fin de la condition
Next I 'prochaine ligne de la boucle

'à effacer ce qui suit, juste pour vérifier
For I = 1 To UBound(Titre)
    MsgBox Titre(I)
Next I
End Sub

Bonjour @ThauThème

Votre code correspond tout à fait à ce que je cherche.Il ne me reste plus qu'à poursuivre.

Merci beaucoup.

Bonjour,

Je vois que j'arrive après ThauThème (que je salue !).

Mais je te présente autre chose !

Je n'ai pas bien vu où tu voulais finalement aller... mais il semblait que tu voulais utiliser dex cases à cocher pour afficher ou désafficher des éléments d'une liste.

Pour aller dans le sens de ce projet, j'ai introduit une ligne de fin, créé une variable publique tableau pour y enregistrer les lignes de titres, y compris la ligne de fin (les titres vont donc de l'indice 0 à UBound -1).

Et comme ton code (que j'ai trouvé déjà nettement au-dessus de la moyenne de ce sur quoi on travaille habituellement sur le forum) mais qui ne me convenait pas tout à fait sur quelques points (indentation en partie, noms de variables bien trop longs à mon goût, absence de regroupements lors des mises en forme...), j'ai donc entrepris de tout réécrire.

Si tu ne l'apprécies pas, cela te laissera toujours de la matière à analyser !

(Contrairement à ThauThème, les commentaires gênent ma lecture du code, je n'en mets donc habituellement pas !)

Ta vérification sur "rifi" laisserait supposer que l'on pourrait différencier les lignes hors titre en fonction de leur contenu, mais comme rien ne permet de l'envisager dans le fichier actuel, au contraire, je ne l'ai pas repris.

Je ne suis pas persuadé non plus de la nécessité de remise en forme de toute la liste lors d'un changement dans la colonne B, cela dépendra de ton utilisation ultérieure... Je l'ai donc maintenue.

J'ai adopté comme principe que tu cochais une case pour afficher les lignes d'un Titre donné et que tu la décochais pour en masquer les lignes (hors le titre).

Procédures modifiées ou ajoutées :

• Workbook_Open : elle lance une proc. d'initialisation de la variable tableau accueillant les numéros de lignes des Titres, puis lance une procédure de mise à jour de l'affichage de la liste pour l'aligner sur les valeurs des cases à cocher. Elle active enfin Page1, mais cela n'aura d'intérêt que si d'autres feuilles sont présentes.

• Worksheet_Change : elle n'opère pas elle-même la mise en forme mais lance une procédure qui la fait. Préalablement, elle démasque toutes les lignes, refait une initialisation de la variable tableau des lignes de titres et à la fin lance la proc. de mise à jour de l'affichage pour le réaligner sur les valeurs des cases à cocher.

• Une procédure affectée à toutes les cases à cocher (MaskAff) : cette proc. recueille selon l'origine de l'appel le rang du titre concerné et la valeur de la case pour savoir s'il faut masquer ou démasquer. Elle appelle la proc. de mise à jour en lui envoyant ces 2 éléments en arguments.

• La proc. de mise à jour (MasquerAfficher) : elle agit différemment selon deux cas, un argument supérieur à 0 indique que c'est le titre du rang correspondant qui est concerné (noter qu'il faudra diminuer ce rang de 1 pour trouver la ligne dans la variable tableau), elle s'assure que ce rang correspond bien à un titre existant et définit alors la ligne de début et celle de fin et applique à cet ensemble la valeur booléenne qui lui a été envoyée. Si l'argument rang du Titre a la valeur 0, la proc. va opérer selon le même mode mais pour tous les titres en recherchant la valeur de la case à cocher correspondante.

Une gestion d'erreur est introduite pour le cas où un incident aurait réinitialisé la variable tableau, limitée strictement aux lignes sur lesquelles surviendrait une erreur dans ce cas. La gestion consiste à initialiser à nouveau la variable et à revenir sur la ligne d'erreur pour poursuivre.

La proc de mise en forme (MenForme) et celle d'initialisation du tableau (InitTitres) n'appellent pas de commentaire...

Cordialement.

Bonjour MFerrand

Merci pour votre réponse et observations .Le fichier que j'ai fournit en exemple n'est en fait qu'une partie du fichier complet qui est une fiche de tests.La mise en forme étant là pour numéroter (et colorier 1 fois sur deux) de manière automatique chaque fois que le terme "verifier" est inscrit dans une cellule de la colonne B (pour éviter les problèmes d'accent ou de majuscules je fais donc la vérification sur le terme "rifi".

Les "#" me servent quant à eux à délimiter les lignes de titres.

Pour le nom des variables étant novice en VBA cela m'a permit de mieux comprendre ce que je faisait.

En ce qui concerne "l'absence de regroupements lors des mises en forme" je suppose que vous parlez du code que j'avais fait sur le changement de valeur dans la colonne "B".

Pour le principe des cases à cocher vous avez bien saisi ce que je voulais faire si ce n'est que je veux aussi masquer le titre.

En fait les cases correspondent à une fonction présente ou non sur l'élément à tester. du coup si la fonction n'existe pas je la masque.

En tout cas merci encore pour votre aide il me reste maintenant à analyser votre code pour tenter de tout comprendre et pouvoir commenter car je ne serais peut être pas toujours le seul à l'utiliser.

Rechercher des sujets similaires à "memoriser etat variable"