从VB.NET Excel中sorting两个范围不起作用

我正在从VB.NET创build一个Excel工作簿。 两个范围的数据input到每张表。 范围是三列宽可变数量的行。 数据input后,它被分类。 sorting工作在第一个范围,但不是第二个 – 它错误了。

错误:COMException未处理。 sorting参考无效。 确保它位于要sorting的数据中,并且第一个“sorting方式”框不相同或为空。

我的代码:

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。

sorting第一范围工作正常。 sorting第二个范围不起作用。 我不明白的是为什么? 这是相同的代码,除了我改变了范围。 我错过了什么?

试试这个代码:

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的左上angular(在你的情况下,“F4”是指绝对单元格“J7”(从单元格“E4”,偏移6列向右,4第一种sorting是因为它从列“A”开始的,并且(意外)是绝对参考和相对参考硬币。

顺便说一句,没有必要“select”范围,只需使用对象sorting方法:range.sort()

Rng2.Range("F4")实际上是J7(因为F4是相对于Rng2,而不是父级工作表)并且在你想要sorting的范围之外。

你可能想要

 Key1:=xlSht.Range("F4") 

代替。

类似于你的第一类:你没有得到一个错误,因为Rng.Range("B4") (B7)仍然在你的sorting范围内。