.net Excel 范围地址限制

.net Excel Range Address limitation

我想在一个 Excel.Range 对象中定义多个区域。目的是通过设置一个范围来为多个不同的区域着色。这应该可以节省使用 Excel 互操作的时间,这在此类操作中非常慢。问题是,当我尝试将 "big" 地址行放入范围时出现错误 (HRESULT: 0x800A03EC)。有人可以告诉我使用 Excel 互操作是否存在限制,有人可以同时/快速地为很多区域着色吗?

示例中的"big"地址行只是为了告诉您问题出在哪里。我知道将 A1:A2 多次放入地址没有多大意义。

Dim objExcelApp As New Excel.Application

objExcelApp.Visible = True

Dim objExcelWorkbooks As Excel.Workbooks = objExcelApp.Workbooks

Dim objExcelWB As Excel.Workbook = objExcelWorkbooks.Add

Dim objExcelWS As Excel.Worksheet = objExcelWB.Worksheets(1)

Dim rng As Excel.Range
rng = objExcelWS.Range("A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2;A1:A2")

造成您问题的最可能原因是您正在尝试从复杂的多区域范围创建值数组。

(编辑:我已经删除了基于 VBA 而非 VB.Net 的额外信息,这与问题无关)。

以下 Whosebug 问答还解决了其他原因和解决方案:HRESULT: 0x800A03EC on Worksheet.range

我发现使用 Union 函数并结合将地址拆分为 255 个字符字符串的方法,可以非常快速地用更多内容填充多区域范围。这个函数很好地完成了这项工作。此代码带有分号,因为它似乎是特定于国家/地区的分隔符(逗号在我的情况下不起作用,也许您可​​以修改它)。感谢@K.Dᴀᴠɪs 的提示:

Private Function CombineAddressToRange(ByVal Address As String, ByVal objExcelWorksheet As Excel.Worksheet, ByVal objExcelApp As Excel.Application) As Excel.Range

        Dim SplitAddress As String()
        Dim TempAddress As String = ""
        Dim FinalRange As Excel.Range

        SplitAddress = Address.Split(";")

        'Initialize Range
        FinalRange = objExcelWorksheet.Range(SplitAddress(0))

        If UBound(SplitAddress) >= 1 Then
            For i = 1 To UBound(SplitAddress)

                If Len(TempAddress) + 1 + Len(SplitAddress(i)) > 255 Then
                    FinalRange = objExcelApp.Union(FinalRange, objExcelWorksheet.Range(TempAddress))
                    TempAddress = SplitAddress(i)
                Else
                    If TempAddress = "" Then
                        TempAddress = SplitAddress(i)
                    Else
                        TempAddress = TempAddress & ";" & SplitAddress(i)
                    End If

                End If

            Next

            If TempAddress <> "" Then
                FinalRange = objExcelApp.Union(FinalRange, objExcelWorksheet.Range(TempAddress))
            End If

        End If

        Return FinalRange

    End Function