|
【 定 義 】 |
|
Sub Show_HolidayListMake ( ) Ver1.10〜
休日リスト(1列目:日付、2列目:休日名) を作成する ツール(
画像 ) を呼び出すサブルーチン
です(アドイン内に用意してあるサブルーチンです)。デモブックに実行ボタンを用意してあります。
Call Show_HolidayListMake
( 使い方 )
Step 1
作成済みの休日リストを修正(日付の追加/削除)を行なう場合は、[
Read List ]ボタンをクリック
して、そのリストの左上端セルを選択してください。そのリストの内容がリストボックス と カレンダー
に設定されます。
Step 2
a) カレンダーをクリックして、休日として登録したい日付を指定します。
b) TextBox に休日名を入力してから[ Register ]ボタンをクリックすると、リストボックスの末尾
に追加され、カレンダーにも反映されます。
c) 既に休日設定されている日付の場合には、TextBox
に休日名が表示されますので修正
した上で[ Register ]ボタンをクリックしてください。
d) 日本語版では祝日が自動設定になっています(山の日 対応済)。
祝日の日付を選択すると、祝日名が
TextBox に表示されます。祝日の日付に対して休日
名を設定すると、以後その休日名で表示されます。
祝日名も残したい場合は、「表示された祝日名
+ 休日名」で登録してください。
e) リストボックスに登録された休日データを削除する場合は、その休日の行をダブルクリック
してください。
f) 登録した休日は、順次、リストの末尾に追加されます。[
ListBox Sort ]ボタンをクリックすれ
ば日付順に並び替えられます。
Step 3
[ Rewrite List ]ボタンをクリックsして、出力先の基点セルを選択すると、リストボックスに登録
された内容がシート上に出力されます。出力先セル範囲に既にデータがある場合には、その
データを消去した上で書き出します。
|
|
Function ktHolidayListArray ( ByVal HolidayList As Variant
) As Variant
祝日以外の日付も赤色(日本語版では、祝日は自動的に赤色表示になります)で表示したい
場合には、休日リストを Create メソッドに指定しますが、そのリストデータを作成する関数です
(アドイン内に用意してある関数です)。表示処理を効率良く行なう為に、
「日付 : 休日名」
の2次元配列を 「月別 : 日付 : 休日名」 の3次元配列に変換しています。
フォームを表示する都度、リストデータを作成するのでは効率が悪くなりますので、事前に
Variant 変数(標準モジュールの Public 変数 など) にデータを格納しておいてください。
( HolidayList )
シート上に 「日付(1列目) と 休日名(2列目)」 で休日一覧を用意し、そのセル範囲を
指定してください(上記の Show_HolidayListMake
サブルーチンで作成できます)。
または、祝日リストを格納した Variant 型の2次元配列
Dim vntArray1 ( 件数 , 2 ) As
Variant
Dim vntArray2 ( 0 To 件数-1 ,
0 To 1) As Variant
Dim vntArray3 ( 1 To 件数 , 1
To 2 ) As Variant 等
を指定してください。
-- 使用例 --
Public vntHolidayList As Variant
vntHolidayList = ktHolidayListArray ( Worksheets ("Sheet1").Range ("G14:H28").Value )
- - - - - - - - - - - -
Private WithEvents MonthView1 As clsPasteCal
Private UserForm_Initialize ( )
Set MonthView = CreatePasteCal
MonthView1.Create Frame1, Date, False, False, , vntHolidayList
|
[ 2K ]
|
UserForm モジュールの宣言セクション(モジュールの先頭)で、下記のように定義します。
Private WithEvents object As clsPasteCal
( object )
任意の名前を指定して下さい。
[ Initialize ] イベントプロシジャーにて下記のようにしてクラスのインスタンスを作成します。
(New キーワードによるインスタンス作成はできません)
Set object = CreatePasteCal ( )
( CreatePasteCal 関数はアドインで用意してある関数です)
|
[ 97 ]
|
UserForm モジュールの宣言セクション(モジュールの先頭)で、下記のように定義します。
WithEvents は付けません。
Private object As clsPasteCal97
( object )
任意の名前を指定して下さい。
[ Initialize ] イベントプロシジャーにて下記のようにしてクラスのインスタンスを作成します。
(New キーワードによるインスタンス作成はできません)。
Set object = CreatePasteCal97 ( )
( CreatePasteCal97 関数はアドインで用意してある関数です)
|
|
【 メソッド 】 |
[ 2K ]
|
object .Create Frame , BaseDate , [MonToSun] , [DTPicker] , [FormatYMD] , [HolidayList]
Frame コントロール内にカレンダーを作り込むメソッドです。
( Frame )
カレンダーを作り込む Frame オブジェクトを指定します。
MonthView スタイルの場合には [ Width=108 , Height=105
]のサイズで用意します。
DTPicker スタイルの場合には [ Width=108 , Height=20
]のサイズで用意します(尚、フレームの
下にカレンダー表示高さとして [ Height=105 ] の余裕が必要です)。
( BaseDate )
この日付の「年月」で初期表示されます。初期表示月を特に指定する必要がなければ、本日日付
として、Date 関数を指定してください。
( MonToSun )
カレンダーの曜日並びを指定します。
[ 日月→土 ]並びの場合は、省略 または False 、[ 月→土日 ]並びの場合は True を指定します。
( DTPicker )
MonthView スタイルの場合は、省略 または False 、DTPicker
スタイルの場合は True を指定します。
( FormatYMD )
MonthView スタイルの場合には省略してください。
DTPicker スタイルでの、テキストボックス部分に表示する日付の書式を指定します。
Format 関数で利用可能な書式文字で指定してください。省略した場合は、"yyyy/m/d" になります。
( HolidayList )
日本版では『祝日』は自動算出されます (「昭和の日」
対応済)。
祝日以外の日付を赤色で表示したい場合に、ktHolidayListArray 関数で作成した休日データを
格納している Variant 変数を指定してください。休日名は
ControlTipText で表示されます。
|
[ 97 ]
|
object .Create Caller , GrpId , Frame , BaseDate ,
[MonToSun] , [DTPicker] , [FormatYMD] , [HolidayList]
Frame コントロール内にカレンダーを作り込むメソッドです。
( Caller )
自UserForm を指定します。実際には「Me 」キーワードを記述して下さい。
(補) 引数[ Caller ]はObject型で受け取ります。
[ Caller ]はUserForm 内の「イベント通知受領プロシジャー」を呼び出す為のオブジェクト参照
に使っています(MsForms.UserForm型ではNGな為)。
( GrpId )
複数のカレンダーコントロール(= 複数の[ object ])を使用する場合、そのコントロールを区別する
「文字列」を指定します。1つしか使わないならば「空文字:
"" 」でも構いません。
( Frame ) 〜 ( HolidayList )
clsPasteCal と同じ。
|
|
object .Clear
クラスの解放などの終了処理です。
UserForm の[Terminate ]イベントで必ず実行して下さい。
|
|
object .EmphasisRelease Ver1.10〜
「日」ボタンの強調表示(水色背景)を解除するメソッドです。
主に、Pop-Up カレンダーフォームに利用した際に使います。そのフォームが Hide で閉じる処理に
なっていると、次回フォームを表示した時に、クリックした「日」ボタンの強調表示が残ったままで表示
されてしまいます。この場合には、フォームの Activate イベント内で [ EmphasisRelease ] メソッドを
実行する事で強調表示を解除した状態でフォームを表示できます。
|
|
object .SetRange MinDate , MaxDate
カレンダーで入力可能な日付範囲を設定するメソッドです。
MinDate 〜 MaxDate の範囲外ではマウス位置の強調表示がされません(クリックできません)。
また、範囲外への年月移動はできなくなります。メソッド実行時にカレンダーが範囲外の年月に
なっていた場合には、MinDate の年月に移動します。
日付選択されていた場合には、選択状態が解除されます(Value
プロパティは Empty を返し、
ValueIsNull プロパティは True を返します)。
( MinDate )
範囲の下限日付を指定します。
( MaxDate )
範囲の上限日付を指定します。
|
|
object .ResetRange
SetRange メソッドで設定した入力範囲を解除するメソッドです。
|
|
object .NextYear [Offset]
object .PrebiousYear [Offset]
object .NextMonth [Offset]
object .PrebiousMonth [Offset]
カレンダーの表示「年月」を変更するメソッドです。スピンボタンのクリック動作に相当します。
日付選択されていた場合には、選択状態が解除されます(Value
プロパティは Empty を返し、
ValueIsNull プロパティは True を返します)。
( Offset )
未来(Next) / 過去(Previous) へ移動する 「年数 または
月数」 を指定します。
省略した場合は 1年/1ヶ月 と見故されます。
|
|
object .Today
カレンダーの表示「年月」を【今月】に変更するメソッドです。
日付選択されていた場合には、選択状態が解除されます(Value
プロパティは Empty を返し、
ValueIsNull プロパティは True を返します)。
|
|
【 プロパティ 】 |
|
object .Value [ = Variant ]
カレンダーの日付を取得/設定するプロパティです。
値の設定と取得が可能です。
( 値の取得 )
選択されている日付を「シリアル値」で返します(MonthView
スタイルでは、右下に表示されている
日付。DTPicker スタイルでは、テキストボックス部分に表示されている日付)
。
日付が選択されていない場合、または[ Enabled=False
] 時には、Empty値を返します。
Value プロパティが 「日付を返すか、Empty値を返すか」
は、ValueIsNull プロパティで確認できます。
( 値の設定 )
渡した日付の「年月」がカレンダーの表示年月になり、その日付が選択状態になります。
[Enabled = False ] 時、または、日付範囲設定時で範囲外の日付を渡した場合には無視されます。
|
|
object .ValueIsNull [ = Boolean ]
日付が選択されているかを返すプロパティです。
値の設定と取得が可能です。
( 値の取得 )
日付が選択されている場合には False を返し、未選択の場合には
True を返します。
[ValueIsNull = True] の場合には、Value プロパティは
Empty値を返します。
( 値の設定 )
True を渡すと、日付選択状態を解除されます(MonthView スタイルでは、右下に表示される
日付が消え、DTPicker スタイルでは、テキストボックス部分の日付が消えます)。
この後、Value プロパティは Empty値を返します。
なお、False を渡した場合は無視されます。
|
|
object .ValueName [ = String ] Ver1.10〜
カレンダーの日付に設定されている 休日名( ControlTipText )
を取得するプロパティです。
値の取得のみ可能です。
( 値の取得 )
選択されている日付(Value プロパティ の日付) に設定されている
休日名( ControlTipText ) の
内容を返します。
日付が選択されていない場合、または[ Enabled=False
] 時には、空文字( "" ) を返します。
|
|
object .Enabled [ = Boolean ]
カレンダーの入力可否状態を設定/取得するプロパティです。
値の設定と取得が可能です。
入力不可状態では、
・ カレンダー部分が淡色表示
・ ValueIsNull プロパティは True を返す
・ Value プロパティは Empty値を返す
となります。
( 値の取得 )
入力可の場合には True を返し、不可の場合には False
を返します。
( 値の設定 )
True を設定すれば入力可になり、False を設定すれば不可になります。
|
|
object .Holiday [ = Variant ] Ver1.10〜
Create メソッドでの HolidayList 引数と同じです。
カレンダーが出来上がった後に 休日設定 を変更(追加/削除)する場合に使います。
値の設定のみ可能です。
この Holiday プロパティへの設定は、即時にカレンダーへ反映され再表示されます。
( 値の設定 )
[ ktHolidayListArray 関数 ] で作成した Variant 値(配列)
を設定します。
|
|
object .CalMonth [ = Date ] Ver1.20〜
今、「何月」 が表示されているかを返すプロパティです。
値の取得のみ可能です。
( 値の取得 )
表示されている「月」の1日が シリアル値で返ります。
|
|
【 イベント 】 |
|
Private Sub object_Click ( ByVal DateVal As Date )
カレンダー上の日付をクリックした場合に発生するイベントです。
( DateVal )
クリックした日付のシリアル値が返ります。
(補) clsPasteCal97 クラスの場合、正確に言えば「イベントプロシジャー」ではありません。
下記の『イベント通知 受領プロシジャー』 から
Call される「普通のサブプロシジャー」です。
|
|
Private Sub object_SpinChange ( ByVal MonthVal As Date ) Ver1.20 〜
年/月のスピンボタン操作で、月が変わった場合に発生するイベントです。
( MonthVal )
移動後の「月」の1日が、シリアル値で返ります。
(補) clsPasteCal97 クラスの場合、正確に言えば「イベントプロシジャー」ではありません。
下記の『イベント通知 受領プロシジャー』 から
Call される「普通のサブプロシジャー」です。
|
|
【 イベント通知 受領プロシジャー( clsPasteCal97 のみ) 】 |
[ 97 ]
|
clsPasteCal97 クラスの場合、利用側のUserForm モジュール内に、下記のプロシジャーを用意する
必要があります。
Ver1.20 より SpinChange イベントが追加されました。
プロシジャー名は 固定 です(clsPasteCal97 と Event の間のアンダーバーは、2つ並べます)。複数の
UserForm で利用する場合は、各々のUserForm モジュール内に1つずつ用意する必要があります。
イベントが発生した際に、UserForm側が[ clsPasteCal97 ]クラスからイベント発生の通知を受け取る為の
窓口ルーチンです。ここから、[ GrpId / EventId ] の内容によって、各カレンダーのクリックイベント処理
ルーチン(上記)へ分岐していきます。
下記のプロシジャー名で [ Ctrl ]部分は任意です。 GrpId で指定した文字列
または その object の
名前などにすると良いでしょう。
Public Sub clsPasteCal97__Event _
( ByVal GrpId As String, ByVal EventId As String, ByVal DateVal As Date )
Select Case GrpId
Case "xxxx" ' Create メソッドで指定した GrpId 文字列
Select Case EventId
Case "Click"
Call
Ctrl_Click ( DateVal )
Case "SpinChange"
Call Ctrl_SpinChange ( DateVal )
Case Else
End Select
Case "yyyy"
‥‥‥
Case Else
End Select
End Sub
( GrpId )
UserForm上に、複数のカレンダーコントロールがある場合でも、この窓口ルーチンは『唯1つ』です。
どのカレンダーに対する通知なのかが返りますので、この[GrpId ]によって、各カレンダーのイベント
処理ルーチン へ 振り分けて下さい。
( EventId )
このクラスでは "Click" または "SpinChange"
が返ります。
( DateVal )
クリックした日付、または、切り替わった月の1日が返ります。
そのまま、各カレンダーのイベント処理ルーチンへ引き継いで下さい。
|
|
【 利用 方法 】 |
[ 2K ]
[ 2K ]
[ 2K ]
|
Private WithEvents MonthView1 As clsPasteCal
Private WithEvents DTPicker1 As clsPasteCal
'-------------------------------------------------------
Private Sub UserForm_Initialize ( )
Set MonthView1 = CreatePasteCal ( )
Set DTPicker1 = CreatePasteCal ( )
MonthView1.Create Frame1, Date
DTPicker1.Create Frame2, Date, , True, "yyyy/m/d (aaa)"
End Sub
Private Sub UserForm_Terminate ( )
MonthView1.Clear 'クラス解放【必須】
DTPicker1.Clear
Set MonthView1 = Nothing
Set DTPicker1 = Nothing
End Sub
'-------------------------------------------------------
Private Sub xxx ( )
If ( DTPicker1.ValueIsNull = False ) Then
MsgBox "選択した日付=" & Format
( DTPicker1.Value, "yyyy/m/d" )
End Sub
Private Sub MonthView1_Click ( ByVal DateVal As Date )
MsgBox "選択した日付=" & Format ( DateVal,
"yyyy/m/d" )
End Sub
|
[ 97 ]
[ 97 ]
[ 97 ]
[ 97 ]
|
Private MonthView1 As clsPasteCal97
Private DTPicker1 As clsPasteCal97
'-------------------------------------------------------
Private Sub UserForm_Initialize ( )
Set MonthView1 = CreatePasteCal97 ( )
Set DTPicker1 = CreatePasteCal97 ( )
MonthView1.Create Me, "MonthView1", Frame1, Date
DTPicker1.Create Me, "DTPicker1", Frame2, Date, , True, "yyyy/m/d
(aaa)"
End Sub
Private Sub UserForm_Terminate ( )
MonthView1.Clear 'クラス解放【必須】
DTPicker1.Clear
Set MonthView1 = Nothing
Set DTPicker1 = Nothing
End Sub
'-------------------------------------------------------
Private Sub xxx ( )
If ( DTPicker1.ValueIsNull = False ) Then
MsgBox "選択した日付=" & Format
( DTPicker1.Value, "yyyy/m/d" )
End Sub
'---------------------------------------------------------
'clsPasteCal97クラス利用の場合、下記【MonthView1_Click 】はイベント
'プロシジャーではありません。[イベント通知受領プロシジャー]を通してCall
'される、通常のサブプロシジャーです。
Private Sub MonthView1_Click ( ByVal DateVal As Date )
MsgBox "選択した日付=" & Format ( DateVal,
"yyyy/m/d" )
End Sub
'===============================================================
'===== イベント通知受領プロシジャー(Public) ==========================
'===============================================================
'[clsPasteCal97]クラスでは、[clsPasteCal97]クラスに登録した全てのコントロールの
'イベントが、この
' 通知受領プロシジャー [clsPasteCal97__Event]
<名称固定>
'を通して送られてくる。
'[GrpId/EventId]によって、所定のカレンダーのイベントプロシジャーに分岐させる。
'(通知受領プロシジャーは、名前の重複を防ぐ為に敢えてアンダーバーを2つ繋げている)
Public Sub clsPasteCal97__Event _
( ByVal GrpId As String, ByVal EventId As String, ByVal DateVal As Date )
Select Case GrpId
Case "MonthView1"
Select Case EventId
Case "Click"
Call
MonthView1_Click ( DateVal )
' Case "SpinChange"
' Call MonthView1_SpinChange
( DateVal )
Case Else
End Select
' Case "xxxx"
' Select Case EventId
' Case "Click"
' Call xxxx_Click
( DateVal )
' Case "SpinChange"
' Call xxxx_SpinChange
( DateVal )
' Case Else
' End Select
Case Else
End Select
End Sub
|