3

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

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

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

谢谢!

4

2 回答 2

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更改为条件,并且只选择范围的第一个单元格进行粘贴。帕克斯

于 2012-05-24T00:07:56.927 回答
1

您的代码将进行一些小的调整。

首先,您需要在对 copyPaste 的调用前加上单词Call. (如果您不想这样做,请参阅下面的注释。)

Private Sub copyABU()
   Call copyPaste(ThisWorkbook.Names("myRange1").RefersToRange)
   Call copyPaste(ThisWorkbook.Names("myRange2").RefersToRange)
   Call copyPaste(ThisWorkbook.Names("myRange3").RefersToRange)
   ' //etc
End Sub

其次,添加一个.Addressafter 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关键字,请省略括号:

copyPaste ThisWorkbook.Names("myRange1").RefersToRange
于 2012-05-24T01:35:06.683 回答