説明1-5 VBAでの年月の判定
操作
次の操作をしましょう。
1).[開始日]ボタンをクリックすると、[シリアル値:43374][開始日:2018/10/1]が表示される。([開始年月]は変更可)
2).[終了日]ボタンをクリックすると、[シリアル値:43281][終了日:2018/6/30]が表示される。([終了年月]は変更可)
3).[開始日と終了日の比較]ボタンをクリックすると、次のダイアログボックスに判定結果が表示される。
プロシージャ「説明用151_開始日」の内容
[開始日]ボタンのプロシージャを表示しましょう。
- Sub 説明用151_開始日()
- Dim wkYear As Long
- Dim wkMonth As Long
- wkYear = Year(Range("b30").Value)
- wkMonth = Month(Range("b30").Value)
- Range("c30").Value = DateSerial(wkYear, wkMonth, 1)
- Range("c30").NumberFormatLocal = "G/標準"
- Range("d30").Value = DateSerial(wkYear, wkMonth, 1)
- Range("d30").NumberFormatLocal = "yyyy/m/d"
- End Sub
- 1行目:「Subプロシージャ」の開始
- 2行目:「年」を格納するための変数(※5)[wkYear]を宣言
- 3行目:「月」を格納するための変数[wkMonth]を宣言
- 4行目:Year関数(※1)でセル[B30]の西暦年を変数[wkYear]に格納
- 5行目:Month関数(※2)でセル[B30]の月を変数[wkMonth]に格納
- 6行目:DateSerial関数(※3)で年(変数)月(変数)の「1日」をセル[C30]に格納
- 7行目:セル[C30]の書式(※4)を[G/標準]形式に設定
- 8行目:DateSerial関数(※3)で年(変数)月(変数)の「1日」をセル[D30]に格納
- 9行目:セル[D30]の書式(※4)を[yyyy/m/d](西暦年/月/日)形式に設定
- 10行目:「Subプロシージャ」の終了
※1.Year関数:Year(date)
多くの場合、関連書籍、インターネット上のサイトには「引数(ひきすう)dateで指定された日付の西暦年を4桁で返します」と記述されていますが、「引数」とは()内の項目、「返す」とは算出する・変換する等の出力系の動作になります。
※2.Monthr関数:Month(date)
引数dateで指定された日付の月(1~12)を返します。
※3.DateSerial関数:DateSerial(year,month,day)
引数に指定されたyear(年)・month(月)・day(日)が1900年1月1日を「1日目」とし通算で何日目(シリアル値)かを返しますが、日付の表示方法は書式の設定に従います。
※4.書式:yyyy/m/d
書式の設定に関する「マクロの記録」(Excelで[セルの書式設定]ダイアログボックスを開き[表示形式]タブ[分類]で、書式を選択)を流用しています。
- 7行目:[標準](G/標準 )のため、1900年1月1日から「43374」日目
- 9行目:[日付](*2001/3/14を選択)のため、2018/10/1
※5.変数
変数とは、数値や文字列などを一時的に保管する箱のような物で使用する前に宣言する必要があり、次のように宣言します。
Dim 変数名 As データ型名
1).変数名の規則
- 文字(英数字、漢字、ひらがな、カタカナ) とアンダスコア(_)を使用でき、先頭の一文字は文字に限られる
- スペースや記号は使用できない
- 長さは半角で255文字以内、全角で127文字以内
2).データ型
- String:最大約20億文字までの文字列
- Long:-2,147,483,648~2,147,483,647の整数
- Variant:あらゆる種類の値
- Date:西暦100年1月1日~西暦9999年12月31日(時刻も可)
上記以外にもいくつかありますが、当面はこの四つを覚えてください。
3).変数の適用範囲
変数は宣言のしかたによって使える場所が限られ、これを変数の適用範囲といい、次の二種類に大別されます。
Dim 変数名 As データ型名:
一つのプロシージャ、または同一モジュール内で使える変数
Public 変数名 As データ型名:
全てのモジュール・プロシージャで使える変数でパブリック変数という
変数の適用範囲の例 (○:正しい、×:エラー)
例1 ○:変数のサンプル11、○:変数のサンプル12
- 各プロシージャ内での宣言のため、同じ変数名でも問題なし。
例2 ○:変数のサンプル21、×:変数のサンプル22 (変数の宣言なし)
例3 ○:変数のサンプル31、○:変数のサンプル32
- モジュール3での宣言のため、同一モジュールの中で使用できる。
例4 ○:変数のサンプル41、○:変数のサンプル42
×:変数のサンプル51、×:変数のサンプル52
- モジュール4での宣言は、モジュール5では使用できない。
例5:Public変数
○:変数のサンプル61、○:変数のサンプル62
○:変数のサンプル71、○:変数のサンプル72
- パブリック変数
プロシージャ「説明用152_終了日」の内容
[終了日]ボタンのプロシージャを表示しましょう。
- Sub 説明用152_終了日()
- Dim wkYear As Long
- Dim wkMonth As Long
- wkYear = Year(Range("b32").Value)
- wkMonth = Month(Range("b32").Value)
- Range("c32").Value = DateSerial(wkYear, wkMonth + 1, 1) - 1
- Range("c32").NumberFormatLocal = "G/標準"
- Range("d32").Value = DateSerial(wkYear, wkMonth + 1, 1) - 1
- Range("d32").NumberFormatLocal = "yyyy/m/d"
- End Sub
- 1行目:「Subプロシージャ」の開始
- 2行目:「年」を格納するための変数[wkYear]を宣言
- 3行目:「月」を格納するための変数[wkMonth]を宣言
- 4行目:Year関数でセル[B32]の西暦年を変数[wkYear]に格納
- 5行目:Month関数でセル[B32]の月を変数[wkMonth]に格納
- 6行目:DateSerial関数で年(変数)月(変数)の「末日」をセル[C32]に格納
- 7行目:セル[C32]の書式を[G/標準]形式に設定
- 8行目:DateSerial関数で年(変数)月(変数)の「末日」をセル[D32]に格納
- 9行目:セル[D32]の書式を[yyyy/m/d](西暦年/月/日)形式に設定
- 10行目:「Subプロシージャ」の終了
プロシージャ「説明用151_開始日」と同様な記述ですが、6・8行目で「末日」を算出しています。
【末日の算出方法】
大の月、小の月からの算出も可能ですが、ここでは「翌月1日の1日前」を「当月の末日」とするために、DateSerial関数で「翌月(WkMonth + 1)の1日」の1日前(DateSerialの算出値 ― 1)を算出しています。
この方法は便利ですので覚えておくとよいでしょう。
プロシージャ「説明用153_開始日と終了日の比較」の内容
[開始日と終了日の比較]ボタンのプロシージャを表示しましょう。
- Sub 説明用153_開始日と終了日の比較()
- If Range("c30").Value > Range("c32").Value Then
- MsgBox "開始日 > 終了日"
- Else
- MsgBox "開始日 ≦ 終了日"
- End If
- End Sub
- 1行目:「Subプロシージャ」の開始
- 2~6行目:「IF」~「Else」~「End If」で、開始日と終了日の比較を行い、比較結果をダイアログボックスに表示しています。
- 7行目:「Subプロシージャ」の終了
【IF文の構成】
IF 条件式 Then
条件が成立する場合の処理
Else
条件が成立しない場合の処理
End If
「条件が成立する場合の処理」と[Else]以下に「条件が成立しない場合の処理」を記述します。
「説明1-4 Excelでの年月の判定」では年月の比較でしたが、ここでは日付に変換した後の比較のため、ダイアログボックスに正しい結果が表示されます。
次にシート[実習用VBA]で実習を行いましょう。
確認が終わりましたら、VBE画面の左上[Excel]アイコンをクリックしてシート[VBA説明用]に戻りましょう。