以编程方式(VBA、C#)将数组字符串设置为一个范围时,出现奇怪的单元格字符数限制

Strange number-of-character-in-a-cell limitation when programmaticaly (VBA, C#) set array string to a range

我 运行 遇到了 Excel 2007 中的一个问题,该问题与 Microsoft 支持 here 描述的 Excel 2003 的已知问题非常相似("You may receive a "运行-time error 1004" 当您以编程方式将大数组字符串设置为 Excel 2003 中的范围时出现错误消息")。如果 运行 以下宏,问题会重现:

Sub newMacro()

Dim longStr As String
longStr = String(8204, "a")

Dim values(3)

For i = 0 To 2
    values(i) = longStr
Next i

Range("A1:C1").Value = values

End Sub

Excel 在将数组值分配给范围时给出 "Run-time error '1004'" 错误消息。但是当字符串长度为 8203 个字符时,一切正常。

我觉得这种情况确实很奇怪,因为 Ecxel 2007 的 "Total number of characters that a cell can contain" 限制(在 "Excel specifications and limits" here 中提到)是 32767。

附加信息:

  1. 问题在 Excel 2010 年没有重现。
  2. 如果不使用数组逐个单元格地设置值,则问题不会重现。但就我而言,它会大大降低我的代码速度。
  3. 最初我在使用 Excel 通过我们的 Excel 加载项使用 NetOffice 库以 C# 编写时注意到了这个问题。

有人 运行 解决过这个问题吗?有什么解决方法吗?微软对此有何评论? 我什么都没找到。

微软似乎也写了一篇关于这个的知识库文章:MS KB 832136

来自文章:

原因: 当满足以下条件之一时,可能会出现此问题:

  • 在 Excel 2007 年,VBA 数组的长度超过 8,203 个字符。

解决方法:

Microsoft 建议不要将整个数组一次放入您的工作表中,而应一次从数组中填充一个工作表。他们在文章中提供了以下示例代码作为如何执行此操作的建议:

Sub PopulateRangeWithArray()
    Dim x
    ReDim x(1 To 2, 1 To 2)
    x(1, 1) = String(2000, "a"): x(1, 2) = String(5000, "b")
    x(2, 1) = String(17000, "c"): x(2, 2) = String(33000, "d")
    MsgBox Len(x(1, 1)) & "," & Len(x(1, 2)) _
           & "," & Len(x(2, 1)) & "," & Len(x(2, 2))
    Range("a1").Value = x(1, 1)
    Range("b1").Value = x(1, 2)
    Range("a2").Value = x(2, 1)
    Range("b2").Value = x(2, 2)
End Sub

相同的限制适用于 Excel 2010 和 Excel 2013。在 Excel 2016 中几乎没有限制,但仅存储前 32767 个字符而不会产生任何错误,其余的被丢弃。声明为 String 的数组就是这种情况。将数组声明为 Variant 时,限制下降到 8192,实际 "Formula Size Limit".