Excel VBA更改表格中的公式?

Excel VBA更改表格中的公式?,excel,vba,excel-2010,listobject,Excel,Vba,Excel 2010,Listobject,有没有人遇到过Excel似乎在操纵您的公式的情况。 我有一张表,其中a列中有一个索引值。第一行以任何非零值开始。列中的后续行增加该值。乙二醇 A1 = 1000 A2= A1+ 1 A3= A2 + 1 等等/ 我还有另一列B,其值要么为空,要么是指向a列的公式(通常是后续行) 例如: 现在我有了备份还原功能,可以将数据/公式写入文本文件,然后在另一个工作簿中读取。 对于A列和B列,我检查文本值是否以“=”开头,然后根据是否存在公式设置该单元格的值或公式 到目前为止,该功能运行良好。它让我准

有没有人遇到过Excel似乎在操纵您的公式的情况。 我有一张表,其中a列中有一个索引值。第一行以任何非零值开始。列中的后续行增加该值。乙二醇

A1 = 1000
A2= A1+ 1
A3= A2 + 1 
等等/ 我还有另一列B,其值要么为空,要么是指向a列的公式(通常是后续行) 例如:

现在我有了备份还原功能,可以将数据/公式写入文本文件,然后在另一个工作簿中读取。 对于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"

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

我遇到了类似的问题。理想情况下,您可以告诉excel停止执行此操作,但我还不知道如何执行。假定执行以下操作可以防止excel复制公式:

xlApp.AutoCorrect.AutoFillFormulasInLists=false

但这对我不起作用

使用这个问题的答案对我有帮助。这感觉不是理想的解决方案,但它确实起到了作用

我使用了这个公式,其中
Weight
是表中的一个列名<代码>#此行是“特殊项目说明符”,具有特殊含义。语法看起来有点古怪,因为它被称为:

=平均值(索引([权重],1):[[这一行],[权重])

索引([Weight],1)
部分给出了Weight列中第一行的参考

[[这一行],[Weight]]
部分给出了Weight列中当前行的引用

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

=平均值(J1:J7)

在第八排,它将相当于


=AVERAGE(J1:J8)
等等

我在从Excel加载项填充ListObject(表)时遇到了同样的问题,设置
自动填充公式列表是解决方案

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

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

将一个表放在自己的工作表中,只是为了澄清:不应该使用
Sheets(“MySheet”).ListColumns(“Next”)
而应该是
Sheets(“MySheet”).ListObjects(1).ListColumns(“Next”)
?感谢您指出本文中的错误@peteralbert“转换为表的好处在于,当我向表中添加更多数据时,公式会自动复制下来。如果更改此公式,Excel将自动将更改复制到列中的所有行。无论是在列顶部更改第一个单元格还是在中间更改单元格,都会修改列中的所有行。
bool OriginalAutoFillFormulaInListsFlag = app.AutoCorrect.AutoFillFormulasInLists;
app.AutoCorrect.AutoFillFormulasInLists = false;

//[ListObject population code....]

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