[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『一週間分のデータをコピーするマクロについて』(素人)
朝からすみません。ご質問させていただきます。
B5:G29を一組(25行)として、以下31組あります。31組というのは一か月の日付分です。
勿論、月によって日付は変動するので、B列は空欄になる場合があります。
B列は25行ごとにセルを結合させています。
1日〜7日分のデータ入力して、それ以下(同じ曜日)にその7日分のデータをコピー(値のみ貼り付け)するマクロを組めたらと思っています。
B列の日付はあらかじめ入ってるものとして、C:Gをコピーしたいというもので。
その際、日付が空欄のところにはコピーしません。あくまで、日付があるところにコピーします。
例えば、4月ですと30日までなので、最後の31組目は日付は空欄なので、コピーしないということになります。
よろしくお願いします。
< 使用 Excel:Excel2019、使用 OS:Windows10 >
(わからん) 2022/05/04(水) 07:18
全体的には、簡単なことと思います。
(わからん) 2022/05/04(水) 08:22
空白がどうか判断するまでもなく、月の日数は決まっているので・・
Sub Macro1() Dim dys As Long
dys = Day(Application.EoMonth(Range("B5"), 0)) Range("C5:G29").Copy Range("C30:G30").Resize(25 * (dys - 1)).PasteSpecial Paste:=xlPasteValues End Sub
(半平太) 2022/05/04(水) 08:35
曜日ごとに内容が違うものとして、こんなことですか?
Sub test() Dim lastRow As Long, m As Long, n As Long
'28日までのコピー Cells(5, "C").Resize(7 * 25, 5).Copy Cells(5 + 7 * 25, "C").Resize(3 * 7 * 25, 5).PasteSpecial Paste:=xlPasteValues
'29日から月末までのコピー lastRow = Cells(Rows.Count, "B").End(xlUp).Row m = (lastRow - 5) / 25 + 1 '月の最終日 n = m - 28 '29からの日数 Cells(5, "C").Resize(n * 25, 5).Copy Cells(5 + 28 * 25, "C").Resize(n * 25, 5).PasteSpecial Paste:=xlPasteValues End Sub (γ) 2022/05/04(水) 08:40
γ様、有難うございます。
ご返事が今になってしまい、すみません。
早速、γ様のマクロを設定してみましたところ、日付を4月にして実行しましたところ、日付が空白である31組目の枠にも貼り付けされてしまいました。日付が空白の箇所には貼り付けしないようにできるでしょうか?
どうぞよろしくお願いします。
(素人) 2022/05/04(水) 16:46
点線の解除は、
Application.CutCopyMode = False
とすればよいでしょう。
ところで、1日から7日の既に入っているデータは、曜日にかかわらず同じ内容なんですか?
(γ) 2022/05/04(水) 17:05
31日のところにも計算式が入っているのでは?
→はい、日数を計算する関数を入れています。以下の通りです。
→B755=IF(MONTH($B$5)=MONTH($B$680+3), $B$680+3, "")
半平太さんのコードを参考にして最終日を求めたらどうですか?
→はい、やってみます。
点線の解除は、Application.CutCopyMode = Falseとすればよいでしょう。
→γ様、半平太様のマクロに追加したところ、点線解除できました!
ところで、1日から7日の既に入っているデータは、曜日にかかわらず同じ内容なんですか?
→いいえ、曜日によって異なりますし、25行すべてにデータが入るとは限りません。空き行はかなりあります。
γ様、もう一つ教えてください。
実行後、29日〜空白(31日)までが範囲選択された状態で終了するのですが、これを範囲選択されずに、先頭行のままで終了させたいのです。
(素人) 2022/05/04(水) 17:21
コードを提示しないといけない義務は当方にはありません。
(γ) 2022/05/04(水) 17:49
ずぶの素人は、マクロの事など知らん。
(嘘八百) 2022/05/04(水) 17:52
29日〜空白(31日)の範囲選択は、以下の追加で解除できました。いかがでしょうか?
ただ、理想としては、実行直前の位置に戻したいのがあります。これだと、決まった場所に必ず戻るということですよね。
あとは、空白部分にコピーしないようにするだけです。
Sub test()
Dim lastRow As Long, m As Long, n As Long '28日までのコピー Cells(5, "C").Resize(7 * 25, 5).Copy Cells(5 + 7 * 25, "C").Resize(3 * 7 * 25, 5).PasteSpecial Paste:=xlPasteValues '29日から月末までのコピー lastRow = Cells(Rows.Count, "B").End(xlUp).Row m = (lastRow - 5) / 25 + 1 '月の最終日 n = m - 28 '29からの日数 Cells(5, "C").Resize(n * 25, 5).Copy Cells(5 + 28 * 25, "C").Resize(n * 25, 5).PasteSpecial Paste:=xlPasteValues Application.CutCopyMode = False Range("C5").Select End Sub
γさん、外出先からありがとうございます。そして、ごめんなさい。
(素人) 2022/05/04(水) 18:58
Sub test()
Dim lastRow As Long, m As Long, n As Long '28日までのコピー Cells(5, "C").Resize(7 * 25, 5).Copy Cells(5 + 7 * 25, "C").Resize(3 * 7 * 25, 5).PasteSpecial Paste:=xlPasteValues '29日から月末までのコピー lastRow = Cells(Rows.Count, "B").End(xlUp).Row m = (lastRow - 5) / 25 + 1 '月の最終日 n = m - 28 '29からの日数 Cells(5, "C").Resize(n * 25, 5).Copy Cells(5 + 28 * 25, "C").Resize(25 * (dys - 1)).PasteSpecial Paste:=xlPasteValues Application.CutCopyMode = False Range("C5").Select End Sub (素人) 2022/05/05(木) 20:19
lastRow = Cells(Rows.Count, "B").End(xlUp).Row m = (lastRow - 5) / 25 + 1 '月の最終日 で変数mにその月の最終日を求めたのですが、 それを消して、半平太さんの dys = Day(Application.EoMonth(Range("B5"), 0)) の式をそのままmを計算するのに使えばいいんじゃないですか?
半平太さんのコードを意味を理解していますか? ワークシート関数EOMONTHを使っているのですから、 それを調べたらどうですか? (γ) 2022/05/05(木) 20:38
Sub test()
Dim lastRow As Long, m As Long, n As Long '28日までのコピー Cells(5, "C").Resize(7 * 25, 5).Copy Cells(5 + 7 * 25, "C").Resize(3 * 7 * 25, 5).PasteSpecial Paste:=xlPasteValues '29日から月末までのコピー lastRow = Cells(Rows.Count, "B").End(xlUp).Row m = Day(Application.EoMonth(Range("B5"), 0)) '月の最終日 n = m - 28 '29からの日数 Cells(5, "C").Resize(n * 25, 5).Copy Cells(5 + 28 * 25, "C").Resize(n * 25, 5).PasteSpecial Paste:=xlPasteValues Application.CutCopyMode = False Range("C5").Select End Sub (素人) 2022/05/06(金) 07:24
Sub test() Dim m As Long, n As Long Dim r As Range
Application.ScreenUpdating = False Set r = ActiveCell 'セルの位置を記憶
'(今の処理をここに書く)
Application.CutCopyMode = False r.Select 'セルの位置を復旧 Application.ScreenUpdating = True End Sub とすればいいですよ。
Application.ScreenUpdating = False としておけば、画面更新は抑止されます。 そのうえで、処理スタート時点の現在位置を記憶し、 処理後にそれを戻せばいいでしょう。
ちなみに、lastRowはお蔵入りですから消したほうがいいでしょう。 (γ) 2022/05/06(金) 07:57
Sub Test() r = 5 Do While Cells(r + 25 * 7, "B") <> "" Range(Cells(r + 25 * 7, "C"), Cells(r + 25 * 8 - 1, "G")).Value = Range(Cells(r, "C"), Cells(r + 25 - 1, "G")).Value r = r + 25 Loop End Sub
(わからん) 2022/05/06(金) 08:20
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.