首页 文章

单击复制的工作表上的复选框时,Excel VBA 'unable to get checkboxes property'

提问于
浏览
0

正如 Headers 所暗示的那样,我的宏在原始工作表上按预期工作,但同一个宏在复制的工作表上失败 .

我有一个Excel工作簿,它从sheet1获取一个输入来复制和填充sheet2,这样该书现在包含sheet1,sheet2和sheet3(这是sheet2的填充副本) . Sheet2包含一堆复选框,复制到sheet3 . Sheet2始终具有相同的名称,但sheet3的名称每次都会更改 .

我在工作簿模块中编写了一个宏,在单击每个复选框时将信息添加到几本不同的书中 . 当单击sheet2上的复选框时,宏按预期工作,但是当我单击sheet3上的复选框时,我收到“运行时错误'1004':无法获取Worksheet类的CheckBoxes属性” .

以下是获取错误的行:

sheetname = ActiveSheet.name If Sheets(sheetname).CheckBoxes(“43”)= 1然后

两个复选框都调用相同的宏,并且工作表的名称由'sheetname = ActiveSheet.Name'指示,并且在sheet3上使用时显示正确 .

我徒劳无功的事情:

  • 将"= 1"更改为"= True"

  • 将"CheckBoxes"更改为"OLEObjects"

  • 已验证'sheetname'是否正确

  • 将sheet3复选框更改为ActiveX,应用代码

  • 更改复制的复选框名称并更改代码以反映新名称

  • 在sheet2和/或sheet3模块上写宏

  • "CheckBoxes(" 43 ").Value = 1"

为什么它可以在一张纸上工作,而不在另一张纸上?

感谢您的时间!

2 回答

  • 1

    CheckBox 复制到另一个工作表时,其 Name 将更改 . 你需要另一种方法来识别它们,也许是 Caption

    您可以使用此小Sub来识别工作表上的复选框的名称和 Headers

    Sub LitsNames()
        Dim ws As Worksheet
        Dim cb As CheckBox
        Set ws = ActiveSheet
        For Each cb In ws.CheckBoxes
            Debug.Print "Name = " & cb.Name, "Caption = " & cb.caption
        Next
    End Sub
    

    在立即窗口中查看结果

    此函数将返回带有给定 Headers 的复选框(如果有多个具有给定 Headers 的CB,则此操作无效)

    Function GetCB(ws As Worksheet, caption As String) As CheckBox
        Dim cb As CheckBox
        For Each cb In ws.CheckBoxes
            If cb.caption = caption Then
                Set GetCB = cb
                Exit Function
            End If
        Next
    End Function
    

    像这样使用它

    Sub Demo()
        Dim cb As CheckBox
    
        Set cb = Nothing
        Set cb = GetCB(ActiveSheet, "Some Caption")
        If Not cb Is Nothing Then
            If cb.Value = 1 Then
                ' do stuff
            End If
        End If
    End Sub
    
  • 0

    您应该能够访问该复选框

    Sheets(sheetname).Shapes(MyShapeIndex).OLEFormat.Object.Value
    

    要么

    Sheets(sheetname).OLEObjects(OLEIndex).Object.Value
    

    希望有所帮助 .

相关问题