对于每个通过OLEObjects都很简单

时间:2018-10-25 11:48:18

标签: excel vba

我只有一个简单的循环:

    Dim o As OLEObject
    For Each o In ActiveSheet.OLEObjects
        If InStr(1, o.Name, "abc") Then
            MsgBox o.Visible = False
        End If
    Next o

这应该显示我的ActiveX按钮的名称,但是没有显示。当我调试程序时,For Each循环不会一次启动。

我使用了Workbooks("MyWorkbook.xlsm").Sheets(1).OLEObjects.Visible = False,它对我所有的按钮都适用。有谁知道为什么我的循环不起作用或如何设置名称包含“ abc”的按钮的Visible属性?

我尝试过:

Option Explicit

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
        If Not Application.Intersect(Target, Range("B6:C20")) Is Nothing Or Not Application.Intersect(Target, Range("H6:H20")) Is Nothing Then
            'Me.OLEObjects.Visible = False <-- This works fine
            Dim o As OLEObject
            For Each o In Me.OLEObjects
                MsgBox o.Visible = False
            Next
        End If
    End Sub

2 个答案:

答案 0 :(得分:1)

替换行

For Each o In OLEObjects

使用

For Each o In Workbooks("MyWorkbook.xlsm").Sheets(1).OLEObjects

您可能应该放置不同于我在OLEObjects之前放置的东西,但是您将需要某种形式的图纸引用。

答案 1 :(得分:1)

OLEObject(单数)没有固有的关系,并且OLEObjects(复数)集合属于工作表,而不是工作簿(.parent.parent之外),当然也不属于Application对象。

如果您要尝试从该工作表的私有代码表访问该工作表上的按钮,

private sub meh()

    Dim o As OLEObject
    For Each o In ME.OLEObjects
        If InStr(1, o.Name, "abc") Then
            MsgBox o.Visible = False
        End If
    Next o

end sub

如果您试图访问另一个工作表中的OLEObjects或从公共模块代码表中访问OLEObject,则像以前一样,求助于完全合格的父级。

public sub meh2()
    with Workbooks("MyWorkbook.xlsm").Sheets(1)
            Dim o As OLEObject
            For Each o In .OLEObjects    '<~~ note .OLEObjects inside the With ... End With
                If InStr(1, o.Name, "abc") Then
                    MsgBox o.Visible = False
                End If
            Next o
    end with
end sub