ロゴ(青) Excel/VBA Tips ロゴ(緑)

  【 擬似からの脱却 】  [ Breakthrough in the Pseudo-Control Arrays ]

[ clsBpca の 軌跡 ] [ 前頁 , 次頁 , §1 , §2 , §3 , §4 , §5 , §6 , §7 , §8 , §9 , §10 , §11 , §12 ]
[ 汎用クラス , トグルラベル クラス , Focus クラス , クラス アドイン , カレンダー クラス ] [ 質問はメール]

  ====================================================================
    カレンダー クラスモジュール [ clsPasteCal / clsPasteCal97 ] リファレンス
  ====================================================================

( このクラスは 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 値が返ります。
      そのまま、各カラーパレットのイベント処理ルーチンへ引き継いで下さい。

 

利用 方法

 デモブック内のサンプルを参照してください。

 







  ====================================================================
    カレンダー クラスモジュール [ clsPasteCal / clsPasteCal97 ] リファレンス
  ====================================================================

[ 前頁 , 次頁 , §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.