无法在VBA中为复制粘贴模板宏定义正确的对象

时间:2014-05-09 13:58:42

标签: excel vba excel-vba

我正在尝试创建一个宏,该宏复制一系列具有文本设置模板的单元格,并将该模板粘贴到一个工作簿中不同工作表上的另一个单元格范围内。

这就是我所拥有的:

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和编程的新手,所以我非常感谢你的帮助!

谢谢!

3 个答案:

答案 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变量。