#Ref 错误时删除其中一张表
Posted
技术标签:
【中文标题】#Ref 错误时删除其中一张表【英文标题】:#Ref error when delete one of the sheets 【发布时间】:2013-05-27 15:25:45 【问题描述】:我有从 1 到 50 的工作表和一个汇总表,其中包含基于工作表 1 到工作表 50 的公式(非常长的公式!)。但是,每当我运行宏时,宏都会删除 50 张表中的一张,并且我在摘要表中的所有公式都变为 #Ref。
我知道我可以使用间接函数,但是我的公式很长,一个单元格中的公式实际上是指所有 50 张纸。将间接函数 1 逐 1 引用到所有 50 张工作表将花费大量时间。
例如:其中一个单元格中的公式是:
if(sheet1!A1=2,1,0)+if(sheet2!A1 = 2,1,0)+...+if(sheet50!A1=2,1,0)
我必须沿列和跨行拖动此公式。
有没有办法快速做到这一点并摆脱#Ref 错误?我不介意在宏或基于公式的情况下这样做。请帮忙。谢谢!
【问题讨论】:
您只是想摆脱#Ref!
并仍然使用您的宏吗?您可以复制汇总表中的所有单元格并粘贴为值(选择性粘贴 > 粘贴值)以删除公式。
看看这个link
您可以在宏中添加逻辑以在删除表之前修改汇总表中的公式,然后将修改后的公式放回汇总表中;您可以尝试在搜索中搜索并替换 #REF 值 - 我无法手动完成此操作,但 see this thread 了解如何以编程方式执行此操作的一些想法(我会尝试弄清楚为了我自己的满意,也是)。
删除第 50 张纸后,是否有新纸可以替换缺失的一张,或者您需要保留 49 张?
【参考方案1】:
在删除工作表操作后,将类似以下内容添加到您的宏中。使用正确的引用,它将替换摘要表中#REF 公式的所有实例。您可能需要创造性地调整WHAT:=
子句,使其与公式的#REF 子句相匹配。
Range("<summary sheet name>").Replace What:="+IF(#REF!*)", Replacement:="", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
PS:请务必先在您的工作表副本上进行测试!
【讨论】:
【参考方案2】:您可以在删除之前添加一些代码,这将删除您想要删除的带有工作表名称的表达式。
例如像“=Sheet1!B1+Sheet2!B1”这样的公式将是“=+Sheet1!B1”
Sub test()
Dim i As Integer
Dim deleteSheetName As String ' sheet name that you want to delete
Dim currentFormula As String
Dim currentFormulaArr() As String
deleteSheetName = "Sheet2"
currentFormula = Mid(Cells(1, 1).formula, 2, Len(Cells(1, 1).formula) - 1)
currentFormulaArr = Split(currentFormula, "+")
Cells(1, 1).formula = "="
For i = 0 To UBound(currentFormulaArr)
If Not currentFormulaArr(i) Like "*" & deleteSheetName & "*" Then
Cells(1, 1).formula = Cells(1, 1).formula & "+" & currentFormulaArr(i)
End If
Next i
End Sub
我只为一个单元格制作它。您需要在每张工作表中的所有使用过的单元格中进行一些循环。 我希望你能理解我的想法。
我认为,chuff 的解决方案更好更快,但您可以在移除工作表之前应用他的解决方案。
... Range("<summary sheet name>").Replace What:="+IF(" & deleteSheetName & "*)", ....
对不起我可笑的英语。
【讨论】:
以上是关于#Ref 错误时删除其中一张表的主要内容,如果未能解决你的问题,请参考以下文章