Table 自动填充公式,即使 Application.AutoCorrect.AutoFillFormulasInLists = False
Table autofilling formula even with Application.AutoCorrect.AutoFillFormulasInLists = False
不确定发生了什么。在将范围的公式分配给数组之前,我设置了 Application.AutoCorrect.AutoFillFormulasInLists = False
。预期公式将被唯一地设置为数组中的一个值。相反,它们会立即自动填充到数组中的第一个值。
我已确保数组格式正确并显示正确的值,只要我不在字符串前面放置“=”即可。当字符串是有效的 Excel 公式时,Excel 仅更改 table 中的值。
过去其他人表示 Application.AutoCorrect.AutoFillFormulasInLists = False
应该解决这个问题,但我认为 Office365 是不同的。作为旁注,即使关闭该选项,Excel 也会自动向 table 添加行(尽管我确实希望发生这种情况)。也许宏的设置与 excel 本身不同?有什么建议吗?
编辑:添加一些示例代码,为我生成相同的结果。
Public Sub Test()
Dim testTable As ListObject
If Sheet1.ListObjects.Count = 0 Then
Set testTable = Sheet1.ListObjects.Add(xlSrcRange, Sheet1.Range(Sheet1.Cells(1, 1), Sheet1.Cells(3, 1)))
Else
Set testTable = Sheet1.ListObjects(1)
End If
Dim dataArray As Variant
dataArray = Application.Transpose(Array("=""Formula 1""", "=""Formula 2""", "=""Formula 3"""))
Application.AutoCorrect.AutoFillFormulasInLists = False
testTable.DataBodyRange.Formula = dataArray
End Sub
老实说,我不确定这在 Excel 365 之前是否可行,欢迎提供相反的证据(我无法再测试)。
几个选项,每个选项都可能有问题:
- 将 table 转换为一个范围(取消将其设为 table),编写公式,然后重新转换。如果您的公式包含结构化引用,这将不起作用。
- 如果您的公式不作为数组公式分解并且您不介意在公式栏中包含
{}
,请使用 .FormulaArray
。
- 使用
.Formula
但将公式写成“块”-即将您的数组分成几个较小的数组并连续写入。
为了完整起见,我将使用 FormulaArray 解决方法更新示例代码。以下适用于单个列:
Public Sub Test()
Dim testTable As ListObject
If Sheet1.ListObjects.Count = 0 Then
Set testTable = Sheet1.ListObjects.Add(xlSrcRange, Sheet1.Range(Sheet1.Cells(1, 1), Sheet1.Cells(3, 1)))
Else
Set testTable = Sheet1.ListObjects(1)
End If
Dim dataArray As Variant
dataArray = Application.Transpose(Array("=""Formula 1""", "=""Formula 2""", "=""Formula 3"""))
Application.AutoCorrect.AutoFillFormulasInLists = False
testTable.DataBodyRange.FormulaArray = dataArray
Application.AutoCorrect.AutoFillFormulasInLists = True
End Sub
如果您有一个包含多列的 table:
Public Sub Test()
Dim testTable As ListObject
If Sheet1.ListObjects.Count = 0 Then
Set testTable = Sheet1.ListObjects.Add(xlSrcRange, Sheet1.Range(Sheet1.Cells(1, 1), Sheet1.Cells(3, 2)))
Else
Set testTable = Sheet1.ListObjects(1)
End If
Dim newFormulaArray As Variant
newFormulaArray = Array("=""Formula 1""", "=""Formula 2""", "=""Formula 3""")
Dim newDataArray As Variant
newDataArray = Array("Value 1", "Value 2", "Value 3")
Application.AutoCorrect.AutoFillFormulasInLists = False
testTable.DataBodyRange.Value = Application.Transpose(Array(newFormulaArray, newDataArray))
testTable.ListColumns(1).DataBodyRange.FormulaArray = Application.Transpose(newFormulaArray)
Application.AutoCorrect.AutoFillFormulasInLists = True
End Sub
不确定发生了什么。在将范围的公式分配给数组之前,我设置了 Application.AutoCorrect.AutoFillFormulasInLists = False
。预期公式将被唯一地设置为数组中的一个值。相反,它们会立即自动填充到数组中的第一个值。
我已确保数组格式正确并显示正确的值,只要我不在字符串前面放置“=”即可。当字符串是有效的 Excel 公式时,Excel 仅更改 table 中的值。
过去其他人表示 Application.AutoCorrect.AutoFillFormulasInLists = False
应该解决这个问题,但我认为 Office365 是不同的。作为旁注,即使关闭该选项,Excel 也会自动向 table 添加行(尽管我确实希望发生这种情况)。也许宏的设置与 excel 本身不同?有什么建议吗?
编辑:添加一些示例代码,为我生成相同的结果。
Public Sub Test()
Dim testTable As ListObject
If Sheet1.ListObjects.Count = 0 Then
Set testTable = Sheet1.ListObjects.Add(xlSrcRange, Sheet1.Range(Sheet1.Cells(1, 1), Sheet1.Cells(3, 1)))
Else
Set testTable = Sheet1.ListObjects(1)
End If
Dim dataArray As Variant
dataArray = Application.Transpose(Array("=""Formula 1""", "=""Formula 2""", "=""Formula 3"""))
Application.AutoCorrect.AutoFillFormulasInLists = False
testTable.DataBodyRange.Formula = dataArray
End Sub
老实说,我不确定这在 Excel 365 之前是否可行,欢迎提供相反的证据(我无法再测试)。
几个选项,每个选项都可能有问题:
- 将 table 转换为一个范围(取消将其设为 table),编写公式,然后重新转换。如果您的公式包含结构化引用,这将不起作用。
- 如果您的公式不作为数组公式分解并且您不介意在公式栏中包含
{}
,请使用.FormulaArray
。 - 使用
.Formula
但将公式写成“块”-即将您的数组分成几个较小的数组并连续写入。
为了完整起见,我将使用 FormulaArray 解决方法更新示例代码。以下适用于单个列:
Public Sub Test()
Dim testTable As ListObject
If Sheet1.ListObjects.Count = 0 Then
Set testTable = Sheet1.ListObjects.Add(xlSrcRange, Sheet1.Range(Sheet1.Cells(1, 1), Sheet1.Cells(3, 1)))
Else
Set testTable = Sheet1.ListObjects(1)
End If
Dim dataArray As Variant
dataArray = Application.Transpose(Array("=""Formula 1""", "=""Formula 2""", "=""Formula 3"""))
Application.AutoCorrect.AutoFillFormulasInLists = False
testTable.DataBodyRange.FormulaArray = dataArray
Application.AutoCorrect.AutoFillFormulasInLists = True
End Sub
如果您有一个包含多列的 table:
Public Sub Test()
Dim testTable As ListObject
If Sheet1.ListObjects.Count = 0 Then
Set testTable = Sheet1.ListObjects.Add(xlSrcRange, Sheet1.Range(Sheet1.Cells(1, 1), Sheet1.Cells(3, 2)))
Else
Set testTable = Sheet1.ListObjects(1)
End If
Dim newFormulaArray As Variant
newFormulaArray = Array("=""Formula 1""", "=""Formula 2""", "=""Formula 3""")
Dim newDataArray As Variant
newDataArray = Array("Value 1", "Value 2", "Value 3")
Application.AutoCorrect.AutoFillFormulasInLists = False
testTable.DataBodyRange.Value = Application.Transpose(Array(newFormulaArray, newDataArray))
testTable.ListColumns(1).DataBodyRange.FormulaArray = Application.Transpose(newFormulaArray)
Application.AutoCorrect.AutoFillFormulasInLists = True
End Sub