以编程方式(VBA,C#)将数组字符串设置为范围时,奇怪的单元格中字符数限制
Posted
技术标签:
【中文标题】以编程方式(VBA,C#)将数组字符串设置为范围时,奇怪的单元格中字符数限制【英文标题】:Strange number-of-character-in-a-cell limitation when programmaticaly (VBA, C#) set array string to a range 【发布时间】:2015-06-05 08:12:52 【问题描述】:我在 Excel 2007 中遇到了一个问题,它与 Microsoft 支持here 描述的 Excel 2003 的已知问题非常相似(“当您以编程方式设置大数组字符串到 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。
附加信息:
-
此问题在 Excel 2010 中不会重现。
如果在不使用数组的情况下逐个单元格地设置值,则该问题不会重现。但就我而言,它会大大减慢我的代码速度。
最初,我通过使用 NetOffice 库用 C# 编写的 Excel 加载项使用 Excel 时注意到了这个问题。
有人遇到过这个问题吗?有什么解决方法吗?微软有没有关于这个案子的cmets? 我什么都没找到。
【问题讨论】:
【参考方案1】:微软似乎也写了一篇关于此的知识库文章: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
【讨论】:
请在您的回答中提供该链接中的相关信息,因为网络链接可能会随着时间的推移而变化,从而使您的回答在未来变得毫无用处。 对不起,汤姆,新来的。希望我通过提供 MS KB 中的相关部分来改进我的答案。 答案是正确的,但上面的链接已经失效。这是截至 2017 年 3 月的更新***.com/questions/30661564/… @Josh 感谢您的提醒,我已经更新了指向新 URL 的链接。【参考方案2】:相同的限制适用于 Excel 2010 和 Excel 2013。在 Excel 2016 中几乎没有限制,尽管仅存储前 32767 个字符而不会产生任何错误,其余的将被丢弃。声明为 String 的数组就是这种情况。当将数组声明为 Variant 时,限制会下降到 8192,即实际的“公式大小限制”。
【讨论】:
实际上,Excel 2010 及更高版本中的限制似乎只有在单元格中的第一个字符是“@”字符时才存在,例如ActiveCell.Value = "@" & VBA.String$(8192, "#")
。对于任何其他初始字符,Excel 最多接受 32767 个字符。
我必须更正我的陈述。 Excel 2010+ 中应用了 32767 个字符的“软”限制。这样的限制不会触发错误并优雅地丢弃任何多余的字符。 仅当单元格中的第一个字符是“@”字符(如ActiveCell.Value = "@" & VBA.String$(8192, "#")
)时,才存在 8192 个字符的限制。 “@”符号是过去 Excel 模仿 Lotus 时遗留下来的。它等于“=”符号,在公式栏中使用时被 Excel 主动替换。 8192 是公式大小限制(见上文)。以上是关于以编程方式(VBA,C#)将数组字符串设置为范围时,奇怪的单元格中字符数限制的主要内容,如果未能解决你的问题,请参考以下文章
以编程方式从 Word 2007 文档中提取宏 (VBA) 代码