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

Tips06: カレンダーコントロール色々

  カレンダーコントロールといえば、日付入力の際に非常に便利なコントロールですが、残念な事に
エクセルには含まれていません

  そこで、一般に使われているのはAccess に付属しているコントロールである『MSCAL.ocx 』です。
エクセル関係で普段カレンダーコントロールといえば『MSCAL.ocx 』を指します。ただし、当然の事
ですが、Access 付属のコントロールなので、Access の無い環境(OFFICE Personal )では利用でき
ません(Access がインストールされているコンピュータから、MSCAL.ocx のみを抜き出して他のコン
ピュータにインストールする行為はライセンス違反です
)。
    「Microsoft Access 使用許諾契約書」 より引用
    2. その他の権利と制限
      ・ 構成部分の分離
        本ソフトウェア製品は1つの製品として許諾されています。
        その構成部分を分離して複数のコンピュータで使用することはできません
 
    (補) Visual Studio 6.0 SP4 以降の環境で作成された VB 6 ソフトに対しては、そのソフトと共に
          MSCAL.ocx を再頒布することが許諾されています( KB 412867 の中程参照 )。


  VisualBasic がインストールされている環境ならば、VB付属のコントロールである
        『MonthView Control 』 と 『DTPicker (DateTimePikcer )
が利用できます。
  (補)   Visual Basic をインストールしていないのに、エクセルで[ DTPicker / MonthView ] が、コントロール
          ツールボックスの一覧に載っていて利用できる場合がありますが、これは、その PC に Visual Basic
          で作られた何らかのソフトがインストールされている為です。
            そのソフトを使うに辺り、[ DTPicker / MonthView ] を、その一部として含むライブラリ(mscomct2.ocx )
          が必要であり、そのソフトをインストールする際に一緒にインストールされた為です。
            これによって、偶々、エクセルからも見える状態になっているだけです。この場合、エクセルからの
          利用は「正規のライセンス」に基づくものではありませんので注意して下さい。Visual Basic がインス
          トールされている PC ならば、ライセンスを取得(購入)したPCですから、そのPCで使う分には許さ
          れる範囲と思われますが、Visual Basic がインストールされていないPCでは、VBで作ったソフトを
          使う為にのみ許諾された部品という扱いになりますので、これをエクセルから利用するのはライセン
          ス上の疑問が残ります。

            また、エクセルで使う為だけに、[ DTPicker / MonthView ] を含むライブラリ( mscomct2.ocx )を
          単独でコピー/インストールする行為はライセンス違反になります。このライブラリ は必ず VisualBasic
          で作られたソフトと一緒にセットで取り扱うようにライセンスで定められています。つまり、「VB ランタ
          イム」 ファイル をエクセルで使う目的で 他からコピーする行為はライセンス違反です。


            Vector や VB ソフト開発者HP 等から 「VB ランタイム」 のダウンロードが出来ますが、これは VB ソフト
          の配布ファイルが 『VB ランタイムを含まない形』 で提供されているケースに対して、その VB ソフトを実行
          する環境を整える事を目的としたものです。Excel や その他 VB 以外のソフトで利用する為のものではあ
          りません。

    「VisualBasic 使用許諾契約書」 より引用
  3.1.2 再頒布可能コード 使用範囲 Microsoft VisualBasic、‥‥について
    (中略) お客様はエンドユーザーに、使用範囲を広げた再頒布可能コードに重要かつ主要な
    機能を追加する使用許諾製品またはWebページと共におよびその一部としてのみ本ソフト
    ウェア製品の特定の部分(READIST.txt に 「使用範囲を広げた再頒布可能コード」 と指定され
    ている部分) をオブジェクトコードで複製および再頒布することを許可できます。
    上記の場合、お客様は以下の条項に従わなければなりません。
        (中略)
    (b) お客様のエンドユーザーは以下の条項に同意しなければなりません。
        (i) 使用範囲を広げた再頒布可能コードに重要かつ主要な機能を追加するエンドユーザー
            が開発したソフトウェア製品と共におよびその一部として、その再頒布可能コードを
            オブジェクトコードでのみ頒布しなければなりません。

  5.7 構成部分の分離
    本ソフトウェア製品は1つの製品として許諾されています。本契約書第1条の場合を除き、
    その構成部分を分離して複数のコンピュータで使用することはできません

  [ READIST.txt ]
    使用範囲を広げた再頒布可能コード:
      mscomct2.ocx
 



