以编程方式(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#)将数组字符串设置为范围时,奇怪的单元格中字符数限制的主要内容,如果未能解决你的问题,请参考以下文章

当我使用相对范围时,VBA会自动将我的范围转换为绝对值

如何使用 VBA 以编程方式添加引用

以编程方式从 Word 2007 文档中提取宏 (VBA) 代码

Excel VBA:将变体数组返回到选定范围时需要 255 转置字符限制的解决方法

以编程方式设置微调器的选定项

以编程方式访问 VBA 设置字体/大小不起作用