正如标题所暗示的那样,我的宏在原始工作表上可以正常工作,但是同一宏在复制的工作表上失败。
我有一个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上使用时显示正确。
我徒劳的尝试:
为什么它只能在一张纸上工作而不能在另一张纸上工作?
谢谢您的时间!
答案 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
希望有帮助。