4

私はすでにこの問題に何時間も費やしましたが、有効な解決策を見つけることができませんでした。

ここに私の問題の説明があります:

あるワークブックの特定の範囲のセルをループして、値を別のワークブックにコピーしたいと考えています。最初のブックの現在の列に応じて、2 番目のブックの別のシートに値をコピーします。コードを実行すると、常に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 と - 明らかに - Google でも検索しましたが、私の質問に答えるような同様の問題は見つかりませんでした。

私の質問は次のとおりです。私のコードのどこにエラーがあるのか​​、または別の方法で同じことを達成するための別の簡単な方法があるかどうか教えていただけますか?

これはここでの最初の質問です。コードの形式、質問、提供された情報に問題がないことを願っています。そうでなければ私に知らせてください。

4

2 に答える 2

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)混乱を少なくするために、2つ以上のオブジェクトを操作するときは、常に完全な宣言を指定してください。コードは次のように書くこともできます

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
于 2012-05-28T11:24:20.843 に答える
2
Workbooks("My_WB_2").Worksheets(CStr(Group.Value)).CurCell_2.Value

CurCell_2 は Worksheet のメソッドではなく変数であるため、これは機能しません。で置き換えます

Workbooks("My_WB_2").Worksheets(CStr(Group.Value)).Range("B4").Value
于 2012-05-28T09:24:16.017 に答える