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)へ、スタート日と最終日を表示
 



【戻る】