[[20220829133541]] 『コピー領域と貼付け領域のサイズが違うとエラー』(1年生) ページの最後に飛ぶ

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

 

『コピー領域と貼付け領域のサイズが違うとエラー』(1年生)

複数シートを1シートへまとめる下記コードでエラー「コピー領域と貼付け領域のサイズが違うため、これをここに貼り付けることができません。」となります。どこを修正したら良いでしょう?教えてください。よろしくお願いいたします。

Sub TEST3()

  Dim A
  '3つ目のシートから最終シートまでループ
  For i = 3 To Sheets.Count
    'まとめシートの最終セルを取得
    Set A = Sheets("まとめ").Cells(Rows.Count, "A").End(xlUp)
    With Sheets(i).Range("A1").CurrentRegion
      'データ部分をコピー
      .Range(“6:405”).Copy A.Offset(1, 1)      
    End With
  Next   
End Sub

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


 .Range(“6:405”).Copy A.Offset(1, 0)
 こうしてみたら?

 行全体を2列目から貼り付けようとしているので、1列足りないです
(´・ω・`) 2022/08/29(月) 14:00

下記でどうでしょう。

    With Sheets(i).Range("A1").CurrentRegion
      'データ部分をコピー
      .Rows("6:405").Copy A.Offset(1, 1)      
    End With

あるいは、

    With Sheets(i)
      'データ部分をコピー
      Intersect(.Range("A1").CurrentRegion, .Range("6:405").Copy A.Offset(1, 1)      
    End With
(hatena) 2022/08/29(月) 14:55

A1:C10 にデータがあるシートで、イミディエイトで確認したら下記のようになりました。

 ?Range("A1").CurrentRegion.Range("6:405").Address
 $6:$405

 ?Range("A1").CurrentRegion.Rows("6:405").Address
 $A$6:$C$405

 ?Intersect(Range("A1").CurrentRegion, Range("6:405")).Address
 $A$6:$C$10

Rowsの仕様が意味不明な気がします。
(hatena) 2022/08/29(月) 15:03


 >Rowsの仕様が意味不明
 ドキュメントのとおりなのでは?

 Range.Range プロパティ (Excel)
 https://docs.microsoft.com/ja-jp/office/vba/api/excel.range.range
 >Range オブジェクトに対して使用すると、このプロパティは Range オブジェクト基準にした相対的な範囲を返します。 

 Range.Rows プロパティ (Excel)
 https://docs.microsoft.com/ja-jp/office/vba/api/excel.range.rows
 >指定した範囲の行を表す Range オブジェクトを返します
(´・ω・`) 2022/08/29(月) 15:47

面白そうなので私も実験してみました。
    Sub 実験()
        On Error Resume Next
        '▼Rangeプロパティ
        Debug.Print Range("A1:B2000").Range("6:405").Address
        Debug.Print Range("A1").Range("6:405").Address
        Debug.Print Range("B1").Range("6:405").Address '←エラーになる
        Debug.Print Rows(2).Range("6:405").Address
        Debug.Print ""

        '▼Rowsプロパティ
        Debug.Print Range("A1:B2000").Rows("6:405").Address
        Debug.Print Range("A1").Rows("6:405").Address
        Debug.Print Range("B1").Rows("6:405").Address
        Debug.Print Rows(2).Rows("6:405").Address
        Debug.Print ""

        On Error GoTo 0
    End Sub

普段意識して区別してませんでしたが違いがあるんですね。
ただ、トピ主が提示されているようなケースであれば、私もhatenaさんが提示されているようにIntersectメソッドを使うと思います。
たとえばこんな感じ。

    Sub 研究用()
        Dim i As Long

        Stop

        For i = 3 To Sheets.Count
            With Sheets(i)
                Intersect(.Range("A1").CurrentRegion.EntireColumn, .Rows("6:405")).Copy _
                Sheets("まとめ").Cells(Rows.Count, "A").End(xlUp).Offset(1, 1)
            End With
        Next i
    End Sub

(もこな2) 2022/08/29(月) 18:26


 ?Range("A1:C10").Range("6:405").Address
 $6:$405

 ?Range("A2:C11").Range("6:405").Address
 $7:$406

 ?Range("B1:D10").Range("6:405").Address
 エラーになる

 前のRangeの左上を基準とした相対範囲になる。
 前のRangeより広い範囲を指定すると、横方向にも縦方向にも元の範囲をはみ出す。

 ?Range("A1:C10").Rows("6:405").Address
 $A$6:$C$405

 ?Range("A2:C11").Rows("6:405").Address
 $A$7:$C$406

 ?Range("B1:D10").Rows("6:405").Address
 $B$6:$D$405

 前のRangeの左上を基準とした行範囲になる。
 横方向にははみ出さないが、縦方向にははみだす。

 ?Intersect(Range("A1:C10"),Rows("6:405")).Address
 $A$6:$C$10

 ?Intersect(Range("A2:C11"), Rows("6:405")).Address
 $A$6:$C$11

 ?Intersect(Range("B1:D10"),Rows("6:405")).Address
 $B$6:$D$10

 2つの範囲の重なった部分を返す。
 つまり、横方向にも縦方向にもはみ出さない。

 質問のコピーする場合は、CurrentRegionをはみ出す部分も含めてコピーするのは無意味、
 あるいは想定外のものまでコピーする可能性があるので、
 Intersect を使うのがいいと思います。

(hatena) 2022/08/29(月) 20:12


コピー領域と貼付け領域のサイズが違うため、これをここに貼り付けることができません。

貼り付け先は左上に当たる1セルだけしていてやれば良いので、
サイズウンヌンと出るとは思えないが、
単にセル結合してないかね?
(メンツ) 2022/08/29(月) 21:13


 >貼り付け先は左上に当たる1セルだけしていてやれば良いので、

 質問のコードでは、 貼り付け先の指定は1セルにしてます。

 $6:$405というような行全体を2列目以降に貼り付けようとすると、
 シートの最大列を超えた範囲になるので、
「コピー領域と貼付け領域のサイズが違う」
 というエラーになります。

 確認用コード
 Range("$6:$405").Copy Range("B1")

(hatena) 2022/08/29(月) 21:23


あ。消そうと思ったらすでに返信が・・。
上のやつとり下げ
(メンツ) 2022/08/29(月) 21:27

コメント返信:

[ 一覧(最新更新順) ]


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