Excel VBA 質問スレッド No.212 (未解決)

VBA 毎月1行ずつ行が増えていく表を1行ずつ空けて転記する方法について

投稿者 : ゆうか     投稿日時 : 2021/04/08(Thu) 17:51:52     OS : 未指定     EXCEL : 未指定
VBA初心者です。
あるブックの各シートにあるA1からW17までの表示されている行のみの表を、
別ブックの1つのシートにそれぞれ上から順に転記していくマクロを作成しています。

表の行は、1月から12月までの月別も入っていますが、
翌月以降の行は、データが未反映のため非表示にしています。
表の転記は毎週1回やる作業ですが、月が変わるごとに、
各表の次の月の行を追加で再表示にして、表と表の間に1行ずつ間隔をあけて上から順に転記していきたいです。

解決方法についていろいろ調べましたが、未だに解決できず、
どのようなコードなら転記できるのかご教示お願い致します。


*******************************************************
Sub TEST()

'別ブックを追加
Workbooks.Add

'新規ブックに、転記
Set a = ThisWorkbook.Worksheets("A").Range("A1:W17")
Set a = a.SpecialCells(xlCellTypeVisible)
Set b = ActiveWorkbook.Worksheets("Sheet1").Range("A2")
a.Copy b

Set a = ThisWorkbook.Worksheets("B").Range("A1:W17")
Set a = a.SpecialCells(xlCellTypeVisible)
Set b = ActiveWorkbook.Worksheets("Sheet1").Range("A21")
a.Copy b

Set a = ThisWorkbook.Worksheets("C").Range("A1:W17")
Set a = a.SpecialCells(xlCellTypeVisible)
Set b = ActiveWorkbook.Worksheets("Sheet1").Range("A40")
a.Copy b

Set a = ThisWorkbook.Worksheets("D").Range("A1:W17")
Set a = a.SpecialCells(xlCellTypeVisible)
Set b = ActiveWorkbook.Worksheets("Sheet1").Range("A59")
a.Copy b

Set a = ThisWorkbook.Worksheets("E").Range("A1:W17")
Set a = a.SpecialCells(xlCellTypeVisible)
Set b = ActiveWorkbook.Worksheets("Sheet1").Range("A78")
a.Copy b

Cells.Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues

'新規ブックを保存して、閉じる
ActiveWorkbook.SaveAs ThisWorkbook.Path & "\★.xlsx"

End Sub

*******************************************************

[返信 1] Re : VBA 毎月1行ずつ行が増えていく表を1行ずつ空けて転記する方法について
投稿者 : ヘンリー     投稿日時 : 2021/04/08(Thu) 22:18:08
>解決方法についていろいろ調べましたが、未だに解決できず、
とありますが、おそらく、やりたい事のどこが分からないかが、
明確にできていないから、調べても分からないのだと思われます。


【仕様の確認】
>表の行は、1月から12月までの月別も入っていますが、
とありますが、データ行は月の順でソートしてある事とします。

>表の転記は毎週1回やる作業ですが、月が変わるごとに、
>各表の次の月の行を追加で再表示にして、
とありますが、転記元のファイルを開いたときに、
ファイルを開いたシステム日付の月に該当する部分を、
非表示から表示に切り替える事とします。
また、日付が入っている列はA列である事とします。

>表と表の間に1行ずつ間隔をあけて上から順に転記していきたいです。
とありますが、上記コードだと、2行ずつ間隔をあけて転記しているので、
2行ずつ間隔をあける事とします。

この仕様でよければ、Workbook_Openイベントに以下のようなコードを書きます。
【プログラムの作成】
①シートをメモリに保持する。
②シートのシート名が、"A" or "B" or "C " or "D" or "E"であるか判断する。
③②がTrueの時、A列n行目の、月の部分の値だけをメモリに保持する。(例えば、変数:strMonth)
④②がTrueの時、システム日付の月の部分の値だけを、メモリに保持する。(例えば、変数:strSysMonth)
⑤②がTrueの時、②と③が等しいかどうか判断する。
⑥④がTrueの時、その行を表示する
⑦nに1を足す
⑧③~⑦の繰り返し
⑨①~⑧の繰り返し
⑩ゆうか様が作成したプロシージャを呼び出す


①、⑨についてはFor Each~Nextについて調べてみる
②If文 複数条件で調べてみる
③文字列を抜き取るについて調べてみる
④システム日付の取得方法について調べてみる
⑤If文について調べてみる
⑥行の非表示、表示について調べてみる
⑦、⑧For~Next文について調べてみる
⑩プロシージャの呼び出しについて調べてみる

というようなステップを踏んでいきます。

コンピュータは、おバカさんなので、
○○の場合は△△
××をする
□□をする
と、1つずつ細かく指令を出さなければなりません。

例えば、1枚の板を渡して、「これを2つに切ってきて」と命令をすると、
人間の場合は、切った後の2つの板を持って帰ってくると思いますが、
コンピュータは、板を切る事しかしません。
切ったことを報告しにも来ないし、切った板を持って帰ってくることもしません。

切断する機会のところへ行け
この板を2枚に切れ
切った2枚の板を持って帰ってこい
2枚の板を私に戻しなさい

と、こんな感じで細かく分けて命令をしてあげなければなりません。

プログラムの①~⑩の部分で、分からないことがあったら、
また質問をしてみてください。

当掲示板について
返信入力フォーム
お 名 前  :
内  容   :
ステータス  : この質問を解決済みにする

認証コード  :
        キャプチャ画像


( 処理日時 : 2021-04-21 08:54:05 )

Page
Top