运行工作表A宏致工作表C对工作表B的引用出现#REF!错误的解决方法咨询
问题解决方法
核心原因
你的宏在更新工作表B(Accruals Previous Period)时,使用了整列复制-粘贴值的操作,加上Wisnullenrf3宏可能对工作表B的结构进行修改(比如删除行/列、清空单元格),导致工作表C的引用目标临时消失,最终触发#REF!错误。锁定单元格(F4)仅针对绝对引用,无法解决单元格本身被移除的问题。
修复方案
1. 替换复制粘贴为直接值赋值(最有效)
删除宏中所有Select/Activate操作,直接通过对象引用将源工作表的值赋值给目标工作表。这种方式只会修改单元格内容,不会改变单元格的存在性,引用自然不会失效。修改后的宏代码如下:
Sub X() If Worksheets("Checks").Range("C2").Value > 0.01 Then MsgBox "One or multiple checks is/are invalid" Exit Sub End If Dim filename As String, myPath As String, myName As String Dim sourceWS As Worksheet, targetWS As Worksheet filename = ActiveWorkbook.Name myPath = ThisWorkbook.Path Set sourceWS = ThisWorkbook.Sheets("Output for Exact") Set targetWS = ThisWorkbook.Sheets("Accruals Previous Period") myName = filename & " " & sourceWS.Range("B2") & " " & "Q" & Sheets("General Input").Range("B5").Text & " EXPORTFILE " ' 直接赋值值,避免复制粘贴导致的结构变动 targetWS.Range("A:W").Value = sourceWS.Range("A:W").Value Application.Run "Wisnullenrf3" End Sub
2. 检查并修改Wisnullenrf3宏
如果上述修改后仍出现#REF!,说明Wisnullenrf3宏中存在删除行/列、清空整单元格区域的操作。需要将这类操作改为仅清空单元格值,比如:
- 把
Rows("1:100").Delete改成Rows("1:100").ClearContents - 把
Range("A:W").Clear改成Range("A:W").ClearContents
这样既能清除旧数据,又能保留单元格本身,确保工作表C的引用始终有效。
额外建议
- 永远避免在VBA中使用
Select/Activate,这类操作容易引发意外的工作表切换和结构变动,直接通过Worksheet/Range对象操作更稳定。 - 如果需要保留源格式,可在直接赋值后单独复制格式,但仅赋值值已经能满足你的核心需求。
内容的提问来源于stack exchange,提问作者Hajoroeters
相关产品推荐
相关产品推荐

