有没有人遇到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"
为什么当我使用表而不是范围时,我的公式值都会更改为相同的值?
答案 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
在自己的工作表中放置一张表格。