カレンダー入力フォームをポップアップして、日付入力を行なう関数です。
一緒に時刻を入力させる事もできます。
『VBA Only』
[デモアニメ] [六曜モードデモ]
ktCalDate( 日付, [基準日], [休日Map], [Pos_X], [Pos_Y],
[入力Msg], [営休制限], [期間制限Fr], [期間制限To],
[六曜], [時刻] )
返却値 ‥‥‥ Boolean型 日 付 ‥‥‥ Date 型 (ByRef) 基準日 ‥‥‥ Variant(Date 又は 日付文字列)型 (省略可) 休日Map ‥‥‥ String 型 (省略可) Pos_X ‥‥‥ Variant(Integer / Empty)型 (省略可) Pos_Y ‥‥‥ Variant(Integer / Empty)型 (省略可) 入力Msg ‥‥‥ String 型 (省略可) 営休制限 ‥‥‥ Variant(Integer) 型 (省略可) 期間制限Fr ‥‥‥ Variant(Date 又は 日付文字列)型 (省略可) 期間制限To ‥‥‥ Variant(Date 又は 日付文字列)型 (省略可) 六曜 ‥‥‥ String 型 (省略可,既定値:"禁止") 時刻 ‥‥‥ String 型 (省略可,既定値:"なし")
日付が選択された場合は、返却値として "True" が返ります。
入力キャンセルした場合は "False" が返ります。
日 付 ‥‥‥ この項目に選択した日付(及び 時刻 )が設定されて呼び元に返されます。呼び元での変数定義が必要です。
基準日 ‥‥‥ この日付の『年月』でカレンダーが初期表示されます。
通常は、選択した「日付」を設定する項目/オブジェクト(Value値)を指定します。(こうすると、再度フォームを表示させた時に、前回選択した日付の『年月』で表示させる事ができます)。
指定した項目/オブジェクトの内容が『Emptyや日付以外』の場合は既定値として本日日付が適用されます。
※ 新元号「令和」対応になっていない環境でも
「令和 日付文字列(元年 表記を含む)」を指定可能です。
省略時には、既定値として本日日付が適用されます。
休日Map ‥‥‥ 『休日Map』または『固定休日コード』を指定します。
ここに指定した休日はピンクで表示されます。
省略時は、「休日なし」としてピンク表示されません。
Pos_X
および
Pos_Y‥‥‥ カレンダーフォームを画面のどの位置に表示するかを指定するパラメータです。
UserForm のプロパティ(Left / Top )で指定する値です。
一方もしくは両方を省略すると『オーナーフォーム中央』に表示します。
または、一方 もしくは 両方に Empty 値 を指定した場合も、省略 と 同じ
扱いで『 オーナーフォーム中央 』 に表示します。
「あるセルの付近に表示する」 という場合には、ktCell2Position 関数 を
使って、セルの座標を変換した値を指定してください (使用例を参照)。
参考 : 表示位置によるPos_X および Pos_Y の値(1024×768サイズの画面)
画面全体の左上 ‥‥‥ Pos_X=0 , Pos_Y=0
〃 中央 ‥‥‥ Pos_X=300 , Pos_Y=170
〃 右下 ‥‥‥ Pos_X=580 , Pos_Y=350
入力Msg ‥‥‥ ここに指定した文字列がキャプション部分に表示されます。
全角20文字/半角28文字程度まで指定できます。
省略時はフォーム名である[ktFormCal]が表示されます。
営休制限 ‥‥‥ 営業日のみ/休業日のみ等の入力制限を施す場合に指定します。
0 または 省略:[営/休]制限なし。
1 :[営業日のみ]入力可
2 :[休業日のみ]入力可
3 :『休日Map』の期間内のみ入力可
4 :『休日Map』の期間内で営業日のみ入力可
5 :『休日Map』の期間内で休業日のみ入力可
(3〜5では期間制限Fr/Toの指定は不要です)
期間制限Fr
および
期間制限To‥‥‥ 日付入力できる期間を[Fr/To]で指定します。
※ 新元号「令和」対応になっていない環境でも
「令和 日付文字列(元年 表記を含む)」を指定可能です。
『月初〜月末』だけでなく『16日〜15日』といった期間も指定できます。
日付文字列/Date型変数/日付データのセル等で指定します。
[月末まで]という場合は『正しい月末日』を指定して下さい。
「2/30や11/31」といった指定は無効とされます。
[営休制限=3〜5]の場合
Fr/Toを指定しなくても休日Mapの有効期間が摘要されます。
Fr/Toも一緒に指定した場合は、両方の重なる期間が用いられます。
全く重なる期間が無い場合は休日Mapの有効期間が摘要されます。
六曜 ‥‥‥ 六曜表示モードの可否を指定します。
省略/”禁止”‥‥‥六曜表示モードを禁止します
”六曜” ‥‥‥通常モードで表示し、『右クリック』で六曜表示モード
へ移行します。
最初から六曜表示モードで表示する場合は、表示対象の六曜を下記の文字で並べて指定します。全ての六曜を表示する場合は『”勝友負仏安赤”』と指定します。「大安・友引」だけを表示するなら『”友安”』と指定します。
『先勝・友引・先負・仏滅・大安・赤口』
(並び順は、ありません。表示対象としたいものを並べて下さい)。
※六曜モードにおいて、六曜が表示されていない日付は選択できません。
※”六曜”と指定した場合、右側のカラーガイダンスをクリックする事で、
個別に六曜の表示/非表示を切り替えられます。”安友”などパラメータ
で個別指定した場合は、カラーガイダンスによる切り替えはできません。
したがって、全ての六曜が常に選択可とする場合は、パラメータに
”勝友負仏安赤”と全てを指定します。
時刻 ‥‥‥ 日付選択に続けて『時刻入力』を行なうかを指定します。
省略(又は”なし”指定』の場合は、従来通り日付のみの入力です。
指定値は[ ktSelClock ]AMPM引数の解説を参照して下さい。
パラメータ「基準日〜六曜」の指定にしたがってカレンダー
フォーム『ktFormCal』を表示します。
マウスの動きに合わせてアクティブ位置が水色で強調さ
れます。そのままワンクリックすれば、その位置の日付が呼
び元へ返ります。
祝日の設定は自動的に行なっていますので、ユーザー側で
準備する必要はありません。休業日の強調表示が可能なの
で、入力時のミスも防げます。
入力制限により「入力不可」となっている日付はマウスカーソルを合わせても水色表示されません。
水色表示される日付が入力可能な日付です。
左の例 : ktCalDate(MyDate, Date, kt_土日祝, , , _
"開始日を入力して下さい", 1, "2001/4/1", "2002/3/31")
中/右の例 : ktCalDate(MyDate, Date, kt_土日祝, , , _
"開始日を入力して下さい", 0, "2001/12/16", "2002/1/15")
「日付」以外の部分を右クリックすると、左のように
六曜がカラー表示されます。
更に、右側の大安・仏滅などのガイダンス部分を
クリックすると、その六曜の表示有無を切り替える事
もできます。
VBAから六曜表示を指定する場合はパラメータ
「六曜」を指定します。
(注)六曜パラメータの既定値は”禁止”です。これは、既にVer2.40以前でカレンダー入力フォームを
運用されている場合、バージョンアップ後に「うっかり」右クリックしてしまい『いきなり六曜表示されて
戸惑う』といった事の無い様、既定で”禁止”する事により、コード修正しないまま利用すれば自然と
従来(〜Ver2.40)の動きのままになるようにしている為です。
六曜表示できるのは「1950〜2050年」の期間です。
六曜は七曜(日〜土)と違って、常に規則正しく繰り返される訳ではありません。旧暦の各月1日の六曜が
月によって決まっており、そこから順に繰り返されます(1・7月:先勝,2・8月:友引‥‥)。したがって、旧
暦の月変わり位置で不連続になります。上の例では5/11〜12日の間で[友引・先負]が飛んでいます。
(注)これで表示される『六曜』は日本標準時を基にしたものです。したがって、中国および韓国での行事
などを求めるのに参考としないで下さい。年によっては【1日のズレ】が出る場合があります。
(例:旧暦2001年4月) 詳しくは『kt旧暦』の解説を読んで下さい。
「時刻」引数を指定した場合は、日付選択後に時刻入力フォームがポップアップしますので、続けて時刻
を選択して下さい。時刻選択を以って入力完了となり、呼び元には『日付+時刻』のシリアル値が返り
ます。時刻選択でキャンセル(×ボタン)した場合は日付入力自体もキャンセルになります。
Dim MyDate As Date
Dim str休日Map As String ‥‥‥「休日マップ」が設定されている変数
※[kt_土日祝]などは「kt関数Addin.xla」内で定義されている『固定休日』定数です。
--- 基本形 ---
If ktCalDate(MyDate, Date, kt_土日祝) Then
xxxx = MyDate または xxxx = Format(MyDate, "yyyy/m/d")
End If
--- パラメータの指定パターン例 --------------------------
(1) 省略できるパラメータを全て省略
ktCalDate(MyDate)
本日日付の「年月」&『休日表示なし』で表示されます。
これは、下記の指定と同じ意味になります。
ktCalDate(MyDate, Date, kt_なし)
(2) 『土日』を休業日表示する
ktCalDate(MyDate, ,kt_土日) または
ktCalDate(MyDate, Date, kt_土日)
(3) 『土日』及び『祝日/振替休日』を休業日表示する
ktCalDate(MyDate, ,kt_土日祝) または
ktCalDate(MyDate, Date, kt_土日祝)
(4) 『休日マップ』を指定
ktCalDate(MyDate, , str休日Map) または
ktCalDate(MyDate, , Rang("A1").Value)
‥‥‥A1セルに休日マップデータが格納されている場合
(5) ある日付の「年月」で表示する。
Dim dtm年月日 As Date
dtm年月日 = DateValue("2000/2/20")
ktCalDate(MyDate, dtm年月日)
または
ktCalDate(MyDate, DateValue("2000/2/20"))
または
ktCalDate(MyDate, "2000/2/20")
または
ktCalDate(MyDate, "平成13年2月20日")
上記の例は、全て「2000年2月」で表示されます。
(6) テキストボックスやセルに入っている日付で表示する。
ktCalDate(MyDate, TextBox1.Value)
または
ktCalDate(MyDate, Rang("B5").Value)
TextBox1/B5セルの内容が【シリアル値/日付文字列】以外の場合は、
本日日付が適用されます。
(7) 表示位置を指定する。
ktCalDate(MyDate, , ,100, 50)
Excelウィンドウ内で「Left=100,Top=50 」の位置に表示します。
-- UserForm の位置/入力項目の位置に合わせて調整 --
ktCalDate(MyDate, , , (Me.Left + 10), (Me.Top + 10))
ktCalDate(MyDate, , , (Me.Left + TextBox1.Left + 10), (Me.Top + TextBox1.Top + 10))
-- F5セルの付近に表示する (ktCell2Position を利用) --
Dim rc As Boolean
Dim vntPos As Variant
Dim vntTop As Variant
Dim vntLeft As Variant
vntPos = ktCell2Position(ActiveSheet.Range("F5"))
If IsError(vntPos) Then
'F5 セル が 表示範囲外 ⇒ Top/Left を省略
vntTop = Empty
vntLeft = Empty
Else
vntTop = vntPos(0) + 5
vntLeft = vntPos(1) + 5
End If
rc = ktCalDate(MyDate, Pos_X:=vntLeft, Pos_Y:=vntTop)
(8) 入力Msg と入力制限の例
ktCalDate(MyDate, Date, kt_土日祝, , , _
"開始日を入力してください", 1, "2001/12/16", "2002/1/15")
(9) 右クリックでの六曜表示モードを可にする
ktCalDate(MyDate, Date, kt_土日祝, , , , , , , "六曜")
または、
ktCalDate(MyDate, Date, kt_土日祝, 六曜:= "六曜")
(10) 最初から六曜表示モードにする
ktCalDate(MyDate, Date, kt_土日祝, , , , , , , "勝友負仏安赤")
または、
ktCalDate(MyDate, Date, kt_土日祝, 六曜:="勝友負仏安赤")
(11) 大安・友引だけで六曜表示する
ktCalDate(MyDate, Date, kt_土日祝, , , , , , , "友安")
または、
ktCalDate(MyDate, Date, kt_土日祝, 六曜:="友安")
(12) 日付&時刻の入力を行なう
ktCalDate(MyDate, Date, kt_土日祝, , , , , , , ,"AMPM#")
または、
ktCalDate(MyDate, Date, kt_土日祝, 時刻:= "AMPM#")
この場合、当然、編集は"yyyy/m/d" ではなく、"yyyy/m/d h:m"等として下さい。
---- 利用コード例 -------------------------------
[DblClick]アクションを無効にする為に『Cancel = True 』は必須です。
(1) テキストボックスでの利用例
UserFormの場合は、そのUserFormのモジュールに、シート上のコントロールの
場合は、そのシートのモジュールに記述してください。
TextBox1 をダブルクリックするとカレンダーフォームを表示して、入力した日付を
「yyyy/m/d 」形式に編集してTextBox1に設定します。
表示の際は、既にTextBox1に日付文字列が設定されている場合は「その年月」で、
空白や日付以外の文字列が設定されていた場合は「本日の年月」で表示します。
Private Sub TextBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Dim MyDate As Date
If ktCalDate(MyDate, TextBox1.Value, kt_土日祝) Then
TextBox1.Value = Format(MyDate, "yyyy/m/d")
End If
Cancel = True
End Sub
(2) ワークシートでの利用例(その1)
そのシートのモジュールに記述して下さい。
セルをダブルクリックするとカレンダーフォームを表示して、日付を入力します。
表示の際は、既にセルにシリアル値/日付文字列が設定されている場合は「その年月」
で、それ以外の場合は「本日の年月」で表示します。
入力した内容は、ダブルクリックしたセルの「表示形式」で表示されます。
Private Sub Worksheet_BeforeDoubleClick _
(ByVal Target As Range, Cancel As Boolean)
Dim MyDate As Date
If ktCalDate(MyDate, Target.Value) Then
Target.Value = MyDate
End If
Cancel = True
End Sub
(3) ワークシートでの利用例(その2)
そのシートのモジュールに記述して下さい。
上記に、表示形式の指定を追加した例です(平成13年2月20日といった形式)。
Private Sub Worksheet_BeforeDoubleClick _
(ByVal Target As Range, Cancel As Boolean)
Dim MyDate As Date
If ktCalDate(MyDate, Target.Value) Then
Target.NumberFormatLocal = "ggge年m月d日"
Target.Value = MyDate
End If
Cancel = True
End Sub
(4) ワークシートでの利用例(その3)
そのシートのモジュールに記述して下さい。
ダブルクリックで日付入力するセルを限定(B5セル)する場合の例です。
Private Sub Worksheet_BeforeDoubleClick _
(ByVal Target As Range, Cancel As Boolean)
Dim MyDate As Date
If (Target.Address = "$B$5") Then
If ktCalDate(MyDate, Target.Value) Then
Target.Value = MyDate
End If
Cancel = True
End If
End Sub
[Cancel = True]を記述する位置に注意して下さい。B5セル以外では
『ダブルクリックでセルへのキー入力』は有効にしなければなりません。
(5) ワークシートでの利用例(その4)
そのシートのモジュールに記述して下さい。
ダブルクリックで日付入力するセルを限定(C列)する場合の例です。
Private Sub Worksheet_BeforeDoubleClick _
(ByVal Target As Range, Cancel As Boolean)
Dim MyDate As Date
If (Target.Column = 3) Then
If ktCalDate(MyDate, Target.Value) Then
Target.Value = MyDate
End If
Cancel = True
End If
End Sub
[Cancel = True]を記述する位置に注意して下さい。C列以外では
『ダブル クリックでセルへのキー入力』は有効にしなければなりません。
(6) ワークシートでの利用例(その5)
そのシートのモジュールに記述して下さい。
実際に業務で利用する場合は、下記のような工夫をして下さい。
ダブルクリックしたセルに日付が入っていない場合は、1行上のセルの日付
に対する「年月」で表示する。明細の1行目の場合は、そこがタイトル行に
なるが、『日付データ以外』なので、1行目は「本日の年月」で表示される。
Private Sub Worksheet_BeforeDoubleClick _
(ByVal Target As Range, Cancel As Boolean)
Dim MyDate As Date
If (Target.Column = 3) Then
If IsDate(Target.Value) Then
'日付入力済みのセルは「その日付」で初期表示
If ktCalDate(MyDate, Target.Value) Then
Target.Value = MyDate
End If
ElseIf (Target.Row > 1) Then
'2行目以降(明細1行目以降)
'2行目の場合、第2引数はタイトル行セルを指し示すが、
'日付ではないので自動的に「本日日付」で表示される
If ktCalDate(MyDate, Target.Offset(-1, 0).Value) Then
Target.Value = MyDate
End If
Else
'1行目(タイトル行)では表示しない
End If
Cancel = True
End If
End Sub
[Cancel = True]を記述する位置に注意して下さい。C列以外では『ダブル
クリックでセルへのキー入力』は有効にしなければなりません。
(7) ワークシートでの利用例(その6)
そのシートのモジュールに記述して下さい。
カーソルを「そのセル」に移しただけで、ポップアップさせたい場合は、
「Worksheet_BeforeDoubleClick」イベントの代わりに
「Worksheet_SelectionChange」イベント
を使ってください。
この場合は[Cancel]引数 が有りませんので、『Cancel = True 』ステップは不要です。