运行时错误' 424'所需对象

时间:2015-05-21 21:14:35

标签: excel excel-vba excel-2013 vba

我在活动工作簿的工作表BA8中的单元格BN10中有一系列数据,并且包括"HR Eval Report"

我希望根据单元格BC8:BC10中的值按升序对此范围进行排序。以下是导致问题的代码部分:

Dim rngOutData As Range
...
ActiveWorkbook.Worksheets("HR Eval Report").Range("BA8").Select
Set rngOutData = ActiveWorkbook.Worksheets("HR Eval Report").Range(Selection, _
Selection.End(xlToRight)).Select

Set rngOutData语句抛出错误。我已经尝试完全限定范围,因为类似的424问题答案表明作为解决方案,但它没有解决问题。任何建议都非常感谢。

3 个答案:

答案 0 :(得分:1)

您需要声明对象并使用它。避免使用选择。您可能希望看到This

以下是一种在BC8

上按升序排序范围的简单方法
Dim rngOutData As Range
Dim ws As Worksheet

Set ws = ThisWorkbook.Sheets("HR Eval Report")

Set rngOutData = ws.Range("BA8:BN10")

With rngOutData
    .Sort Key1:=ws.Range("BC8"), Order1:=xlAscending, Header:=xlYes, _
    OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
    DataOption1:=xlSortNormal
End With

注意:如果您的数据没有标题,请按照以下评论中的@Jeeped正确建议将Header:=xlYes更改为Header:=xlNo

答案 1 :(得分:0)

您的代码抛出错误的原因是您尝试将Range.Select返回值分配给对象变量。但是,Select方法不返回对象,它返回True(如果已成功选择范围)。

有两种方法可以准确地实现代码尝试的操作:选择范围,然后将选择分配给对象变量:

ActiveWorkbook.Worksheets("HR Eval Report").Range("BA8").Select
ActiveWorkbook.Worksheets("HR Eval Report").Range(Selection, _
    Selection.End(xlToRight)).Select
Set rngOutData = Selection

或将范围分配给变量,然后选择:

ActiveWorkbook.Worksheets("HR Eval Report").Range("BA8").Select
Set rngOutData = ActiveWorkbook.Worksheets("HR Eval Report").Range(Selection, _
    Selection.End(xlToRight))
rngOutData.Select

然而,几乎可以肯定有更好的方法来实现排序细胞的总体目标,通常应该避免使用Selectsee this question for more)。例如,要将相同的范围转换为rngOutData,以下内容更快,更强大且更易于阅读:

With ActiveWorkbook.Worksheets("HR Eval Report")
    Set rngOutData = .Range(.Range("BA8"), .Range("BA8").End(xlToRight))
End With

类似的事情适用于ActiveWorkbook - 通常最好有一个包含对工作簿的引用的变量并使用它。

答案 2 :(得分:-1)

试试这个,只需按照'如果你......步骤

Sub order()

Sheets("HR Eval Report").Select
Range("BC8").Select
ActiveWorkbook.Worksheets("HR Eval Report").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("HR Eval Report").Sort.SortFields.Add Key:=Range("BC8"), _
    SortOn:=xlSortOnValues, order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("HR Eval Report").Sort
    .SetRange Range("BA8:BN10")
    .Header = xlNo ' IF YOU HAVE TITLE ON THE COLUMN THEN SET .Header x1Yes
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
End With

End Sub