2012-05-28 109 views
4

我已經在這個問題上花了幾個小時,但是我沒有成功找到工作解決方案。Excel VBA:循環遍歷單元格並將值複製到另一個工作簿

這裏是我的問題描述

我想遍歷一定範圍內的一個工作簿細胞和值複製到另一個工作簿。根據第一個工作簿中的當前列,我將這些值複製到第二個工作簿中的另一個工作表中。 當我執行我的代碼時,我總是得到runtime error 439: object does not support this method or property

代碼看起來或多或少是這樣的:

Sub trial() 

Dim Group As Range 
Dim Mat As Range 
Dim CurCell_1 As Range 
Dim CurCell_2 As Range 

Application.ScreenUpdating = False 

Set CurCell_1 = Range("B3") 'starting point in wb 1 

For Each Group in Workbooks("My_WB_1").Worksheets("My_Sheet").Range("B4:P4") 
    Set CurCell_2 = Range("B4") 'starting point in wb 2 
    For Each Mat in Workbooks("My_WB_1").Worksheets("My_Sheet").Range("A5:A29") 
     Set CurCell_1 = Cells(Mat.Row, Group.Column) 'Set current cell in the loop 
     If Not IsEmpty(CurCell_1) 
      Workbooks("My_WB_2").Worksheets(CStr(Group.Value)).CurCell_2.Value = Workbooks("My_WB_1").Worksheets("My_Sheet").CurCell_1.Value 'Here it break with runtime error '438 object does not support this method or property 
      CurCell_2 = CurCell_2.Offset(1,0) 'Move one cell down 
     End If 
    Next 
Next 

Application.ScreenUpdating = True 

End Sub 

我已經做了廣泛的研究,我知道如何,如果你使用顯式的名稱爲您的對象從一個工作簿中的值複製到另一個(表&範圍),但我不知道爲什麼它不工作,就像我使用變量實現它。 我也搜索了stackoverlow和 - 顯然谷歌,但我沒有找到類似的問題,可以回答我的問題。

所以我問題是: 你能告訴我在哪裏,我的代碼錯誤是或者是否有其他使用不同的方式來完成相同的更簡單的方法?

這是我的第一個問題,所以我希望我的代碼格式,問題以及提供的信息都可以。否則,讓我知道。

回答

11

5件事替換...

1)你不需要這行

Set CurCell_1 = Range("B3") 'starting point in wb 1

此行是沒有意義的,你在裏面設置它迴路

2)你在一個循環中,每次

Set CurCell_2 = Range("B4")

爲什麼你會那麼做設置呢?它每次都會簡單地覆蓋這些值。另外哪個表是這個範圍? (見第5點)

3)CurCell_2是一個範圍,正如JohnB指出的那樣,它不是一種方法。

變化

Workbooks("My_WB_2").Worksheets(CStr(Group.Value)).CurCell_2.Value = Workbooks("My_WB_1").Worksheets("My_Sheet").CurCell_1.Value

CurCell_2.Value = CurCell_1.Value

4)您不能只設置一個 「=」 號分配範圍

CurCell_2 = CurCell_2.Offset(1,0)

將其更改爲

Set CurCell_2 = CurCell_2.Offset(1,0)

5)有兩個或多個對象時,這樣有較少的困惑始終指定完整聲明。您的代碼也可以寫成(UNTESTED

Option Explicit 

Sub trial() 
    Dim wb1 As Workbook, wb2 As Workbook 
    Dim ws1 As Worksheet, ws2 As Worksheet 
    Dim Group As Range, Mat As Range 
    Dim CurCell_1 As Range, CurCell_2 As Range 

    Application.ScreenUpdating = False 

    '~~> Change as applicable 
    Set wb1 = Workbooks("My_WB_1") 
    Set wb2 = Workbooks("My_WB_2") 

    Set ws1 = wb1.Sheets("My_Sheet") 
    Set ws2 = wb2.Sheets("Sheet2") '<~~ Change as required 

    For Each Group In ws1.Range("B4:P4") 
     '~~> Why this? 
     Set CurCell_2 = ws2.Range("B4") 
     For Each Mat In ws1.Range("A5:A29") 
      Set CurCell_1 = ws1.Cells(Mat.Row, Group.Column) 
      If Not IsEmpty(CurCell_1) Then 
       CurCell_2.Value = CurCell_1.Value 
       Set CurCell_2 = CurCell_2.Offset(1) 
      End If 
     Next 
    Next 

    Application.ScreenUpdating = True 
End Sub 
+0

非常感謝!你的回答幫了我很多!我根據您的建議更改了代碼,並立即運行! 表達你的觀點** 2)**:其實你是對的,工作表丟失了。如果我理解你是正確的,那麼範圍是指特定的單元格,工作表和工作簿,而不僅僅是單元格。但是因爲我在每個內部循環中使用* Offset *來移動這個範圍,所以我必須在外部循環中重置它。 – Patrick

+0

'如果我理解你是正確的,那麼範圍指的是一個特定的單元格,一個工作表和一個工作簿,而不僅僅是一個單元格。'否:)範圍表示一個單元格,一行,一列或在工作表中包含一個或多個連續的單元格塊的單元格。 –

2
Workbooks("My_WB_2").Worksheets(CStr(Group.Value)).CurCell_2.Value 

這不起作用,因爲CurCell_2不是工作表的一種方法,而是一個變量。通過

Workbooks("My_WB_2").Worksheets(CStr(Group.Value)).Range("B4").Value 
+0

謝謝你的回答!聽起來對我來說非常合乎邏輯。 所以現在我清楚地明白爲什麼會出現錯誤信息。 但是,如果最後的範圍並不總是範圍(「B4」),而是由變量CurCell_2定義的變化範圍,那麼如何編寫代碼? – Patrick

+0

CurCell_2.Value = ...?或者像... Range(aVariableContainingAStringDefiningTheRange).Value = ... – JohnB

相關問題