传递范围作为函数(参数)
我想通过一个范围作为参数在一个函数,以便我可以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保存的单词。
而且,不需要Select
和Selection
,而是使用完全限定的范围和工作表。
注意 :请记住,使用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