Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从VB.NET对Excel中的两个区域排序不起作用_Excel_Vb.net_Sorting - Fatal编程技术网

从VB.NET对Excel中的两个区域排序不起作用

从VB.NET对Excel中的两个区域排序不起作用,excel,vb.net,sorting,Excel,Vb.net,Sorting,我正在从VB.NET创建Excel工作簿。每个工作表中输入两个数据范围。范围为三列宽,行数可变。输入数据后,将对其进行排序。排序在第一个范围内有效,但在第二个范围内无效-错误已出 错误:COMException未处理。排序引用无效。确保它位于要排序的数据中,并且第一个“排序依据”框不相同或不为空 我的代码: Dim xlApp As New Excel.Application Dim xlWB As Excel.Workbook Dim xlSht As Excel.Worksheet Dim

我正在从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        
Dim xlApp作为新的Excel.Application
将xlWB设置为Excel.工作簿
将xlSht设置为Excel.工作表
尺寸为Excel.Range
将Rng2设置为Excel.Range
'
Dim dic作为字典(属于UInteger,cVM)
黯淡的irow作为一个整体
'
'创建新的Excel工作簿实例
xlWB=xlApp.Workbooks.Add
'
'为每个组创建一个工作表
对于dGroup.Keys中的每个键
'
'创建工作表
xlSht=xlWB.Sheets.Add
xlSht.Name=key
'
'
' =======================================================
irow=4
'
'按组输出关键数据
dic=新词典(由UInteger、cVM编制)
dic=dGroup(键).Dat
对于dic.键中的每个lc
xlSht.单元格(irow,1)=lc
xlSht.Cells(irow,2)=dic(lc).VM
xlSht细胞(irow,3)=dic(lc).EID
irow+=1
下一个
'
'对输出进行排序
Rng=xlSht.范围(“A4”、“C10000”)
Rng.Select()
Rng.Sort(键1:=Rng.Range(“B4”)_
Order1:=Excel.XlSortOrder.xlDescending_
方向:=XlSortOrientation.xlSortColumns)
Rng2。范围(“F4”)
实际上是J7(因为F4是相对于Rng2的,而不是相对于父工作表),并且超出了您尝试排序的范围

你可能想要

Key1:=xlSht.Range("F4") 
相反

与您的第一次排序类似:您没有在那里得到错误,因为
Rng.Range(“B4”)
(B7)仍然在您的排序范围内。

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

你可能想要

Key1:=xlSht.Range("F4") 
相反

与第一次排序类似:由于
Rng.Range(“B4”)
(B7)仍在您的排序范围内,因此没有出现错误。

请尝试以下代码:

Rng2=xlSht.范围(“E4”、“G10000”)

Rng2.Sort(键1:=Rng2.Cells(1,2)_
Order1:=Excel.XlSortOrder.xlDescending_
方向:=XlSortOrientation.xlSortColumns)

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

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

尝试以下代码:

Rng2=xlSht.范围(“E4”、“G10000”)

Rng2.Sort(键1:=Rng2.Cells(1,2)_
Order1:=Excel.XlSortOrder.xlDescending_
方向:=XlSortOrientation.xlSortColumns)

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


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

现在这完全有意义了。我没有意识到这是一个相对参考。感谢您提供有关“选择”的提示.这是从某个例子中得到的,我应该知道得更清楚。现在这完全有道理了。我不知道这是一个相对的参考。谢谢你关于“选择”的提示。这是从某个例子中得到的,我应该知道得更清楚。我更喜欢这种方法,引用工作表而不是范围。好提示。我更喜欢这种方法,引用工作表而不是范围。好提示。