なお、[ MSCAL / DTPicker / MonthView ]コント
ロールは標準では「ツールボックス」に載って来ま
せんので、「ツールボックス」上で右クリックして
      「その他のコントロール」ダイアログ
でチェックを入れておく必要があります。


  Access もVisualBasic も無い環境では、
      ・ 自分で代用フォームを自作する
      ・ 「kt関数アドイン」のようなアドインソフトを利用する
      ・ APIを使って直接[ Windows のカレンダーコントロール]を呼び出す
といった方法を採る事になります。

 1. Access 付属の【 MSCAL.ocx 】
 2. Visual Basic 付属の【 DTPicker Control 】
 3. Visual Basic 付属の【 MonthView Control 】
 4. kt関数アドイン のカレンダー入力フォーム
 5. カレンダークラス アドイン
 6. その他の「カレンダー入力」フリーソフト
 7. カレンダー入力フォーム 基本コード (カレンダーフォームを自作したい人はコレを参考に)
 8. カレンダーフォームをクリックで呼び出す(MSCAL の例)
 9. (参考) Java Script によるカレンダー入力フォーム
10. (参考) Java Script によるカレンダー入力フォーム(2)  ( 2007/3/16 追記 )



[ この場所へのリンク ]
Access 付属の【 MSCAL.ocx 】
一月分のカレンダーを表示するコントロールです。
コンボボックスで年/月を切り替え、クリックした日付
のシリアル値は[Value プロパティ]で取得します。
このように、[MSCAL]だけを貼り付けたUserFormを
用意して、日付を入力するTextBox からDblClick で
呼び出すなどして利用するようにします。

  『 MSCAL.ocx プロパティ一覧 / 利用例

      [MSCAL]のヘルプは下記の場所にありますので、ショートカットを作っておくと便利でしょう。
          [ C:\Program Files\Microsoft Office\Office\MSCAL.hlp ]
                  (上記は、Windows98SE/Access2000 環境でのパスです)


[ この場所へのリンク ]
    Access がインストールされてる(Office Pro または Access単体)のに、上記ダイアログにカレンダーコントロールが
    表示されない場合には、カレンダーコントロールの追加インストールを行なって下さい(Office Pro または Access
    のCD-ROMを用意)。
        (a) コントロールパネルの「アプリケーションの追加と削除」を実行
        (b) アプリケーション一覧から、Office Pro(またはAccess )を選択
        (c) インストール選択で『機能の追加/削除』を選択
        (d) Access の一覧から「カレンダーコントロール」を選択して【マイコンピュータから実行】に設定を変更する



カレンダーコントロールのバージョンによって、互換性に問題があります。
    Access2000以前の[9.0]Access2002以降の[10.0]では、DayLength/FirstDay プロパティ
    同じ値でも結果が異なります(2004/2/9 追記)。  この不具合の回避方法はこちらを参照。
       参考HP : すぐに役立つエクセルVBAマクロ集 ( 解説ページ )
                      [ACC2002] カレンダーコントロールのプロパティの設定値で異なる結果が表示
                      補) [DayLength]の「設定値と表示内容」が上記で異なっていますが 『すぐに役立つ』の方が正しいです。

[ この場所へのリンク ]
VisualBasic 付属の【 DTPikcer
1月分のMonthView とTextBox が合体したコントロールです。
ドロップボタンをクリックするとMonthViewと同じ外観のカレン
ダーがポップアップします。必要な時だけカレンダーが出るので、
フォームレイアウト上、使い易いコントロールです。
普段の外観がコンボボックス形状なので、UserFormの中に
他のコントロールと一緒に配置して利用できます。





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

ここで紹介するのは、井上 治さんが、EUC(MOUGの前身)時代に、青山 彩さん
という方からアドバイスを受けたノウハウを元にして作ったコードです。

  VisualBasic が無い環境で『DTPicker 』コントロールを使う方法の解説 (Ver 3.2 )
     (2004/3/21 解説文見直し修正)
     (2004/4/26 日付編集文字列の解説を追加)
     (2004/4/27 配色変更用のプロパティを追加)
     (2004/5/2  配色変更でシステムカラーを指定可能に)
     (2004/6/5  Ver 2 をリリース)    旧Ver1 は こちら
     (2004/11/25 Ver 3 をリリース)
     (2004/11/25 Ver 3.1 をリリース)
     (2005/3/11 Ver 3.2 をリリース)

