【问题标题】:Sorting two ranges in Excel from VB.NET not working从 VB.NET 对 Excel 中的两个范围进行排序不起作用
【发布时间】:2017-10-01 14:50:47
【问题描述】:

我正在从 VB.NET 创建一个 Excel 工作簿。在每张表中输入两个数据范围。范围是三列宽,行数可变。输入数据后,它会被排序。排序在第一个范围内有效,但在第二个范围内无效 - 它出错了。

错误:COMException 未处理。排序参考无效。确保它在您要排序的数据中,并且第一个排序依据框不是相同的或空白的。

我的代码:

Dim xlApp As New Excel.Application
Dim xlWB As Excel.Workbook
Dim xlSht As Excel.Worksheet
Dim Rng As Excel.Range
Dim Rng2 As Excel.Range
'
Dim dic As Dictionary(Of UInteger, cVM)
Dim irow As UInteger
'
' create a new Excel Workbook instance
xlWB = xlApp.Workbooks.Add
'
' create a worksheet for each group
For Each key In dGroup.Keys 
    '
    ' create worksheet
    xlSht = xlWB.Sheets.Add 
    xlSht.Name = key 
    '
    '
    ' =======================================================
    irow = 4 
    '
    ' output critical data, by Group
    dic = New Dictionary(Of UInteger, cVM)
    dic = dGroup(key).Dat
    For Each lc In dic.Keys
        xlSht.Cells(irow, 1) = lc
        xlSht.Cells(irow, 2) = dic(lc).VM
        xlSht.Cells(irow, 3) = dic(lc).EID
        irow += 1
    Next
    '
    ' sort the output
    Rng = xlSht.Range("A4", "C10000")
    Rng.Select()
    Rng.Sort(Key1:=Rng.Range("B4"), _
             Order1:=Excel.XlSortOrder.xlDescending, _
             Orientation:=XlSortOrientation.xlSortColumns) ' <== THIS WORKS !!!
    '
    '
    '
    ' =======================================================
    irow = 4 
    ' output critical data, by Group
    dic = New Dictionary(Of UInteger, cVM)
    dic = dGroup2(key).Dat
    For Each lc In dic.Keys
        xlSht.Cells(irow, 5) = lc
        xlSht.Cells(irow, 6) = dic(lc).VM
        xlSht.Cells(irow, 7) = dic(lc).EID
        irow += 1
    Next
    '
    ' sort the output
    Rng2 = xlSht.Range("E4", "G10000")
    Rng2.Select()
    Rng2.Sort(Key1:=Rng2.Range("F4"), _
              Order1:=Excel.XlSortOrder.xlDescending, _
              Orientation:=XlSortOrientation.xlSortColumns) ' <== THIS IS WHERE IT ERRS OUT
'
Next key        

第一个范围是从 A4:C10000。 第二个范围是从 E4:G10000。

对第一个范围进行排序可以正常工作。对第二个范围进行排序不起作用。我不明白的是为什么?除了我更改了范围之外,它是相同的代码。我错过了什么?

【问题讨论】:

    标签: excel vb.net sorting


    【解决方案1】:

    试试这个代码:

    Rng2 = xlSht.Range("E4", "G10000")

    Rng2.Sort(Key1:=Rng2.Cells(1,2), _ Order1:=Excel.XlSortOrder.xlDescending, _ Orientation:=XlSortOrientation.xlSortColumns)

    您的代码失败的原因: Rng2.Range("F4") 不是指工作表中的单元格“F4”,而是指 Rng2 中的单元格“F4”。 “F4”不是绝对参考 - 它相对于 Rng2 的左上角(在您的情况下,“F4”指的是绝对单元格“J7”(从单元格“E4”开始,向右偏移 6 列,4列向下)。 您的第一个排序有效,因为它从“A”列开始,并且(意外地)绝对参考和相对参考硬币。

    顺便说一句,不需要“选择”范围,只需使用对象排序方法:range.sort()

    【讨论】:

    • 现在这完全有道理。我没有意识到这是一个相对的参考。感谢您提供有关“选择”的提示。这是来自一些例子,我应该更清楚。
    【解决方案2】:

    Rng2.Range("F4") 实际上是 J7(因为 F4 是相对于 Rng2,而不是相对于父工作表)并且超出了您尝试排序的范围。

    你可能想要

    Key1:=xlSht.Range("F4") 
    

    相反。

    与您的第一个排序类似:您没有收到错误,因为Rng.Range("B4") (B7) 仍在您的排序范围内。

    【讨论】:

    • 我更喜欢这种方法,引用工作表而不是范围。很好的提示。
    猜你喜欢
    • 2015-06-03
    • 2015-12-27
    • 1970-01-01
    • 2013-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    • 2010-12-01
    相关资源
    最近更新 更多