首页 文章

当programmaticaly(VBA,C#)将数组字符串设置为范围时,奇怪的字符数在单元格中的限制

提问于
浏览
1

我在Excel 2007中遇到了一个问题,这与Microsoft支持here("You may receive a "运行时错误1004 " error message when you programmatically set a large array string to a range in 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 specifications and limits" here中提到)的"Total number of characters that a cell can contain"限制是32767 .

附加信息:

  • 问题无法在Excel 2010中重现 .

  • 如果在不使用数组的情况下逐个单元设置值,则问题不会重现 . 但就我而言,它会大大减慢我的代码速度 .

  • 最初我通过使用NetOffice库用C#编写的Excel加载项使用Excel时发现了问题 .

有人遇到过这个问题吗?它有什么变通方法吗?微软对此案有何评论?我没找到任何东西 .

2 回答

  • 3

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

  • 1

    似乎微软也写了一篇关于此的知识库文章:MS KB 832136 .

    来自文章:

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

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

    Workaround:

    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
    

相关问题