[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『マクロで結合セルのコピー&ペースト』(通りすがり)
お世話になります。
現在、コンボボックスをクリックすると、シート(入力)の結合されたセルをシート(売上明細書)へコピーするため、下記の様なマクロを使用しておりますが、良く見る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
その他、このコードだと数秒ではありますが、処理に時間がかかっているので
処理を高速化できるのであれば行いたく存じます。
その他、希望としては入力シートで文字を入力しているところのみコピー&ペーストをしたい
というのがまだできませんので、ご教授頂ければと思います。
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
また、通りすがりは使用されている方がいらっしゃるとのことでしたので、
大変恐縮ですが同じ名前を使用してしまい大変申し訳ございませんでした。
次回からは解明の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.