我正在尝试使用条件格式规则从 1 个工作表复制范围,并使用确切格式粘贴到另一个工作簿中,但删除条件规则。 我将 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
答案 0 :(得分:1)
ByRef argument type mismatch in Excel VBA 可能有助于比我更清楚地解释这个错误。
它的基本要点是:
ByVal
而不是 ByRef
。ByRef
,请确保明确声明您的语句,而不是使用默认数据类型 (Variant
) 进行声明,这样您将传递 Range
,其中 {{1 }} 是预期的。This answer on my question on CodeReview 还涉及传递参数 Range
与 ByVal
相对。
如果您不返回值,则不需要包含括号 ByRef
- 您可以在 Using parentheses in code(VBA) 上阅读。
对您的问题行的以下编辑将在没有 ( )
错误的情况下执行:
Object Required
当对 PasteFormattedRange rgFrom, rgTo
、Sub
或任何其他 Function
或 Method
使用括号时,您需要将所有参数封装在括号内,而不仅仅是一个 如果确实需要括号。
如果要赋值,则需要括号,如下所示:
Property
如果您没有赋值,则不包括括号,如下所示:
Sub Foo()
x = MyFunction(Argument1, Argument2)
End Sub