如何在没有Application.Caller的情况下单击Shape

时间:2012-09-25 12:13:20

标签: winapi vba excel-vba excel

如何在不使用Application.Caller的情况下检索单击以运行宏的形状?它的名称或形状本身就是一个对象。

我无法使用Application.Caller,因为如果形状名称大于30个字符,则只检索前30个字符。

也许有一个API可以检索Sape对象?

修改

  1. 我不想在工作表中循环形状。通过工作簿中的所有形状循环都需要花费太多时间。
  2. 我无法重命名形状。
  3. 由于

1 个答案:

答案 0 :(得分:2)

您可以重命名工作表中的Shape对象吗?

Private Sub Workbook_Open()
Dim shp As shape
Dim i As Integer

For Each shp In ThisWorkbook.Sheets(1).Shapes
    shp.Name = "Shape" & Format(i, "0000")
    i = i + 1
Next shp
End Sub

或者,您可以手动设置每个形状的.OnAction属性,以将形状名称传递给您的函数:

Sub RenameShapes2()

    Dim shp As shape
    Dim i As Integer

    For Each shp In ThisWorkbook.Sheets(1).Shapes
        shp.name = "Shape" & "abcdefghijklmnopqrstuvwxyz0123456789_" & Format(i, "0000")
        shp.OnAction = "'userFunction """ & shp.name & """'"
        i = i + 1
    Next shp

End Sub


Sub userFunction(name As String)
    MsgBox name
End Sub 

这允许您使Shape长度超过30个字符。

虽然有点难看