当程序devise(VBA,C#)将数组string设置为范围时,奇怪的单元格内字符数限制

我遇到了Excel 2007中的一个问题,这与Microsoft支持在此处描述的Excel 2003的已知问题非常相似(“当您以编程方式将大型数组string设置为”可能“时,您可能会收到”运行时错误1004“范围在Excel 2003“)。 如果运行下面的macros,问题重现:

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会给出“运行时错误”1004“”错误消息。 但是当string长度是8203个字符时,一切正常。

这种情况在我看来很奇怪,因为Ecxel 2007的“单元格可以包含的字符总数”限制(在此处的 “Excel规范和限制”中提到)是32767。

附加信息:

  1. 该问题不会在Excel 2010中重现。
  2. 如果没有使用数组,单元格值设置的问题不会重现。 但在我的情况下,这将大大减慢我的代码。
  3. 最初,我通过使用NetOffice库以C#编写的Excel加载项来处理Excel时,发现了这个问题。

有没有人遇到这个问题? 有没有解决办法? 微软对此案有何评论? 我没有find任何东西。

看来,微软也写了一篇KB文章: MS KB 832136 。

从文章:

原因:满足下列条件之一时可能会发生此问题:

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

解决方法:

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

 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”。