Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.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
Vba 具有范围类问题排序方法的宏_Vba_Excel_Sorting - Fatal编程技术网

Vba 具有范围类问题排序方法的宏

Vba 具有范围类问题排序方法的宏,vba,excel,sorting,Vba,Excel,Sorting,我对下面的宏有点问题-我使用数据表单添加或删除记录。当我添加一条记录时,它工作,但当我删除一条记录时,它不工作-出现错误: “错误1004-范围类的排序方法失败” 有人能帮忙吗 这是一个突出的问题: Range("A1:G11").Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlYes, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _

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

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

有人能帮忙吗

这是一个突出的问题:

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为:

排序引用无效。确保它位于要排序的数据内,并且第一个“排序依据”框不相同或不为空

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

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

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 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

请记住,在未指定范围在哪个工作表中的情况下,不要使用范围。

您可能应该知道数据块是否有标题。不要依赖xlGuess。您可能希望阅读并遵循以下步骤:加快代码速度,降低代码易出错的风险。谢谢您的指导-它成功了。还有一件事。。。每次删除记录时,范围都会发生变化,但覆盖旧范围的宏代码保持不变。你也能帮我修一下吗?谢谢你,佩赫。。。到目前为止看起来不错。。如前所述,删除记录时范围会发生变化。如何使宏变得如此灵活,以至于在添加或删除记录时实际范围会发生变化…实际上它不再工作。。。当我删除一条记录时效果很好,但当我删除另一条记录时,同样的错误出现了。我发现问题在于删除记录时范围会发生变化,但宏不会随之变化。谢谢你,PEH。。我明白了。。现在,当我使用您的代码并添加或删除一条记录时,我得到的是msge:“排序引用无效。请确保它位于要排序的数据内,并且第一个排序依据框不相同或不为空。”。(不一样,也不是空白)。。我将更新我的帖子并向您显示代码……如果您的数据有标题,您键入的可能是
Key1:=.Range(“A2”)
,而不是
A1
?并确保在范围之前有一个
,否则它不会引用
with
语句中的工作表!我只能坚持“No
Range()
而不引用范围在哪个工作表中”如果这没有改变任何东西,您能提供一个导致错误的示例数据集吗?我无法复制它。此外,当我添加新记录时,它位于列表之外(超出范围),并且我仍然得到msge:Sort方法或range类失败-然后我必须扩展列表,以便能够再次测试…再次出错。。请帮忙好的-谢谢你。。。我会尝试根据你的建议进行更改,然后,如果没有成功,我会给你发送数据表,以便你可以复制。。。谢谢你,佩霍姆。。。是的,它的工作原理和简单的工作表一样。。。多好的解决方案…哈。。。我完全疯了。。我知道,不太推荐在excel 2003中工作,但我必须这样做,因为我正在开发某种计算器/估计器,并且它必须在所有excel版本中工作。。。从2003年开始。非常感谢你,佩赫,我真的很感谢你的帮助。再一次,你绝对是一个能解决任何问题的人。非常感谢。
Dim ws as Worksheet
Set ws = ThisWorkbook.Worksheets("STUDS")

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