前提:在excel中我用插入--》对象的方法插入多个avi文件'在ThisWorkbook模块中:
Private Sub Workbook_Open()
Dim b As Shape
For Each b In ThisWorkbook.ActiveSheet.Shapes
    b.OnAction = "test"
Next
End Sub'在“模块1”中:
Public Sub test()
    MsgBox TypeName(Selection)
End Sub当用户点击某一个avi shape时怎么弹出的对话框写的是“Range”而不是“OLEObject"呢?怎样才能解决?

解决方案 »

  1.   

    你为何不直接插入Windows Media Player控件呢?
      

  2.   

    我要保持插入的avi视频在文件中,只需拷给用户excel即可观看,不用再拷很多的avi文件。所以用插入--》对象--》对象包的方法
      

  3.   

    Private Sub Workbook_Open()
        Dim b As Shape
        For Each b In ThisWorkbook.ActiveSheet.Shapes
            b.OnAction = "'ThisWorkbook.Test """ & b.Name & """'"
        Next
    End SubSub Test(objName)
        Dim sht As Worksheet
        Set sht = ActiveSheet
        With sht.Shapes(objName)
            If MsgBox("是否打开对象 """ & objName & """", vbYesNo) = vbYes Then
                .OLEFormat.Verb (xlVerbPrimary)
            End If
        End With
    End Sub
      

  4.   

    onaction中还能传参数,太厉害了,不过还有个问题,我是用vb控制excel的,在vb中我怎么写呢?onaction后面怎么写能调用我vb中的一个子程序?
      

  5.   

    非常感谢超级绿豆的赐教,给出了一个非常好的交互方法,但是在我的程序中,excel表都是通过用户选择打开的,表里我不可能写进去程序,所以我想实现把上面代码中需要写到excel表中的也都写到vb中,当然onaction我可以在vb中当excel打开时赋给每个shape指定宏。
    我现在解决的方法是:在用户机器上应用加载宏的方式(就是在xlstart中建立xla文件),把指定宏的内容写到加载宏中,让每个shape指定宏都调用xla里的子程序。这样虽然不是很好,但是能解决我目前的问题。
    如果不用xla文件都写在vb中,那就完美了,请问高手有没有更好的办法。
      

  6.   

    不用xla,超级绿豆的代码都可以在vb实现,可以在用户打开excel文件以后,把要执行的宏从vb写入用户文件就行了。