我正在写一个宏来进行复杂的复制/粘贴练习。这在概念上非常简单,但我被困在一个地方。所有各种数据块都使用各种命名范围进行标识。我需要遍历这个名称列表,将每个名称作为参数传递给一个函数(实际上是一个子程序,但同样的想法)。数据源位于一个工作簿中,而目标位于另一个工作簿中。
这就是我所拥有的(仅用于一个数据块):
Private Sub copyABU()
copyPaste(ThisWorkbook.Names("myRange1").RefersToRange)
copyPaste(ThisWorkbook.Names("myRange2").RefersToRange)
copyPaste(ThisWorkbook.Names("myRange3").RefersToRange)
//etc
End Sub
Private Sub copyPaste(thisRange As Range)
Windows(someworkbook).Range(thisRange).Copy
Range(thisRange).PasteSpecial Paste:=xlPasteValues
End Sub
不幸的是,我遇到了运行时错误。我认为存在类型不匹配,但我不确定这一点,也无法弄清楚我错过了什么。有人能看出为什么这会失败吗? (我正在使用Excel 2010)。
谢谢!
答案 0 :(得分:1)
这里我的回答:
Sub init()
Windows("Book1.xlsx").Activate
Call copyPaste(2, Range(Cells(1, 1), Cells(10, 10)), "copy")
Windows("Book2.xlsx").Activate
Call copyPaste(1, Range(Cells(1, 1), Cells(10, 10)), "paste")
End Sub
Function copyPaste(wksInt As Integer, thisRange As Range, copyPasteStr As String)
Dim workSheetRange As Range
With Worksheets(wksInt)
Set workSheetRange = thisRange
End With
workSheetRange.Select
If copyPasteStr = "copy" Then
Selection.Copy
Else
Worksheets(wksInt).Paste
End If
End Function
只要复制和粘贴的范围是相同的尺寸,这就可以工作。如果尺寸变化,则需要将workSheetRange.Select更改为条件,并仅选择粘贴范围的第一个单元格。 PAX
答案 1 :(得分:1)
您的代码可以进行一些小调整。
首先,您需要使用单词Call
为copyPaste添加前缀。 (如果您不想,请参阅下面的注释。)
Private Sub copyABU()
Call copyPaste(ThisWorkbook.Names("myRange1").RefersToRange)
Call copyPaste(ThisWorkbook.Names("myRange2").RefersToRange)
Call copyPaste(ThisWorkbook.Names("myRange3").RefersToRange)
' //etc
End Sub
其次,在.Address
之后添加thisRange
。
Private Sub copyPaste(thisRange As Range)
Range(thisRange.Address).Copy
thisRange.PasteSpecial Paste:=xlPasteValues
End Sub
我不想打扰创建someworkbook
变量,所以我只是删除了那部分。
注意:如果要调用括在括号中的参数列表的过程,则必须使用Call
关键字。 https://stackoverflow.com/a/7715070/138938
如果您不想使用Call
关键字,请省略parens:
copyPaste ThisWorkbook.Names("myRange1").RefersToRange