[[20220824145415]] 『エクセルVBA 3行目の最終列までの繰り返し処理』(なんなん) ページの最後に飛ぶ

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

 

『エクセルVBA 3行目の最終列までの繰り返し処理』(なんなん)

お世話になります。
シート1にC3セルから複数列(列数に変動あり)データが入っています。
3行目には必ず英数字が入っているので、3行目を確認すると最終列が分かります。
この3行目最終列までの1〜2行目のセルにセルB1:B2をコピーして貼り付ける作業をVBAを使用して行いたいのですが、実行時エラー1004アプリケーション定義またはオブジェクト定義のエラーです。というエラーになります。
色々なサイトを見て学習したつもりでしたが、躓きました。
詳しい方には笑われてしまうと思うのですが、後学のために勉強させてください。
どこを直せば良いのか、あるいは根本から間違っているのか、
ご教示いただければ幸いです。

Sub コピーペースト()

     Dim row As Range  
      Set row = Cells(3, Columns.Count).End(xlToLeft).EntireColumn
      row.Select               

   Do

        Range("B1:B2").Copy
           ActiveSheet.Paste Destination:=Range(Range("C1"), Cells(3,
       Columns.Count).End(xlToLeft)).Offset(-1, 0).Select
           row = row + 1    
        Application.CutCopyMode = False
    Loop Until Cells(3, row).Value = ""    

    Range("A1").Select

End Sub

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


この1行だけでOK
ループする必要ありません。

 Range("B1:B2").Copy Destination:=Range("C1", Cells(3, Columns.Count).End(xlToLeft).Offset(-1, 0))

(マナ) 2022/08/24(水) 15:24


 今回はマナさんの提示の通りなのですが
 後学のために、ということで一応
 関数内でF8を押すとステップ実行ができます。
 その機能を用いて1行づつ実行し、時にはローカルウィンドウ等で変数の中身を見て
 意図している動作になっているかデバッグできるようになれば今後よりステップアップできるかと思います。
(.:*.ゆ ゅ) 2022/08/24(水) 15:28

じゃあぼくも一点だけ
Set row = Cells(3, Columns.Count).End(xlToLeft).EntireColumn
↑Columnを入れる変数にrowって名前をつけるのはマジでやめたほうがいい。
(ufj) 2022/08/24(水) 15:33

みなさんとモロかぶりですが投稿しておきます。

■1
どこでエラーになるのか提示がありませんが、おそらく↓の箇所でしょう。

  ActiveSheet.Paste Destination:=Range(Range("C1"), Cells(3,Columns.Count).End(xlToLeft)).Offset(-1, 0).Select

本来は↓のように書くべきですが

 ○○シート に 貼り付けしなさい 貼り付けるセルは ××

↓のようになっています

 ActiveSheet に 貼り付けしなさい 貼り付けるセルは ××セルを選択しなさい
                                                               ~~~~~~~~~~~~~

すなわち、セルを指定するはずの部分が、セルを選択する命令になってしまっているのがおかしいです。

■2
上記を直したとしてですが

 Dim row As Range

↑なのですから、「row」にはセル(範囲)が格納されることになっています。
しかし、↓のようになっているのは変です。

 row = row + 1

そして、同様の理由から↓も違和感を感じます

 Cells(3, row).Value = ""

■3
>3行目には必ず英数字が入っているので、3行目を確認すると最終列が分かります。
>この3行目最終列までの1〜2行目のセルにセルB1:B2をコピーして貼り付ける作業をVBAを使用して

表のレイアウトが今ひとつピンときませんが、【最終列】は別にして【開始列】はどこからなのですか?
B列ないし、C列から開始とかであれば、ループ処理なんぞせず、1回だけ(フィル)コピーすれば十分なのではありませんか?

■4
ということを踏まえて、例えばB1:B2をコピーして、C列〜3行目の最終列まで(の1〜2行目に)貼り付ける例など。

    Sub さんぷる()
        Dim 最終列 As Long

        Stop 'ブレークポイントの代わり

        With ActiveSheet
            最終列 = .Cells(3, .Columns.Count).End(xlToLeft).Column

            If 最終列 < 3 Then Exit Sub '最終列がC列より前だったら、処理せず終了

            .Range("B1:B2").Copy .Range("C1", .Cells(1, 最終列))
        End With
    End Sub

(もこな2) 2022/08/24(水) 15:49


マナ 様

早速のご教示ありがとうございました。
ループの必要はなかったのですね。
難しく考えすぎていたようです。
おかげさまで思い通りの処理ができました。
次は、この記述を一つずつ復習して覚えて行こうと思います。
本当にありがとうございました!

.:*.ゆ ゅ 様

助言ありがとうございます。
F8機能は分っていませんでした。これから使っていこうと思います。
一つ覚えられたので嬉しいです。
少しずつですが頑張って勉強します。

ufj 様

変数の名前の付け方も理由があるのですね。
勉強になりました。ありがとうございます。

もこな2 様

丁寧に教えて頂けてとても嬉しいです。
何が悪いのか、どうしてダメだったのかがよく解りました。
そもそもの命令がおかしいのですからエラーになって当然ですね。
ご教示頂いた内容を一つずつ勉強させていただきます!
楽しくなってきました。ありがとうございます!

(なんなん) 2022/08/24(水) 16:22


 1 ○△■
 2 ○△      □
 3 ○○○○○…○○○

こんな構文です。

 コピー元,Copy Destination:=貼り付け先
 Range("B1:B2"),Copy Destination:=Range(■,□)

 ■:C1
 □:3行目最終セルの1つ上のセル

(マナ) 2022/08/24(水) 17:35


 参考まで。

[[20220823161455]] 『なぜか先頭が大文字にならない』(ngk)
(MK) 2022/08/24(水) 17:38


皆様

返信いただきありがとうございます。
ゆっくりですがVBAの学習を進めています。
皆様からのアドバイスはとても参考になりました。
また解らない時は質問させていただきます。
その時はよろしくお願いいたします。
(なんなん) 2022/08/30(火) 17:24


コメント返信:

[ 一覧(最新更新順) ]


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