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 SubPremiè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 ?
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
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.