2
votes

Plage dynamique pour masquer les lignes

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>


3 commentaires

Découvrez Redimensionner et Offset .


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


4 Réponses :


2
votes

Oui, vous pouvez faire quelque chose comme ça pour créer un 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

Vous peuvent déclarer votre variable comme 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

J'espère que cela vous aidera.


2 commentaires

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. :)



1
votes

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


0 commentaires

1
votes

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.

 entrez la description de l'image ici

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.


0 commentaires

2
votes

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


0 commentaires