まえきんブログ

*文系出身SEが綴る、日常・趣味・体験談・スキルアップについての雑記ブログ*

【事例で学ぶExcel VBA #2】縦型の簡易版スケジュール表を作成する

f:id:maekinblog:20220227181858j:plain
まえきんです!

このシリーズでは、私が普段実務で手作業の自動化ツールを作成する中で実装している

処理の一部をピックアップし、ブログ掲載用にカスタマイズしたものをご紹介しています。

全て私の実務ベースで使っているものなので、使いこなすことが出来れば、

必ずや手作業の自動化に一役買ってくれる内容ばかりと勝手に自負しています笑 😁

「本だけじゃなくてExcel VBAを実践的に勉強してみたい!」「ハードル高くて苦手だった

けどもう一度VBAを勉強してみたい!」「実務で役に立つVBAを学びたい!」そんな方々の

学習意欲向上の一助になればと思い、このシリーズを投稿しようと思いました。

私自身もこのシリーズの投稿を通じて、新しい知識の習得、習得した知識の棚卸しや

ブラッシュアップをしていきます😊一緒に楽しくスキルアップしていきましょう!!👍✨

👇さて、今回のテーマはコチラ

#2:縦型の簡易版スケジュール表を作成する

Excelでスケジュール表を作成するシーンは私の場合、結構多いです。もちろん、その都度

作成するのも一つの手ですが、やはり毎回フォーマットも含めて一から手作業では時間が

かかってしまい非効率になってしまいます。今回もバシッとマクロを組んで自動化して

しまいましょう!

ツールの全体像

「メニュー」シート(ユーザーフォーム未使用)
f:id:maekinblog:20220305184758p:plain
「原本」シート
f:id:maekinblog:20220305184932p:plain

まずは任意のエクセルシートを開いて、上記のシートを各々作成しておきます。

「メニュー」シートにはマクロ実行用の「シート作成・コピー」ボタンも

配置しておきます。本ツールのVBAコードは以下の通りです。

なお、事例紹介用のツールのため、今回は入力日付の整合性等の

エラーチェックは敢えて外して掲載していますm(_ _)m

VBAコード ※パソコンでの閲覧推奨
Option Explicit

'===================================================
'ツール名:縦型の簡易版スケジュール表作成ツール
    (まえきんブログ掲載用にカスタマイズ)
'作成日:2022/03/05
'処理概要:縦型の簡易版スケジュール表作成
'付属機能:なし
'作成者:まえきん
'===================================================

'===================================================
'定数宣言
'===================================================
Const SheetName1 As String = "メニュー"
Const SheetName2 As String = "原本"

'===================================================
'関数名 :メイン関数(シート作成・コピーボタン)
'処理内容:スケジュールシートの作成・出力
'トリガー:シート作成・コピーボタンを押下した際にコールされる
'引数  :なし
'戻り値 :なし
'===================================================
Private Sub CommandButton1_Click()
    '----------
    '変数宣言
    '----------
    Dim sDate As String '入力年月日
    Dim sLast As String '末日
    Dim sLastDay As Integer  '末日の日のみ
    Dim Day As String  'スケジュール表.日付
    Dim Week As String  'スケジュール表.曜日
    Dim i As Integer  'ループ変数
    
    With Worksheets(SheetName1) 'シート名省略
        '入力年月日セット
        sDate = Format(.Cells(7, 3).Value, "yyyy/m/d")
        '----------
        '月の日数取得
        '----------
        '翌月1日の前日(月の日数)を取得
        sLast = DateSerial(Year(sDate), Month(sDate) + 1, 0)
    
        '月の日数のみを取得
        sLastDay = Format(sLast, "d")
    End With

    With Worksheets(SheetName2) 'シート名省略
        '----------
        'スケジュールタイトルセット
        '----------
        .Cells(1, 1).Value = Format(sDate, "yyyy年m月")
    
        '----------
        'スケジュール表作成
        '----------
        '日付初期化
        Day = 1
        '曜日初期化
        Week = Weekday(sDate)
    
        'スケジュール表出力
        For i = 1 To sLastDay
            '----------
            '日付出力
            '----------
            .Cells(i + 3, 1).Value = Day

            '----------
            '曜日出力
            '----------
            .Cells(i + 3, 2).Value = WeekdayName(Week, True)
            '土曜日("7")の場合
            If Week = "7" Then
                '日曜日("0")リセット
                Week = 0
            End If
        
            '----------
            ' 改行処理
            '----------
            '日付リセット
             Day = Day + 1
         
            '曜日リセット
            Week = Week + 1
        Next i
        
        '----------
        'シート保存
        '----------
        '末尾にコピー
        .Copy After:=Worksheets(Worksheets.Count)
        'シート名をセット
        ActiveSheet.Name = Format(sDate, "yyyymm")
    End With
        
    '----------
    '処理完了通知
    '----------
    '処理完了メッセージを表示
    MsgBox "スケジュール表の作成が完了しました!"
