[[20220403212300]] 『マクロで結合セルのコピー&ペースト』(通りすがり) ページの最後に飛ぶ

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

 

『マクロで結合セルのコピー&ペースト』(通りすがり)

お世話になります。
現在、コンボボックスをクリックすると、シート(入力)の結合されたセルをシート(売上明細書)へコピーするため、下記の様なマクロを使用しておりますが、良く見るfor i 等を使用してきれいにマクロを作成したいと思います。

現在、シート(入力)は44行目までコピーとシート(売上明細書)は37行目までペーストをしたいと思います。下記の通り、一気にコピーペースト出来るわけでなく、コピーするセルが離れていたり、結合されたセルがあったりなかったりしています。

また、今後 行が増加する可能性があるため、現在の行目までではなく、データが入っているところまでコピーとペーストを回したいと考えています。どうかお力添えを頂ければと思います。

Private Sub cmdCopy1_Click()

      Sheets("売上明細書").Range("B8:D8").Value = Sheets("入力").Range("B15:C15").Value
      Sheets("売上明細書").Range("B9:D9").Value = Sheets("入力").Range("B16:C16").Value
・・・
      Sheets("売上明細書").Range("B37:D37").Value = Sheets("入力").Range("B44:C44").Value

      Sheets("売上明細書").Range("E8:F8").Value = Sheets("入力").Range("D15").Value
      Sheets("売上明細書").Range("E9:F9").Value = Sheets("入力").Range("D16").Value
・・・
      Sheets("売上明細書").Range("E37:F37").Value = Sheets("入力").Range("D44").Value

      Sheets("売上明細書").Range("G8").Value = Sheets("入力").Range("E15").Value
      Sheets("売上明細書").Range("G9").Value = Sheets("入力").Range("E16").Value
・・・
      Sheets("売上明細書").Range("G37").Value = Sheets("入力").Range("E44").Value

      Sheets("売上明細書").Range("H8:I8").Value = Sheets("入力").Range("H15").Value
      Sheets("売上明細書").Range("H9:I9").Value = Sheets("入力").Range("H16").Value
・・・
      Sheets("売上明細書").Range("H37:I37").Value = Sheets("入力").Range("H44").Value

End Sub

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


こう

Sheets("売上明細書").Range("B8").Value = Sheets("入力").Range("B15").Value
(左上) 2022/04/03(日) 21:55


左上さん、コメントありがとうございます。
これでも出来るんですね。ありがとうございます。
ただ、このコードですが、1行だけですので、上記の通り、
売上明細シートの8行目から37行目へ入力シートの15行目から44行目までをコピーするマクロが知りたいです。
また、入力シートの行を今後増やすことがあるため、できれば入力シートで入力されているセルまで(今後行を増やしてB50まで項目を追加する可能性があります)コピーを行いたいのですが、こちらも併せてお教えいただけないでしょうか?
どうぞよろしくお願いいたします。
(通りすがり) 2022/04/03(日) 22:56

途中まで調べながら、行いました。
For i で制御しているのですが、改善点を伺いたいです。
先ほどのコードは一部でしたが、こちらは全て記載してあります。

その他、このコードだと数秒ではありますが、処理に時間がかかっているので
処理を高速化できるのであれば行いたく存じます。

その他、希望としては入力シートで文字を入力しているところのみコピー&ペーストをしたい
というのがまだできませんので、ご教授頂ければと思います。

Private Sub cmdCopy1_Click()

Dim i As Long
Dim k As Long
Dim n As Long

k = 8
n = 15