[ この場所へのリンク ]
VisualBasic 付属の【 MonthView Control
複数月を一度に表示させる事も出来るコントロールです。
日付選択も「クリックによる1日のみ」だけでなく、「マウスドラッグによる
複数日選択」も可能です。
このように、[MonthView]だけを貼り付けたUserFormを用意して、日付を
入力するTextBox からDblClick で呼び出すなどして利用するようにします。
VB不要でAPI により実装する方法  (2004/5/4 追記)
横に2ヶ月分表示させて、日付範囲選択を
している例です。





[ この場所へのリンク ]
kt関数アドインの【 ktCalDate 関数 】
( 「昭和の日」は Ver3.00 で対応しました )
MSCAL等のコントロールと違って、関数を呼び出すだけ
でポップアップするフォームです。祝日機能・入力期間
制限機能・六曜表示機能など既存コントロールには
無い機能が盛り沢山です。
利用方法は、ktCalDate 関数ヘルプ参照。

GIFアニメによるデモ画像
      〃            六曜モードのデモ画像


kt関数アドインの【 ktCalRepeat サブルーチン】
上記のカレンダーフォームを使って、フォームを表示したままで、セル範囲に連続的に日付入力
可能になりました  (Ver2.90〜)
利用方法は、ktCalRepeat サブルーチンヘルプ および kt関数メニュー:日付連続入力 参照。


kt関数アドインの【 ktMutiCal 関数 】
   (Ver2.80〜)
( 「昭和の日」は Ver3.00 で対応しました )
MonthView コントロールに相当するカレ
ンダーフォームです。期間日付の入力が
簡単にできます。勿論、祝日/営業日機能
搭載です。
利用方法は、ktMultiCal 関数ヘルプ参照
GIFアニメによるデモ画像
   
[ この場所へのリンク ]
(番外)入力には使えませんが、表示専用のアクセサリーとして、このようなツールも
            あります。『kt貼付暦アドイン/kt関数アドイン』の【 ktPasteCal( 「昭和の日」 対応済 )
            利用サンプル(kt関数アドインの休日マップ作成フォーム)


[ この場所へのリンク ]
カレンダークラス アドイン Ver1.20 】  ( 「昭和の日」 対応済 )
      Access も要らない、VB も要らない、API なんて使わない!
      必要なのは 『Frame コントロール』 唯一つ!

上記の「kt貼付暦アドイン」のクラス化によってイベント処理が追加され、入力系ツールとして
利用可能になりました。MonthView スタイルDTPicker スタイルの2種類をサポートします。



Ver1.20 のデモブックに、このクラスを
利用した「期間入力フォーム」のサンプル
を用意しました。


[ この場所へのリンク ]
【その他のカレンダー入力ソフト】
カレンダーコントロールを代替するフリーのアドインソフトは「kt関数アドイン」以外にも幾つか
公開されています。現時点で、私が把握している所では下記の4つがあります。

    MightyFrogさん  「超便利かれんだあ Ver3.10」  (公開終了)
            旧バージョン: MOUG内ソフトコーナー 超便利かれんだあ Ver3.00

    k窓 川口さん 「Excel 入力支援 kデート Ver2.15 」 
            バージョンアップしてシェアウェア『 k蘭 』になりました。「kデート」単体はVectorから

    藤代千尋さん 「CF 日付選択フォーム(DTPicker もどき)」
            ダウンロードは Excel ファンクラブ フリーソフトコーナー(4頁)から

    田舎モンさん  「カレンダーアドイン V2.00」
           ダウンロードページ「田舎モン 特産物」  解説



[ この場所へのリンク ]
【カレンダーフォーム】のサンプルコード  ( 2004/6/24 追記 )

    『擬似からの脱却』の「§11 その他のサンプルコード」にカレンダーフォームの基本コード
    紹介していますので参考にして下さい(ktCalDate と同じように、マウス位置が強調表示されて、
    ワンクリックで日付入力するタイプです)。

    尚、このサンプルコードは[ clsBpca ] クラスを利用したものです。[ clsBpca ]クラスの仕組み 及び
    使い方については『擬似からの脱却』をお読み下さい。

    [ clsBpca ]によるコントロール配列の代わりに、ラベルの[ Click / MouseMove ]イベントをクラスモ
    ジュールを使って擬似コントロール配列(§1〜§5 参照)にしても良いです。
 



[ この場所へのリンク ]
(参考)【Java Script によるカレンダー入力フォーム】  ( 2004/7/9 追記 , 2005/5/20 「昭和の日」 対応済 )
 All About Japan[ JavaScript ]高橋 登史朗さん )で紹介されている、
 JavaScriptによる日付入力ポップアップフォーム
