[[20211124212428]] 『どうしてもセルがコピーできません』(あ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『どうしてもセルがコピーできません』(あ)

シート1のB1〜H21までデータが入っています。
それをシート2のD3:J3の行から1行飛ばしでD43:J43までコピーがしたいのですが・・・

Sub ()

    Dim i As Long
    Dim j As Long

    For i = 1 To 21
        For j = 3 To 43 Step 2
            Sheets("Sheet1").Range(Cells(i, 2), Cells(i, 8)).Value = Sheets("Sheet2").Range(Cells(j, 4), Cells(j, 10)).Value
        Next j
    Next i
End Sub

エラーが出てできませんでした。
Range(Cells(i, 2), Cells(i, 8))←このような指定がダメだと思うのですが…
何がダメか教えてください!
(改善案もいただけたらとても幸いです)

< 使用 Excel:Excel2016、使用 OS:Windows10 >


 Sheets("Sheet1").Range(Cells(i, 2), Cells(i, 8)).Value
                         ↑こちらのCellsたちにもシートの指定が必要です。

 指定がないとActivesheetのセルと解釈されます(*)ので、
 Sheets("Sheet2") が仮にアクティブの場合、
 Sheets("Sheet1").Range(Sheets("Sheet2").Cells(i, 2), Sheets("Sheet2").Cells(i, 8)).Value
 と書いたものと解釈され、Excel君が混乱して立往生するわけです。

 (*) ・標準モジュールに書いた場合です。
     ・シートモジュールに書いた場合は、(選択シートにかかわらず)そのシートが使われます。

 With を使ったり、ワークシート変数を使ったりして、長々しくならないように工夫してください。
 下記を参考にしてください。

 Sub test()
     Dim ws As Worksheet
     Dim i As Long
     Dim j As Long

     Set ws = Worksheets("Sheet1")
     j = 3
     With Worksheets("Sheet2")
         For i = 1 To 21
             .Range(.Cells(j, 4), .Cells(j, 10)).Value = ws.Range(ws.Cells(i, 2), ws.Cells(i, 8)).Value
             j = j + 2
         Next
     End With
 End Sub

(γ) 2021/11/24(水) 21:55


γ様

分かりやすく教えていただき勉強になります。
本当にありがとうございました!
(あ) 2021/11/24(水) 21:58


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.