【问题标题】:Excel 2007 - Formula changes to #REFExcel 2007 - 公式更改为 #REF
【发布时间】:2011-10-02 12:59:19
【问题描述】:

所以我得到了这个包含大量数据的工作簿。我有这张表,它基本上根据某些条件复制数据。

每一行中的每个单元格如下所示(最后指定的单元格是公式所在的单元格):

=IF(Numbers1!E2<>0;Numbers1!A2;"")
=IF(Numbers1!E3<>0;Numbers1!A3;"")
=IF(Numbers1!E4<>0;Numbers1!A4;"")
=IF(Numbers1!E2<>0;Numbers1!B2;"")
=IF(Numbers1!E3<>0;Numbers1!B3;"")
=IF(Numbers1!E4<>0;Numbers1!B4;"")

所以单元格A2中的公式是第一行,A3中的公式是第二行等等。

我想从表格 Numbers1 中复制同一列和同一行的值,如果 E 列同一行中的值不为 0。这似乎工作得很好。

但是,当我更新 Numbers1 表中的数据时,公式突然无效,公式现在看起来像这样:

=IF(Numbers1!#REF!<>0;Numbers1!#REF!;"")

每个单元格中的每个公式看起来都与上面的公式相同。而且我做不到,为什么 Excel 不能在没有“帮助”我的情况下保持公式不变?

【问题讨论】:

  • 您使用什么方法来更新“Numbers1”工作表中的数据?如果您使用剪切/粘贴,Excel 会破坏旧的单元格引用并用它“移动”的单元格覆盖它们。如果您使用复制/粘贴,我相信它不应该这样做。
  • Numbers1 工作表中的数据是通过宏导入的。也许单元格引用因此被覆盖?如果是这种情况,也许我需要使用宏重新插入每个单元格的引用'
  • 您是否有权访问正在导入数据的宏?如果它是批量删除行然后添加新数据而不是清除现有数据,我不会感到惊讶。如果是这样,那么简单的事情就是改变数据更新的方法。如果没有,接下来最好的办法是编写一个宏来在导入后重新编写您的公式。
  • 我认为后者是最好的,因为宏是由提供从数据库读取数据的软件的公司编写的。所以这是一种“他们的财产”。但在这种情况下,我需要一个 Sub 来执行此操作而无需太多代码。每个公式本质上是相同的,唯一的区别是对公式所在单元格的引用。因此,如果很容易从“我在”单元格中获取单元格编号,那将更容易创建公式。我会自己尝试,但如果您有任何建议,我很乐意尝试:)

标签: excel excel-2007 formula excel-formula vba


【解决方案1】:

由于您最好使用宏来重写您的公式,以下是基础知识:

Sub RewriteFormulas()

    Dim row, col As Integer
    row = 1               'row you want your target formulas to be on

    For row = 1 To 60
        For col = 1 To 13

            ActiveSheet.Cells(row, col).Formula = "=IF(Numbers1!" & Cells(row,col).Address & "<>0,Numbers1!" & Cells(row+2,col).Adddress & ","""")"

        Next row
    Next col

End Sub

您可以尝试使用不同的工作表(或不同的工作簿)而不仅仅是 ActiveSheet,这样您就可以拥有 1 个工作簿来存储宏并更改任何工作簿中的数据,从而为您提供更新的数据集。

希望对您有所帮助...

【讨论】:

  • 谢谢!然而,它有点相反,我试图让这项工作。意思是,我想遍历从 A 到 M(13 列)的每一列,每列 60 行。我将尝试稍微更改代码并尝试查看它是否有效。但同样,如果您有任何建议:)
  • 我将继续并将其设置为答案。我现在的问题不是#REF 引用,而是宏本身。新主题:)
  • @Kenny 我在示例中添加了更多细节。遍历您的行和列。 Cells() vba 函数将返回一个 Range,您可以从中获取 .Address 属性。希望这会有所帮助...
猜你喜欢
  • 2014-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-04
  • 1970-01-01
  • 2018-11-03
  • 1970-01-01
相关资源
最近更新 更多