Поместите командную кнопку в ячейку MS Excel vba - PullRequest
5 голосов
/ 29 ноября 2011

Я хочу разместить командную кнопку в ячейке через код VBA.Произнесите позицию B3.Я использовал макрос-рекордер для этой цели, но он дает мне верхнее нижнее значение кнопки.Я не хочу, потому что, если я перенесу свой код на другой компьютер с другим разрешением экрана, код потерпит неудачу.Позиция ячейки (пример B3) будет абсолютной.

Можете ли вы предложить мне способ сделать это.

PS Это кнопка activeX

Спасибо

Ответы [ 2 ]

22 голосов
/ 29 ноября 2011

Вы не можете поместить любой объект "в" ячейку, только над ней. Вы можете установить свойства кнопки Left и Top для ячейки Left / Top.

Sub Tester()
    Dim rng As Range
    Set rng = ActiveSheet.Range("B3")
    With ActiveSheet.OLEObjects("CommandButton1")
        .Top = rng.Top
        .Left = rng.Left
        .Width = rng.Width
        .Height = rng.RowHeight
    End With
End Sub
0 голосов
/ 11 января 2019

Альтернатива «помещению кнопки в ячейку»

Сделайте код выбора ячейки непосредственно, используя событие рабочего листа: Worksheet_SelectionChange. Поместите код в модуль конкретного листа. Цвет / Граница / Текст ячейки, как вам угодно. Ячейка на любом компьютере или экране. Я использую это для ссылки на справку, загруженную в пользовательскую форму, из справочного листа, когда пользователь нажимает на короткую метку / описание. Использование ячеек / кнопок позволяет избежать жалоб на объекты Active-X от ИТ-специалистов.

Что нужно продумать, с примером кода, следующим:

  1. Target.Address возвращает абсолютные адреса, используя символ "$"
  2. Используйте Select Case в своем коде, даже если у вас есть одна ячейка / кнопка. Это облегчает путь к добавлению ячейки / кнопок, позже
  3. рассмотрите возможность использования именованных диапазонов в электронной таблице и ссылки на них в коде. Таким образом, VBA не будет заботиться о перемещении ячейки / кнопки
  4. Если вы объединили ячейки, для которых создали именованный диапазон, помните, что именованный диапазон в электронной таблице указывает только на верхнюю левую ячейку
    • Однако Target.Address для объединенной области возвращает полный диапазон, а не только одну ячейку. Если ваш Select Case ссылается на адрес верхней левой ячейки Target, вы избежите этой проблемы.
    • использовать Target.Cells(1,1).Address
  5. Неправильный выбор для объединенных ячеек: не используйте 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

Image of the Sheet

...