ExcelVBA在复制的工作表上单击复选框时“无法获得复选框属性”

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (40)

正如标题所暗示的那样,我的宏在原来的工作表上工作,但是相同的宏在复制的工作表上失败。

我有一个Excel工作簿,它接收从Sheet 1到复制和填充Sheet 2的输入,这样这本书现在包含Sheet 1、Sheet 2和Sheet 3(这是Sheet 2的填充副本)。Sheet 2包含一堆复选框,这些复选框被复制到Sheet 3中。Sheet 2的名称总是相同的,但是Sheet 3的名称每次都会更改。

当单击每个复选框时,我在工作簿模块中编写了一个宏,以将信息添加到一些不同的书籍中。当单击Sheet 2上的复选框时,宏可以正常工作,但是当我单击Sheet 3上的复选框时,我会收到“运行时错误‘1004’:无法获得工作表类的复选框属性”。

下面是获取错误的行:

Sheetname=ActiveSheet.name如果工作表(Sheetname).CheckBox(“43”)=1

两个复选框调用相同的宏,工作表的名称由‘Sheetname=ActiveSheet.Name’指定,在Sheet 3上使用时显示正确。

我尝试过的东西都是徒劳的:

  • 将“=1”改为“=True”
  • 将“复选框”更改为“OLEObjects”
  • 经验证的“单张名称”是正确的
  • 将Sheet 3复选框更改为activex,应用代码
  • 更改复制复选框的名称并更改代码以反映新名称
  • 在Sheet 2和/或Sheet 3模块上编写宏
  • “复选框(”43“).value=1

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

提问于
用户回答回答于

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

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

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

希望能帮上忙。

用户回答回答于

将a复制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

扫码关注云+社区

领取腾讯云代金券