我在VBA写一个Excel宏。在我的代码的某一部分,我需要复制和粘贴一个未合并的单元格到一个合并的单元格在一个单独的工作簿。这个过程的一部分是重复的。对我来说,实现这一点的最有效方法是复制单元格,然后将Call
复制到一个单独的Sub
,并将其粘贴到该位置。我已经写了一个版本使用Select
工作:
Sub Macro1()
Workbooks("Book1.xlsm").Worksheets("Sheet1").Activate
ActiveSheet.Range("A1").Copy
Call Macro2
End Sub
Sub Macro2()
Workbooks("Protected_JD_Form.xlsx").Worksheets("Cover Page").Activate
ActiveSheet.Range("E46:G46").Select
Selection.PasteSpecial Paste:=xlPasteFormulasAndNumberFormats, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False
End Sub
但我一直试图远离Select
,这是我想出的代码:
Sub Macro1()
Workbooks("Book1.xlsm").Worksheets("Sheet1").Range("A1").Copy
Call Macro2
End Sub
Sub Macro2()
Workbooks("Protected_JD_Form.xlsx").Worksheets("Cover Page").Range("E46:G46").PasteSpecial xlPasteFormulasAndNumberFormats
End Sub
这段代码在宏2的唯一一行上给了我一个'范围类失败的PasteSpecial方法'。
是否有办法复制单元格的内容,然后Call
一个单独的Sub
与目的地和粘贴方法,而不使用Select
?
编辑:我明白设置值等于彼此比复制/粘贴更简单。然而,在这种情况下,这是不可能的。
我也理解合并单元格的缺陷。我明白了。认真对待。但是我没有选择,因为我正在处理客户的工作簿,不能更改。
编辑#2:在@ExcelHero的评论之后,我重新启动了我的电脑并再次运行宏。它工作。我不知道哪里出了问题。无论如何,感谢@ExcelHero识别出我的代码是正确的。为什么要用第二个宏?
无论如何,如果它是绝对必要的,你将需要稍微编辑你的第二个宏。
Sub Macro1()
Dim copyString As String
copyString = Worksheets("Sheet1").Range("A1").Value
Call Macro2(copyString)
End Sub
你会注意到现在Macro2
被调用,copyString
在它之后。这意味着,您将运行Macro2
,并对设置为copyString
的值执行一些操作。
Sub Macro2(text As String)
'Workbooks("Protected_JD_Form.xlsx").Worksheets("Cover Page").Range("E46:G46").Value = text
Workbooks("Protected_JD_Form.xlsx").Worksheets("Cover Page").Range("E46:G46").Value = text
End Sub
在这个宏中,您将看到我在宏名中添加了(text as String)
。这将获取一些值(来自Macro1
,该值是copyString
变量),然后在宏中使用它。明白了吗?
再次强调,只有在复制/粘贴过程中绝对需要两个宏时,我才会这样做。如果您只能使用一个宏,那么这些宏可以组合成几行简单的代码:
Sub Macro3()
Dim copyString As String
copyString = Worksheets("Sheet1").Range("A1").Value
Workbooks("Protected_JD_Form.xlsx").Worksheets("Cover Page").Range("E46:G46").Value = copyString
End Sub
…或者更进一步,去掉copyString
中间商(如@findwindow所提到的):
Sub macro4()
Workbooks("Protected_JD_Form.xlsx").Worksheets("Cover Page").Range("E46:G46").Value = Worksheets("Sheet1").Range("A1").Value
End Sub
这种格式对我来说很有效-简单地将复制范围定义为范围并将其传递给第一个子单元,然后通过循环迭代将后续单元格声明为粘贴范围,并将该范围传递给粘贴子单元:
Sub copy_paste()
Dim rng As Range
Set rng = Sheets(1).Range("A1")
Call copy_start(rng)
End Sub
Sub copy_start(ByVal copyRange As Range)
Dim rng As Range
copyRange.copy
For i = 1 To 5
Set rng = Sheets(1).Range("B" & i)
Call pasteover(rng)
Next i
Application.CutCopyMode = False
End Sub
Sub pasteover(ByVal pasteRange As Range)
pasteRange.PasteSpecial Paste:=xlPasteFormulasAndNumberFormats, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False
End Sub
由于我在编辑代码时所做的复制/粘贴而导致的错误。由于我正在复制的代码仍在剪贴板上,宏试图将其粘贴到单元格中,从而导致错误。
经验教训:
- 限制在VBA中使用剪贴板
- 当在编码窗口复制/粘贴时,仔细检查以确保您没有影响现有的代码