删除其中一张纸时出现#Ref错误

时间:2013-05-31 18:22:57

标签: excel excel-vba excel-formula excel-2010 vba

我有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错误?我不介意在宏观或基于公式的情况下这样做。请帮忙。谢谢!

2 个答案:

答案 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 & "*)", ....

抱歉我可笑的英语。