Как создать динамическую кнопку в Excel - PullRequest
4 голосов
/ 23 августа 2010

Я заполняю свою электронную таблицу значениями базы данных. Теперь, если я заполнил 30 строк, я хочу создать динамическую кнопку, скажем, на 31-й или 32-й строке для выполнения какого-либо действия. Число строк, которые будут заполнены, не фиксировано..Как я могу это сделать.

1 Ответ

6 голосов
/ 25 августа 2010

Я предполагаю, что вы будете циклически перебирать записи после того, как запрос заполнит вашу таблицу, произведете поиск условия и "сделайте вещи". Поэтому я предполагаю, что место, где вы хотите разместить кнопку, представлено объектом Range () в ActiveSheet ()

Итак, давайте создадим динамическую кнопку ActiveX в этом месте:

Sub CreateDynamicButton()
Dim MyR As Range, MyB As OLEObject
Dim MyR_T As Long, MyR_L As Long


    Set MyR = Range("C110") 'just an example - you get that from your own script
    MyR_T = MyR.Top         'capture positions
    MyR_L = MyR.Left        '...
    'create button
    Set MyB = ActiveSheet.OLEObjects.Add(ClassType:="Forms.CommandButton.1", Link:=False, DisplayAsIcon:=False)

    'set main button properties
    With MyB
        .Name = "MyPrecodedButton"     'important - code must exist ... see below
        .Object.Caption = "MyCaption"
        .Top = MyR_T
        .Left = MyR_L
        .Width = 50
        .Height = 18
        .Placement = xlMoveAndSize
        .PrintObject = True            'or false as per your taste
    End With

End Sub

Если - заранее - вы создали следующую процедуру на активном листе

Private Sub MyPrecodedButton_Click()
    MsgBox "Co-Cooo!"
End Sub

тогда при нажатии кнопки, созданной выше (появится тестирование под XP / SP2 + Excel 2003), появится красивое окно с сообщением.

Процедура Create не спрашивает, существует ли кнопка с тем же именем, вам нужно принять меры, чтобы создать ее только один раз с тем же именем. Если вы дважды вызовете подпрограмму, .Name = "..." произойдет сбой без предупреждения и начнет называть кнопку «CommandButton1» и выше.

Итак, теперь у вас должны быть все ингредиенты для создания ваших кнопок. У каждого из них должна быть предварительно закодированная процедура, если они должны действовать по-другому. Я должен отметить, что вы не можете отлаживать (проходить) процедуру Create после создания объекта OLE, поскольку управление передается за пределы Excel - «это не ошибка, это особенность!»

Я должен признать, что это звучит немного необычно, и я, вероятно, предпочел бы не устанавливать динамические кнопки, действующие на предварительно закодированные Sub, вместо этого я бы сделал начальный диалог перед тем, как запрос предоставит опции с помощью флажков, таких как «Усечь после X». row (Y / N) "и тому подобное - но у вас будут веские причины делать это по-своему.

Надеюсь, это поможет - удачи

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...