我正在尝试创建一个宏,该宏复制一系列具有文本设置模板的单元格,并将该模板粘贴到一个工作簿中不同工作表上的另一个单元格范围内。
这就是我所拥有的:
Option Explicit
Dim ClinObTemplate As Variant
ClinObTemplate = Sheets("clin obs").Range("A397, [D429]")
Dim NewTemplate As Variant
NewTemplate = Sheets("clin obs 2").Range("A430, [D462]")
Sub ClinOb_Copy_Paste()
ClinObTemplate.Select
Selection.Copy
NewTemplate.Select
Selection.Paste
End Sub
我应该将这些变量定义为String吗?我一直收到运行时错误424:对象必需,但我似乎无法定义我的对象。
我是VBA和编程的新手,所以我非常感谢你的帮助!
谢谢!
答案 0 :(得分:2)
您应该将它们定义为Excel内置的Range类型。您还应该在子例程中定义它们,除非您需要跨多个子函数或函数。您还应该阅读:Avoiding using select。
稍微清理一下代码后,这就是我提出来的。
Sub ClinOb_Copy_Paste()
Dim ClinObTemplate As Range
ClinObTemplate = Sheets("clin obs").Range("A397, [D429]")
Dim NewTemplate As Range
Set NewTemplate = Sheets("clin obs 2").Range("A430, [D462]")
ClinObTemplate.Copy NewTemplate
End Sub
我希望这有帮助!
答案 1 :(得分:1)
试试这个:
Option Explicit
Sub ClinOb_Copy_Paste2()
Dim ClinObRange As Range, NewObRange As Range
Dim ClinObsSheet1 As Worksheet, ClinObsSheet2 As Worksheet
'set references up-front
Set ClinObsSheet1 = ThisWorkbook.Worksheets("clin obs")
Set ClinObsSheet2 = ThisWorkbook.Worksheets("clin obs 2")
With ClinObsSheet1
Set ClinObRange = .Range("A397:D429")
End With
With ClinObsSheet2
Set NewObRange = .Range("A430:D462")
End With
'do work
ClinObRange.Copy NewObRange
End Sub
答案 2 :(得分:1)
您的代码失败有几个原因。
如果要使用对象,可以使用Set
将它们分配给变量。即使您将变量声明为Variant
类型,如果您使用Set
,它仍然有效。但是,始终建议明确声明要使用的变量类型。为什么呢?
所以这会奏效:
Dim ClinObTemplate As Variant
Set ClinObTemplate = Sheets("clin obs").Range("A397,D429")
但当然,Dan发布的内容是明智的
现在,正如您所看到的那样,我构建Range Object
语法的方式有所不同。
我们来看看您的代码:
Dim ClinObTemplate As Variant
ClinObTemplate = Sheets("clin obs").Range("A397, [D429]")
上面会产生Error 1004
如果您已注意到,我会删除[]
地址上的D429
括号。
为什么?
因为[]
在VBA
中具有特殊含义。
它是Evaluate
的捷径
[D429]
实际上正在评估地址D429
并实际返回Range Object
。
因此,为了使代码与括号[]
一起使用,它应该是这样的:
Dim ClinObTemplate As Variant
Set ClinObTemplate = Sheets("clin obs").Range("A397," & [D429].Address)
现在,您的ClinOnTemplate
变量包含Range Object
A397和D429
但是,如果您想在A397:D429这些边界之间选择整个范围,请编写如下代码:
Dim ClinObTemplate As Variant
Set ClinObTemplate = Sheets("clin obs").Range("A397", [D429])
或者这个:
Dim ClinObTemplate As Variant
Set ClinObTemplate = Sheets("clin obs").Range("A397:" & [D429].Address)
甚至这个:
Dim ClinObTemplate As Variant
Set ClinObTemplate = Sheets("clin obs").Range([A397], [D429])
所有代码都会将Range Object A397:D429
分配给ClinObTemplate
变量。