【问题标题】:Excel VBA changing my formulas in a table?Excel VBA 更改表格中的公式?
【发布时间】:2013-06-10 18:28:07
【问题描述】:

有没有人遇到过 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"

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

【问题讨论】:

  • 澄清一下:Sheets("MySheet").ListColumns("Next") 不应该是Sheets("MySheet").ListObjects(1).ListColumns("Next")
  • 感谢@PeterAlbert指出错误
  • 这篇文章Formulas and Structured Data in Excel Tables 说“转换为表格的好处在于,当我向表格中添加更多数据时,公式会自动为我复制下来。如果我更改此公式,那么Excel 会自动将更改复制到列中的所有行。无论我更改列顶部的第一个单元格还是更改中间的单元格,列中的所有行都会被修改。我不确定如何改变这种行为。

标签: excel vba excel-2010 listobject


【解决方案1】:

从 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】:

    我遇到了类似的问题。理想情况下,您可以告诉 excel 停止这样做,但我无法弄清楚如何。假设执行以下操作是为了防止 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) 部分给出了权重列中第一行的参考

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

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

    =AVERAGE(J1:J7)

    并且在第 8 行将相当于

    =AVERAGE(J1:J8)

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-12-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-04
        相关资源
        最近更新 更多