具有Range类问题的Sort方法的宏

时间:2018-03-12 08:31:18

标签: excel vba excel-vba sorting

我对下面的宏有一点问题 - 我使用数据表单来添加或删除记录。当我添加一条记录时,它可以工作,但当我删除一条记录时它不起作用 - 出现错误:

  

“错误1004 - 范围类的排序方法失败”

    Dim sourceSheet As Worksheet
    Set sourceSheet = ActiveSheet

    Application.ScreenUpdating = False
    SHEETS("STUDS").Visible = True
    SHEETS("STUDS").Select
    ActiveSheet.ShowDataForm
    Columns("A:H").Select
    Range("A1:H5").Sort Key1:=Range("A1"), Order1:=xlAscending, Header:= _
        xlGuess, OrderCustom:=1, MatchCase:=False, 
        Orientation:=xlTopToBottom, _
        DataOption1:=xlSortNormal
    Range("A1").Select
    SHEETS("STUDS").Visible = xlVeryHidden
    Call sourceSheet.Activate

有人可以帮忙吗?

这是一个突出显示的问题:

Range("A1:G11").Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlYes, _
        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
        DataOption1:=xlSortNormal

每次添加或删除记录时,范围都会更改,但宏代码保持不变(A1:G11) - 它不会随范围而改变

我尝试了新的和修改过的代码,但它不起作用

    Dim sourceSheet As Worksheet
        Set sourceSheet = ActiveSheet

    Application.ScreenUpdating = False
    With Worksheets("STUDS")
        .Visible = True
        .ShowDataForm

        Dim LastRow As Long
        LastRow = .Cells(.Cells.Rows.Count, "A").End(xlUp).Row 'find last used row in column A

        .Range("A1:H" & LastRow).Sort Key1:=Range("A1"), Order1:=xlAscending, 
        Header:=xlYes, _
        OrderCustom:=1, MatchCase:=False, _
        Orientation:=xlTopToBottom, _
        DataOption1:=xlSortNormal
        .Range("A1").Select 'only needed if you want to jump to the top
        .Visible = xlVeryHidden
    End With
    Application.ScreenUpdating = True

End Sub

错误msge是:

  

排序参考无效。确保它在您要排序的数据中,并且第一个按框排序不一样或空白

(第一个排序依据框不相同或为空) 请帮助:)

1 个答案:

答案 0 :(得分:0)

这是一种避免使用.Select并查找最后使用的行来动态更改范围的方法。

Dim sourceSheet As Worksheet
Set sourceSheet = ActiveSheet

Application.ScreenUpdating = False
With Worksheets("STUDS")
    .Visible = True
    .ShowDataForm

    Dim LastRow As Long
    LastRow = .Cells(.Cells.Rows.Count, "A").End(xlUp).Row 'find last used row in column A

    .Range("A1:H" & LastRow).Sort Key1:=.Range("A1"), Order1:=xlAscending, Header:= _
        xlGuess, OrderCustom:=1, MatchCase:=False, _
        Orientation:=xlTopToBottom, _
        DataOption1:=xlSortNormal
    .Range("A1").Select 'only needed if you want to jump to the top
    .Visible = xlVeryHidden
End With
sourceSheet.Activate 'call is deprecated and not needed
Application.ScreenUpdating = True 'Don't forget to reactivate updating!

请注意,我使用了With声明。这意味着以点开头的所有内容都是指With语句中指定的工作表:

With Worksheets("STUDS")
    .Visible = True
    .Range("A1").Select
End With

相同
Worksheets("STUDS").Visible = True
Worksheets("STUDS").Range("A1").Select

您应始终指定范围在哪个工作表中。如果您不这样做,VBA会假定ActiveSheet是有意的。

另一种方法是为工作表定义变量

Dim ws as Worksheet
Set ws = ThisWorkbook.Worksheets("STUDS")

ws.Visible = True
ws.Range("A1").Select

请记住,如果没有指定范围是哪个工作表,请不要使用Range