单击复制的工作表上的复选框时,Excel VBA'无法获取复选框属性'

时间:2018-06-19 22:37:03

标签: excel excel-vba checkbox vba

正如标题所暗示的那样,我的宏在原始工作表上可以正常工作,但是同一宏在复制的工作表上失败。

我有一个Excel工作簿,该工作簿从sheet1接收输入以复制并填充sheet2,因此该书现在包含sheet1,sheet2和sheet3(这是sheet2的填充副本)。 Sheet2包含一堆复选框,这些复选框已复制到sheet3。 Sheet2始终具有相同的名称,但是sheet3的名称每次都会更改。

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

这是出现错误的行:

  

sheetname = ActiveSheet.name

     

如果Sheets(sheetname).CheckBoxes(“ 43”)= 1然后

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

我徒劳的尝试:

  • 将“ = 1”更改为“ = True”
  • 将“ CheckBoxes”更改为“ OLEObjects”
  • 已验证的“工作表名称”正确
  • 将sheet3复选框更改为ActiveX,应用代码
  • 更改已复制复选框的名称并更改代码以反映新名称
  • 在sheet2和/或sheet3模块上写入宏
  • “ CheckBoxes(” 43“)。Value = 1”

为什么它只能在一张纸上工作而不能在另一张纸上工作?

谢谢您的时间!

2 个答案:

答案 0 :(得分:1)

CheckBox复制到另一张纸时,其Name将改变。您需要另一种方法来识别它们,也许是Caption

您可以使用这个小的Sub来识别工作表上复选框的名称和标题

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

在立即窗口中查看结果

此函数将返回具有给定标题的复选框(如果有多个具有给定标题的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

答案 1 :(得分:0)

您应该能够通过以下方式访问该复选框

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

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

希望有帮助。