【问题标题】:Add/Modify/delete calculated column formula in Excel Listobject/Table via VBA通过 VBA 在 Excel Listobject/Table 中添加/修改/删除计算列公式
【发布时间】:2012-11-25 01:39:39
【问题描述】:

如果我在 Excel 表(即 ListObject)的列中手动输入公式,自动更正会将此公式应用于整个列。

有没有办法通过 VBA 控制这种行为,即我可以以某种方式修改/删除/添加这个公式吗?

我知道我可以简单地更改 ListObject.ListColumns(1).DataBodyRange 对象的公式 - 但这会覆盖之前输入的任何手动值 - 而在 UI 中更改公式将保持不变...

【问题讨论】:

  • 我不清楚你想要什么行为。关于“更改 UI 中的公式将保持不变”,这不是我的经验。如果我有一个表格列,除了一个硬编码的单元格之外,整个表格的列都具有相同的公式,然后我更改了公式,我会收到“用这个公式覆盖所有单元格”的小提示。如果我选择是,硬编码的单元格将被覆盖,如果否,则公式仅适用于我已更改的单元格。这是 Excel 2010。
  • @Doug - 感谢您澄清这一点。我错误地认为更新公式时会保留偏离计算列公式的单元格!我现在看到情况并非如此,这几乎使问题无效!修改计算列公式所需要做的就是修改listObject.ListColumns("Column name").DatabodyRange.FormulaR1C1...

标签: excel listobject excel-tables vba


【解决方案1】:

感谢 Doug 和 bonCodigos cmets/answers,我找到了简单的答案:

ListObject.ListColumns("Column name").DataBodyRange.FormulaR1C1 = "new formula"

这将覆盖任何手动值(就像使用自动更正的正常行为一样)。

【讨论】:

  • 这是否也会设置默认公式,以便在添加新行时也添加公式?
  • @William - 是的,会的
  • 我在使用这个时突然收到“无效使用财产”...有什么提示吗?
  • @MattE 你确定列名是正确的吗?此外,您的表是否有数据 - 如果没有,DataBodyRange 将为 Nothing,您将收到此错误。
  • @PeterAlbert 我认为这可能是它发生的原因,因为我正在从查询中提取数据......在运行此之前等待查询完成加载以确保有有数据吗?
【解决方案2】:

如果您能给我们看一张您的工作表的屏幕截图,那就最好不过了。基于此,我们将明确给出答案。

这是一般假设。您有一个列表对象可以将一些数据转储到一列,并且该列中的其余单元格是手动交互的。

您可以先手动尝试以下方法,看看它是否适合您。手动的仍然被代码级别所取代,然后您在代码级别执行此操作。 :)

这里的主要操作是停止自动更正

转到 -> 工具菜单 -> 单击自动更正选项 -> 在自动更正选项卡中 ->

1- 防止所有自动更正

清除Replace Text as you type的复选框

2- 为了防止特定的更正

清除选项对应的复选框。我相信您对后者更感兴趣 - 您只是通过 listobject 转储的特定数据范围。


现在这里是在代码级别禁用此功能的代码。

使用 Excel 表格 (ListObjects) 时,需要考虑两个自动更正选项:您可以详细了解这两个选项。

* Apply new rows and columns in table 
  (VBA AutoCorrect.AutoExpandListRange Property)
* Fill formulas in tables to create calculated columns 
 (VBA AutoCorrect.AutoFillFormulasInLists Property) 

您可能希望在我们的列表对象顶部使用的代码是,

Application.AutoCorrect.AutoFillFormulasInLists = False

并且完全同意,如果Application.AutoCorrect. AutoFillFormulasInLists 在 ListObject 级别逐个表进行控制,它会更加有用。所以这里有一个解决方法。

因此,一种方法是每次清除表数据。当您清除数据时,您可以确保表格忘记论坛和格式。所以在删除表格内容之前会先清除数据体范围的内容。

Sub forgetMe()
   With Sheet1.ListObjects("myTable")
      If Not .DataBodyRange Is Nothing Then
         .DataBodyRange.ClearContents
         .DataBodyRange.Delete
      End If
   End With

End Sub

输入数据时,先关闭自动填充。

【讨论】:

    猜你喜欢
    • 2017-11-22
    • 2017-07-07
    • 2017-06-16
    • 1970-01-01
    • 1970-01-01
    • 2013-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多