0

我在 VBA 中有一个子程序,如果用户将数据粘贴进去,它会调用另一个子程序对数据进行一些分析。下面的代码错误为:

运行时错误'-2147467259 (80004005)':对象'_CommandBarComboBox'的方法'List'失败

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim UndoList As String
    UndoList = Application.CommandBars("Standard").Controls("&Undo").List(1)  'Errors Here!

    If Left(UndoList, 5) = "Paste" Then
        Dim Annotations() As String
        FindAnnots
    End If

End Sub

关于为什么对象的列表不存在的任何想法?

4

2 回答 2

3

在使用 Bryan 关于它是CommandBarComboBox的回答后,我认为您可以检查其启用状态以查看列表是否存在。这是我在不使用On Error Resume Next的情况下让它工作的唯一方法。

使用以下循环捕获 ComboBox 的状态

Dim UndoList As String

If Application.CommandBars("Standard").Controls("&Undo").Enabled = True Then

    UndoList = Application.CommandBars("Standard").Controls("&Undo").List(1)

    If Left(UndoList, 5) = "Paste" Then

        'Code to run here after paste action'

    End If

End If
于 2016-04-22T10:13:41.223 回答
1

简短回答: .List还不存在,因为用户尚未执行任何保存在撤消队列中的操作。该代码正在尝试访问尚未创建的内容。我必须为它创建一个错误处理程序。

长答案:在我的搜索中,我发现 VBA 中的 Controls 对象没有正式的 List 属性。但是,Controls("&Undo")不是Controls对象。这是一个CommandBarComboBox

所以在

Application.CommandBars("Standard").Controls("&Undo").List(1)

Controls("&Undo") 的 .List 属性实际上并未显示在 Excel VBA 智能感知中。它正在查看 Controls 对象的智能感知下拉菜单。但是,如果您尝试

? TypeName(Application.CommandBars("Standard").Controls("&Undo"))

在即时窗口中,您会看到它的类型是CommandBarComboBox,它确实有一个列表属性。但是,与其他 ComboBox 样式控件一样,在添加列表成员之前不会创建列表。在这种情况下,当用户执行值得存储在 Undo 队列中的操作时。

于 2016-04-18T14:55:34.080 回答