Excel VBA在表格中更改我的公式?

时间:2013-06-14 07:01:35

标签: excel vba excel-2010 listobject

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

A1 = 1000
A2= A1+ 1
A3= A2 + 1 

依此类推/ 我有另一列B,其值为空或指向列A的公式(通常是后续行) 例如:

B1.Formula = "=A2"
B2.Formula = "=A3"
B3.Value = ""
B4.value = "=A6"

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

到目前为止,功能一直很好。它让我准确地恢复。

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

 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

一旦我完成了一行,我就会循环到开头并

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

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

B1.Formula = "=A5"
B2.Formula = "=A5"
B3.Value = ""
B4.value = "=A5"

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

3 个答案:

答案 0 :(得分:0)

我遇到了类似的问题。理想情况下,你可以告诉excel停止这样做,但我无法弄清楚如何。据推测,执行以下操作应该保持擅长复制公式:

xlApp.AutoCorrect.AutoFillFormulasInLists = false

但它对我不起作用。

使用此问题的答案How to create running total using Excel table structured references?帮助了我。它不是理想的解决方案,但它确实能够完成这项工作。

我使用了这个公式,其中Weight是我的表中的列名。 #This Row是“特殊项目说明符”,具有特殊含义。语法看起来有点时髦,因为它叫做Structured Reference

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

INDEX([Weight],1)部分为重量列中的第1行提供参考

[[#This Row],[Weight]]部分为权重列中的当前行提供参考。

因此,例如,如果Weight是列J,而当前行是7,那么这相当于

=AVERAGE(J1:J7)

并且在第8行它将等同于

=AVERAGE(J1:J8)依此类推

答案 1 :(得分:0)

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

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

bool OriginalAutoFillFormulaInListsFlag = app.AutoCorrect.AutoFillFormulasInLists;
app.AutoCorrect.AutoFillFormulasInLists = false;

//[ListObject population code....]

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

希望这有助于某人。

答案 2 :(得分:0)

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

我总是选择或引用EntireRow来在工作表对象而不是表本身中进行插入。无论如何,我总是使用xx.Entirerow.Insert在自己的工作表中放置一张表格。