Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过VBA在Excel Listobject/Table中添加/修改/删除计算列公式_Excel_Listobject_Excel Tables_Vba - Fatal编程技术网

通过VBA在Excel Listobject/Table中添加/修改/删除计算列公式

通过VBA在Excel Listobject/Table中添加/修改/删除计算列公式,excel,listobject,excel-tables,vba,Excel,Listobject,Excel Tables,Vba,如果我在Excel表格(即ListObject)的列中手动输入公式,则“自动更正”会将此公式应用于整个列 是否有任何方法可以通过VBA控制此行为,即是否可以以某种方式修改/删除/添加此公式 我知道我可以简单地更改ListObject.ListColumns(1).DataBodyRange对象的公式-但这将覆盖以前手动输入的任何值-同时更改UI中的公式将保持此不变…如果您能向我们显示工作表的屏幕截图,那将是最好的选择。基于这一点,我们本可以明确给出答案 以下是一般假设。您有一个列表对象将一些数据

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

是否有任何方法可以通过VBA控制此行为,即是否可以以某种方式修改/删除/添加此公式


我知道我可以简单地更改
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我认为这可能是我从查询中提取数据时发生此情况的原因…在运行此操作之前,等待查询完成加载以确保有数据的最佳方式是什么?