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

我想通过一个范围作为参数在一个函数,以便我可以select和清除它。

但是,我不断得到一个应用程序定义/对象定义的错误。

如果我在我的clearData方法中做了这个,我只是做range("m3").select而不是range(test).select range("m3").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 

尽量不要用range名称来定义variables,因为Range是Excel保存的单词。

而且,不需要SelectSelection ,而是使用完全限定的范围和工作表。

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

如果要获取整个图纸的范围(包括中间的空行和列),请使用:

要获得最后一行使用:

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

要获得最后一列使用:

 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 

通过表是过分的,你可以通过范围。

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

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