Application.ScreenUpdating = False

      With Sheets("売上明細書")
      .Cells(4, 7).Value = Sheets("入力").Cells(2, 2).Value
      .Cells(5, 7).Value = Sheets("入力").Cells(3, 11).Value
      .Cells(6, 7).Value = Sheets("入力").Cells(3, 3).Value
      .Cells(5, 16).Value = Sheets("入力").Cells(3, 12).Value
      .Cells(6, 16).Value = Sheets("入力").Cells(3, 13).Value
      End With
    For i = 0 To 29
      With Sheets("売上明細書")
      .Cells(k + i, 1).Value = Sheets("入力").Cells(n + i, 1).Value
      .Cells(k + i, 2).Value = Sheets("入力").Cells(n + i, 2).Value
      .Cells(k + i, 5).Value = Sheets("入力").Cells(n + i, 4).Value
      .Cells(k + i, 7).Value = Sheets("入力").Cells(n + i, 5).Value
      .Cells(k + i, 8).Value = Sheets("入力").Cells(n + i, 8).Value
      .Cells(k + i, 10).Value = Sheets("入力").Cells(n + i, 9).Value
      .Cells(k + i, 12).Value = Sheets("入力").Cells(n + i, 11).Value
      .Cells(k + i, 14).Value = Sheets("入力").Cells(n + i, 12).Value
      .Cells(k + i, 16).Value = Sheets("入力").Cells(n + i, 19).Value
      End With
    Next i
Me.Range("取引先名").Select
Application.ScreenUpdating = True

End Sub
(通りすがり) 2022/04/04(月) 00:06


編集がかぶってしまいましたがそのまま。

■1
>良く見るfor i 等
正しくは、「For 〜 Nextステートメント」といいます。

 (変数は"i"じゃなくてもいいです)

■2
既に指摘がありますが、今回のケースは【結合セル】があるので少々厄介なことになっています。
結合セルの場合、結合されている範囲の左上セルだけに値が入っているような状態になっています

■3
>現在、シート(入力)は44行目までコピーとシート(売上明細書)は37行目までペースト
>現在の行目までではなく、データが入っているところまでコピー
いぇ、For 〜 Nextステートメントを使うならば、結局は○行目までという書き方になります。

すなわち

 (1)データの始まり行(列)を取得する’固定ならなおよい
 (2)データの終わり行(列)を取得する
 (3)For 〜 Nextステートメントをつかい、(1)〜(2)までを繰り返し処理する

といった流れで処理することになります。

これを踏まえて、データの始まり行(列)はともかく【データの終わり行(列)】はどこを見ればわかりますか?
(ちょっと、どれがワンセットなのかわかりませんが、データが列方向に並んでたりしませんか?)

■余談
「通りすがり」というニックネームは、回答者で使われている方がいらっしゃるとおもいます

 (既に御承知であれば失礼。)

(もこな2) 2022/04/04(月) 00:17


追加で。

■4(■3の補足)
一応、↓のように条件を満たしたらループ処理を抜ける(ループ処理をやめる)というアプローチも可能ではあります。

    Sub 研究用1()
        Dim データ行 As Long
        Dim dstSH As Worksheet
        Set dstSH = Sheets("売上明細書")

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

        With Sheets("入力")
            '繰り返さない部分
            dstSH.Range("G4").Value = .Range("B2").Value
            dstSH.Range("G5").Value = .Range("K3").Value
            dstSH.Range("G6").Value = .Range("C3").Value
            dstSH.Range("P5").Value = .Range("L3").Value
            dstSH.Range("P6").Value = .Range("M3").Value

            '繰り返し処理
            For データ行 = 15 To 44 Step 1
                If .Cells(出力行, "A").Value = "" Then
                    Exit For
                Else
                    dstSH.Cells(出力行 - 7, "A").Value = .Cells(出力行, "A").Value
                    dstSH.Cells(出力行 - 7, "B").Value = .Cells(出力行, "B").Value
                    dstSH.Cells(出力行 - 7, "E").Value = .Cells(出力行, "D").Value
                    dstSH.Cells(出力行 - 7, "G").Value = .Cells(出力行, "E").Value
                    dstSH.Cells(出力行 - 7, "H").Value = .Cells(出力行, "H").Value
                    dstSH.Cells(出力行 - 7, "J").Value = .Cells(出力行, "I").Value
                    dstSH.Cells(出力行 - 7, "L").Value = .Cells(出力行, "K").Value
                    dstSH.Cells(出力行 - 7, "N").Value = .Cells(出力行, "L").Value
                    dstSH.Cells(出力行 - 7, "P").Value = .Cells(出力行, "S").Value
                End If
            Next データ行
        End With
    End Sub

