我有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错误?我不介意在宏观或基于公式的情况下这样做。请帮忙。谢谢!
答案 0 :(得分:0)
删除工作表操作后,在宏中添加如下内容。使用正确的引用,它将替换摘要表中的所有#REF公式实例。您可能需要具有创造性来定制WHAT:=
子句,以使其与公式的#REF子句匹配。
Range("<summary sheet name>").Replace What:="+IF(#REF!*)", Replacement:="", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
PS:请务必先在表格的副本上进行测试!
答案 1 :(得分:0)
您可以在删除前添加一些代码,删除要删除的表单名称的表达式。
例如“= 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 & "*)", ....
抱歉我可笑的英语。