2

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

4

2 回答 2

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

对不起我可笑的英语。

于 2013-05-31T19:31:51.333 回答
0

在删除工作表操作后,将以下内容添加到您的宏中。使用正确的引用,它将替换摘要表中#REF 公式的所有实例。您可能必须创造性地调整WHAT:=子句,使其与公式的#REF 子句相匹配。

   Range("<summary sheet name>").Replace What:="+IF(#REF!*)", Replacement:="", LookAt:=xlPart, _
       SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
       ReplaceFormat:=False

PS:请务必先在您的工作表副本上进行测试!

于 2013-05-31T19:09:11.057 回答