3

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

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

4

3 回答 3

1

I had the same issue when populating a ListObject (Table) from an Excel Add-in, setting AutoFillFormulasInLists was the solution.

My workaround is to save the current setting, set AutoFillFormulasInLists to false, populate the table with data, formulas etc, then set AutoFillFormulasInLists back to the original setting.

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

//[ListObject population code....]

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

Hope this helps someone.

于 2018-04-24T21:34:53.643 回答
0

我遇到了类似的问题。理想情况下,您可以告诉 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)等等

于 2013-09-16T19:49:41.757 回答
0

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

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

于 2019-07-25T20:53:59.267 回答