2.ユーザーフォームからの制御
2-1.日付制御関連
(1) 概略
KIkabuのマクロでは、下図のような表示で日付の指定をしていますが、ここではKIkabuでの
日付計算やダイアログからの入力方法を例に説明します。
Excelでは、日付は1900/1/1を1としてシリアル値で管理されており(小数点以下は1日内の時間)、
日付変数に1を加えると1日加算される等、慣れればVBAでの日付制御は簡単です。

(2)メインオブジェクト
Public shoki As Integer '初期指定1 '[1]
Dim ch1date As Date '日付1 '[2]
Dim ch2date As Date '日付2
Sub 日付ダイアログ()
shoki = 1
shu = UserForm1.txt2.Text '[3]
If shu = "" Then
UserForm1.txt2.Text = 60
End If
'取得最終日
With UserForm1
.txt10y.Text = Year(Date) '[4]
.txt10m.Text = Month(Date) '[5]
shoki = 0
.txt10d.Text = Day(Date) '[6]
End With
Call スタート年月日
UserForm1.Show 0 '[7]
End Sub
[1] ダイアログのテキストボックスが変化で入力なしのエラー防止に使用
[2] 日付計算を行う関係で、変数"ch1date"を日付データにする
[3] 取得する日数を読み取り、(空白の場合はテキストボックスtxt2へ60を入力)
[4] 本日の日付から年を取り出し、ダイアログのテキストボックスtxt10yへ入力
[5] 本日の日付から月を取り出し、ダイアログのテキストボックスtxt10mへ入力
(shoki = 0 については(3)項で説明)
[6] 本日の日付から日を取り出し、ダイアログのテキストボックスtxt10dへ入力
[7] 以上でテキストボックスへの入力が終了し、ダイアログ"UserForm1"を表示
(本例はShow 0でモ-ドレスに指定してありExcel2000以前のバージョンはエラーとなる)
(3)ユーザーフォームモジュールのマクロ
ユーザーフォームの各部品に付けた名称は下図参照のこと

'---------------------------------------------------------------------
Private Sub spn10m_Change() '[1]
With UserForm1
.txt10m.Text = .spn10m.Value
End With
End Sub
'---------------------------------------------------------------------
Private Sub spn10d_Change() '[2]
With UserForm1
.txt10d.Text = .spn10d.Value
End With
End Sub
'---------------------------------------------------------------------
Private Sub txt10m_Change() '[3]
If Not IsNumeric(UserForm1.txt10m) Then
MsgBox "数字を入力して下さい"
Exit Sub
End If
With UserForm1
.spn10m.Value = .txt10m
.txt10m = .spn10m.Value
End With
If shoki <> 1 Then
Call スタート年月日
End If
End Sub
'---------------------------------------------------------------------
Private Sub txt10d_Change() '[4]
If Not IsNumeric(UserForm1.txt10d) Then
MsgBox "数字を入力して下さい"
Exit Sub
End If
With UserForm1
.spn10d.Value = .txt10d
.txt10d = .spn10d.Value
End With
Call スタート年月日
End Sub
'---------------------------------------------------------------------
Private Sub txt10y_Change() '[5]
If Not IsNumeric(UserForm1.txt10y) Then
MsgBox "数字を入力して下さい"
Exit Sub
End If
If shoki <> 1 Then
Call スタート年月日
End If
End Sub
'---------------------------------------------------------------------
Private Sub txt2_Change() '[6]
If Val(txt2.Text) > 4000 Then
MsgBox "数字は「4000」までの指定でお願いします"
End If
If shoki <> 1 Then
Call スタート年月日
End If
End Sub
[1]スピンボタン(spn10m)に変化のあった時実行イベント
・スピンボタンで増加減した値はテキストボックスtxt10mに表示
・ Minプロパティ=1、Maxプロパティ=12(プロパティウインドウで設定)
[2]スピンボタン(spn10d)に変化のあった時実行イベント
・スピンボタンで増加減した値はテキストボックスtxt10dに表示
・ Minプロパティ=1、Maxプロパティ=31(プロパティウインドウで設定)
・Max31は無い月もあり問題があるが、プロシージャ(スタート年月日)でガードしてある
[3]テキストボックス(txt10m)に変化のあった時実行イベント
・数字以外の入力ガード「数字を入力して下さい」メセージを表示。
・テキストボックスへ直接入力された場合その数値をスピンボタン(spn10m)にも反映させる
・プロシージャ(スタート年月日)コール。ただし初期設定で日が未入力の場合はコールしない
[4]テキストボックス(txt10d)に変化のあった時実行イベント
・数字以外の入力ガード「数字を入力して下さい」メセージを表示。
・テキストボックスへ直接入力された場合その数値をスピンボタン(spn10d)にも反映させる
・プロシージャ(スタート年月日)コール。
[5]テキストボックス(txt10y)に変化のあった時実行イベント
・数字以外の入力ガード「数字を入力して下さい」メセージを表示。
・テキストボックスへ直接入力された場合その数値をスピンボタン(spn10d)にも反映させる
・プロシージャ(スタート年月日)コール。ただし初期設定で月日が未入力の場合はコールしない
[6]テキストボックス(txt2)に変化のあった時実行イベント
・入力数字は4000までにガード
・プロシージャ(スタート年月日)コール。ただし初期設定で年月日が未入力の場合はコールしない
(4)取得スタート日の計算
前述の説明までで所得最終日を指定しましたが、データをダウンロードする場合は
当然スタート日が必要であり、本例はスタート日の計算例です。
Sub スタート年月日()
Dim d10y As String, d10m As String, d10d As String
Dim d11y As String, d11m As String, d11d As String
daysuu = UserForm1.txt2.Text '[1]
With UserForm1 '[2]
d10y = .txt10y.Text
d10m = .txt10m.Text
d10d = .txt10d.Text
End With
If IsDate(d10y & "/" & d10m & "/" & d10d) = False Then '[3]
MsgBox d10y & "/" & d10m & "/" & d10d & "は日付エラーです"
Exit Sub
End If
'スタート日計算 '[4]
ch1date = d10y & "/" & d10m & "/" & d10d
ch2date = ch1date - Val(daysuu)
d11y = Year(ch2date)
d11m = Month(ch2date)
d11d = Day(ch2date)
' 取得日表示 '[5]
UserForm1.lbl1.Caption = "データ取得日:" & d11y & "/" & d11m & "/" & d11d & " 〜" & d10y & "/" & d10m & "/" & d10d
End Sub
[1] テキストボックス(txt2)から、取得する日数を変数(daysuu)へ代入
[2] テキストボックスの年月日を、それぞれ変数(d10y)(d10m)(d10d)へ代入
[3] 文字変数(d10y)(d10m)(d10d)を合わせて日付に変換可能はチェック
・変換不可の場合は"False"が返ってくるのでメッセージを表示
・初期設定でまだ「年」「月」「日」空白の場合はエラーになる為、前述[If shoki <> 1 Then]ガード
[4]スタート日計算
・シリアル値で計算の関係で、データ形式日付の変数(ch1date)へ1度代入
・変数(ch1date)-Val(daysuu)でスター日を計算。(取得日数(daysuu)は文字変数であり数値に変換し計算)
・ドウンロードのURLを指定する時、スタート日は年月日が分かれており(d11y)(d11m)(d11d)へ分ける
[5]取得日表示→ラベル(lbl1)へ、スタート日と最終日を表示
【戻る】