「祝日表示(祝日判定ロジック JavaScript ) 他」の修正を加えたものです。
 
(補) この [ Java Script によるカレンダー入力 ] そのものは『高橋 登史朗 さん』の著作物です。
        利用許諾などの連絡を私のところへ頂く事がありますが、高橋さんの方へ確認して下さい
        私が追加した部分[ HolidayChk.js ]については、そのコード内に記載してあるように、コード内
        の Copyright 記述を含めたコメント を、そのまま残して頂ければ、それでOKです。


日付1〜3はテキストボックス内にカーソルを置くとフォームがポップアップします。
日付4は隣のボタンをクリックするとフォームがポップアップします。
使い方などの解説は[ All About Japan ]を参照して下さい。
  (レイヤー版)
    日付1:
    日付2:
    日付3:
    日付4:

  (サブウィンドウ版)
    日付5:
    日付6:

<< JavaScript コード >>
    2005/5/20 祝日判定コードを 「昭和の日」 対応で修正しました。最新版を DL し直して差し替えて下さい。
    祝日判定コード       : HolidayChk.js (昭和の日に関しては こちら 参照。)
    日付入力カレンダー (高橋さんのオリジナルに祝日強調表示の修正を加えてあります)
        レイヤー版 : calendarlay.js      サブウィンドウ版 : calendarsubwin.js
この3つのJavaScript ファイルを、ホームページ領域にダウンロードしておいて、次のようなHTMLを
記述すると、上記の入力ができます。
   (注) JavaScript ソース を見ると判りますが、レイヤー版/サブウィンドウ版ともに、「本日」を太字表示するように
          手直ししてあります。しかし、サブウィンドウ版では、Aタグのスタイル指定の関係で、Bタグが無効となり、
          太字表示にはなりません ( 2006/3/3 )。


 <HEAD>
   :
 <script src="HolidayChk.js" language="JavaScript"></script>
 <script src="calendarlay.js" language="JavaScript"></script>
 <script src="calendarsubwin.js" language="JavaScript"></script>
 </HEAD>
 <BODY>
   :
 <form name=calf1>
 日付1:<input name="e1" type="text"
              onFocus="wrtCalendarLay(this,event)"><br>
 日付2:<input name="e2" type="text"
              onFocus="wrtCalendarLay(this,event,'mm月dd日')"><br>
 日付3:<input name="e3" type="text"
              onFocus="wrtCalendarLay(this,event,'yyyy年mm月dd日(曜)')"><br><br>
 日付4:<input name="e4" type="text">
              <input type="button" value="入力用カレンダー"
                  onclick="wrtCalendarLay(this.form.e4,event)"><br>
 <br>
 (サブウィンドウ版)<br>
 日付5:<input name="e5" type="text" onFocus="wrtCalendar(this)"><br>
 日付6:<input name="e6" type="text">
              <input type="button" value="入力用カレンダー"
                  onclick="wrtCalendar(this.form.e6)"><br>

 </form>
   :
 </BODY>
 

 「何日目以降から入力可」をサポートするカスタマイズ版を利用される場合は下記を使って下さい。
    日付入力カレンダー : calendarlay2.js (入力有効日機能を追加した版に祝日強調表示の修正を加味)

 <script src="HolidayChk.js" language="JavaScript"></script>
 <script laguage="JavaScript">
    window.xDaysAfter = 7;    // (7日目以降が有効)
 </script>

 <script src="calendarlay2.js" language="JavaScript"></script>
 </HEAD>
 <BODY>
   :

  動作テストフォーム

 (注) 高橋さんの解説では[ window.xDaysAfter = 7; ]という風に書かれていますが、
      この書き方では私のPC(Win98SE IE5.5SP2,IE6SP1)で動作しませんでした(入力
      不可にならない)。しかし、他のブラウザ(Netscape, FireFox)では動作しました。
      window を省略して[ xDaysAfter = 7; ]と記述したらIEでも動作するようになりました。
 


[ この場所へのリンク ]
(参考)【Java Script によるカレンダー入力フォーム その2】  ( 2007/3/16 追記 )

    川崎有亮さん作の[ JKL.CalendarMOMさんによる改良版)] に、安達さんが私の祝日判定
    コードを反映させた改良版を紹介しています。
    詳細は上記の川崎さん・MOMさん・安達さんのHPをご覧下さい。

    日付:  (TextBox をクリックすると JKL.Calendar フォームがポップアップします)




 Home   Back Page   Next Page

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

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