将2个范围变量传递给Sub-Object必需/ByRef参数类型不匹配错误



我正试图从一个具有条件格式规则的工作表中复制区域,并使用完全格式但删除条件规则粘贴到另一个工作簿中。我将2个范围对象传递给我的子对象,当调用宏时,我会得到错误。请帮帮我。

Sub Create() 
Dim rgFrom, rgTo As Range
oldBook = ActiveWorkbook.Name
Workbooks.Add
Set rgFrom = Workbooks("Daily Flow Template.xlsm").Worksheets("DailyFlow").Range("A1:BZ110")
Set rgTo = ActiveWorkbook.Worksheets("Sheet1").Range("A1:BZ110")
PasteFormattedRange (rgFrom), rgTo   ----- Error Object Required
End Sub
Sub PasteFormattedRange(ByRef rgFrom As Range, ByRef rgTo As Range)
Dim S                     As String
Dim rgStart As Range
Dim i As Long, CF_Format  As Long
Dim SaveDisplayAlerts As Boolean, SaveScreenUpdating As Boolean
Dim HTMLInClipBoard       As Boolean
Dim Handle As Long, Ptr As Long, FileName As String
Set rgStart = Selection
rgFrom.Copy
'Enumerate the clipboard formats
If OpenClipboard(0) Then
CF_Format = EnumClipboardFormats(0&)
Do While CF_Format <> 0
S = String(255, vbNullChar)
i = GetClipboardFormatName(CF_Format, S, 255)
S = Left(S, i)
HTMLInClipBoard = InStr(1, S, "HTML Format", vbTextCompare) > 0
If HTMLInClipBoard Then
Application.CutCopyMode = False
Application.Goto rgTo
ActiveSheet.PasteSpecial Format:="HTML"
Application.Goto rgStart
Exit Do
End If
CF_Format = EnumClipboardFormats(CF_Format)
Loop
CloseClipboard
End If
End Sub

ByRef参数类型不匹配

这个答案来自";Excel VBA中的ByRef参数类型不匹配";可能有助于比我更清楚地解释这个错误。

它的基本要点是:

  • 除非需要,否则传递参数ByVal而不是ByRef
  • 如果您使用ByRef,请确保显式声明您的语句,而不是使用默认数据类型(Variant(进行delcare,这样您将传递一个Range,其中需要Range

我在CodeReview上的问题的这个答案还涉及传递与ByRef相反的参数ByVal


需要对象(错误424(

如果不返回值,则不需要包含圆括号( )-您可以在"在代码中使用圆括号"(VBA(中阅读有关内容。

以下对问题行的编辑将在没有Object Required错误的情况下执行:

PasteFormattedRange rgFrom, rgTo

当为SubFunction或任何其他MethodProperty使用圆括号时,如果实际需要圆括号,则需要将所有参数封装在圆括号内,而不是仅封装一个

如果你要赋值,你需要括号,比如:

Sub Foo()
x = MyFunction(Argument1, Argument2)
End Sub

如果你没有赋值,你就不包括括号,比如:

Sub Foo()
MySub Argument1, Argument2
End Sub

最新更新