2012-05-23 106 views
2

我正在編寫一個宏來執行復雜的複製/粘貼練習。從概念上講,這很簡單,但我陷入了一個地方。所有不同的數據塊都用不同的命名範圍來標識。我需要迭代這個名字列表,將每個名字作爲參數傳遞給一個函數(實際上是一個子例程,但是同樣的想法)。數據源位於一個工作簿中,而目標位於另一個工作簿中。Excel VBA:傳遞範圍名稱作爲函數參數

這裏是我有什麼(只是一個數據塊):

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

謝謝!

回答

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

+0

感謝。我忽略了兩件事:首先,我只有一個源文件和一個目標文件,因此工作簿的名稱很簡單。其次,範圍名稱在兩個文件中都是相同的。所以需要傳遞給函數的唯一參數就是我在那個特定時刻處理的範圍名稱。如果我能做到這一點,其餘的應該很容易。即使你的建議,我仍然有同樣的問題,即我所做的只是一個「Hello World」消息框中,我不能讓參數傳遞到被調用函數。 – Alex

+0

我想我明白了。我沒有嘗試將範圍作爲對象傳遞,而是將範圍的名稱作爲字符串傳遞,然後從此處繼續。似乎工作得很好。謝謝您的幫助!我很感激。 – Alex

+0

也許你已經在上面看到了我的更新代碼,所以如果這對你有幫助,你可以關閉該案例。 THX PS:如果還有關於使用不同範圍的問題,請告訴我! – systrue

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 

其次,加.AddressthisRange

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 
相關問題