Я предполагаю, что вы будете циклически перебирать записи после того, как запрос заполнит вашу таблицу, произведете поиск условия и "сделайте вещи". Поэтому я предполагаю, что место, где вы хотите разместить кнопку, представлено объектом 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) "и тому подобное - но у вас будут веские причины делать это по-своему.
Надеюсь, это поможет - удачи