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

Tips06-5: API で MonthView コントロールを利用する

  API を使わずクラスのみで実装し、イベント処理も可能な 『カレンダークラスアドイン』 もあります。
  DTPikcer / MonthView 2つの形式が指定できます。
( Ver 1.2 で x64 対応になりました )

  MonthView コントロールは、元々Windows(IE) が持っているコモンコントロールですので、API を
使う事で呼び出す事ができます。「VisualBasic が有ると利用できる」というのは、
        「この面倒くさいAPI 回りの処理を隠蔽したActiveXコントロールとして実装されるので、
          ユーザーはVBE上で簡単に貼り付けたり、プロパティ操作だけで利用できる。」
という事です。
  逆に言えば、小難しいAPI 処理を厭わなければ、VisualBasic が無くても利用できるという事
になります。
  この方法を使うと、アドインソフトもAccess/VisualBasic も必要なく、どのPCであってもカレンダー
コントロールが利用できます。この事は、作成したブックを他のPCへ持って行く場合に、
      ・相手PCの環境(アドインソフト/Access/VisualBasic の有無)
      ・配布方法(アドインソフトのインストールや参照設定)
に気を使う必要が無いという事です。


ここで紹介するのは、[API でDTPicker利用]で使った井上 治さん&青山 彩さんによる、VBA/UserForm向け移植
方法を参考にして、 VersionUpAKIさんが公開している 「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 /
    NecessaryWidth
MonthView コントロールの表示サイズを取得できますが、
DispNecessarySize メソッド(「基本的な考え方 6項」参照)
を実行すれば、MsgBoxで、この内容が表示されますので、
敢えて利用する必要はありません。
 

 9.MonthView の配色を変更
      MonthView のタイトルバー色やカレンダー文字色などを変更する事ができます(1UserForm
      内の複数のMonthView を個別に配色変更できます)。
      プロパティにカラー値を代入すれば、下記のような配色にする事が可能です(前月/翌月部分
      を非表示にする場合は、前月/翌月文字色をカレンダー部分の背景色と同じにします)。


      配色変更用プロパティには
CalendarForeColor カレンダー部分の文字色
CalendarBackColor カレンダー部分の背景色
CalendarTitleForeColor タイトルバー(年月)の文字色
CalendarTitleBackColor タイトルバーの背景色・曜日の文字色・選択日付のマーク色
CalendarTrailingForeColor [前月/翌月]部分の文字色
      の5つがあります。

      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 に設定されている色が数値で返ります。
 



 Home   Back Page   

ロゴ(ゴールド)   ロゴ(ゴールド)

角田 桂一 Mail:addinbox@h4.dion.ne.jp CopyRight(C) 2001 Allrights Reserved.