Aglomerer plusieurs commandes pour une même cellule

Bonjour à tous,

je suis en pleine découverte de ce qu'est le VBA.

pour un fichier que je suis en train de mettre au point, je souhaite créer une macro pour masquer un range de colonnes en fonction de la présence ou non d'une abréviation dans une cellule.

pour tenter d'expliquer, dans mon fichier, j'ai 16 cultures différentes que j'indique ou non dans la colonne F " cultures sinistrées".

si, par exemple dans la cellule, j'ai BTH et CZH, je voudrai que toutes les autres cultures soient masquées (soit le range ("AV:BL") pour l'ESC, le range ("BM:CC") pour l'OP et ainsi de suite)

j'ai écris une première ligne de commande comme ceci :

Sub BTH()
'
'afficher BTH

If Not ActiveCell.Value Like "*BTH*" Then Range("AE:AU").EntireColumn.Hidden = True

End Sub

Première question : est-ce que mon code peut fonctionner et est pertinent ?

deuxième question : comment écrire une seule macro qui prenne en compte les 16 cultures ?

10modele.zip (352.17 Ko)

Salut JLS,

Pour mon code, j'ai dû défusionner tes en-têtes de section (BTH,...).
Un clic sur une ligne ou un changement en [F:F] actualise l'affichage ou non des colonnes ad hoc.
À tester car fait entre deux portes...

Public Sub Mask(ByVal iRow%)
'
Dim rCel As Range, tSplit, tCol(), iCol%
'
Application.ScreenUpdating = False
'
Columns.Hidden = False
iCol = Cells(1, Columns.Count).End(xlToLeft).Column + 16
If Range("F" & iRow).Value <> "" Then
    tSplit = Split(Range("F" & iRow).Value, " ")
    ReDim tCol(UBound(tSplit))
    For x = 0 To UBound(tSplit)
        tCol(x) = Rows(1).Find(what:=tSplit(x), lookat:=xlWhole, LookIn:=xlValues).Column
    Next
    Columns("AE:" & fctCol(iCol)).Hidden = True
    For x = 0 To UBound(tSplit)
        Columns(fctCol(tCol(x)) & ":" & fctCol(tCol(x) + 16)).Hidden = False
    Next
End If
'
Application.ScreenUpdating = True
'
End Sub
7jsl.zip (363.38 Ko)


A+

merci, cela fonctionne très bien sur le fichier joint

par contre quelle frustration de ne pas encore comprendre la macro fournie .....

mais je vais y travailler et la prendre en main pour l'intégrer dans mon fichier source.

bonne journée

Salut JSL,

déso, je mets rarement des commentaires!

Public Sub Mask(ByVal iRow%)
'
Dim rCel As Range, tSplit, tCol(), iCol%
'
Application.ScreenUpdating = False
'
Columns.Hidden = False                                          'on affiche toutes les colonnes, sinon, FIND... ne trouvera rien LOL!
iCol = Cells(1, Columns.Count).End(xlToLeft).Column + 16        'dernière colonne des cultures à pouvoir être cachée
If Range("F" & iRow).Value <> "" Then                           'si [F:F] en cours <> ""
    tSplit = Split(Range("F" & iRow).Value, " ")                'on splitte les différentes cultures de [F:F] en cours dans tSplit()
    ReDim tCol(UBound(tSplit))                                  'initialisation d'un tableau qui récoltera les N° de colonnes des cultures splittées
    For x = 0 To UBound(tSplit)                                 'lecture de tSplit()
        tCol(x) = Rows(1).Find(what:=tSplit(x), lookat:=xlWhole, LookIn:=xlValues).Column       'tCol() récolte les n° de colonne (FIND)
    Next
    Columns("AE:" & fctCol(iCol)).Hidden = True                 'on peut maintenant cacher toutes les colonnes de cultures...
    For x = 0 To UBound(tSplit)                                 '...pour ne ré-afficher QUE les cultures enregistrées dans tCol()
        Columns(fctCol(tCol(x)) & ":" & fctCol(tCol(x) + 16)).Hidden = False
    Next
End If
'
Application.ScreenUpdating = True


A+

Merci beaucoup du temps passé et des commentaires.

cela commence à avoir du sens pour moi.

Rechercher des sujets similaires à "aglomerer commandes meme"