Excel VBA:将范围名称作为函数参数传递

时间:2012-05-23 23:46:22

标签: excel-vba vba excel

我正在写一个宏来进行复杂的复制/粘贴练习。这在概念上非常简单,但我被困在一个地方。所有各种数据块都使用各种命名范围进行标识。我需要遍历这个名称列表,将每个名称作为参数传递给一个函数(实际上是一个子程序,但同样的想法)。数据源位于一个工作簿中,而目标位于另一个工作簿中。

这就是我所拥有的(仅用于一个数据块):

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)。

谢谢!

2 个答案:

答案 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