2013-02-28 118 views
1

有人可以提示我可能在这里做错了吗?目前,我正在有效地尝试使用Ctrl-A命令对vba中的数据块执行全选操作。然后我希望将该选择保存为一个范围,以便稍后使用它。设置选择范围

Dim rngAdData As Range 
..... 
Range("A1").Select 
Range(Selection, Selection.End(xlToRight)).Select 
Range(Selection, Selection.End(xlDown)).Select 

Set rngAdData = Selection 
Range(rngAdData).AdvancedFilter Action:=xlFilterInPla.... //<---- 

最后一行给了我一个run-time error '1004': Method 'Range' of object 'Global' failed

当我做下面的方式,它的工作原理

Range("A1").Select 
Range(Selection, Selection.End(xlToRight)).Select 
Range(Selection, Selection.End(xlDown)).AdvancedFilter Action:=xlFilterInPla.... 

但是做这种方式很麻烦,因为我需要再次使用范围这里

With ActiveWorkbook.Worksheets("....").Sort 
    .SetRange Range(Selection) //<--- 

被指出的那一行给了我同样的错误。

回答

1

Range(rngAdData)被馈送至的范围内。只需使用rngAdData.AdvancedFilter

这对您的第二个问题是一样的想法。改用此语法。

With ActiveWorkbook.Worksheets("....").Sort 
    .SetRange Selection 

虽这么说,你应该使用让您的所需范围以外的其他使用SelectSelection语句的另一种手段。像这样的东西应该更好地工作

Dim rngAdData As Range 
Dim sht As Worksheet, bottomMostRow As Long, rightMostColumn As Long 
Set sht = ActiveSheet 
With sht 
    bottomMostRow = .Cells(1, 1).End(xlDown).Row 
    rightMostColumn = .Cells(1, 1).End(xlToRight).Column 
    Set rngAdData = .Range(.Cells(1, 1), .Cells(bottomMostRow, rightMostColumn)) 
End With 
+0

你为我敞开了大门,非常感谢。自从我上一个vba项目以来已经有一段时间了。只是一个小问题,是'.Select'语句不好? – mango 2013-02-28 16:55:28

+2

@mango他们很慢,不可靠。你明智地在代码中明确表达你想要的内容,而不是依赖于光标位置的变化。您的代码不会受到某人在执行过程中单击鼠标并将所有内容搞乱的影响。它也会导致屏幕变化太慢。 – Brad 2013-02-28 17:52:45

1

尝试以下代码:

Sub sample() 
    Dim rng As Range 
    Range("A1").Select 
    Set rng = Range("A1").CurrentRegion 
    rng.AdvancedFilter xlFilterInPlace, Sheets("sheet1").Range("E7:H8"), False 
End Sub 
+0

非常感谢您的帮助。虽然我收到了编译错误。说的参数不是可选的:'rngAdData.AdvancedFilter' – mango 2013-02-28 16:50:26

+0

你想filer与任何标准? – 2013-02-28 16:51:15

+0

是的,我很抱歉省略:'rngAdData.AdvancedFilter操作:= xlFilterInPlace,CriteriaRange:=表格(“...”)。Range(“E7:H8”),Unique:= False' – mango 2013-02-28 16:52:20