Excel VBA 更改表格中的公式?

Excel VBA changing my formulas in a table?

有没有人遇到过 Excel 似乎在操纵您的公式的情况。
我有一张工作表,其中在 A 列中有一个索引值。第一行以任何非零值开头。列中的后续行递增该值。例如

1
2
3
A1 = 1000
A2= A1+ 1
A3= A2 + 1

等等/
我有另一列 B,其值要么为空白,要么为指向 A 列的公式(通常是后续行)
例如:

1
2
3
4
B1.Formula ="=A2"
B2.Formula ="=A3"
B3.Value =""
B4.value ="=A6"

现在我有一个备份-恢复功能,可以让我将数据/公式写到一个文本文件中,然后在另一个工作簿中读回。
对于 A 列和 B 列,我正在检查文本值是否以 "=" 开头,然后根据是否有公式来设置该单元格的值或公式。

到目前为止,该功能运行良好。它让我准确还原。

现在,如果我将此数据范围转换为表格并相应地修改代码,则行为很奇怪。我正在使用 ListObject 结构来引用该表。所以对于 B 列,我的恢复代码是:

1
2
3
4
5
6
7
 If Left(soureString) ="=" Then
               'This is a formula
               Sheets("MySheet").ListObjects(1).ListColumns("Next").DataBodyRange(row).Formula = sourcestring
Else
               'This is a value
                Sheets("MySheet").ListObjects(1).ListColumns("Next").DataBodyRange(row).Value = soureString
End If

写完一行后,我循环到开头,

1
2
3
Dim newRow AS listrow
Set newRow = Sheets("MySheet").Listrows.Add(AlwaysInsert:=False)
row = newRow.Index

但是这次我运行这个过程。这就是我得到的:

1
2
3
4
B1.Formula ="=A5"
B2.Formula ="=A5"
B3.Value =""
B4.value ="=A5"

当我使用表格而不是范围时,为什么我的公式值都变为相同的值?


从 Excel 加载项填充 ListObject(表)时,我遇到了同样的问题,设置 AutoFillFormulasInLists 是解决方案。

我的解决方法是保存当前设置,将 AutoFillFormulasInLists 设置为 false,用数据、公式等填充表格,然后将 AutoFillFormulasInLists 设置回原始设置。

1
2
3
4
5
6
7
8
9
bool OriginalAutoFillFormulaInListsFlag = app.AutoCorrect.AutoFillFormulasInLists;
app.AutoCorrect.AutoFillFormulasInLists = false;

//[ListObject population code....]

if (OriginalAutoFillFormulaInListsFlag == true)
{
    app.AutoCorrect.AutoFillFormulasInLists = true;
}

希望这对某人有所帮助。


我发现,当您在 VBA 中插入时,解决 Excel 表格中公式更改问题的唯一方法是在表格的第一行插入,而不是在底部或中间插入。你可以排序。

而且我总是选择或引用 EntireRow 来插入工作表对象而不是表本身。无论如何,我总是使用 xx.Entirerow.Insert.

将表格放在自己的工作表中


我遇到了类似的问题。理想情况下,您可以告诉 excel 停止这样做,但我无法弄清楚如何。假设执行以下操作可以防止 excel 复制公式:

xlApp.AutoCorrect.AutoFillFormulasInLists = false

但它对我不起作用。

使用这个问题的答案如何使用 Excel 表格结构化引用创建运行总计?帮助过我。它感觉不是理想的解决方案,但确实可以完成工作。

我使用了这个公式,其中 Weight 是我表中的列名。 #This Row 是一个"特殊项目说明符",具有特殊含义。语法看起来有点古怪,因为它就是所谓的结构化引用:

=AVERAGE(INDEX([Weight],1):[[#This Row],[Weight]])

INDEX([Weight],1) 部分给出了重量列第一行的参考

[[#This Row],[Weight]] 部分给出了权重列中当前行的引用。

例如,如果权重是 J 列,并且当前行是,比如说,7,那么这相当于

=AVERAGE(J1:J7)

并且在第 8 行将等同于

=AVERAGE(J1:J8) 等等