【发布时间】:2021-02-28 14:51:13
【问题描述】:
我有一个带有计算列的 Excel 表 (ListObject),但是,有些公式被值覆盖了。
我正在尝试将所有行读入一个数组,进行一些更改(包括添加新行),然后将修改后的数据放回表中。
我的问题是,当我这样做时,计算列中的任何覆盖值都会丢失,因为它们会被原始公式替换。
如何防止这种行为,同时仍将公式填充到新添加的行中?
请注意,这是一个非常简化的示例。实际上,有很多半计算列,如果可以避免,我不想在代码中重新编写每一列的公式。
我目前的简化代码如下:
Dim Tbl As ListObject
Set Tbl = ThisWorkbook.Sheets("Sheet1").ListObjects("Tbl")
''copy current tbl into array
Dim Arr As Variant
Arr = Tbl.DataBodyRange.Formula
''make changes to the array
''copy back from array to tbl
Tbl.DataBodyRange.Resize(UBound(Arr, 1), UBound(Arr, 2)) = Arr
谢谢。
【问题讨论】:
-
我认为您将不得不修改那些直接在工作表上“覆盖”计算公式的值。例如。
Tbl.DataBodyRange(5, 3).FormulaR1C1 = "newValue" -
不。那是行不通的……有超过 10,000 行和 20 多列。它已经运行得太慢了。循环遍历每个单元格以检查它是否是公式,然后将每个不是的单元格单独写入工作表将花费太长时间。
-
您可以通过检查数组以查看它是否以等号开头来节省一些时间。或者您可以将公式转换为范围,然后再返回。或者也许其他人会想出更好的答案。
-
这不是检查它们是否是需要时间的公式,而是必须将它们单独写入工作表。我想我有一个解决方案,并会发布一个答案,虽然它有点令人费解。
标签: excel vba listobject