将范围作为函数传递(参数)

时间:2017-02-19 05:12:54

标签: excel vba excel-vba

我正在尝试将范围作为参数传递给函数,以便我可以选择并清除它。

但是,我一直在获取Application defined / object defined错误。

如果我在clearData方法中执行此操作,我只需range("m3").select代替range(test).select即可。

我做错了什么?

Sub CopyData()
    Call ClearData("Detailed Report", Sheets("Detailed Report").range("M3"))
    Sheets("Raw Data").Select
    range("A2").Select
    range(Selection, Selection.End(xlToRight)).Select
    range(Selection, Selection.End(xlDown)).Select
    Selection.Copy
    Sheets("Detailed Report").Select
    range("M3").Select
    ActiveSheet.Paste
End Sub

Sub ClearData(sheetName As String, range As range)
    Sheets(sheetName).Select
    Dim deletrange As range
    Set deletrange = range
    range(deletrange).Select
    deletrange(Selection, Selection.End(xlToRight)).Select
    deletrange(Selection, Selection.End(xlDown)).Select
    Selection.ClearContents
End Sub

2 个答案:

答案 0 :(得分:1)

尽量不要使用range之类的名称定义变量,因为Range是Excel保存的单词。

此外,不需要SelectSelection,而是使用完全合格的范围和工作表。

注意:请注意,使用End(xlDown)End(xlToRight)获取最后一行和列并不是最安全的方法。如果要将连续范围与“M3”一起使用,请使用Range("M3").CurrentRegion

如果您想获得整个工作表的范围,包括中间的空行和列,请使用:

要使用最后一行:

Sheets("Detailed Report").Cells(Sheets("Detailed Report").Rows.Count, "M").End(xlUp).Row

要使用Last列:

Sheets("Detailed Report").Cells(3, Sheets("Detailed Report").Columns.Count).End(xlToLeft).columnn

代码

Sub CopyData()    
    ClearData "Detailed Report", Sheets("Detailed Report").Range("M3")        
    ' Copy >> Paste in 1 line (without Selecting)
    Sheets("Raw Data").Range("A2").Resize(Sheets("Raw Data").Range("A2").End(xlDown).Row, Sheets("Raw Data").Range("A2").End(xlToRight).Column).Copy _
    Sheets("Detailed Report").Range("M3")          
End Sub

'=====================================================================

Sub ClearData(sheetName As String, Rng As Range)
    ' the code line below uses your original method, less recommended
    Rng.Resize(Rng.End(xlDown).Row, Rng.End(xlToRight).Column).ClearContents        

    ' better of using the code line below:
    Rng.CurrentRegion.ClearContents

End Sub

答案 1 :(得分:0)

传递纸张是过度的,你只能通过范围。

如果您要传递工作表,请将其作为对象传递,而不是工作表名称。

CurrentRegion也足以满足您的需求

Sub Better()
Dim rng1 As range
On Error Resume Next
Set rng1 = Sheets("Detailed Report").[m3]
On Error GoTo 0
If Not rng1 Is Nothing Then Call ClearData(rng1)
End Sub

清除代码

Sub ClearData(rng1 As range)
rng1.CurrentRegion.ClearContents
End Sub