Excel VBA对范围进行排序

时间:2015-03-30 18:57:14

标签: excel vba excel-vba

我编写了一个宏,打开包含新数据的CSV文件,复制内容(减去标题行),然后将其粘贴到主工作簿中。现在我需要它来按照A列中的样本编号对整个数据集(主表中的所有数据)进行排序。我尝试了两种不同的方法:

Set rData = ThisWorkbook.Sheets("Data").Range("A1")
Set rData = Range(rData, rData.End(xlDown).Offset(0, 4))
rData.Sort Key1:=Range("A:A"), Order1:=xlAscending, Header:=xlYes  'Debug points here

此方法返回运行时错误1004:"排序参考无效。"

Set rData = ThisWorkbook.Sheets("Data").Range("A1")
Set rData = Range(rData, rData.End(xlDown).Offset(0, 4))
ThisWorkbook.Sheets("Data").Sort.SortFields.Clear    'Debug points here
ThisWorkbook.Sheets("Data").Sort.SortFields.Add Key:=Range( _
    "A:A"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
    xlSortNormal
With ThisWorkbook.Sheets("Data").Sort
    .SetRange Range(rData)
    .Header = xlYes
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
End With

此方法返回运行时错误9:"下标超出范围。"

2 个答案:

答案 0 :(得分:1)

在SO上也有类似的问题,答案可能会对您有所帮助 '1004': “The sort reference is not valid.”
Excel VBA Run-Time Error 1004

据我所知,错误在于:Key1:=Range("A:A")可能会将其更改为Key1:=Range("A1")并确保添加工作簿或/和工作表引用。

答案 1 :(得分:0)

我相信它就在这里:

Set rData = Range(rData, rData.End(xlDown).Offset(0, 4))

试试这个:

Set rData = Range(cells(1,1), cells(4,rData.End(xlDown).Offset(0, 4)))

*注意,我经常混淆.cells()中的行/列顺序,因此如果您的范围不正确,则必须更换它们。

在任何一种情况下,

Set rData = ThisWorkbook.Sheets("Data").Range("A1")
Set rData = Range(rData, rData.End(xlDown).Offset(0, 4))

是多余的,最多需要:

Set rData = Range("a1", rData.End(xlDown).Offset(0, 4))

根据评论更新:

我认为问题在于您如何指定要排序的范围。文档说您可以对任何范围进行排序,包括整个工作表。也可以对整张表进行排序,因为这是你得到的唯一数据,对吗?

set rdata = thisworkbook.sheets("Data")
rdata.sort (Key1:=rdata.range("A:A"), Order1:=xlAscending, Header:=xlYes)