ただ、例えばA列を見ればどこまでデータが入っているかどうか(最終行が)判断できるといった場合は、そこまで繰り返す処理を書くのが一般的です。

    Sub 研究用2()
        Dim データ行 As Long
        Dim dstSH As Worksheet
        Set dstSH = Sheets("売上明細書")

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

        With Sheets("入力")
            '繰り返さない部分
            dstSH.Range("G4").Value = .Range("B2").Value
            dstSH.Range("G5").Value = .Range("K3").Value
            dstSH.Range("G6").Value = .Range("C3").Value
            dstSH.Range("P5").Value = .Range("L3").Value
            dstSH.Range("P6").Value = .Range("M3").Value

            '繰り返し処理
            For データ行 = 15 To .Cells(.Rows.Count, "A").End(xlUp).Row Step 1
                dstSH.Cells(出力行 - 7, "A").Value = .Cells(出力行, "A").Value
                dstSH.Cells(出力行 - 7, "B").Value = .Cells(出力行, "B").Value
                dstSH.Cells(出力行 - 7, "E").Value = .Cells(出力行, "D").Value
                dstSH.Cells(出力行 - 7, "G").Value = .Cells(出力行, "E").Value
                dstSH.Cells(出力行 - 7, "H").Value = .Cells(出力行, "H").Value
                dstSH.Cells(出力行 - 7, "J").Value = .Cells(出力行, "I").Value
                dstSH.Cells(出力行 - 7, "L").Value = .Cells(出力行, "K").Value
                dstSH.Cells(出力行 - 7, "N").Value = .Cells(出力行, "L").Value
                dstSH.Cells(出力行 - 7, "P").Value = .Cells(出力行, "S").Value
            Next データ行
        End With
    End Sub

(もこな2) 2022/04/04(月) 00:53


↑の「出力行」は「データ行」に読み替えてください。

(もこな2 ) 2022/04/04(月) 08:49


もこな2様
返事頂きありがとうございます。
お礼が遅くなって申し訳ございません。
無事稼働を確認出来ました。
Stop 'ブレークポイントの代わり
はあるとエラーが出るため、削除して使用させていただきました。

また、通りすがりは使用されている方がいらっしゃるとのことでしたので、
大変恐縮ですが同じ名前を使用してしまい大変申し訳ございませんでした。
次回からは解明のETMで投稿させていただきます。

またなにかありましたらどうぞよろしくお願いいたします。
(ETM) 2022/04/04(月) 18:57


>エラーが出るため、削除して使用させていただきました。
意図して【ブレークポイント】を設定したものであり、エラーではありません。
こちらとしては、完成品のプレゼントではなく研究用資料として提示したつもりですので、【ステップ実行】してどれがどのような命令なのかきちんと研究(理解)することをお勧めします。

※ステップ実行という言葉を聞いたことがなければ↓をお読みください。

 【ステップ実行】
https://www.239-programing.com/excel-vba/basic/basic023.html
http://plus1excel.web.fc2.com/learning/l301/t405.html

他にも↓も覚えておいて損はないでしょう。

 【ブレークポイント】
(コード中のコメントをヒントに類似のサイトにたどり着いたかもしれませんが提示しておきます)
https://www.239-programing.com/excel-vba/basic/basic022.html
https://www.tipsfound.com/vba/01010

 【イミディエイトウィンドウ】
https://www.239-programing.com/excel-vba/basic/basic024.html
https://excel-ubara.com/excelvba1/EXCELVBA486.html

 【ローカルウィンドウ】
https://excel-ubara.com/excelvba4/EXCEL266.html
http://excelvba.pc-users.net/fol8/8_2.html

(もこな2 ) 2022/04/04(月) 19:30


コメント返信:

[ 一覧(最新更新順) ]


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