Альтернатива «помещению кнопки в ячейку»
Сделайте код выбора ячейки непосредственно, используя событие рабочего листа: Worksheet_SelectionChange
. Поместите код в модуль конкретного листа. Цвет / Граница / Текст ячейки, как вам угодно. Ячейка на любом компьютере или экране. Я использую это для ссылки на справку, загруженную в пользовательскую форму, из справочного листа, когда пользователь нажимает на короткую метку / описание. Использование ячеек / кнопок позволяет избежать жалоб на объекты Active-X от ИТ-специалистов.
Что нужно продумать, с примером кода, следующим:
- Target.Address возвращает абсолютные адреса, используя символ "$"
- Используйте
Select Case
в своем коде, даже если у вас есть одна ячейка / кнопка. Это облегчает путь к добавлению ячейки / кнопок, позже
- рассмотрите возможность использования именованных диапазонов в электронной таблице и ссылки на них в коде. Таким образом, VBA не будет заботиться о перемещении ячейки / кнопки
- Если вы объединили ячейки, для которых создали именованный диапазон, помните, что именованный диапазон в электронной таблице указывает только на верхнюю левую ячейку
- Однако
Target.Address
для объединенной области возвращает полный диапазон, а не только одну ячейку. Если ваш Select Case
ссылается на адрес верхней левой ячейки Target
, вы избежите этой проблемы.
- использовать
Target.Cells(1,1).Address
- Неправильный выбор для объединенных ячеек: не используйте
MergeArea.Address
(MergeArea
не будет работать для объединенных ячеек [работает только для отдельных ячеек); возвращает объединенный диапазон, в котором живет ячейка.
* Пример кода *
'How to Make Cells into Buttons that execute code
' place code in the specific Worksheet module of interest
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
' in this example, I create named ranges on the spreadsheet '
' [complicated names, here, so you can read what's what]:
' one cell: "Button_OneCellNameRange"
' one set of merged cells: "Button_MergedCellNameRange"
' [the reference is the top-left cell, only]
' a VBA created cell/button location [not very useful for later sheet edits]
Dim myVBACellButton As Range
Set myVBACellButton = Range("B2")
Debug.Print "Target Address: " & Target.Address
'merged cells will return a range: eg "$A$1:$D$3"
Debug.Print "Target.Cells(1,1).Address: " & Target.Cells(1, 1).Address
'merged cells will return the top left cell, which would match
' a named reference to a merged cell
Select Case Target.Cells(1, 1).Address
'if you have merged cells, you must use the ".cells(1,1).address"
' and not just Target.Address
Case Is = "$A$1"
MsgBox "Hello from: Click on A1"
Case Is = myVBACellButton.Address
MsgBox "Hello from: Click on B2, a VBA referenced cell/button"
' "myCellButton" defined as range in VBA
'using a range named on the spreadsheet itself ...
' named ranges allow one to move the cell/button freely,
' without VBA worries
Case Range("Button_OneCellNameRange").Address
MsgBox "Hello From: Button Click on Button_OneCellNameRange"
Case Range("Button_MergedCellNamedRange").Address
'note that the address for merged cells is ONE CELL, the top left
MsgBox _
"Hello from: Button_MergedCellNamedRange.Address: " _
& Range("Button_MergedCellNamedRange").Address _
Case Else ' normally you wouldn't be using this, for buttons
MsgBox "NOT BUTTONS"
End Select
End Sub