( Ver 1.2 で x64 対応になりました )
API を使わずクラスのみで実装し、イベント処理も可能な 『カレンダークラスアドイン』 もあります。
DTPikcer / MonthView 2つの形式が指定できます。
MonthView コントロールは、元々Windows(IE) が持っているコモンコントロールですので、API を
使う事で呼び出す事ができます。「VisualBasic が有ると利用できる」というのは、
「この面倒くさいAPI 回りの処理を隠蔽したActiveXコントロールとして実装されるので、
ユーザーはVBE上で簡単に貼り付けたり、プロパティ操作だけで利用できる。」
という事です。
逆に言えば、小難しいAPI 処理を厭わなければ、VisualBasic が無くても利用できるという事
になります。
この方法を使うと、アドインソフトもAccess/VisualBasic も必要なく、どのPCであってもカレンダー
コントロールが利用できます。この事は、作成したブックを他のPCへ持って行く場合に、
・相手PCの環境(アドインソフト/Access/VisualBasic の有無)
・配布方法(アドインソフトのインストールや参照設定)
に気を使う必要が無いという事です。
ここで紹介するのは、[API でDTPicker利用]で使った井上 治さん&青山 彩さんによる、VBA/UserForm向け移植
方法を参考にして、 VersionUpのAKIさんが公開している 「MonthViewコントロールをAPI で実装するクラス」
[ Home / Visual Basic / Class Library / Common Control / clsMonthView - MonthViewクラス ]
のソースを基に、 角田がVBA/UserForm向けに編集/移植したものです。
サンプルブック( MonthViewClass_V12.zip 65KB ) (2011/9/27 Ver1.2)
2004/ 5/ 4 Ver 1.0 初版
2005/ 3/10 Ver 1.1 解説文・クラスソース・サンプルソースにおいて、オブジェクト定義時での[New]指定
を止めて、Initialize 時にインスタンス生成(Set ステートメント)するように修正しました。
2011/ 9/27 Ver 1.2 API 周りの処理を修正して x64 動作可としました。
Ver1.0/1.1 のサンプルブックに [CommonControls2.6.0] の参照設定が付いていましたので
削除しました(これは Ver1.0 開発時に ActiveX版のMonthViewを使った際のゴミです)
※ アドイン化しました [ 2005/3/8 初版 ] [ 2011/9/27 x64対応版で再構築 ]
【 この手法の基本的な考え方 】
1.MonthView コントロールは実行時(UserFormの表示時)に動的に生成します。
2.したがって、フォーム設計時にはコントロールを貼り付け出来ません。
3.しかし、これでは MonthViewコントロールを「どこにどのサイズで作る」のか決められません
ので、代わりにLabel を貼り付けて設計します。
4.フォーム表示時に、このLabel の左上端を基点にしてMonthViewコントロールを動的に生成
します。MonthViewコントロールはサイズが決まっています(縁の3D/Flat表示、複数月表示
などの条件によって変わります)ので、DTPicker の場合のように土台となるコントロールの大
きさは関係ありません。Label は基点を定める為だけに使っていますので、表示した際に、
はみ出さなければ、どのような大きさにしておいても構いません。
5.しかし実際には、MonthView以外のコントロールの配置を決める為にも、Label のサイズを
MonthViewと同じサイズにしておく必要があります。
6.MonthViewのサイズは表示させてみないと判りませんが、この移植したMonthViewクラスには、
自身のサイズをMsgBox で表示するメソッドを組み込んでありますので、設計時に仮に表示さ
せてやる事で調べる事ができます。
(1) 最初、適当な大きさでLabel を配置しておきます。
(2) [UserForm_Click ]イベントに「 MonthView1.DispNecessarySize 」と記述します。
("MonthView1" はクラスオブジェクトとして定義したオブジェクト変数名)
(3) VBE の[実行]等で、テスト的にUserFormを表示させたら、UserForm をクリック
すると、必要サイズがMsgBox で表示されますので、その値を控えておきます。
(4) 上記の[UserForm_Click ]イベントは、もう不要なので削除し、Label のサイズを
直しておきます(実際は、はみ出さないように1ポイント位、小さめにして下さい)。
7.現在の所、この手法で作成したMonthView コントロールに対するイベント処理(MonthView
で日付を指定した時に何かの処理をする等)は行なえません。したがって、他のイベント処理
(コマンドボタンのClick イベント等)内で、MonthView コントロールの内容を「参照する」とい
う使い方しか出来ません。
(注意事項)
(1) この方法では、フレーム/マルチページ上のラベルに[MonthView]を載せる事が出来ません。
フレーム/マルチページへの配置は控えて下さい。
(2) この方法で作成したMonthView コントロールは、タブ送り(Tab/Shift+Tab)の流れには
入りません。マウスクリックでのみアクセス出来ます。
【 この手法の使い方 】
※ アドイン化したクラスモジュールを利用する場合は下記のインポート作業は不要です。
1.先ず、上記のサンプルブックをダウンロードして下さい。
2.利用するブックのVBEでユーザーフォームを用意してください。
3.そのユーザーフォームには上記で説明したように、[MonthView ]コントロールを貼り付けたい
位置に、代わりのラベルを貼り付けます。
4.その後、サンプルブックからモジュールをコピーします。
サンプルブックを開いてVBEを見ると
左記のモジュール構成になっています。
(1) 先ず、クラスモジュール[clsMonthViewOnLabel]を適当なフォルダへエクスポート
します。
(2) 次に、利用先ブック内に、このクラスモジュールをインポートします。
(3) [UserForm1]のコードウィンドウを開き、中のコードを全て利用先ブックのユーザーフォーム
モジュール内にコピーして下さい。
5.クラスモジュール[clsMonthViewOnLabel]の内容は一切変更する必要はありません。
(補) MonthView はサイズが大きいので、DTPicker のように、1フォーム内で幾つも配置
するというような使い方は無いと思います。したがって、このMonthView の利用サンプ
ルでは、DTPicker のようにコレクション化はしていません。クラスオブジェクトの定義も、
クラス廃棄処理もUserFormモジュール内で行なうようにしてあります。
そのお陰で、DTPicker(Ver1) では複数のUserFormで利用する場合に必要とされた修正
は、このMonthViewでは必要ありません。
6.サンプルブックの[UserForm1]のコードは下記になります。このサンプルでは、2つの
MonthView を使いますので、クラスオブジェクトを2つ用意しています。
Private MonthView1 As clsMonthViewOnLabel
Private MonthView2 As clsMonthViewOnLabel
Private Sub UserForm_Initialize()
'クラスインスタンス生成
'標準(Flat表示,1ヶ月分,日付範囲なし)
Set MonthView1 = New clsMonthViewOnLabel
With MonthView1
.Cmd = Label1
.UserForm = Me
.Create ' MonthViewを生成
'初期表示を本日日付以外にする場合は、Create後の
'この位置で[Value]プロパティに代入する
' .Value = DateValue("2003/8/10")
End With
'3D表示,4ヶ月分(2*2),日付範囲(7日間迄)入力
Set MonthView2 = New clsMonthViewOnLabel
With MonthView2
.Cmd = Label2
.UserForm = Me '[Create]
' 1op:3D表示, 2op:行数, 3op:列数, 4op:MultiSelDays
.Create True, 2, 2, 7 ' MonthViewを生成
'初期表示を本日日付以外にする場合、
'MultiSelect指定の場合は[Value]の代わりに
'[SelStart/SelEnd]を使う
' .SelStart = DateValue("2003/8/10")
' .SelEnd = DateValue("2003/8/10")
End With
End Sub
Private Sub UserForm_Terminate()
'クラスインスタンス廃棄
MonthView1.Destroy
Set MonthView1 = Nothing
MonthView2.Destroy
Set MonthView2 = Nothing
End Sub
7.[Create ]メソッドの引数
このMonthView クラスのCreate メソッドには4つの引数があります(全て省略可)。
Create ( [ MV3D As Boolean ],
[ MVRows As Integer ], [ MVColumns As Integer ],
[ MVMultiSelDays As Integer ] )
MV3D カレンダーを立体表示(凹形状)にするか、フラット表示にするかの
指定です(立体表示にすると縁の分だけ丈/幅が大きくなります)。
False : フラット表示(既定)
True : 立体表示
MVRows /
MVColumnsカレンダーを縦/横に幾つ並べるかの指定です。既定は1です。
1ヶ月分で良い場合は、省略するか、両方に1を指定します。
最大で12ヶ月分まで指定(Rows×Columns ≦ 12)できます。
MVMultiSelDays 1日付の選択の場合には、省略または1を指定します。
日付範囲選択の場合には、2以上を指定します。
指定した日数までが選択可能です。
8.[MonthView ]コントロールの値の取得/設定では、Create 時の引数[MVMultiSelDays ]の
指定(1日付の選択か、日付範囲の選択か)によって使うプロパティが異なります。
・MVMultiSelDays = 1 : 1日付の選択
『Value プロパティ(シリアル値)』を通して行ないます。
・MVMultiSelDays ≧ 2 : 日付範囲の選択
『SelStart / SelEnd プロパティ(シリアル値)』を通して行ないます。
このMonthView クラスで使える、その他のプロパティ(Create メソッド後に利用可)
MinDate / MaxDate 日付選択可能範囲を指定します(シリアル値)。
この範囲を越える月には切替できません。
既定は[1900/1/1〜9999/12/31]です。
StartOfWeek カレンダーの左端を何曜日から始めるかを指定します。
vbSubday, vbMonday, 〜 vbSaturday で指定します。
既定は[vbSunday]です。
MaxSelCount 日付範囲モードの場合での選択可能最大日数です。
Create メソッドの指定(MVMultiSelDays )で設定済みですが、
後から最大日数を変更するような場合には、ここに日数を指定
すれば変更できます。
NecessaryHeight /
NecessaryWidthMonthView コントロールの表示サイズを取得できますが、
DispNecessarySize メソッド(「基本的な考え方 6項」参照)
を実行すれば、MsgBoxで、この内容が表示されますので、
敢えて利用する必要はありません。
9.MonthView の配色を変更
MonthView のタイトルバー色やカレンダー文字色などを変更する事ができます(1UserForm
内の複数のMonthView を個別に配色変更できます)。
プロパティにカラー値を代入すれば、下記のような配色にする事が可能です(前月/翌月部分
を非表示にする場合は、前月/翌月文字色をカレンダー部分の背景色と同じにします)。
配色変更用プロパティには
の5つがあります。
CalendarForeColor カレンダー部分の文字色 CalendarBackColor カレンダー部分の背景色 CalendarTitleForeColor タイトルバー(年月)の文字色 CalendarTitleBackColor タイトルバーの背景色・曜日の文字色・選択日付のマーク色 CalendarTrailingForeColor [前月/翌月]部分の文字色
Initialize イベントで、MonthViewクラスの【 Create 】後にカラー値を設定して下さい。
カラー値の指定では
・16進定数
・「vbWhite , vbBlack 」などのカラー定数
・「vbButtonFace , vbWindowText 」などのシステムカラー定数
で指定して下さい。
(設定例:上図の左下の場合)
With MonthView1
.CalendarForeColor = &H0& 'または vbBlack
.CalendarBackColor = &HFFFFFF 'または vbWhite
.CalendarTitleForeColor = &H0& 'または vbBlack
.CalendarTitleBackColor = &HC0C0&
.CalendarTrailingForeColor = &HFFFFFF 'または vbWhite
End With
サンプルブックのサンプルフォームに配色変更ボタンを追加してありますので、実際に配色を
決める際の参考ツールとして使って下さい。
10.MonthView コントロールでは、年月を切り替えるのに左右方向のスピンボタンをクリックして
月単位でシフトさせますが、他に「年」「月」を直接指定する事もできます。
タイトル部の「年」「月」の部分をクリックすると、
「年」‥‥‥上下方向のスピンボタンが現われて、年単位でシフトできます。
「月」‥‥‥1月〜12月のポップアップリストが現われて、直接その月にシフトできます。
※ クラスモジュールで使っているAPI の詳細(SendMessage のメッセージ内容)を知りたい方は
MSDN Library / Month Calendar Control Reference (英語)
を参照して下さい。
==========================================================================
[ clsMonthViewOnLabel ] クラス メソッド/プロパティ一覧
==========================================================================
下記で[ object ]の部分には、clsMonthViewOnLabel クラスを定義したオブジェクト変数を記述します。
【 定 義 】 UserForm モジュールの宣言セクション(モジュールの先頭)で、下記のように定義します。
Private object As clsMonthViewOnLabel
( object )
任意の名前を指定して下さい。
[ Initialize ] イベントプロシジャーにて下記のようにしてクラスのインスタンスを作成します。
Set object = New clsMonthViewOnLabel
※ アドイン化したクラスを利用している場合は、New キーワードを使わずに下記のようにします。
Set object = CreateMonthViewCls ( )
(CreateMonthViewCls 関数は、クラスアドイン で用意してある関数です)
【 メソッド 】 object .Create [ MV3D ] , [ MVRows ] , [ MVColumns ] , [ MVMultiSelDays ]
Cmd プロパティで登録したラベル上に MonthView を作成するメソッドです。
Cmd および UserForm プロパテイの後に実行して下さい。
( MV3D )
カレンダーを立体表示(凹形状)にするか、フラット表示にするかの指定です。
立体表示にすると縁の分だけ丈/幅が大きくなります。
False : フラット表示(既定)
True : 立体表示
( MVRows および MVColumns )
カレンダーを縦/横に幾つ並べるかの指定です。省略時の既定は1です。
1ヶ月分で良い場合は、省略するか、両方に1を指定します。
最大で12ヶ月分まで指定(Rows×Columns ≦ 12)できます。
( MVMultiSelDays )
1日付の選択の場合には、省略または1を指定します。
日付範囲選択の場合には、2以上を指定します。
指定した日数までが選択可能です。
MVMultiSelDays の設定値は、Create メソッドで指定した後でも、MaxSelCount プロパティで
変更できます(ただし、MVMultiSelDays ≧ 2 を指定した場合のみ)。
object .Destroy
作成したMonthView ウィンドウを破棄する、などの終了処理です。
UserForm の[Terminate ]イベントで必ず実行して下さい。
object .DispNecessarySize
MV3D/MVRows/MVColumns で指定した条件で作成されるMonthView ウィンドウのサイズを
MsgBox で表示します。
「基本的な考え方:6項」を参照して下さい。
【 プロパティ 】 object .Cmd [ = MsForms.Label コントロール ]
MonthView を載せる「ラベル」コントロールを[ clsMonthViewOnLabel ]クラスに指定する
プロパティです。ひとつの clsMonthViewOnLabel クラスオブジェクトに対して、ひとつの
ラベルが指定できます。
Create メソッドの前に設定して下さい。
値の設定と取得が可能です。
( 値の設定 )
MonthView の土台として用意した ラベル を指定します。
( 値の取得 )
MonthView の土台として指定した ラベル を返します。
object .UserForm [ = MsForms.UserForm オブジェクト ]
MonthView を載せる「UserForm 」を[ clsMonthViewOnLabel ]クラスに指定するプロパティです。
Create メソッドの前に設定して下さい。
値の設定と取得が可能です。
( 値の設定 )
自UserFormを指定します。実際には [ Me ] キーワードを指定して下さい。
( 値の取得 )
自UserFormが返ります。
object .Value [ = Date ]
MonthView コントロールの日付(シリアル値)を取得/設定するプロパティです。
Value プロパティは、Create メソッドにおいて[MVMultiSelDays = 1, もしくは省略]を
指定した場合に日付の取得/設定を行なうプロパティです。
値の設定と取得が可能です。
( 値の設定 )
MinDate/MaxDate プロパティで設定した「入力可能範囲」を越える日付は
設定できません(Value プロパティに代入しても値は変化しません)。
( 値の取得 )
MonthView で選択されている日付がシリアル値で返ります。
object .SelStart [ = Date ]
object .SelEnd [ = Date ]
MonthView コントロールの日付(シリアル値)を取得/設定するプロパティです。
SelStart / SelEnd プロパティは、Create メソッドにおいて[MVMultiSelDays ≧ 2]を指定
した場合に日付選択範囲の取得/設定を行なうプロパティです。
SelStart には選択範囲の先頭日付が、SelEnd には選択範囲の最終日付が入ります。
値の設定と取得が可能です。
( 値の設定 )
MinDate/MaxDate プロパティで設定した「入力可能範囲」を越える日付は
設定できません(SelStart / SelEnd プロパティに代入しても値は変化しません)。
( 値の取得 )
MonthView で範囲選択されている先頭日付(SelStart ) / 最終日付( SelEnd )がシリアル値で
返ります。
object .MinDate [ = Date ]
object .MaxDate [ = Date ]
MonthView コントロールで入力できる日付範囲を指定するプロパティです。
Create メソッド実行後に設定/取得できます。
値の設定と取得が可能です。
( 値の設定 )
MonthView の入力可能範囲の下限/上限日付をシリアル値で指定します。
このプロパティを指定しない場合の既定は[1900/1/1〜9999/12/31]です。
( 値の取得 )
MonthView に設定されている入力可能範囲の下限/上限日付ががシリアル値で返ります。
object .StartOfWeek [ = Integer ]
カレンダーの左端を何曜日から始めるかを指定するプロパティです。
既定は「日,月,‥‥,土」並びです。
Create メソッド実行後に設定/取得できます。
値の設定と取得が可能です。
( 値の設定 )
カレンダーの左端に来る曜日を[ vbSunday(1) 〜 vbSaturday(7) ]で指定します。
このプロパティを指定しない場合は[ vbSunday(1) ]が既定になります。
( 値の取得 )
カレンダーの左端に来る曜日が[ 1 〜 7 ]の数値で返ります。
object .MaxSelCount [ = Long ]
日付範囲モードの場合での選択可能最大日数です。Create メソッドの指定(MVMultiSelDays )で
設定済みですが、後から最大日数を変更するような場合には、このプロパティに日数を指定すれ
ば変更できます(ただし、Create メソッドで MultiSelDays ≧ 2 を指定した場合のみ)。
Create メソッド実行後に設定/取得できます。
値の設定と取得が可能です。
( 値の設定 )
Create メソッドで MultiSelDays ≧ 2 を指定した場合のみ設定できます。
実行中に選択可能最大日数を変更する場合に利用します。
( 値の取得 )
選択可能最大日数が返ります。
object .NecessaryHeight [ = Double ]
object .NecessaryWidth [ = Double ]
MV3D/MVRows/MVColumns で指定した条件で作成されるMonthView ウィンドウのサイズを
取得できますが、DispNecessarySize メソッド(「基本的な考え方 6項」参照)を実行すれば、
MsgBoxで、この内容が表示されますので、敢えて利用する必要はありません。
値の取得のみ可能です。
( 値の取得 )
MonthView のウィンドウサイズ(高さ/幅)が返ります。
object .CalendarForeColor [ = Long ]
object .CalendarBackColor [ = Long ]
object .CalendarTitleForeColor [ = Long ]
object .CalendarTitleBackColor [ = Long ]
object .CalendarTrailingForeColor [ = Long ]
MonthView コントロールの配色を変更するプロパティです。Create メソッド実行後に設定/取得できます。
値の設定と取得が可能です。
[ CalendarForeColor ]
カレンダー部分の文字色
[ CalendarBackColor ]
カレンダー部分の背景色
[ CalendarTitleForeColor ]
タイトルバー(年月)の文字色
[ CalendarTitleBackColor ]
タイトルバーの背景色・曜日の文字色・選択日付のマーク色
[ CalendarTrailingForeColor ]
[前月/翌月]部分の文字色(CalendarBackColor と同色にすれば非表示にできます)
( 値の設定 )
MonthView に設定する色を
・16進数 などの数値 もしくは RGB関数
・vbWhite , vbBlack などのカラー定数
・vbButtonFace , vbWindowText などのシステムカラー定数
の何れかで指定します。
( 値の取得 )
MonthView に設定されている色が数値で返ります。
|
||
角田 桂一 Mail:addinbox@h4.dion.ne.jp CopyRight(C) 2001 Allrights Reserved. |