Скрытие строк на основе расположения кнопок в VBA - PullRequest
0 голосов
/ 01 июня 2018

Хорошо, я пытаюсь создать кнопку Показать Скрыть в Excel, это большой документ, поэтому я не хочу создавать новую подпрограмму для каждой отдельной кнопки с новым диапазоном для каждой, я в идеале хочучтобы выйти из положения кнопки, и я хочу показать / скрыть 10 строк под кнопкой.Я нашел сабвуфер, который присоединяется к моему сабвуферу «Show» и к сабвуферу «Hide», поэтому мне нужно использовать только одну кнопку для этого, но вот что у меня есть:

Sub Hide()

Dim addr As Object, rs As Long, cs As Long
'addr is the address of the button
'rs is the row number
'cs is the column number
Dim offset1 As Long
'offset for rows value
Dim offset2 As Long
'offset 2 for row value
Dim rs1 As Long
Dim rs2 As Long
Dim rng As Range
Dim sheet As Worksheet
'rng is the cell the button is in

Set sheet = Worksheets("Sheet1")

Set addr = sheet.Shapes(Application.Caller)
'address of the shape using the macro (i.e. the button)
With addr.TopLeftCell
'coordinates of the top left cell of the button
rs = .Row
'row number
cs = .Column
'column number
End With

offset1 = -1
offset2 = -10

rs1 = rs + offset1
rs2 = rs + offset2


With sheet
.Cells(rs1 & ", " & cs).Select
Set rng = .Range(.Cells(rs1 & "," & cs), .Cells(rs2 & "," & cs))

End With
' let rng be the cell the button is in

rng.EntireRow.Hidden = True

End Sub

Iэто работало для моей первой кнопки с использованием функций .offset и .resize, но когда я попробовал ее в другом месте, она не работала без полного изменения смещений.

Заранее спасибо

Ответы [ 3 ]

0 голосов
/ 01 июня 2018

Cells() принимает 2 (или 1) Long аргумента в качестве параметров.Вместо этого вы указываете: Cells(rs1 & "," & cs), что не совсем корректно.

Попробуйте сделать следующее:

With Sheet
    .Cells(rs1, cs).Select
    Set Rng = .Range(.Cells(rs1 & "," & cs), .Cells(rs2 & "," & cs))
End With

Если вы прочитали Как избежать использования Selectв Excel VBA вы можете изменить свой код следующим образом:

With Sheet
    .Range(.Cells(rs1, cs), .Cells(rs2, cs)).EntireRow.Hidden = True
End With

Таким образом, избегая Select и писать меньше кода.

0 голосов
/ 01 июня 2018

Мне кажется, что вы слишком усложняете вещи.

Есть две основные проблемы.

  1. Позиционирование кнопки относительно (это означает, что она не связана с какой-либо конкретнойстрока или столбец).Однако вы можете сами оценить, в каком ряду заканчивается ваша кнопка.

Например

enter image description here

Мы можем видетькнопка заканчивается примерно на строке 8. Таким образом, мы можем скрыть строки с 10 по 20 (или что угодно).

Что касается реализации, то она кажется излишне сложной.Если вы хотите просто спрятать 10 строк под кнопкой, вы можете сделать это легко.

С помощью следующего кода, который сделает его переключаемым:

Private Sub hide_button_Click()
   If (Rows("10:20").EntireRow.Hidden = True) Then
       Rows("10:20").EntireRow.Hidden = False
   Else
       Rows("10:20").EntireRow.Hidden = True
   End If
End Sub

РЕДАКТИРОВАТЬ : В своем вопросе вы сказали, что хотите использовать 10 строк, поэтому я превратил это в статическое значение, очевидно, если вы работаете с динамическим диапазоном, измените интервал 10:20 налюбая переменная, в которой вы храните начальный и конечный диапазон ваших данных

0 голосов
/ 01 июня 2018

Проблема в том, что вы используете Cells.Если вы дадите ему два целых числа, они будут двумя отдельными параметрами и не будут объединены.Измените

.Cells(rs1 & ", " & cs).Select
Set rng = .Range(.Cells(rs1 & "," & cs), .Cells(rs2 & "," & cs))

на

.Cells(rs1, cs).Select
Set rng = .Range(.Cells(rs1, cs), .Cells(rs2, cs))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...