当programmaticaly(VBA,C#)将数组字符串设置为范围

时间:2015-06-05 08:12:53

标签: excel vba excel-vba excel-2007 excel-addins

我在Excel 2007中遇到了一个问题,它与Microsoft支持here描述的Excel 2003的已知问题非常相似(“当您以编程方式时,可能会收到”运行时错误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在将数组值分配给范围时给出“运行时错误'1004'”错误消息。但是当字符串长度为8203个字符时,一切正常。

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

其他信息:

  1. 问题无法在Excel 2010中重现。
  2. 如果在不使用数组的情况下逐个单元格设置值,则问题不会重现。但在我的情况下,它会大大减慢我的代码。
  3. 最初我注意到使用Excel使用NetOffice库用C#编写的Excel加载项来处理问题。
  4. 有没有人遇到过这个问题?它有什么变通方法吗?微软对此案有何评论? 我没找到任何东西。

2 个答案:

答案 0 :(得分:3)

似乎微软也写了一篇关于此的知识库文章: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

答案 1 :(得分:1)

相同的限制适用于Excel 2010和Excel 2013.在Excel 2016中几乎没有限制,但只存储了前32767个字符而没有产生任何错误,其余的被丢弃。声明为String的数组就是这种情况。当将数组声明为Variant时,限制下降到8192,实际&#34;公式大小限制&#34;。