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