J'ai un classeur où j'ai des boutons pour masquer et afficher des lignes. Ainsi, lorsque les lignes sont masquées, un bouton est également masqué, puis vice versa. Ensuite, j'ai une plage qui devrait être masquée et non masquée en cliquant sur les boutons. Y a-t-il un moyen de rendre cela dynamique?
Le problème est que j'ai environ 40 boutons et une fois que j'apporte des modifications à la calculatrice et que j'ajoute une nouvelle ligne à ma feuille de calcul, je dois réécrire toutes les plages. Les plages sont dans l'ordre, donc elles vont comme:
Sub WorkshopwnWork_UnhideMe()
Application.ScreenUpdating = False
ThisWorkbook.Sheets("Price calculation").Unprotect Password:="123"
Range("1254:1275").EntireRow.Hidden = False
ActiveSheet.Shapes("Rectangle: Rounded Corners 111").Visible = False
ActiveSheet.Shapes("Rectangle: Rounded Corners 233").Visible = True
ActiveWindow.ScrollRow = 1254
ThisWorkbook.Sheets("Price calculation").Protect Password:="123"
Application.ScreenUpdating = True
End Sub
Est-il possible d'avoir quelque chose comme +22 au lieu de 1254: 1275 ? Puis +23 au lieu de 1276: 1298 etc.?
Pour 40 boutons, j'ai 80 sous-marins (1 pour masquer et 1 pour afficher). Chaque opération dans son propre sous-marin comme ceci:
BOUTON MASQUER:
Sub WorkshopWork_HideMe()
Application.ScreenUpdating = False
ThisWorkbook.Sheets("Price calculation").Unprotect Password:="123"
Range("1254:1275").EntireRow.Hidden = True
ActiveSheet.Shapes("Rectangle: Rounded Corners 111").Visible = True
ActiveSheet.Shapes("Rectangle: Rounded Corners 233").Visible = False
ThisWorkbook.Sheets("Price calculation").Protect Password:="123"
Application.ScreenUpdating = True
End Sub
BOUTON DÉCHARGER:
Range("1254:1275").EntireRow.Hidden = True
Range("1254:1275").EntireRow.Hidden = False
next one
Range("1276:1298").EntireRow.Hidden = True
Range("1276:1298").EntireRow.Hidden = False
next one
Range("1299:1350").EntireRow.Hidden = True
Range("1299:1350").EntireRow.Hidden = False
etc.
p>
4 Réponses :
Oui, vous pouvez faire quelque chose comme ça pour créer un Vous peuvent déclarer votre variable comme J'espère que cela vous aidera. lignes index dynamic'This goes at the start of a Module, outside any Sub or Function
Public Const startRow As Integer = 1200
'Example Button1
Sub mySubButton1()
Range(startRow + 54 & ":" & startRow + 75).EntireRow.Hidden = True
Range(startRow + 54 & ":" & startRow + 75).EntireRow.Hidden = False
End Sub
'Example Button2
Sub mySubButton2()
Range(startRow + 100 & ":" & startRow + 125).EntireRow.Hidden = True
Range(startRow + 100 & ":" & startRow + 125).EntireRow.Hidden = False
End Sub
Public Constant et les utiliser dans toutes vos fonctions:Dim startRow As Integer
startRow = 1200
Range(startRow + 54 & ":" & startRow + 75).EntireRow.Hidden = True
Range(startRow + 54 & ":" & startRow + 75).EntireRow.Hidden = False
Je vous remercie! Cela a l'air bien, mais comment le faire fonctionner si j'ai son propre sous pour chaque bouton?
@ user7202022 Vous pouvez déclarer startRow comme une Public Constant ( Public Const startRow As Integer = 1200 ), puis utiliser dans toutes vos Fonctions . Je modifierai le code ma réponse en conséquence. :)
Vous pouvez essayer:
Option Explicit
Sub test()
Dim arr As Variant, i As Long
arr = Array(1254, 1276, 1299) '<- Create an array with all row you want to change
For i = LBound(arr) To UBound(arr) '<- loop array
Call Module1.Hide(arr(i)) '<- Call Hide sub
Next i
End Sub
Sub Hide(ByVal Value As Long)
Dim y As Long
With ThisWorkbook.Worksheets("Sheet1")
If Value = 1254 Then '<- Check value
y = 22
ElseIf Value = 1276 Then
y = 23
End If
.Range(Value & ":" & Value + y).EntireRow.Hidden = True
End With
End Sub
Je créerais et maintiendrais une plage nommée qui bouge et bouge avec vos besoins. Il vous suffit d'inclure les cellules dans la première colonne car vous basculez l'affichage de la ligne entière.
De là, vous pouvez incluez cette plage dans votre code, vous pouvez la voir dans l'appel de plage dans la routine ci-dessous. Si vous insérez ou supprimez ensuite des lignes, la forme de la plage nommée s'ajuste automatiquement.
Vous pouvez également améliorer votre routine pour accepter un booléen pour show, puis le gérer à partir d'une routine proxy pour masquer et afficher.
Sub WorkshopWork_HideMe()
ToggleHideShow False
End Sub
Sub WorkshopWork_ShowMe()
ToggleHideShow True
End Sub
Private Sub ToggleHideShow(ByVal bShow As Boolean)
Application.ScreenUpdating = False
ThisWorkbook.Sheets("Price calculation").Unprotect Password:="123"
Range("ShowHideRange").EntireRow.Hidden = Not bShow
ActiveSheet.Shapes("Rectangle: Rounded Corners 111").Visible = bShow
ActiveSheet.Shapes("Rectangle: Rounded Corners 233").Visible = Not bShow
ThisWorkbook.Sheets("Price calculation").Protect Password:="123"
Application.ScreenUpdating = True
End Sub
Quelque chose à penser de toute façon.
Essayez d'utiliser Application.Caller.
Sub btnS()
Set wsAuth = ThisWorkbook.Worksheets("Data")
ColumnNr = wsAuth.Buttons(Application.Caller).TopLeftCell.Column
RowNr = wsAuth.Buttons(Application.Caller).TopLeftCell.Row
Range(RowNr + 54 & ":" & RowNr + 75).EntireRow.Hidden = True
End Sub
Découvrez
RedimensionneretOffset.Qu'est-ce qui détermine les plages? Vous pouvez toujours utiliser des plages nommées, par conséquent, pas besoin de changements de code, juste des mises à jour de la ou des plages nommées
Vous pouvez créer une classe de sorte que chaque fois qu'un bouton est cliqué, il déclenche la classe. Cela signifie que vous n'avez pas à ajouter de code pour chaque bouton