【发布时间】:2021-09-25 02:25:06
【问题描述】:
我有一个宏,可以将源工作表中的单元格复制到当前工作表上。
为了让 vba 仍然可以运行,我已使用以下内容保护了所有工作表:
Sub ProtectAllSheets()
Dim ws As Worksheet
For Each ws In Worksheets
ws.Protect , UserInterFaceOnly:=True
Next ws
End Sub
复制/粘贴的宏在任何情况下始终有效,但现在我使用上面的代码进行保护,它只有在粘贴到同一个源工作表时才有效。
如果粘贴在不同的工作表上,我会收到一个运行时错误,指出它是只读的。
包括源在内的所有工作表都以上述方式受到保护。
运行时错误指向宏中的这行代码:
copySheet.Range("2:" & copySheet.Cells(Rows.Count, 1).End(xlUp).Row).Copy .Rows(LRow)
Dim copySheet As Worksheet
Dim pasteSheet As Worksheet
Dim LRow As Long, i As Long
Set copySheet = Worksheets("Template")
Set pasteSheet = ActiveSheet
With pasteSheet
If Application.WorksheetFunction.CountA(.Cells) = 0 Then
copySheet.Rows(1).Copy .Rows(1)
LRow = 2
Else
LRow = .Range("A" & .Rows.Count).End(xlUp).Row + 1
End If
copySheet.Range("2:" & copySheet.Cells(Rows.Count, 1).End(xlUp).Row).Copy .Rows(LRow)
End With
End Sub
这里可能会发生什么,我该如何纠正?
【问题讨论】:
-
您遇到了哪个错误?您是否在 workbook_open 事件中运行
ProtectAllSheets?因为UserInterFaceOnly:=True在关闭工作簿时迷路了。并且需要在打开工作簿时再次重新申请。 -
在 workbook_open 中是。我收到运行时错误 1004:您尝试更改的单元格或图表受到保护,因此是只读的...
-
那么你能说出
.Rows(LRow)指的是什么吗?你能告诉minimal reproducible example这个问题吗? -
已在上面编辑以包含完整代码。
-
你
Set pasteSheet = ActiveSheet在哪个工作簿中的ActiveSheet与Worksheets("Template")相同?如果它在工作簿中,则代码编写在我建议指定ThisWorkbook.ActiveSheet和ThisWorkbook.Worksheets("Template")。只是为了确保它是可靠的。您能否确认所有内容都在同一个工作簿中?