End Sub
VBAコード解説

'----------
'月の日数取得
'----------
まず「メニュー」シートの「年月設定」欄に入力された年月日情報から該当月の「日数」を

取得します。例えば、記事の投稿月である3月を例に見ていきましょう。3月の日数は31日です。

DateSerial関数により翌月1日の前日(月の日数)を取得するようにしています。Format関数で

後続の処理に必要な月数の部分のみを取得し、それを変数「sLastDay」に格納しています。

これについては、後述する「スケジュール表作成」の部分で触れていくことにします。
'----------
'スケジュールタイトルセット
'----------
ここでは、「メニュー」シートの「年月設定」欄に入力された年月日情報を

基にスケジュール表のタイトルを設定します。ここでは「"yyyy年m月"」形式で

表示されるように実装しています。今回の事例でいうと「2022年3月」になります。

ちなみに、このタイトルは「原本」シートのA1セルに出力されるように設定しています。
'----------
'スケジュール表作成
'----------
ここからは、実際にスケジュール表を作成する機能を実装しています。

For文で1行(1日)ずつ日にちとそれに紐づく曜日をカウントアップしていくわけですが、

ここで質問です。何回までループを回せばいいでしょうか。そう、今回の場合は31回です。

通常であれば、数字を直打ちして「For i = 1 To 31」で設定すれば一応実現はできますが、

これでは月の数が「31」の月しか対応が出来ませんVBAのツールとしての汎用性に欠けます。

ここで、序盤の処理(月の日数取得)で仕込んだ変数「sLastDay」の出番になります。

この変数には「メニュー」シートで入力した年月日の内容に応じた月の日数が格納される

ため、ループの終わりを動的に設定できます。ここがミソです!
'----------
'シート保存
'----------
ここでは、「原本」シートを基に作成したスケジュール表を別シートにシート名を付与した

うえでコピーして新しくシート出力する処理を記述しています。ここでは「.Copy After:」の

部分で新規で作成したシートを末尾に出力、「ActiveSheet.Name」の部分でシート名を付与

しています。ここではFormat関数を使用して「"yyyymm"」形式で指定します。ちなみに、

今回の事例でいうと「202203」になります。

ツールの実行手順

①「メニュー」シートの「年月設定」欄に作成したい月をYYYY/MM/DD形式(月初)で入力
 ※冒頭のツールの全体像のイメージ図参照

②「シート作成・コピー」ボタンを押下する

実際にマクロを実行すると以下のような結果になります。

マクロ実行結果

「202203」シートが新規追加
f:id:maekinblog:20220305193437p:plain
処理完了通知
f:id:maekinblog:20220305193528p:plain

上記の通り、結果が得られましたでしょうか😊

今回ご紹介したこのツールもほんの一例でしかないので、カスタマイズして

使いやすくしていくのもVBAスキルアップの一環になるのでよいと思います👍✨

今回はこれで以上です😊

最後まで読んで頂きありがとうございました!ではまた!