通过VBA在Excel Listobject/Table中添加/修改/删除计算列公式
如果我在Excel表格(即ListObject)的列中手动输入公式,则“自动更正”会将此公式应用于整个列 是否有任何方法可以通过VBA控制此行为,即是否可以以某种方式修改/删除/添加此公式通过VBA在Excel Listobject/Table中添加/修改/删除计算列公式,excel,listobject,excel-tables,vba,Excel,Listobject,Excel Tables,Vba,如果我在Excel表格(即ListObject)的列中手动输入公式,则“自动更正”会将此公式应用于整个列 是否有任何方法可以通过VBA控制此行为,即是否可以以某种方式修改/删除/添加此公式 我知道我可以简单地更改ListObject.ListColumns(1).DataBodyRange对象的公式-但这将覆盖以前手动输入的任何值-同时更改UI中的公式将保持此不变…如果您能向我们显示工作表的屏幕截图,那将是最好的选择。基于这一点,我们本可以明确给出答案 以下是一般假设。您有一个列表对象将一些数据
我知道我可以简单地更改
ListObject.ListColumns(1).DataBodyRange
对象的公式-但这将覆盖以前手动输入的任何值-同时更改UI中的公式将保持此不变…如果您能向我们显示工作表的屏幕截图,那将是最好的选择。基于这一点,我们本可以明确给出答案
以下是一般假设。您有一个列表对象将一些数据转储到列中,而该列中的其余单元格是手动交互的
您可以先手动尝试以下操作,看看它是否适合您。但手动模式仍被代码级别取代,然后在代码级别执行此操作。:)
此处的主要操作是停止自动更正
转到->工具菜单->单击自动更正选项->
在“自动更正”选项卡中->
1-防止所有自动更正
清除键入时替换文本的复选框
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)
您可能希望在listobject顶部使用的代码是
Application.AutoCorrect.AutoFillFormulasInLists = False
并且完全同意,如果Application.AutoCorrect,它将非常有用。AutoFillFormulasList
在ListObject级别逐表控制。所以这里有一个解决办法
因此,一种方法是每次清除表数据。当您清除数据时,可以确保表忘记了公式和格式。因此,它将在删除表内容之前清除数据体范围的内容
Sub forgetMe()
With Sheet1.ListObjects("myTable")
If Not .DataBodyRange Is Nothing Then
.DataBodyRange.ClearContents
.DataBodyRange.Delete
End If
End With
End Sub
当您输入数据时,请先关闭自动填充功能。多亏了Doug和bonCodigos的评论/答案,我找到了简单的答案:
ListObject.ListColumns("Column name").DataBodyRange.FormulaR1C1 = "new formula"
这将覆盖任何手动值(就像自动更正的正常行为一样)。我不清楚您想要什么行为。关于“在UI中更改公式将保持不变”,这不是我的经验。如果我有一个表列,除了一个硬编码的单元格外,其他所有单元格的公式都相同,然后我更改了公式,我会得到一个小提示“用这个公式覆盖所有单元格”。如果我选择“是”,硬编码的单元格将被覆盖,如果“否”,则公式将仅应用于我更改的单元格。这是Excel 2010。@Doug-谢谢你澄清这一点。我错误地认为,当公式更新时,偏离计算列公式的单元格会被保留!我现在明白了,事实并非如此,这几乎使问题无效!修改计算列公式所需要做的就是修改
listObject.ListColumns(“列名”).DatabodyRange.FormulaR1C1
…这是否也会设置默认公式,以便在添加新行时,也会添加公式?@William-是的,它会突然获得“属性的无效使用”使用此功能时…有任何提示吗?@MattE您确定列名正确吗?另外,您的表是否有数据?如果没有,DataBodyRange将为Nothing,您将得到此错误。@PeterAlbert我认为这可能是我从查询中提取数据时发生此情况的原因…在运行此操作之前,等待查询完成加载以确保有数据的最佳方式是什么?