Динамический диапазон для сокрытия рядов - PullRequest
2 голосов
/ 18 апреля 2019

У меня есть рабочая тетрадь, в которой есть кнопки для скрытия и скрытия строк.Таким образом, когда строки скрыты, одна кнопка также скрывается, а затем наоборот.Тогда у меня есть диапазон, который должен быть скрыт и скрыт при нажатии на кнопки.Есть ли способ сделать это как-то динамичным?

Проблема в том, что у меня около 40 кнопок, и как только я делаю некоторые изменения в калькуляторе и добавляю новую строку в свой лист, я должен переписать все диапазоны.Диапазоны расположены в последовательности, поэтому они выглядят так:

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.

Возможно ли как-то иметь что-то вроде +22 вместо 1254:1275?Затем +23 вместо 1276:1298 и т. Д .?

Для 40 кнопок у меня есть 80 сабов (1 для скрытия и 1 для показа).Каждая операция в собственной подпрограмме выглядит так:

СКРЫТЬ КНОПКУ:

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

СКРЫТЬ КНОПКУ:

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

Ответы [ 4 ]

2 голосов
/ 18 апреля 2019

Попробуйте использовать 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
2 голосов
/ 18 апреля 2019

Да, вы можете сделать так, чтобы сделать rows index динамическим :

Dim startRow As Integer

startRow = 1200
Range(startRow + 54 & ":" & startRow + 75).EntireRow.Hidden = True
Range(startRow + 54 & ":" & startRow + 75).EntireRow.Hidden = False

Вы можете объявить свою переменную как Public Constant иони используют его во всех ваших functions:

'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

Надеюсь, это поможет.

1 голос
/ 18 апреля 2019

Я бы создал и поддерживал именованный диапазон, который перемещается и встряхивается с вашим требованием. Вам нужно только включить ячейки в первый столбец, если вы переключаете отображение всей строки.

enter image description here

Оттуда вы можете включить этот диапазон в ваш код, вы можете увидеть его в вызове Range в подпрограмме ниже. Если вы затем вставляете или удаляете строки, форма именованного диапазона автоматически настраивается.

Вы также можете улучшить свою процедуру, чтобы принять логическое значение для шоу, а затем обработать его из прокси-программы для игры в прятки.

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

В любом случае, о чем подумать.

1 голос
/ 18 апреля 2019

Вы можете попробовать:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...