2015-04-23 121 views
1

此代碼的想法是從名爲「My list.xlsx」的工作簿啓動它,並在我的列表的工作表「FX」上創建一個列表;此列表將基於另一個已打開的工作簿(稱爲「Daily prices.xlsm」)的電子表格。使用不同工作簿的參考

當我嘗試玩耍時,它似乎不喜歡我在其他工作簿上引用列表來複制它的方式。這裏是我的代碼:

Sub forEachWs() 
    Dim ws As Worksheet, dest As Worksheet 
    Dim LastRow As Long 
    Dim LastRowDestination As Long 
    Dim ExRateWb As Workbook 
    Dim DailyPrices As Workbook 

    Set ExRateWb = ActiveWorkbook 
    Set DailyPrices = Workbooks("Daily prices.xlsm") 
    Set dest = Worksheets("FX") 

    For Each ws In DailyPrices.Worksheets 
     Select Case ws.Name 
      Case "FX", "BBG prices", "PRICES" 

      Case Else 

       MsgBox DailyPrices.Name 

       LastRow = ws.UsedRange.Rows.Count 
       LastRowDestination = dest.UsedRange.Rows.Count + 2 

       DailyPrices.ws.Range(Cells(1, 1), Cells(LastRow, 5)).Copy 
       ExRateWb.dest.Cells(LastRowDestination, 1).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, _ 
            SkipBlanks:=False, Transpose:=False 

     End Select 
    Next 
End Sub 
+1

它在哪一行標記錯誤? – kaybee99

回答

0

由於kaybee99 mentioned,你不完全指明問題的發生,但我確實看到了錯誤了幾個潛在的領域,我會注意的違規線以上:

Sub forEachWs() 
    Dim ws As Worksheet, dest As Worksheet 
    Dim LastRow As Long 
    Dim LastRowDestination As Long 
    Dim ExRateWb As Workbook 
    Dim DailyPrices As Workbook 

假設是這將指向此代碼所在的工作簿。然而,沒有的,這保證仍是如此,因爲其他的代碼(在你的OP未顯示)可能使用<workbook>.Select這會改變什麼ActiveWorkbook

Set ExRateWb = ActiveWorkbook 

使用這種方法來設置你的「工作簿」變量要好得多,因爲無論工作簿目前處於活動狀態,它都能保證準確 - 這是分配變量的首選方法。

Set DailyPrices = Workbooks("Daily prices.xlsm") 

您的工作被認爲是在ActiveWorkbook,再次,不能保證目前無論是活動的工作簿將有FX工作。建議改變這Set Dest = ExRateWb.Worksheets("FX")Set Dest = DailyPrices.WorkSheets("FX")適當

Set dest = Worksheets("FX") 

    For Each ws In DailyPrices.Worksheets 
     Select Case ws.Name 
      Case "FX", "BBG prices", "PRICES" 

我建議把至少一個評論在這裏承認你是有意這樣做沒有爲這三個工作表。有助於防止下一次你(或其他人)是通過您的代碼&想知道發生了什麼意外刪除的關注...

  Case Else 
       MsgBox DailyPrices.Name 
       LastRow = ws.UsedRange.Rows.Count 
       LastRowDestination = dest.UsedRange.Rows.Count + 2 

DailyPrices是包含您在已經引用工作表集合的工作簿變量你的For Each...聲明創建了你當前所在的循環。再次引用它將是無效的。 ws是對DailyPrices工作簿中當前(在此循環中)工作表中的引用。除去下面

   DailyPrices.ws.Range(Cells(1, 1), Cells(LastRow, 5)).Copy 

到上述意見類似的DailyPrices.參考,Dest已經被定義爲工作表屬於特定的工作簿,所以ExRateWb限定符是不必要的,並且,事實上,無效。去掉它。

   ExRateWb.dest.Cells(LastRowDestination, 1).PasteSpecial _ 
          Paste:=xlPasteValues, Operation:=xlNone, _ 
          SkipBlanks:=False, Transpose:=False 

     End Select 
    Next 
End Sub 

如果這些更改不能解決問題,請詳細說明您在哪裏得到錯誤,以及錯誤是什麼。

相關問題