【 擬似からの脱却 】 [ Breakthrough in the Pseudo-Control Arrays ]
[ clsBpca の 軌跡 ] [ 前頁 , 次頁 , §1 , §2 , §3 , §4 , §5 , §6 , §7 , §8 , §9 , §10 , §11 , §12 ]
[ 汎用クラス , トグルラベル クラス , Focus クラス , クラス アドイン , カレンダー クラス ] [ 質問はメールへ ]
( このクラスは Win32-API を使っていないので、x64 でも動作します )
( 2014/5/29 [ 山の日 ] 改正による祝日判定ロジックの修正を施しました )
( 2018/4/29 [ 天皇誕生日の変更 ] 改正による祝日判定ロジックの修正を施しました )
( 2018/6/26 [ 体育の日 改名 / 東京五輪による祝日移動(2020年) ] 改正による祝日判定ロジックの修正を施しました )
( 2018/12/9 [ 即位関連休日 ] 改正による祝日判定ロジックの修正を施しました )
( 2020/11/28 [ 東京五輪による祝日移動(2021年) ] 改正による祝日判定ロジックの修正を施しました )
Access も要らない、VB も要らない、API なんて使わない、
必要なのは 「Frame コントロール」 唯一つ!
このカレンダークラス[ clsPasteCal / clsPasteCal97 ]は、MonthView/DTPicker コントロールの
代わりに使用できるカレンダーコントロールをUserForm上へ動的に生成します(このクラスはアド
インとしての提供のみです。ソースコードは公開していません)。
以前から公開していた「貼付暦アドイン」にBpca手法を採り入れてクラス化したものですが、クラ
ス化により、Click イベントをユーザー側へ通知する事が可能となり、入力系コントロールとして利
用できるようになりました。直接ユーザーフォームに組み込んで利用したり、ktCalDate 関数のよ
うなポップアップカレンダーツールを独自にカスタマイズしたりして利用してください。
利用方法は、
(1) ktClsPasteCal.xla または ktClsPasteCal97.xla への参照設定を行なう。
(2) ユーザー側でUserForm上にフレーム(Caption 無し)を用意する。
(カレンダーに背景色を付ける場合は、フレームの背景色を変更してください)
(3) そのフレームに対して[ clsPasteCal / clsPasteCal97 ]クラスを適用する。
(4) Click イベント/Value プロパティ により日付を取得する。
と簡単です(貼付暦アドインでは、フレーム内にスピンボタンを用意する必要がありましたが、こ
のクラスではスピンボタンも動的に生成しますので、ユーザー側で用意する必要はありません)。
また、主な特徴として、
(a) MonthView スタイルと DTPicker スタイルの2種類をサポート。
(b) 「日月→土」と「月→土日」の2種類の曜日並びをサポート。
(c) 日本語版では、祝日は自動算出。
別途、休日リストを用意すれば、年末年始や創立記念日などを追加できます。
これらの日付は赤色で表示され[ControlTipText]で休日名が表示されます。
(休日リストの作成ツールを用意してあります。デモブックからも実行できます。)
(d) 日付入力操作は、マウス位置の強調表示による【ワンクリック入力】。
などが挙げられます。
【 MonthView スタイル 】
[ Width=108 , Height=105 ]のフレームを用意してください。
左側のスピンボタンで「年」、右側のスピンボタンで「月」が移動します。マウス位置は強調
表示され、クリックすると『Click イベント』が発生します。選択日付(Value プロパティで取
得できます)は右下に表示されます(年月を移動すると選択日付はキャンセルされます)。
MonthView スタイルカレンダーを2つ並べて「期間入力フォーム」を簡単に作れます。
デモブックにサンプルフォームとして下記を用意してありますので、そのまま利用して下さい。
【 DTPicker スタイル 】
[ Width=108 , Height=20 ]のフレームを用意してください。カレンダーをドロップダウンした
場合には[ Height=125 ]になりますので、フレームの下側に【 105 】の余裕が必要になりま
す。その余裕部分に他のコントロールを配置しても構いません。カレンダーのドロップダウン
時には、それらのコントロールに覆い被さる形で表示されます。ドロップボタンのクリックでカ
レンダーの表示/非表示が切り換わります。日付をクリックすると、カレンダーが畳まれて、テ
キストボックス部分に日付が表示されます(この日付の表示形式は引数で変更できます)。
尚、テキストボックス部分のフォントサイズは変更できません。
(注) DTPicker スタイルはコンパクトサイズなので、ついフォーム上に沢山配置しがちになるかと思いますが、
あまり多く配置するとフォーム表示の際のレスポンスが悪くなる可能性があります(1つに付き49個のコン
トロールを動的に作成していますので、例えばフォーム上に10個配置すると、フォーム表示の度に490個
のコントロールが動的に作成される事になります。スペックの低いPCではかなり反応が悪くなると思います)。
そのような場合は、ポップアップカレンダーフォームを作り、テキストボックスのダブルクリック等で呼び出す
方法を採ってください。(ポップアップカレンダーフォームの作り方はデモブック内に用意してあるサンプル
を参照してください)。
(2012/2/18 追記)
(注) ドロップカレンダー部が Frame , MultiPage , ListBox の背後に隠れてしまう場合があります。
Frame, MultiPage, ListBox を DTPicker スタイルの下に
配置していると、ドロップダウンカレンダー部が、その背後
に隠れてしまう場合があります。
MultiPage等を ZOrder=最背面にしても隠れてしまう場合が
あります。
DTPikcer スタイルでは
Frame コントロールは ZOrder に係わらず他のコントロールよりも前面に表示される
という特性を利用して実現しています(この特性があるので、TextBox 等があっても、それにオーバーラップしてドロップ
ダウンカレンダー が表示されるという動きになっています)。これは、他のコントロールとは異なり、Frame コントロールが
ウィンドウハンドルを持つコントロールである事に由来していると思われます。MultiPage と ListBox もウィンドウハンドル
を持つので他のコントロールよりも前面に表示されます。その為に、ドロップダウンカレンダー部分に MultiPage, ListBox
(当然そこには Frame も含まれます)があると、「他コントロールよりも前面に表示される」という動きを阻害することとなり、
結果として、ドロップダウンカレンダーが MultiPage, ListBox, Frame の背後に隠れてしまうという症状になります(尚、Multi-
Page, ListBox, Frame コントロールの数によって、隠れたり隠れなかったりと、その症状は一定しませんので、この点も注意
してください)。
この問題は回避できませんので、DTPicker スタイルの下(ドロップカレンダーが被さる範囲)には Frame,MultiPage, ListBox
を配置しないように レイアウト を工夫してください。フォームの設計上どうしても避けられない場合には、DTPicker スタイル
を取り止めて『MonthViewスタイルを使ったポップアップカレンダーフォーム』を利用してください。
[ clsPasteCal / clsPasteCal97 ] クラス アドイン & サンプル ブック : ktClsPasteCal_V170.zip (ReadMe)
カラーパレット フォームを作成する『パレット クラス』が付属しています。
( 2005/5/12 Ver1.00 )
( 2005/5/20 Ver 1.10 ) 「昭和の日」対応、休日リスト機能の強化、パレットクラスの追加
( 2005/6/3 Ver 1.11 ) 機能変更はありません。日本語/英語版 切替用の[条件付コンパイル]記述の廃止。
( 2005/6/14 Ver 1.20 ) ValueIsNull プロパティのバグ修正、 SpinChange イベント/CalMonth プロパティの追加。
( 2014/5/29 Ver 1.30 ) 「山の日」 改正への対応
( 2018/4/29 Ver 1.40 ) 「天皇誕生日の変更」 改正への対応
( 2018/6/26 Ver 1.50 ) 「体育の日 改名 / 東京五輪による祝日移動(2020年)」改正への対応
( 2018/12/9 Ver 1.60 ) 「即位関連休日」 改正への対応
( 2020/11/28 Ver 1.70 ) 「東京五輪による祝日移動(2021年)」改正への対応
[ この場所へのリンク ]
※ ktClsPasteCal.xla / ktClsPasteCal97.xla の二次配布について
ユーザーが「このカレンダークラスモジュールを利用して作成したブック/マクロ」を第三者へ配布する際、
その配布ファイル内に [ ktClsPasteCal.xla / ktClsPasteCal97.xla ] を含める事を、下記条件の下に許可
します。
(1) 基本事項
(a) [ ktClsPasteCal.xla / ktClsPasteCal97.xla ] の内容を一切改変しない事。
(b) ユーザーが作成したソフトに添付される「そのソフトの ReadMe 等」の解説媒体に、以下の記述を
掲載する事。
カレンダークラスアドイン [ ktClsPasteCal.xla および ktClsPasteCal97.xla ] は
角田 桂一 の著作物です。
[ AddinBox ] http://addinbox.sakura.ne.jp/
http://addinbox.sakura.ne.jp/Bpca_PasteCal.htm
-- 旧サイト -- [ http://www.h3.dion.ne.jp/~sakatsu/ ]
(2) 社内利用など、限られた範囲への配布の場合には、自由に配布して構いません。
(3) 個人が作成するフリーソフト/シェアソフトとしての配布の場合には、自由に配布して構いません。
(4) 企業が作成する販売ソフトでの利用について
(a) 企業が 商用ソフト(シェアソフト含む)として不特定多数のユーザーに向けて販売するソフトウェア
に、このカレンダークラスアドインを利用する事は許可しません(企業が自前の技術で対処するの
が筋と考えます)。
(b) 企業が特定のユーザーへ納入するソフトウェアに、このカレンダークラスアドインを利用する事を
許可します。ただし、納入先ユーザーに対して、このアドインが
「 フリーで公開/配布されているものであり、自社で開発したものではない 」
という旨の説明をすると共に、納入ドキュメント内に (1-b) の記述を掲載する事が条件です。
==========================================================================
[ clsPasteCal / clsPasteCal97 ] クラス イベント/メソッド/プロパティ一覧
==========================================================================
Excel2000 以上では[ clsPasteCal ]クラスが利用できます。
Excel97 では[ clsPasteCal97 ]クラスを使って下さい(Excel2000 以上 と Excel97 の両方で使う場合を含む)。
下記で[ object ]の部分には、clsPasteCal/clsPasteCal97 クラスを定義したオブジェクト変数を記述します。
尚、[ 2K ]表記は clsPasteCal 用、[ 97 ]表記は clsPasteCal97 用、無印は共通 です。
利用するには、ktClsPasteCal.xla または ktClsPasteCal97.xla を参照設定する必要があります。
このクラスは Win32-API を使っていないので、x64 でも動作します。
【 定 義 】 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
==========================================================================
[ clsPalette / clsPalette97 ] クラス イベント/メソッド/プロパティ一覧
==========================================================================
clsPasteCal クラスと同様の手法を使うと、カラーパレットフォームを簡易に作成するクラスも
作れますので、おまけとして加えておきます(Ver1.10 〜)。
ポップアップパレットフォームとして利用する方法は、デモブックに用意してあるサンプルを
参考にしてください(そのままコピーすれば使えます)。
Excel2000 以上では[ clsPalette ]クラスが利用できます。
Excel97 では[ clsPalette97 ]クラスを使って下さい(Excel2000 以上 と Excel97 の両方で使う場合を含む)。
下記で[ object ]の部分には、clsPalette/clsPalette97 クラスを定義したオブジェクト変数を記述します。
尚、[ 2K ]表記は clsPalette 用、[ 97 ]表記は clsPalette97 用、無印は共通 です。
利用するには、ktClsPasteCal.xla または ktClsPasteCal97.xla を参照設定する必要があります。
【 定 義 】 [ 2K ] UserForm モジュールの宣言セクション(モジュールの先頭)で、下記のように定義します。
Private WithEvents object As clsPalette
( object )
任意の名前を指定して下さい。
[ Initialize ] イベントプロシジャーにて下記のようにしてクラスのインスタンスを作成します。
(New キーワードによるインスタンス作成はできません)
Set object = CreatePalette ( )
( CreatePalette 関数はアドインで用意してある関数です)
[ 97 ] UserForm モジュールの宣言セクション(モジュールの先頭)で、下記のように定義します。
WithEvents は付けません。
Private object As clsPalette97
( object )
任意の名前を指定して下さい。
[ Initialize ] イベントプロシジャーにて下記のようにしてクラスのインスタンスを作成します。
(New キーワードによるインスタンス作成はできません)。
Set object = CreatePalette97 ( )
( CreatePalette97 関数はアドインで用意してある関数です)
【 メソッド 】 [ 2K ] object .Create Frame , Book
Frame コントロール内にカラーパレットを作り込むメソッドです。
作成されるカラーパレット上の ColorIndex の並びは Excel と同じです。
( Frame )
カラーパレットを作り込む Frame オブジェクトを指定します。
Frame は [ Width=105 , Height=97 ]のサイズで用意します。
( Book )
Workbook オブジェクトを指定します。ここに指定したブックに設定されている配色が適用されます。
通常は ThisWorkbook を指定してください。特にブックを指定したい場合は、Workbooks コレク
ション や ActiveWorkbook などで指定してください。
[ 97 ] object .Create Caller , GrpId , Frame , Book
Frame コントロール内にカラーパレットを作り込むメソッドです。
作成されるカラーパレット上の ColorIndex の並びは Excel と同じです。
( Caller )
自UserForm を指定します。実際には「Me 」キーワードを記述して下さい。
(補) 引数[ Form ]はMsForms.UserForm型、引数[ Caller ]はObject型で受け取ります。
[ Caller ]はUserForm 内の「イベント通知受領プロシジャー」を呼び出す為のオブジェクト参照
に使っています(MsForms.UserForm型ではNGな為)。
( GrpId )
複数のカラーパレット(= 複数の[ object ])を使用する場合、そのコントロールを区別する
「文字列」を指定します。1つしか使わないならば「空文字: "" 」でも構いません。
( Frame ) 〜 ( Book )
clsPalette と同じ。
object .Clear
クラスの解放などの終了処理です。
UserForm の[Terminate ]イベントで必ず実行して下さい。
object .EmphasisRelease
「色」ボタンの強調表示(盛り上がり)を解除するメソッドです。
主に、Pop-Up カラーパレットフォームに利用した際に使います。そのフォームが Hide で閉じる処理
になっていると、次回フォームを表示した時に、クリックした「色」ボタンの強調表示が残ったままで表示
されてしまいます。この場合には、フォームの Activate イベント内で [ EmphasisRelease ] メソッドを
実行する事で強調表示を解除した状態でフォームを表示できます。
【 イベント 】 Private Sub object_Click ( ByVal ColorIdx As Integer, ByVal ColorVal As Long )
カラーパレット上の色をクリックした場合に発生するイベントです。
( ColorIdx )
クリックした色の ColorIndex 値(1〜56)が返ります。
( ColorVal )
クリックした色の Color 値( &H000000 〜 &HFFFFFF )が返ります。
(補) clsPalette97 クラスの場合、正確に言えば「イベントプロシジャー」ではありません。
下記の『イベント通知 受領プロシジャー』 から Call される「普通のサブプロシジャー」です。
【 イベント通知 受領プロシジャー( clsPalette97 のみ) 】 [ 97 ] clsPalette97 クラスの場合、利用側のUserForm モジュール内に、下記のプロシジャーを用意する
必要があります。
プロシジャー名は 固定 です(clsPalette97 と Event の間のアンダーバーは、2つ並べます)。複数の
UserForm で利用する場合は、各々のUserForm モジュール内に1つずつ用意する必要があります。
イベントが発生した際に、UserForm側が[ clsPalette97 ]クラスからイベント発生の通知を受け取る為の
窓口ルーチンです。ここから、[ GrpId ] の内容によって、各パレットのクリックイベント処理ルーチン
(上記)へ分岐していきます。
下記のプロシジャー名で [ Ctrl ]部分は任意です。 GrpId で指定した文字列 または その object の
名前などにすると良いでしょう。
Public Sub clsPalette97__Event _
( ByVal GrpId As String, ByVal EventId As String, _
ByVal ColorIdx As Integer, ByVal ColorVal As Long )
Select Case GrpId
Case "xxxx" ' Create メソッドで指定した GrpId 文字列
Call Ctrl_Click ( ColorIdx, ColorVal )
Case "yyyy"
‥‥‥
Case Else
End Select
End Sub
( GrpId )
UserForm上に、複数のカラーパレットがある場合でも、この窓口ルーチンは『唯1つ』です。
どのカラーパレットに対する通知なのかが返りますので、この[GrpId ]によって、各カラーパレットのイベント
処理ルーチン へ 振り分けて下さい。
( EventId )
このクラスでは "Click" が固定的に返ります。
( ColorIdx )
クリックした色の ColorIndex 値が返ります。
そのまま、各カラーパレットのイベント処理ルーチンへ引き継いで下さい。
( ColorVal )
クリックした色の Color 値が返ります。
そのまま、各カラーパレットのイベント処理ルーチンへ引き継いで下さい。
【 利用 方法 】
デモブック内のサンプルを参照してください。
[ 前頁 , 次頁 , §1 , §2 , §3 , §4 , §5 , §6 , §7 , §8 , §9 , §10 , §11 , §12 ]
[ 汎用クラス , トグルラベル クラス , Focus クラス , クラス アドイン , カレンダー クラス ] [ 質問はメールへ ]
[ Home へ戻る ]
|
||
角田 桂一 Mail:addinbox@h4.dion.ne.jp CopyRight(C) 2004 Allrights Reserved. |