以编程方式(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。
附加信息:
- 问题在 Excel 2010 年没有重现。
- 如果不使用数组逐个单元格地设置值,则问题不会重现。但就我而言,它会大大降低我的代码速度。
- 最初我在使用 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".
我 运行 遇到了 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。
附加信息:
- 问题在 Excel 2010 年没有重现。
- 如果不使用数组逐个单元格地设置值,则问题不会重现。但就我而言,它会大大降低我的代码速度。
- 最初我在使用 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".