2013-08-17 81 views
4

嗯,我的问题是,我创建了一个VBA Sub,它接收一个Excel单元格引用和2个文本值以及一个Variant参数。动态调用宏从形状传递参数OnAction属性

Sub CreateButton(oCell, sLabel, sOnClickMacro, oParameters) 

此子成功地在oCell的创建按钮,但我必须发送一个参数为微距什么是实现这一目标的最佳途径?

如果已经挖不工作某些方面还别人太脏了,不要让我填舒适


随着给予帮助,我设法解决这个问题,我在这里放下对于简单的工作方案,

Sub Button_Click(sText) 
    MsgBox "Message: " & sText 
End Sub 

Sub Test_Initiallize() 
    Dim oCell 
    Dim oSheet 
    Dim oShape 

    Set oCell = Range("A1") 
    Set oSheet = ThisWorkbook.Sheets(1) 

    For Each oShape In oSheet.Shapes 
     oShape.Delete 
    Next 

    Set oShape = oSheet.Shapes.AddShape(msoShapeRectangle, oCell.Left, oCell.Top,  oCell.Width, oCell.Height) 

    oShape.TextFrame.Characters.Text = "Click Me" 
    oShape.OnAction = "'Button_Click ""Hello World""'" 
End Sub 

回答

6

您可以将字符串分配给有次打电话给其次是它的参数的OnAction(注意整个字符串包裹在单引号)

像:

Shape.OnAction = "'SubToCallOnAction ""Hello World!""'" 

Sub SubToCallOnAction(text As String) 

    MsgBox text 

End Sub 

数字参数不需要引号(尽管他们将通过数量来传递 - >默认字符串转换 - >默认数转换)

所以,我想,是什么你想要做的是传中被点击的按钮的名称:

Shape.OnAction = "'SubToCallOnAction """ & Shape.Name & """'" 

更先进,更灵活的使用可能是这样的:

'Set the button up like: 
databaseTable = "tbl_ValidAreas" 
databaseField = "Country" 
Shape.OnAction = _ 
    "'SubToCallOnAction """ & _ 
    Shape.Name & """ """ & _ 
    databaseTable & """ """ & 
    databaseField & """'" 

... 
Sub SubToCallOnAction(buttonID As String, ParamArray args) 

    Select Case buttonID 
     Case "button1" 
      'get the relevant data or whatever using the ParamArray args 
      Call GetData(args(0),args(1)) 
     ... 
    End Select 

End Sub 
+0

嗯,我试图动态创建一个itens fr数据库的列表,它可能被编辑,删除或插入,我需要在点击时获得ID的前两个buutons,并且Im避免使用change事件细胞,所以我更喜欢在命令按钮 –

+0

@Roger有关联的东西我错了 - 检查我的编辑回答:-) –

+0

是的,那个解决,谢谢!我之前尝试过这种方法,但没有注意到该调用必须带有单引号。当然,这将做到这一点! –

1

- 对于谁在2016+找到这个网页的人 -

Cor_Blimey的解决方案在Excel 2003 你必须在参数之间,而不是加空格的逗号,像这样不工作:

Shape.OnAction = _ 
    "'SubToCallOnAction """ & _ 
    Shape.Name & """,""" & _ 
    databaseTable & """,""" & 
    databaseField & """'