kt関数アドイン ヘルプ

【 §１ はじめに 】

kt関数アドイン (Ver 5.40) では以下の祝日変更までサポート しています。
( a ) 2019年施行の「天皇誕生日の変更」 12/23⇒2/23 (補：2019年には[天皇誕生日]はありません)
( b ) 2019年の徳仁親王の即位日(5/1) および
祝日に挟まれて「国民の休日」となる 4/30(平成天皇の退位日) ＆ 5/2 の２休日
( c ) 2019年の「即位の礼 正殿の儀 (10/22) 」
( d ) 2020年施行の「体育の日の改名」⇒スポーツの日
( e ) 東京五輪特措法による 2020年の「祝日移動」
( 海の日： 7/20 (3rd Mon) ⇒ 7/23 , スポーツの日: 10/12 (2nd Mon) ⇒ 7/24 , 山の日： 8/11 ⇒ 8/10 )
( f ) 東京五輪特措法による 2021年の「祝日移動」
( 海の日： 7/19 (3rd Mon) ⇒ 7/22 , スポーツの日: 10/11 (2nd Mon) ⇒ 7/23 , 山の日： 8/11 ⇒ 8/8 )

新元号 「 令和 」 をサポートしています。

また、Ver 5.00 から [ xlam 版 ] では メニュー が リボンインターフェース になりました。 後述 の 「主な変更点」 参照。

この 『kt関数アドイン』 は
「カレンダーコントロール （MSCAL） の
代わりになるものを作ってみよう」
という思いつきから作り始めたものなんですが､ カレンダーという
以上は【祝日】 を避けて通れません。

そこで､祝日判定関数を作ってみました。

そうすると 「祝日が自動判定できるなら営業日数の計算も出来るな」
と思い､どうせなら分析ツールの WORKDAY / NETWORKDAYS で
不便だった”土日”固定の休日設定を自由にカスタマイズできるよう
にしよう‥‥‥と､次から次へと便利な関数が増えて行きました。

主な機能だけ､紹介しますと
・ 日付入力用のカレンダーフォーム
・ 期間入力用のマルチカレンダーフォーム
・ 時刻入力用のアナログ時計フォーム
・ 祝日判定関数
・ 営業日計算関数
・ 第2/4土曜休み等自由にカスタマイズできる休日設定ツール
・ 年間カレンダーシートの作成
・ ｙ年ｍヶ月ｄ日といった期間計算
・ 始業/終業時刻からの勤務時間計算
・ フォルダ選択のダイアログ
・ ユーザーフォームの閉じるボタンの無効化
・ コマンドバーに指定するアイコン 『FaceId』 の一覧表示
・ 旧暦/六曜と干支の算出
・ 表示位置や色を変更できる､MsgBoxの代替関数 『 ktMsgBox 』
・ 値を返しつつ､記述したセルにシェープ画像を描画する関数 『 ktCalShape 』

など､他にも沢山便利な関数/サブルーチンが揃っています。
詳細は 「 リファレンス 」 を参照して下さい。

【 Ver 5.40 の 新機能 および 主な変更点 】

( 1 ) 下記の 祝日改正に対応しました。
・ 東京五輪特措法による祝日の移動 (2021年 施行)
海の日 ： 7/19 ( 3rd Mon ) ⇒ 7/22
スポーツの日 : 10/11 ( 2nd Mon ) ⇒ 7/23
山の日 ： 8/11 ⇒ 8/8
休日マップの再作成 / 変更された祝日を跨ぐ営業日計算等の再計算 が必要になります ( Q13 )。

( 2 ) kt祝日日付 関数の対象に「山の日」を追加しました。

( 3 ) ktPhoneNumber 関数で使用する 「番号翻訳テーブル」 を 2020/6/1 版に差替えました。

【 Ver 5.31 の 新機能 および 主な変更点 】

( 1 ) ktPhoneNumber 関数で使用する 「番号翻訳テーブル」 を 2019/5/7 版に差替えました。
[ 025-60x , 025-80x ] の局番が追加されました。

【 Ver 5.30 の 新機能 および 主な変更点 】

( 1 ) 新元号 「 令和 」 に対応しました。
kt関数アドインが提供する関数は、新元号「令和」対応になっていない環境でも
[日付] 引数に 「令和 日付文字列(元年 表記を含む)」を指定可能です。

( 2 ) 新元号 「 令和 」 対応の下記の日付変換関数 ( 改元アップデート未対応 環境でも「令和」を
サポートします ) を追加しました。
ktEraFormat , ktEraCDate , ktEraIsDate

( 3 ) 電話番号の編集/検証ツール ktPhoneNumber 関数を追加しました。

【 Ver 5.20 の 新機能 および 主な変更点 】

( 1 ) 下記の 祝日改正に対応しました。
・ 2019年の徳仁親王の即位日(5/1) および
祝日に挟まれて「国民の休日」となる 4/30(平成天皇の退位日) ＆ 5/2 の２休日
・ 2019年の「即位の礼 正殿の儀 (10/22) 」

休日マップの再作成 / 変更された祝日を跨ぐ営業日計算等の再計算 が必要になります ( Q13 )。

【 Ver 5.10 の 新機能 および 主な変更点 】

( 1 ) 下記の 祝日改正に対応しました。
・ 体育の日 ⇒ スポーツの日 改名 (2020年 施行)
・ 東京五輪特措法による祝日の移動 (2020年 施行)
海の日 ： 7/20 ( 3rd Mon ) ⇒ 7/23
スポーツの日 : 10/12 ( 2nd Mon ) ⇒ 7/24
山の日 ： 8/11 ⇒ 8/10
休日マップの再作成 / 変更された祝日を跨ぐ営業日計算等の再計算 が必要になります ( Q13 )。
kt祝日日付 では、「体育の日」の改名にあたり、「体育の日 / スポーツの日」 のどちらでも可としました。

( 2 ) kt 関数アドインメニュー ( xlam 版 )
ウィンドウ 幅を縮小した場合に、リボン も 「ボタンのみ表示」 で縮小対応するように、<group>要素に
autoScale 及び image 属性を追加しました。

( 3 ) xla 版用サポートツール の 「 リボンアタッチメント for AddinBox 」 を Ver2.10 ( 縮小表示対応版 )
に差し替えました。

【 Ver 5.00 の 新機能 および 主な変更点 】

( 1 ) 「天皇誕生日」 の 祝日改正に対応しました。
休日マップの再作成 / 変更された祝日を跨ぐ営業日計算等の再計算 が必要になります ( Q13 )。

( 2 ) メニュー 方式の変更
( a ) 右クリックメニュー
バージョン画面で個別に作成していたのを止め、「kt関数アドイン」 グループ として４ コマンド全てを
起動時に作成します。また、表示位置オプション (セル位置 or 画面中央) の指定も 右クリックメニュー
内に組み込みました。
これに伴い、バージョン画面 での 「右クリックメニュー作成」 機能は廃止となりました。

( b ) kt 関数アドインメニュー ( xlam 版 )
xlam 版では メニュー を CommandBar (アドイン タブ) から リボン インターフェース (AddinBox
メニュー タブ) へ移行します。なお、[AddinBox メニュー] タブは kt電話郵便アドイン ( xlam 版 )
と共用となります。

( c ) kt 関数アドインメニュー ( xla 版 )
xla 版での メニュー は従来通り CommandBar (アドイン タブ) ですが、 [ Temporary=True ] タイプ
に変更となります。
これにより、Excel 2013 以降の ＳＤＩ 環境において、アドインメニューを確実に反映される為に
Ver 4.00 で必要だった手順 が簡素化され、今後は、単純に 「アドイン登録後に エクセル再起動」
のみで済みます。

参照 ： Excel2013/2016 アドインブックによるCommandBar メニューとアドインタブ ( ５ 項 ＆ ６ 項 )

なお、リボンアタッチメント アドイン for AddinBox (Ver2.00) を一緒に使うことで、リボンインターフェース の
メニュー を利用することも可能です。

( 3 ) Excel2016で UserForm の Width / Height を動的に設定すると以前の バージョン に比べて狭く
なる (7.5p) 症状に対処しました。 ( 参考画像 )
[ UserForm is shorter and narrower than in earlier versions of Excel ]
https://support.microsoft.com/en-us/help/3156159

K.Tsunoda(AddinBox) Mail:addinbox@h4.dion.ne.jp CopyRight(C) 2015 Allrights Reserved.


【 §２ 登録と削除 】

１．動 作 環 境
-- 開発環境 --
Windows10 ＆ Excel 2016 / 2010SP2 / 2007SP3 / 2003SP3

-- 動作環境 --
Windows98SE 以降 , 64bit 可
Excel2000 以降 , 64bit 可

２．登録作業の前に

配布ファイルを解凍すると､下記の構成のファイルに 展開されます。まず､適当なフォルダに配布ファイルを
解凍して保存してください （ 体験ktCalShape.xls は ktCalShape 関数の利用サンプルです）。
(補) kt関数Addin.xla ( 約 2300 KB ) , kt関数Addin.xlam ( 約 950 KB )
ファイルサイズ に ２ 倍以上の違いがあるのは、 xlam の方が ZIP 圧縮されている為です。

[ リボンアタッチメント アドイン ] については こちら を参照してください。

※ ネット から ダウンロード した ファイルは、ＯＳ により セキュリティブロック されています。解凍した上記の
各ファイルも セキュリティ ブロック されています。 インストール の前に、ファイル の プロパティ ダイアログ
にて 【ブロックの解除】 を行なって下さい。

『 kt関数アドイン 』 をアドイン登録すると､EXCELの メニュー内 ( 標準メニュー or リボン ) に、
kt関数の メニューコマンド が追加されます。競合を避ける為に 「ショートカットキー」 は設けていません。

３．kt関数アドインの登録

Ver 5.00 以降 の配布 ファイル には
( a ) 97-2003 形式 の kt関数Addin.xla
( b ) 2007 形式 の kt関数Addin.xlam
の ２ つ を収録しています（機能は全く同じですが、Excel 2003 以前では ( b ) の アドイン
ブック は使用できません）。

( 1 ) 今回、初めて kt関数アドインを使われる方 （Excel 2007 以降） は、2007 形式の
kt関数Addin.xlam を インストール した方が良いですが、下記の ( 2 ) および ( 3 ) を
考慮した上で決めてください。

( 2 ) 以前から kt関数アドイン を利用されている方は、97-2003 形式の kt関数Addin.xla
をインストール してください。
お使いの エクセル が Excel2007 以降であるからといって、ｘｌａｍ の方をインストール
すると、既に シート に書き込まれている 各種の kt関数が リンクエラー となります。

( 3 ) kt関数Addin.xla を インストール している ＰＣ と、kt関数Addin.xlam を インストール
している ＰＣ の間で、シート に kt関数 を書き込んである ワークブック を 遣り取りする
と リンクエラー になります。どちらか 一方に 統一して インストール してください。
97-2003 形式の方 ( .xla ) であれば、Excel 2007以降でも利用できますので、xla に
統一した方が良いです。
--- Ver 5.00 での アドイン登録手順の改善について ---

Ver 5.00 では メニュー の作成方法を一新しました。
- Ver 4.00 以前 -
Excel 2003 以前の メニュー方式である CommandBar を [ Temporary = False ( 常設メニュー) ] で
作成していました。 この False タイプの CommandBar と Excel 2013 以降で採用された ＳＤＩ (Single
Document Interface ) の 相性が悪く、CommandBar メニュー を確実に 作成 ( 且つ 全ての Excel
ウィンドウ に反映させる ) する為には、アドイン登録の際に特定の手順を必要としていました。
参照 ： 6. [ Temporary := False ] メニュー と [ アドイン登録/解除 ] 手順
- Ver 5.00 -
xla 版 の メニュー は CommandBar を [ Temporary = True ] で作成するように変更しました。
これにより、Excel 2013 以降でも、アドイン登録後に 単純に Excel 再起動する だけで 全ての
Excel ウィンドウ に メニュー が反映されます。
参照 ： 5. [ Temporary := True ] メニュー と [ アドイン登録/解除 ] 手順
尚、xlam 版は メニュー を リボン ＵＩ へと移行しましたので、アドイン登録と同時に全ての Excel
ウィンドウ に反映されます。

( 1 ) ファイルの保存

( a ) Ver 4.00 を使っていた方は、まず最初に、 4. kt関数アドインの削除 の手順で、kt関数メニューの削除
ならびに 【アドイン登録ダイアログ】のリストからの削除 を行なって下さい。

※ kt関数Addin.xla から kt関数Addin.xlam に切り替えをする場合には、
・ 【アドイン登録ダイアログ】の リスト からの削除
・ アドイン ファルダ から 旧ファイル( kt関数Addin.xla ) の削除
を確実に行なって下さい。ファイル名が異なるので、『同じ アドイン名 の 全く別物のアドイン』 と
して扱われます。

( b ) 「kt関数Addin.xla （ または kt関数Addin.xlam ）」 を アドインフォルダ に保存して下さい。

kt関数アドイン は 『シート関数 としての利用』 が主体ですので、OFFICE システム アドイン フォルダ
（ C:\Program Files\ ... 下の Library フォルダ ） に保存して下さい。

この アドインフォルダ であれば、kt関数アドイン を利用する ワークブック を、ワークブック作成時とは異なる
フォルダ / ドライブ / ＰＣ もしくは ネットワーク上 へ移動・コピーさせても リンクエラー とならずに済みます。

尚、ＯＳ/エクセルのバージョンによってフォルダパスは異なります。判らない場合は、下記のマクロ
を実行して確認して下さい。
MsgBox Application.LibraryPath

また、この アドインフォルダ は、Windows Vista 以降では ＵＡＣ （ユーザーアカウント制御） 管理下のフォルダ
となりますので、ファイル を保存する際には、管理者ユーザーにて ＵＡＣ を解除する必要があります。

フォルダパス や 注意事項などの詳細は 「§３ アドインフォルダ 」 で解説しています。

( c ) ヘルプファイル 「 ktFuncHelp.chm 」 を 「 kt関数Addin.xla / .xlam 」 と 同じフォルダに保存して
下さい。 ヘルプファイル が､この フォルダ に存在しないと メニュー から表示できません。

( 2 ) 「 kt関数Addin.xla / .xlam 」 のアドイン登録

EXCEL を起動して、[ ツール ⇒ アドイン ] で 【 アドイン登録ダイアログ 】 を表示してください。
アドインフォルダ に保存されている各種の アドイン が リスト に載っていますので、その中から
『 kt関数Addin 』 をチェックして下さい (新規ブックで行なうようにしてください)。

--- Excel 2007 以降での 【 アドイン登録ダイアログ 】 の表示手順は下記になります ---
[ Excel 2007 ]

[ Excel 2010 以降 ]

Excel 2010 以降では [ 開発 ] タブ から 直接 「アドイン登録ダイアログ」 を呼び出す事もできます。

※ Excel 2013 以降 での注意事項 ( xla 版のみ ) ※
アドイン登録と同時に kt関数のメニューが追加されますが、xla 版 では 直ちにメニューが
表示されません。 これは、メニュー に使っている CommandBar 機能が ＳＤＩ (Single Document
Interface ) の影響を受けた為であり、アドイン登録の実施後に エクセル を再起動する事で
kt関数アドイン の メニュー が表示されます。

Ver 4.00 以前 ( xla 版) では、再起動だけではなく、アドイン登録時の手順にも注意が必要でしたが、
Ver 5.00 では CommandBar の作成方法を変えた ( Temporary = True タイプ ) 為、「単純に 再起動
のみ」 で十分です。

xlam 版 では、メニュー に リボン を使っている為、再起動しなくても、直ちにメニュータブが表示されます。

( 注 ) 「kt関数Addin.xla/xlam を新バージョンに差し替えても 旧バージョンのままでアップデートできない」
という場合は FAQ: Q35 を参照してください。

～～～ 以上 で ｋｔ関数アドイン の登録は完了です。 ～～～

( 3 ) ＶＢＡ から kt関数 を利用する場合の準備

ＶＢＡから利用する場合は、更に BOOKごとに ＶＢＥ 画面の [ ツール ⇒ 参照設定 ] で 『 kt関数Addin 』 を
チェックする必要があります。

４．kt関数アドインの削除

(1) kt関数アドインを使用している全てのBOOKについて、ＶＢＥ 画面の [ ツール ⇒ 参照設定 ] から
『 kt関数Addin 』 のチェックを外します。

(2) 【 アドイン登録ダイログ 】 から 『 kt関数Addin 』 のチェックを外します（ダイアログの出し方は前項を参照）。
チェックを外すと自動的に 「ｋｔ関数メニュー」 も削除されます。
( Excel ウィンドウが SDI になった影響で、メニュー変更を Excel 全体に反映させるには Excel を一旦
終了する必要があります）。

アドインを解除する際は､ワークシート上にｋｔ関数アドインの関数が記述されていない事を確認した上で
行ってください。 （解除は新規ブックで行なってください）

(3) アドインフォルダ から 「 kt関数Addin.xla （または kt関数Addin.xlam ）」 「ktFunc_Help.chm」 を削除します。

(4) 「 kt関数Addin.xla / .xlam 」 のファイルを削除した後､エクセルを起動し　【 アドイン登録ダイアログ 】 を表示
してください。 リスト の中に 『 kt関数Addin 』 が残っていたら、それを選択します。そうすると､
アドイン'C:￥‥‥‥ ￥kt関数Addin.xla' が見つかりません。
リストから削除しますか？
という確認ダイアログが表示されますので 「はい」 を選択します（この操作をするまでは [ kt関数Addin.xla ] を
削除した後であってもリストに残り続けます）。

( 注 ) kt関数Addin.xla/xlam を削除してもアドイン登録ダイアログのリストから消えない。」 という場合は
FAQ: Q35 を参照してください。

５．「ｋｔ関数メニュー」 が 【消えない】場合の対処 ( xla 版 のみ )

何らかの理由により、kt関数アドインのアドイン解除 （アドインダイアログでチェックを外す） を行なった後に、
[ kt関数メニュー ] が残ってしまった場合は、下記の方法により、メニューを削除してください。

( a ) 新規ブックだけを開いて、もう一度、kt関数アドインをアドイン登録し、直ぐにアドイン解除する。
（当然、[ kt関数Addin.xla ] ファイルを再び入れておく必要があります）

K.Tsunoda(AddinBox) Mail:addinbox@h4.dion.ne.jp CopyRight(C) 2004 Allrights Reserved.


【 §３ ： アドイン フォルダ 】

「アドインフォルダ」 には
( 1 ) OFFICE システム アドインフォルダ ( Library フォルダ )
( 2 ) ユーザー アドインフォルダ ( Addins フォルダ )
の ２ つがあります。 どちらかの フォルダ に アドインブック を保存すると、『 アドイン 登録 ダイアログ 』
の一覧に載ります。

  1. OFFICE システム アドインフォルダ ( Library フォルダ )
    kt関数アドイン は 「シート関数」 としての利用が主体ですので、この OFFICE システム アドイン
    フォルダ に保存して下さい    。

    1. Excel.exe の直下に位置し、エクセル の 「分析 ツールアドイン」 が インストール されている
      フォルダ です。

      下記の マクロ で パス を確認できます。
      MsgBox Application.LibraryPath

    2. Windows Vist 以降では、UAC ( ユーザーアカウント制御 ) の管理下にあるフォルダですので、
      保存の際には管理者 ユーザーで UAC を解除 した上で行なう必要があります。

      ※ UAC を解除せずに Library フォルダに アドインブック を保存すると トラブル を
      招きます( Q35 )ので注意してください。

      [ ユーザー アカウント 制御 ]
      https://docs.microsoft.com/ja-jp/previous-versions//mt437606(v=vs.85)

      参考 : ＠ＩＴ Tips / Windowsのユーザー・アカウント制御 （UAC） を一時的に無効にする
      http://www.atmarkit.co.jp/ait/articles/0703/09/news127.html

    3. OS が異なっても共通の場所となりますが、Excel の バージョン ごとに フォルダ が分かれます。
      -- Excel 2003 --
      C:\Program Files\Microsoft Office\Office11\Library

      -- Excel 2007 --
      C:\Program Files\Microsoft Office\Office12\Library

      -- Excel 2010 --
      C:\Program Files\Microsoft Office\Office14\Library

      -- Excel 2013 / 2016 --
      Excel 2013/2016 では、インストール方法によって パス が異なります。
      [ Windows インストーラーでインストール ]
      C:\Program Files\Microsoft Office\Office15\Library
      [ プリインストール版 , Click-To-Run ]
      C:\Program Files\Microsoft Office 15\Root\Office15\Library

      補：Excel2016では "Office15" の部分が "Office16" になります。

      -- Windows ( 64bit ) での注意事項 --
      Excel が 32bit/64bit の違いでも パス が異なりますので注意が必要です。
      32bit 版 Excel : C:\Program Files (x86)\....
      64bit 版 Excel : C:\Program Files\....

      細かく分かれますが、最初に書いたように下記のマクロで確認できます。
      MsgBox Application.LibraryPath

    4. セル上で利用できる 「シート関数」 を提供している アドインでは、この フォルダ に保存する必要があります。

      その理由については、下記サイトにて詳細に解説していますが、一言で言えば、
      アドイン関数を使用している ワークブック を 『他のフォルダ、他のＰＣ、ネットワーク 等』 へ
      移動・コピーした際に 【 リンク エラー を起こさない 】
      為です。
      AddinBox / Excel の リンク の管理 と 格納 （ワークブック の移動で起きる リンクエラー の仕組み）

      kt関数アドイン は 「シート関数」 としての利用が主体ですので、この OFFICE システム アドインフォルダ に保存して下さい。

  2. ユーザー アドインフォルダ ( Addins フォルダ )
    1. 保存ダイアログでファイル の 種類を [ アドイン ( *.xla or *.xlam ) ] とした場合に、既定の保存先として選択されるフォルダです。

      下記のマクロでパスを確認できます。
      MsgBox Application.UserLibraryPath

    2. Windows Vista 以降でも UAC 管理下からは外れているフォルダですが、『隠しフォルダ』属性ですので、エクスプローラーのフォルダオプションで 「全てのファイルとフォルダを表示する」 にチェックを入れておく必要があります。

    3. マルチインストールの場合でも、Excel の各バージョンで共通の場所となりますが、OS によって場所が異なり、ユーザーごとに分かれます。
      -- Windows XP --
      C:\Documents and Settings\USER NAME\Application Data\Microsoft\AddIns

      --Windows Vista 以降 --
      C:\Users\USER NAME\AppData\Roaming\Microsoft\Addins


【 リボンアタッチメント アドイン for AddinBox 】

kt関数アドインの配布ファイル に 同梱 されている [ RibbonAttach4AddinBox.xlam ] は、
kt関数アドインの xla 版 ( メニュー は 従来の CommandBar / アドイン タブ 内に収録 ) を
Excel2007 以降で使用する際に一緒に利用するサポートツールです。

xlam 版を使用する場合には必要ありません。

--- kt 関数アドイン 配布ファイル ---

この リボンアタッチメント を アドイン登録すると、下図の リボンメニュー が作成され、
この リボン内の コマンド から kt関数アドイン のメニュー機能を呼び出すことができます。
また、アドイン タブ内の メニューも引き続き利用できます。

(補) kt関数Addin.xlam を使用している場合は、この リボンメニュー のコマンドは機能しません。

尚、リボンアタッチメントアドイン は kt関数アドイン と kt電話郵便アドイン の共用ツール
ですので、kt電話郵便アドインの リボンメニュー も一緒に展開されます （kt電話郵便アド
イン がアドイン登録されていなければ、勿論、そのメニューコマンド は機能しません）。


【 SDI の不具合について （終了時に空ウィンドウが残る） 】

Excel 2013 / 2016 の不具合により、エクセルワークブック を [ ダブルクリック または
右クリックメニュー/開く ] で 開いた場合に、空 ウィンドウ が 余計に１つ開く という
不具合が報告されています。

この障害は
エクセル起動時の処理 （アドインブック等） によって Active Window が立て続けに切り替わる
という動作が発生した際に Excel の SDI (Single Document Interface ) 機能が対応しきれない。
という原因に拠る不具合です。

-- KB 3157115 -- https://support.microsoft.com/ja-jp/help/3157115
Excel 2013 以降 の バージョンで、複数のアドインが設定されている状態で
ファイル を開くと 空白の Excel ウィンドウ が表示される

当サイトで公開している アドインソフト の改修のみでは、この トラブルの完全な回避は
不可能です。 このトラブルの 詳細および 回避不可 の理由については下記を参照
してください。

AddinBox / Tips24 : Excel 2013でエクセル終了時に空ウィンドウが残る
http://addinbox.sakura.ne.jp/Excel_Tips24.htm

唯一 の 確実 な 対処法 は、
・ [ ワークブック アイコン を ダブルクリック ] または [ 右クリックメニュー / 開く ] で
ワークブック を開かない
という事です。つまり、
・ エクセル を 起動してから [ 開く ] コマンド で ワークブック を開く
という事です。

多少 なりとも手間を省く為に下記のようにする事をお勧めします。
・ 起動画面 および 空白ワークブック を表示せずに Excel 2013/2016 を起動する
⇒ [ /e スイッチ を持つ Excel 起動ショートカット ] を デスクトップ に作成
-- Microsoft Office 製品 の コマンド ライン スイッチ --
・ バックステージビュー ( ファイル タブ ) を開く手間を省く
⇒ クイックアクセスツールバー に [ 開く ] コマンド を組み込む
-- クイック アクセス ツールバーをカスタマイズする --


【 kt関数を利用しているワークブックのリンク変更手順 (xla版からxlam版へ変更) 】

kt関数Addin.xla から kt関数Addin.xlam へアドイン を差し替える際に、既に作成されている アドイン式の リンク を
変更する手順を説明します。

安全の為に、予め 対象 ワークブック の バックアップ を行なって下さい。

( 1 ) 白紙ブック で kt関数Addin.xla をアドイン解除する。

( 2 ) エクセル を終了し、Library フォルダ から kt関数Addin.xla を削除する。

( 3 ) エクセル再起動後に、白紙ブック で アドイン登録ダイアログ を表示し、『 kt関数Addin 』 を クリック して
アドインリスト から削除する。
( 補 ) エクセルバージョン によっては不要です （自動で消えています）。

( 4 ) エクセル を終了し、Library フォルダへ kt関数Addin.xlam をコピーする。

( 5 ) 白紙ブック で kt関数Addin.xlam をアドイン登録する。

--- 「参照設定 (ＶＢＥ > ツール > 参照設定)」 が無いブックの場合 ---
( 6 ) kt関数 を使っているブック を開く （ リンクエラーは無視する ）。

( 7 ) [ データ > リンクの編集 ] で kt関数Addin.xla の リスト を選択し、『 リンク元の変更 』 を クリック する。

( 8 ) 表示されるエクスプローラーで [ C:\…\Library\kt関数Addin.xlam ] を選択する。

( 9 ) kt関数アドイン の リンク 式が変更されて、kt関数の結果が正しく処理されている事を確認した後に、
当該ブック を保存する。

--- 「参照設定 (ＶＢＥ > ツール > 参照設定)」 が有るブックの場合 ---
( 10 ) kt関数を使っている ブック を開く （ リンクエラーは無視する ）。

( 11 ) ＶＢＥ ( 開発タブ > Visual Basic ) から [ ツール > 参照設定 ] を開く。

( 12 ) [ レ ] 参照不可：kt関数Addin.xla
[ ] kt関数Addin ( ← kt関数Addin.xlam )
上記のようになっているので、参照不可の方のチェック を外し、xlam の方に チェック を入れて
ＯＫ ボタン を クリック する。 再度、参照設定を開くと、参照不可の方 ( xla ) が消えて、xlam の
方だけが残っている。

( 13 ) ( 7 ) ～ ( 9 ) の操作を行なう。

( 14 ) 『 リンクの編集 』 を再び呼び出して、kt関数Addin.xlam の リンク だけになっていればＯＫ。

( 15 ) kt関数Addin.xla と kt関数Addin.xlam の２つが リスト に載っている場合は、置換 ( ホーム >
検索と選択 > 置換 ) を呼び出し、下記条件で 「全て置換」 を実行する。
検索する文字列 ： \kt関数Addin.xla'
置換後の文字列 ： \kt関数Addin.xlam'
（ xlam を xla と誤認させない為に最後の アポストロフィ も含める事 ）

( 16 ) ( 6 ) ～ ( 15 ) を全ての 「kt関数を使っているブック」 で繰り返す。


【 §４-１　カレンダー入力フォーム 】

ｋｔ関数を作り始めたキッカケが､この 「カレンダー入力フォーム」です。
下記のように ユーザーフォーム や ワークシート の コードモジュール にｋｔ関数 『 ktCalDate 』 を記述する
だけで､カレンダーフォーム を ポップアップ します。あとは マウス クリック だけで日付入力が行なえます（ダブ
ルクリック 等の イベント に記述して下さい）。

（例）
Dim MyDate As Date
If ktCalDate(MyDate, Date, 休日Map) Then
TextBox1.Value = Format(MyDate, "yyyy/m/d")
End If

第２パラメータ の日付で初期表示して､選択した日付を第１パラメータに返します。
ktCalDate自体は【 True：入力あり ，False：キャンセル 】 を返します。

カレンダーフォーム を表示した時に 『休業日』 を強調表示 （ピンク） させる事が出来ます。
『休業日』 は第３パラメータの 「休日Map 」 で指定します。

この例では休業日は 「祝日・日曜・第2/4土曜」 です。
「営業日のみ/休業日のみ/ある期間内のみ」 といった
入力制限を施す事もできます。

カレンダー入力フォーム はＶＢＡからだけでなく､
メニュー からでも表示できます。「ちょっと､カレンダー
を確認したい」 といった場合に便利です。

メニュー起動の場合は､下記条件で実行されます。
・ アクティブセルが日付データの場合は､その日付の【月】で初期表示します。
日付データ以外の場合は､本日の【月】で初期表示します。
・ 選択した日付はアクティブセルに設定されます。
・ 基本的に 「休業日」 表示はありません。
・ アクティブセルが 『休日Mapデータ』 の場合に限り休業日表示されますが､
      この場合には 『休日Mapデータ』 の確認モードとして動作してますので､
      日付を選択しても､その日付はセルに書き込まれません。
    ・『右クリック』 で六曜表示モード移行【可】
    ・時刻入力フォームとの連携はなし （日付のみの入力です）

「日付」 以外の部分を 右クリック すると、左のよう
に 六曜 がカラー表示されます。

更に、右側の 大安・仏滅 などのガイダンス部分を
クリックすると、その六曜の表示有無を切り替える
事もできます。

ＶＢＡから六曜表示を指定する事もできます。

六曜表示できるのは「１９５０～２０５０年」の期間です。

六曜は七曜（日～土）と違って、常に規則正しく繰り返される訳ではありません。旧暦の各月１日の六曜が
月によって決まっており、そこから順に繰り返されます（１・７月：先勝，２・８月：友引‥‥）。したがって、旧
暦の月変わり位置で不連続になります。上の例では5/11～12日の間で[友引・先負]が飛んでいます。

（注） これで表示される 『六曜』 は日本標準時を基にしたものです。したがって、中国および
韓国での行事などを求めるのに参考としないで下さい。年によっては【１日のズレ】が出る
場合があります（例：旧暦２００１年４月）。詳しくは 『 kt旧暦 』 の解説 を読んで下さい。

kt関数メニューでの カレンダー入力は 「日付のみ」 ですが､ 『 ktCalDate 』 自体には 『時刻入力フォーム：
ktSelClock 』 との連携機能があり､【日付＋時刻】の入力も行なえます。
右クリックメニュー の コマンドには【日付＋時刻】の機能もあります。

期間（２つの日付セット）入力用のカレンダーフォームとして [ ktMultiCal 関数 ] が利用できます。
今まで､２つのTextBox に入力された日付に対して
「日付エラー/大小関係/期間超過などでチェックを行って再入力」
といった処理を必要としていたのが､単に [ ktMultiCal 関数 ] を呼び出すだけで済みます。


【 §４-２　祝　日 】

１．祝日の定義

Ver 5.40 で 2019年～2021年 の 祝日改正(下記) に対応しています。
( a ) 2019年施行の「天皇誕生日の変更」 12/23⇒2/23 (補：2019年には[天皇誕生日]はありません)
( b ) 2019年の徳仁親王の即位日(5/1) および
祝日に挟まれて「国民の休日」となる 4/30(平成天皇の退位日) ＆ 5/2 の２休日
( c ) 2019年の「即位の礼 正殿の儀 (10/22) 」
( d ) 2020年施行の「体育の日の改名」⇒スポーツの日
( e ) 東京五輪特措法による 2020年の「祝日移動」
( 海の日：7/20(3rd Mon)⇒7/23, スポーツの日:10/12(2nd Mon)⇒7/24, 山の日：8/11⇒8/10 )
( f ) 東京五輪特措法による 2021年の「祝日移動」
( 海の日：7/19(3rd Mon)⇒7/22, スポーツの日:10/11(2nd Mon)⇒7/23, 山の日：8/11⇒8/8 )

ｋｔ関数では 【 祝日 】 を全てアドイン内部で算出しています。
分析ツールの WORKDAY の様にユーザー側で 『 祝日一覧表 』 を用意する必要はありません。

ある年の 『 祝日一覧 』 は メニュー から簡単に求める事もできます。

ｋｔ関数では､下記一覧表に載っている､現行の祝日法で定められた祝日を 「施行日」 を含めて認識します

補足： 退位/即位日と天皇誕生日変更(12/23 ⇒ 2/23) の タイミングの関係で
2019年には 『天皇誕生日』はありません。

※ 皇室関連の臨時休日
・ 皇太子明仁親王の結婚の儀 昭和34年 4月10日 (1959年)
・ 昭和天皇の大喪の礼 平成元年 2月24日 (1989年)
・ 即位礼 正殿の儀 (平成天皇) 平成 2年11月12日 (1990年)
・ 皇太子徳仁親王の結婚の儀 平成 5年 6月 9日 (1993年)
・ 平成天皇の退位 平成31年 4月30日 (2019年) 祝日に挟まれる国民の休日です (*3)
・ 徳仁親王の即位 平成31年 5月 1日 (2019年)
・ 即位礼正殿の儀 (徳仁親王) XX 元年10月22日 (2019年)

※ [ 国民の休日 ] 条項の適用
--- 国民の祝日に関する法律 ---
第３条 ３項
その前日及び翌日が 「国民の祝日」 である日（日曜日にあたる日及び前項に
規定する休日にあたる日を除く。）は、休日とする。
（改正） ： H17(2005)/5/20制定 , H19(2007)/1/1施行
その前日及び翌日が「国民の祝日」である日（「国民の祝日」でない日
に限る）は、休日とする。

(*1) ５月４日の扱いは下記のようになります（2006年まで）。
・ 日曜日の場合は､只の日曜日（≠祝日）
・ 月曜日の場合は憲法記念日の振替休日
・ 火～土曜日の場合に「国民の休日」
２００７年以降は 「みどりの日」 で祝日に固定されます。

(*2) 「敬老の日」 を 『９月第３月曜日』 にする改正により､「敬老の日」 と 「秋分の日」 が 【１日おいて並ぶ】 年
が現れます。つまり､「５月４日」 を祝日にした条項の適用で敬老の日と秋分の日に挟まれた､この日も休日と
なります。2100年まででは､
2009, 2015, 2026, 2032, 2037, 2043, 2049
2054, 2060, 2071, 2077, 2088, 2094, 2099
の年が対象になります。ただし､正式には 「秋分の日」 は前年の官報で公示される事によって定まる祝日
ですから､この９月の 「国民の休日」 も官報の公示をもって正式に定まると解釈するべきでしょう。

(*3) 2019年5月1日(即位の日)の制定により、2019年4月30日～2019年5月3日にかけて ２つの国民の休日が
発生します。 5月1日(即位の日) は 2019年限りの臨時祝日なので、4月30日＆5月2日 の 「国民の休日」
も 2019年限りです。
2019年 4月 29日 : 昭和の日
4月 30日 : 国民の休日 ( 平成天皇の退位日 )
5月 1日 : 即位の日 ( 徳仁親王 )
5月 2日 : 国民の休日
5月 3日 : 憲法記念日

※ 振替休日 S48(1973)/4/12制定 & 施行
1973/2/11(日) → 振替休日なし
1973/4/29(日) , 9/23(日) → 振替休日あり
(改正) ： H17(2005)/5/20制定 , H19(2007)/1/1施行
”祝日が日曜にあたるときは、その日後において、その日に最も近い 「国民の祝日」
でない日を休日”とする。
5/3(日) → 5/6(水) が振替休日（追加）
5/4(日) → 5/6(火) が振替休日（追加）
5/5(日) → 5/6(月) が振替休日（従来通り）

※ 改　元 （西暦変換）
明治：M1.10.23 ～ M45. 7.29 (1868.10.23 ～ 1912. 7.29) 明治 + 1867
大正：T1. 7.30 ～ T15.12.24 (1912. 7.30 ～ 1926.12.24) 大正 + 1911
昭和：S1.12.25 ～ S64. 1. 7 (1926.12.25 ～ 1989. 1. 7 ) 昭和 + 1925
平成：H1. 1. 8 ～ H31. 4.30 (1989. 1. 8 ～ 2019. 4.30 ） 平成 + 1988

（補） 「明治改元の布告」 の詔書に記されている日付は【明治元年九月八日】になって
いますが､「改暦の布告」 が発せられたのは【明治五年】です。
即ち､それ以前の日付は旧暦日付で記されている訳で､明治元(1868)年九月八日を
新暦に直すと【１８６８年１０月２３日】になります。

歴史について語るならば 「明治元(1868)年九月八日」 と表現するべきでしょうが、
コンピューター等において期間を計算する場合を考えれば、新暦の基準でその
まま遡った 「１８６８年１０月２３日」 を使わないと正しい期間は得られません。

祝日に関して詳しく知りたい方は､こちらのＨＰが便利です。
休日の変遷　『行政歴史研究会』
http://homepage1.nifty.com/gyouseinet/kyujitsu.htm

なお､『春分の日／秋分の日』 は官報に公示される事によって初めて正式に定められる祝日です。
したがって､未来の 『春分の日／秋分の日』 は､あくまで計算で求めた天文学上の日付という扱い
になります。蛇足ながら､２０９２年と２０９６年の 『春分の日』 は計算上 『３月１９日』 になります。

出典：恒星社厚生閣 刊　海上保安庁水路部「暦計算研究会」 編 『 新こよみ便利帳 』
         海上保安庁 海洋情報部 （旧 水路部） http://www1.kaiho.mlit.go.jp/

上記の式の意味を知りたい方は､こちらの ＨＰ で詳しく説明されています。
こよみのページ　『暦と天文の雑学』 http://koyomi.vis.ne.jp/mainindex.htm

（補足） 2002/3/28 に海上保安庁水路部 「暦算担当官」 に確認しました
上記の式で１８５１～１９７９年の範囲では
［ ( 年 － １９８３ ) ÷ ４ ］
となっていますが、ガウス記号本来の意味からすると
［ ( 年 － １９８０ ) ÷ ４ ］
となります。この相違は下記の理由に拠るものです。

ガウス記号は『その値を越えない最大の整数値』という意味です。したがって、正数の場合には
【単に小数部を切り捨てた値】ですが、負数の場合には異なりますので注意してください。
［－８．４］ → －９ , ［８．４］ → ８

Fortran または Ｃ 系の言語での 『 Int 関数』 は符号に関係なく【小数部を切り捨てた整数部】
という機能ですが、ＶＢ(ＶＢＡ)では
Fix 関数 ‥‥ 符号に関係なく【小数部を切り捨てた整数部】 Fix ( -8.4 ) → －８
Int 関数 ‥‥ 『その値を越えない最大の整数値』 Int ( -8.4 ) → －９
という機能になります。

上記の式で 『１８５１～１９７９年』 の範囲が ［（年－１９８３）÷４］ となっているのは、Fortran/C 等の
Int 関数でガウス記号の意味を実現する為に行なった補正によるものです。

したがって、ＶＢ（ＶＢＡ）で上記の式のまま使う場合には 『 Fix 関数 』 を使ってください。
尚、ＶＢ（ＶＢＡ）で 『 Int 関数 』 を使えば、
『１８５１～１９７９年』 の範囲も 『 Int ( ( 年－１９８０ ) ÷ ４ ) 』
となりますので、全ての期間で共通になります。

２．祝日の算出アルゴリズム

「祝日の判定」 というものは結構重い処理です。　『祝日ではない』 という判断に辿り着くまでに非常に時間を
要すると言った方が正確かも知れません。

--- ある１日だけならば微々たるものですが､
日数計算などでは連続して何百回/何千回と実行される為､
微々たる時間も積もり積もって 結構大きな時間になります。 ---

例えば､通常､祝日テーブルは 「１月１日（正月）～１２月２３日（天皇誕生日）」 の順で作成します。ここで､１月１日
と１月２日での流れを見ると､１月１日では､１つ目のデータとの比較で即 『祝日である』 と判断を完了できますが､
１月２日を 『祝日ではない』 と判断する為には全てのデータ （１５＋α） との比較を終える必要があります。また､
１年の 「祝日を除いた日数」 をカウントする等の場合､９割５分の日付が 『祝日ではない』 側になります。

つまり､祝日算出アルゴリズムの最重要ポイントは､「祝日データをどのように持たせて判断するか」 ではなく､ 「如何
にして 『祝日ではない』 という判断を速やかに下すか」ということになります。

ｋｔ関数では､日付を年・月・日に分解し【月→日→年】の順で判断します。何故かと言うと、１２月の日付を判断するのに
『１月～』 の祝日データと比較する必要は無いからです。また､現時点で祝日の無い６月の日付に対しては､ 祝日データ
との比較自体が全くの無駄な話です。

更に効率よく 『祝日ではない』 という判断を下す為に､ｋｔ関数では 『祝日プリマップ期間』 というものを設けています。
これは､本日日付の前後５年間（計１１年間）の祝日を予めマップデータとして展開しておくというものです。マップ展開
自体は [ ｋｔ関数Addin.xla ] のオープン時に自動的に行なわれます。日付が上記の期間内である場合は､マップデー
タ上で 「シリアル値」 の位置にフラグが立っているかという､たったひとつの判断で決定を下す事が出来ます。日付が
マップ期間から外れた場合は､自動的に通常の判定処理（個々の祝日との比較）に移行するようにしてあります。

土曜/日曜/祝日を休日とした場合の１年間の営業日数計算を行なって比較すると､この計算を１０００回繰り返した
（シート１０００行の日数計算式の再計算に相当）場合､
『祝日プリマップ期間』 内 ‥‥‥ ６秒４７４
〃 外 ‥‥‥ １３秒５３５ （Pentium Ⅲ , 450MHz）
という 結果 が得られています（200MHz位のマシンなら 「２０秒 対 ４０秒」 程度になるでしょうか）。

「今年～１０年後」 とか 「１０年前～今年」 といったデータを大量に処理したいという場合､『祝日プリマップ期間』
から外れるデータが出てきて処理時間が多くなってしまいます。このような場合には､一時的に 『祝日プリマップ
期間』 をリセットすることが出来ます。【kt祝日PreMap設定】を参照して下さい。

（補） 休日マップ（祝日を休日）を利用する場合は､既に祝日を含めた休業日の位置（シリアル値）に
フラグを立ててありますので､たった1回の判定処理で判断できます。したがって､休日マップを
利用する際には､祝日判定に要する処理時間を気にする必要は全くありません。


【 §４-３　EXCEL 『分析ツール』 との比較 】

『kt 関数アドイン』 にはEXCELの 『分析ツール』 に収録されている関数と同様の機能を提供する関数があります。

（注） 『kt 関数アドイン』 内ではEXCEL『分析ツール』は使用していませんので､ 『kt 関数アドイン』 を利用するに
当たり､ 『分析ツール』 をアドインする必要はありません。

『分析ツール』
EDATE ( 開始日, 月 )
「開始日」 の"月"から 「月」 数だけ前または後の月の 「開始日」 の"日"に対応するシリアル値を返
します（暦日ベース）。

シフトした先の月に 「開始日」 の"日"に当たる日付が無い場合は､その月の月末日になります。

 2000/6/15 の 4ヶ月後 → 2000/10/15 (日)
2000/6/20 〃 → 2000/10/20 (金)
2000/6/30 の 8ヶ月後 → 2001/ 2/28 (水)

『kt 関数アドイン』
kt締日算出 ( 休日Map，日付，締日，[月数]，[休日前営] )
「日付」 の"月"から 「月数」 (省略時､0) だけ前または後の月の 「締日(15や20等)」 に対応するシリ
アル値を返します。ただし､求めた日付が休業日の場合に前営業日(既定値) を返すか翌営業日を
返すか指定できます （「休日Map」 = 【固定休日：なし】の場合は暦日ベース）。

シフトした先の 「月」 に 「締日」 に当たる日が無い （締日３０を指定して２月など） 場合は､その月の
月末日（又は月末営業日）が返ります。

2000/6/15 の 4ヶ月後 の 15日締営業日(土日祝が休日) → 2000/10/13 (金)
〃 〃 の 20日締 〃 → 2000/10/20 (金)
〃 の ８ヶ月後 の 31日締 〃 → 2001/ 2/28 (水)

(補) kt月末営業日／kt月初営業日 という関数を別に用意してあります。

『分析ツール』
EOMONTH （ 開始日，月 ）
「開始日」 の"月"から 「月」 数だけ前または後の月の【月末日】に対応するシリアル値を返します。
（暦日ベース）

『kt 関数アドイン』
kt月末日付 （ 日付_年，[月] ）
指定した年月の【月末日】に対応するシリアル値を返します。
第１ op だけで 「シリアル値または日付文字列」 ､
第１・２ op 両方で 「年　＆　月」 といった指定が出来ます。
（暦日ベース）

kt月末営業日 ( 休日Map，日付，[月数] )
「日付」 の"月"から 「月数」 (省略時､0) だけ前または後の月の【月末日】に対応するシリアル値を
返します。ただし､求めた日付が休業日の場合は前営業日を返します。
（「休日Map」 = 【固定休日：なし】 の場合は暦日ベース）

kt月初営業日 ( 休日Map，日付，[月数] )
「日付」 の"月"から 「月数」 (省略時､0) だけ前または後の月の【月初日】に対応するシリアル値を
返します。ただし､求めた日付が休業日の場合は翌営業日を返します。
（「休日Map」 = 【固定休日：なし】の場合は暦日ベース）

『分析ツール』
WORKDAY （開始日，日数，[祝日] ）
WORKDAY.INTL ( 開始日, 日数, [週末], [祝日] ) Excel 2010 ～
「開始日」 から営業日ベースで 「日数」 だけ前または後の日付に対応するシリアル値を返します。
休業日は
WORKDAY : 〔土／日曜〕 固定
WORKDAY.INTL : 週末番号 または ７文字（0 or 1） の週末文字列 で指定
および 祝日（祝日の日付を記述した配列定数 または セル範囲）で指定された日付。

〔日数＝１〕 は 「開始日」 の 翌営業日
〔日数＝－１〕 は 「開始日」 の 前営業日
〔日数＝0〕 は 「開始日」 の 当日(休業日も含む) になります。

『kt 関数アドイン』
kt営業日算出 ( 休日Map，日付，日数，[休日前営] )
「日付」 から営業日ベースで 「日数」 だけ前または後の日付に対応するシリアル値を返します。
休業日は 「休日Map」 でいろいろなパターンを指定できます。

〔日数＝１〕 は 「日付」 の 翌営業日
〔日数＝－１〕 は 「日付」 の 前営業日
〔日数＝0〕 は 「日付」 = 営業日の場合は 当日 になります。
「日付」 ≠ 営業日の場合は [休日前営 (True or False)] にしたがって､
前営 or 翌営になります。
「休日Map」 = 【固定休日：なし】 の場合は暦日ベースとなり､DateAdd関数 (VBA 関数) の"d" 指定
と同じ機能になります。

『分析ツール』
NETWORKDAYS （ 開始日，終了日，[祝日] ）
NETWORKDAYS.INTL （ 開始日，終了日，[週末], [祝日] ） Excel 2010 ～
「開始日」 から 「終了日」 の間の営業日数を返します。
休業日は
NETWORKDAYS : 〔土／日曜〕 固定
NETWORKDAYS.INTL : 週末番号 または ７文字（0 or 1） の週末文字列 で指定
および 祝日（祝日の日付を記述した配列定数 または セル範囲）で指定された日付。

〔終了日 = 開始日〕 の 結果は １ （開始日が休業日の場合は ０ ）
〔終了日 = 開始日の 翌営〕 の 結果は ２ （開始日が休業日の場合は １ ）
〔終了日 = 開始日の 前営〕 の 結果は －２ （開始日が休業日の場合は －１ ） になります。

『kt 関数アドイン』
kt営業日数 ( 休日Map，日付1，日付2，[休業日数] )
「日付１」 から 「日付２」 の間の営業日数を返します。休業日は 「休日Map」 でいろいろな
パターンを指定できます。

〔日付２ = 日付１〕 の 結果は １ （日付１ が休業日の場合は ０ ）
〔日付２ = 日付１の翌営〕 の 結果は ２ （日付１ が休業日の場合は １ ）
〔日付２ = 日付１の前営〕 の 結果は －２ （日付１ が休業日の場合は －１ ）になります。

オプションパラメータ 『休業日数』 に 【True 】 を指定すると、営業日数の代わりに休業日数を返します。
省略時および【False 】指定時は従来通りに営業日数を返します。

「休日Map」 = 【固定休日：なし】の場合は暦日ベースとなり､DATEDIF関数 (VBAではDateDiff関数）の
"d" 指定と同様の機能になりますが､日数のカウント方法が異なります。
DATEDIF および DateDiff 関数のカウント方法
〔終了日 = 開始日〕 の 結果は ０
〔終了日 = 開始日の翌日〕 の 結果は １
〔終了日 = 開始日の前日〕 の 結果は －１ になります。

(Note-1) 休日マップ 「固定休日 : なし」
半角１２文字で "00000000000@" 。
ＶＢＡでは 「kt_休日なし」 という定数を用意してあります。


【 §４-４ 休日マップ 】

１． 『kt 関数アドイン』 における休日はパラメータ 『 休日Map 』 で指定します。

kt 関数では 『 休日Map 』 を指定する事で､下記のような多種多様なカレンダーに基づいた
日付処理が可能です。

例） ・ 第２／４土曜日が休業日
・ 日曜営業で月曜が休業日
・ 年末年始／夏期休暇
・ 普通は土曜日が休業日だが､ある日だけ営業日にする
・ Ａ社にはＡ社のカレンダー／Ｂ社にはＢ社のカレンダーで日付処理する

『 休日Map 』 に指定する内容には 「固定休日コード」 と 「休日マップデータ」 の ２ 種類があります。

２． 【固定休日コード】
日曜～土曜・祝日などに対して 「休日」 とするかどうかを 【 0 or 1 】 で指定します。
有効期間の制限が無く､マップデータの管理が必要ないので簡単に利用できます。

各桁とも 「１ ： 休日とする」 「０ ： 休日としない （営業日）」
（ 0 / 1 以外を指定した場合は "0" と見故します）

『祝日』 を休日指定する場合でも､祝日テーブルなどを別個に用意する必要はありません。
全て関数内で祝日日付を算出して判定しています。
祝日情報に関しては､ここ をクリックして下さい。

『年始』 は 【１月１日～３日】 を休日とします。
『年末』 は 【１２月２９日～３１日】 を休日とします。
『大晦日』 は 【１２月３１日】 を休日とします。

各桁の休日指定を組み合わせると､下記のように定義する事ができます。
（カッコ内は､ＶＢＡ用に kt関数Addin.xla 内で用意してある定数名です）
・ 休日なし "00000000000@" （kt_休日なし ）
・ 土日を休日 "10000010000@" （ kt_土日 ）
・ 土日/祝日を休日 "10000011000@" （ kt_土日祝 ）
・ 日/祝日を休日 "10000001000@" （ kt_日祝 ）
・ 銀行休日 "10000011101@" （ kt_銀行休日 ）
・ 官庁（日祝） "10000001111@" （ kt_官庁1 ）
・ 官庁（土日祝） "10000011111@" （ kt_官庁2 ）

※ ＶＢＡでの一括処理やシートに大量の式 （1000行以上など） を記述する場合には､処理時間が
多く掛かりますので注意が必要です。（ cf ： パフォーマンス上の注意 ）

「固定休日コード」 を 「休日マップデータ」 に変換する 関数 / サブルーチン を用意してありま
すので､「固定休日コード」を利用している環境で一括処理等を行なう場合は､臨時に 「休日マップ
データ」 を生成して処理の効率化を図ってください。

ワークシート上の式で 「固定休日コード」 を使う場合は､メンテナンス性やミスの防止の為にも､どこか
のセルに 「固定休日コード」 を書き込み､そのセルに【名前】を付けて､式の中では 『セル名』 で参照
するようにして下さい。セル に 「固定休日コード」 を書き込む場合は､【HyperLink 】が付かないように
事前に書式設定を ”文字列” にして下さい。

        ※ 『kt固定休日EX 』 関数 , 『ktTemp休日Map 』 サブルーチンの２つでのみ、固定休日コードの
曜日部分（１～７桁目）が拡張されて、第１～第５曜日の組み合わせ指定が出来ます。

３． 【休日マップデータ】
「固定休日コード」 だけでは定義できない休業日パターンが必要な場合は【休日Map作成】で休日マップ
データ (４～12年分) を自由に カスタマイズ して作成します（作成したデータ はセルに格納して､パラメータ
にはそのセルを指定します）。

「休日マップデータ」 では【第２／４土曜日】といった指定も可能です。夏期休暇など規則性の無い休日は
「１日ずつ」 登録していきます。本来なら休日となる日だが､ある１日だけ特別に営業日にすることも可能です。
（先に休日指定した日付に対して､【日付指定で解除】します）

「休日マップデータ」 には【有効期間】があります。パラメーターに指定した日付､または算出結果となる日付が､
この有効期間の範囲外となる場合には､kt関数はエラー値（#VALUE!） を返します。詳しくは各関数のリファレンス
を参照して下さい。

休日マップデータ 【 圧 縮 】 ４年間 ⇒ ２５４文字

休日マップデータ 【 ノーマル 】 ４年間 ⇒ １４７４文字

４． 休日マップデータに圧縮を用意した理由

休日マップデータは 「１日を１文字」 で表している為､最小の 『４年間』 でも軽く１０００文字を越えてしまいます。

エクセルでは
ワークシート全体をコピーする場合、個々のセルのデータ は２５５文字まで（それ以上は欠落）
 という制限がある為､圧縮していない データ をセルに収録した状態で ワークシート全体をコピーすると 【２５６文字
以降の欠落】 によりマップデータ が壊れてしまいます。

これに対処する為に､圧縮データ をサポートしています。圧縮するとサイズが 〔１／６〕 になるので､『４年間』 の
場合は【２５４文字】となり､上記の問題をクリアできます。
尚、『６～１２年間』 の場合は､圧縮しても上記の制限に引っ掛かりますので､何ら メリット はありません。

５． 休日マップデータの管理について
Ver 2.90 から 『ktMapLinker 関数』 が追加された事により､休日マップを､閉じたままのカレンダー管理ブックにて
一元管理できるようになりました。

個々のブックでは､カレンダー管理ブック上に用意された 「４ ( ２ )年/圧縮」 の休日マップを引数とした 『ktMapLinker
関数』 を記述する事により､管理ブックで定義されている休日マップを【ノーマル】モードで展開できます。

管理ブック上には 「休日マップの作成」 により､休日マップを作成してください。
期間に応じて、１～３個の 「４ ( or ２ )年 圧縮」 休日マップに分解出力されます。

既に作成済みの休日マップから、[ ktMapLinker 関数 ] 用の分解休日マップを作成する場合は、
「休日マップの作成」 で作成したシート上に書き込んである 『休日条件』 を【読み込み】ボタンにより
取り込み、そのままシートへ再度、カレンダー出力すればＯＫです。

『 kt固定休日EX 』 関数によって、「休日マップの作成」 フォームによるものと全く同レベルの定義が可能です。
ワークシート上で簡単に【休日マップ】を作成できます。

この関数を設けた理由は 「ある週の休業日が決定するのが２週間前」 といった短期間ごとの営業カレンダーに
簡単に対応出来るようにする為です。予定が決まった段階で ワークシート上の 『任意休日/休日解除』 一覧に
日付を追加していけば、それだけで【休日マップ】が即座に更新されます。

ただ、この運用方法であれば、当然の事として、設定情報がワークシート上に誰にでも見れる状態で置かれて
いる事になる訳ですから、誤って更新してしまう危険性もありますので注意して下さい。「休日マップの作成」で
作ったものならば、基本の休日管理用ブックで管理して、個々のブックでは 「外部参照式」 でその管理ブック
から取り込むように運用できますから、誤って更新してしまう危険性はありません。

したがって、出来る限り 『休日マップの作成』 フォームで作るようにして下さい。


【 §４-５　パフォーマンス上の注意事項 】

１． 実 測 値 ( 2001 年頃の PC での実測値です )

ご覧のように
『休日マップデータを使用しないで 固定休日：土日祝 等を指定』
『圧縮データのマップを指定』
は､他と比べてパフォーマンスが落ちますので､一括処理の中で使用する場合は注意してください。
（注 ： 上記のデータ は Windows 98SE 時代の PC による計測値です）

２． 所要時間の理由

「固定 ： なし」
直接 "日付１" と "日付２" をシリアル値で引き算しているだけです。

「マップ指定（ノーマル）」
ループしながら､マップデータ上の シリアル値の位置が "-" か "*" かを判定しているだけですので､
非常に高速です。

「マップ指定（圧縮）」
関数が呼び出される都度､圧縮データ を展開する処理が動きますので､その分時間が掛かります。
圧縮マップを用意している理由については下記を参照して下さい。
§４-４　休日マップ / ４．休日マップデータに圧縮を用意した理由

「固定 : 土日」
ループしながら､毎回 Weekday 関数で曜日を取り出しつつ判定していますので､それなりに時間が
掛かります。

「固定 : 土日祝」
祝日判定関数 『ｋｔ祝日判定』 を呼び出している為､多数の条件判断と色々な関数呼び出しを必要
としています（プレマップ期間外）。
この時間の掛かる祝日判定を少しでも早く処理する為に
『祝日プレマップ期間』 （参照 ： §4-2 祝日 / 2. 祝日の算出アルゴリズム ）
というものを設けています。これにより､「固定 : 土日」 とほぼ同じ位のレスポンスが得られるようになり
ました。

３． レスポンス向上テクニック

ワークシート上に圧縮したマップデータ を置いている場合、展開処理に時間を要します。したがって､マクロで
１０００回を越えるようなループを行なう場合は､ループ処理の前に
・ セル上のマップデータ を展開して文字列変数に格納
・ その展開した文字列変数をマップとして渡す
という風にすると レスポンス が向上します。

セル上の式で圧縮したマップデータ を利用する場合は､その式の数が数百程度ならば レスポンス上問題ない
と思います。それ以上の場合はノーマルマップデータ の方を使ってください。

「固定休日コード」 を 「休日マップデータ」 に変換する サブルーチン （ ktTemp休日Map ） を用意してあり
ますので､「固定休日コード」 を利用している環境で一括処理等を行なう場合は､臨時に「休日マップデータ」
を生成してやると処理を高速化できます。


【 §５ kt関数メニュー 】

『 kt関数アドイン 』 をアドイン登録すると 下記の メニューコマンド が追加されます。

----- xla 版 ( kt関数Addin.xla ) の メインメニュー -----
・ Excel 2003 以前 ： 標準メニューバー
・ Excel 2007 以降 : アドイン タブ

なお、リボンアタッチメント アドイン for AddinBox (Ver2.00) を一緒に使うことで、リボンインターフェース の
メニュー を利用することも可能です。

----- xlam 版 ( kt関数Addin.xlam ) の メインメニュー -----
リボン の [ AddinBox メニュー ] タブ
尚、[ AddinBox メニュー ] タブ は kt電話郵便アドイン (Ver 3.00) との 共用タブ です。

----- 右クリックメニュー -----
Ver 4.00 では Version 画面で ユーザ作業により 個別に作成していましたが、
Ver 5.00 より アドイン側にて ４ コマンドを一括で作成するように変更されました。

尚、カレンダー入力 / 時刻入力 / 日付時刻入力 については、「セル位置にポップアップ」
にチェックが入っていると、ActiveCell 位置にポップアップします。未チェックの場合には、
エクセル画面の中央にポップアップします。


【 §５-１　kt関数メニュー ： カレンダー入力 】

「カレンダー入力フォーム」 を呼び出す メニュー コマンド です。
「ちょっとカレンダーを確認したい」 とか 「休日マップの定義内容を確認する」 といった場合に利用して下さい。

メニューからの実行では入力した日付はアクティブセルに 書き込まれます。
（注） メニューから実行する場合は 　　『休業日表示 （ピンク）』 されません。

メニューからの実行では､アクティブセル が
日付 の場合は 「その日付の年月」
日付 以外の場合は 「本日日付の年月」
で 表示されます。

『休日Ｍａｐ』 データが格納されているセルがアクティブの
場合は､そのデータで 『休業日表示 （ピンク）』 されます。
ただし､この場合は日付入力はできません。
【日ボタン】 をクリックしても日付は書き込まれません。

スピンボタンで 「年」 「月」 を変更すると､カレンダーがその年の内容に替わります。
初期表示は 『 ktCalDate(1op, 2op, ‥‥‥) 』で指定した第２パラメータの日付（年月） になります。

標準の閉じるボタン（×）は無効にしてありますので、入力をキャンセルする場合には ピンクの×ボタンを
クリックします。

カレンダー部分で、カーソル位置の 『日』 は水色で表示されます。
また、その 『日』 が祝日の場合には 「祝日名」 が、更に【本日】の場合には ”本日” とポップアップ表示されます。

『 ktCalDate (1op, 2op, 3op, ‥‥‥) 』 の第３パラメータ （ 休日Map ） で定義した日付はピンクで表示されます。
この例では【祝日・日曜・第2/4土曜】です。
休日マップは自由にカスタマイズできますが､固定休日パターンも用意しています

このフォーム は 『ｋｔCalDate 関数』 を記述すれば､ＶＢＡマクロ から呼び出すことができます。

「日付」 以外の部分を右クリックすると、 左のように
六曜 がカラー表示されます。

更に、右側の大安・仏滅などのガイダンス部分をクリック
すると、その六曜の表示有無を切り替える事もできます。

ＶＢＡから六曜表示を指定する事もできます。

六曜表示できるのは「１９５０～２０５０年」の期間です。

六曜は七曜（日～土） と違って、常に規則正しく繰り返される訳ではありません。旧暦の各月１日の
六曜が月によって決まっており、そこから順に繰り返されます （１・７月：先勝，２・８月：友引‥‥）。
したがって、旧暦の月変わり位置で不連続になります。上の例では 5/11～12日の間で [友引・先負]
が飛んでいます。
（注） これで表示される 『六曜』 は日本標準時を基にしたものです。したがって、中国および韓国
での行事などを求めるのに参考としないで下さい。年によっては【１日のズレ】が出る場合があ
ります（例：旧暦２００１年４月）。
詳しくは 『 kt旧暦 』 の解説を読んで下さい。

kt関数メニューでのカレンダー入力は 「日付のみ」 ですが､ 『 ktCalDate 』 自体には、『時刻入力
フォーム：ktSelClock 』 との連携機能があり､【日付＋時刻】の入力も行なえます。

右クリックメニューに追加されるコマンドには【日付＋時刻】の機能もあります。


【 §５-２　kt関数メニュー ： 日付連続入力 】

「 カレンダー入力 」 は、ひとつのセルへの日付入力 ですが、セル範囲を選択して、
この メニュー コマンド を実行すると、そのセル範囲に対して、カレンダーフォーム
を表示したまま連続して日付を入力できます（セル 範囲を終えるか、キャンセルした
場合に終了します）。

日付連続入力は 『 ktCalRepeat サブルーチン 』 を マクロで呼ぶ事でも利用できます。

「複数行/複数列」 の範囲を指定した場合、入力順は【左→右/上→下】 と行単位で進みます（下側の図）。

列単位で【上→下/左→右】 の順 （上側の図） に進めたい場合は、１列を選択した後、[ CTRL ] キーを押し
ながら２列目を選択、更に [ CTRL ] キーを押しながら３列目と選択していきます。

セルに書式が設定されていなければ [ yyyy/m/d ] 書式で書き込まれます。
それ以外の書式で入力したい場合は、入力範囲のセルに予め書式設定を行なっておいて下さい。


【 §５-３　kt関数メニュー ： 時刻入力 】

「 時刻入力フォーム 」 を呼び出す メニュー コマンド です。

メニュー からの実行では入力した時刻は アクティブセル に書き込まれます。

このフォームは 『 ｋｔSelClock 関数 』 を記述すれば､ ＶＢＡマクロから呼び出すことができます。

当日： AM / PM
『 ０：００～１１：５９ 』 『 １２：００～２３：５９ 』 の範囲が入力できます。

翌日： AM / PM
『 ２４：００～３５：５９ 』 『 ３６：００～４７：５９ 』 の範囲が入力できます。

中央の時刻表示（選択時刻）
マウスカーソル位置が示す時刻を表示します。枠外の現在日時に
カーソルを合わせると､その時刻 （背景：黄色） になります。

下部の 日付＆時刻
現在日時を表示しています。マウスを動かしている限りはリアルタイム
で表示更新されます。

時計盤の枠内
時計盤 の枠内でマウスを動かすと､時計位置に沿って 『分』 が 【０～５９】 で変化します。
そのまま クリック するだけで､その時刻が取り込まれます。

時刻文字【付近】では 「５分単位」 の値になります。
[１分] とか [４分] などは､時刻文字の近くでは反応しませんので､少し内側を探って下さい。

『時』 の切り替えは時刻文字を【右クリック】します。

※ マウスカーソル が 時刻文字の上にある時は 時刻文字が 【 斜体 】 になります。

従来の時刻入力コントロールは､
・ ドロップダウンリスト から選択したり
・ スピンボタンで 時/分の値を変更する
方式が一般的でしたが､この時刻入力フォームには以下のように、直感的/視覚的なマウス操作で時刻入力が
可能という特徴があります。

・ アナログ時計を模した時計盤フォームがポップアップ
・ ＡＭ/ＰＭ(＆当日/翌日)はオプションボタンで切り替え
・ 「時」 は１～１２の時刻文字を『右クリック』で選択
・ 後は､その時計盤上でマウスを滑らせれば 「分」 が [０～５９] の間でリアルタイムに変化
・ ３時の位置にマウスカーソルを置けば､それだけで 「１５分」
・ 入力する時刻の位置にマウスを合わせたら､その場所でクリックすれば､それで時刻が取り込まれます
・ 時計盤の下には【現在日時】が表示されます（マウスを動かしている限りはリアルタイムで更新されます）
・ 【現在日時】の上でマウスクリックすると､『現在時刻 (時＆分)』で取り込まれます。
【現在日時】上にマウスがある時は､時計盤中央の 「選択時刻」 も現在時刻になります。

『 ktCalDate 関数 』 には 『時刻入力フォーム ： ktSelClock 』 との連携機能があり､【日付＋時刻】の入力も
行なえます。

右クリックメニューに追加されるコマンドには【日付＋時刻】の機能もあります。


【 §５-４　kt関数メニュー ： 休日Mapの作成 】

『営業日 関連 関数』 や 『カレンダー入力フォーム』 で利用する
【 休業日を定義した休日Ｍａｐ 】
を作成するツールです。

「２～１２年間」 の休業日カレンダーを作成できます。

休日マップは 『 kt固定休日EX 』 関数で作る事も出来ます。

１． 先ず最初に 『 開始年（西暦） 』 とマップの 『 期間（２・４・６・８・１０・１２年） 』 を指定します。

２． 祝日/振替休日を休業日として定義する場合は【祝日】 をクリック します。
これだけで､期間内の全ての祝日/振替休日が休業日になります。
もう一度クリック してピンク表示を消せば解除できます。

３． 年始/年末/大晦日を休業日として定義する場合は【年始/年末/大晦日】 をクリック します。
『年始：１月１～３日 , 年末：１２月２９～３１日 , 大晦日：１２月３１日』
これだけで､期間内の全ての年始/年末/大晦日が休業日になります。
もう一度クリック してピンク表示を消せば解除できます。

４． 曜日別に休業日を定義する場合は、その曜日の チェックボックス を【オン】にします。
曜日ラベルの部分を クリック すると 『第１～５』 を一度に【オン】に出来ます。

５． 夏期休暇・創業記念日などの休業日は 『ひとつひとつ日付を指定して登録』 します。
テキストボックスに日付（西暦）を入力してから【休日設定】を クリック してリストに追加します。
「毎年この日は休日（例えば､5/1､5/2など）」 という登録を一度で行なう機能はありません。
各年の日付を 『ひとつひとつ登録』 して下さい。

リストに登録した日付を削除するにはリスト内の 「その日付」 をダブルクリック します。

６． テキストボックスをダブルクリック すると､カレンダー入力フォーム が ポップアップします。
カレンダー入力フォーム はテキストボックスの日付の 〔年/月〕 で初期表示されますので､
連続した日付を登録する場合（夏期休暇など）は､登録後のテキストボックスの内容をその
ままにダブルクリック してカレンダー入力フォーム を呼び出すようにすれば､簡単に登録で
きます。

慶弔を基に日付を指定する場合は 『六曜モード』 チェックボックスを【オン】にしておくか、
カレンダー入力フォーム が表示されてから、日付以外の部分を右クリックすると 六曜表示
モードで表示されます。

７． 一度登録した休業日の一部を解除するには､テキストボックスに日付を入力してから【休日解除】
をクリックしてリストに追加します。「曜日指定での解除」 という機能はありません。

リストに登録した日付を削除するにはリスト内の 「その日付」 をダブルクリックします。

８． 「普通は土曜日は休みだが､ある１日だけ営業する」 というカレンダーは､先ず 『全ての土曜日』
を休業日とした後で､その営業する日の日付で 『休日解除』 します。

９． 定義した 『休業日条件』 は右側のカレンダーで常に確認できます（休業日はピンク表示されます）。
スピンボタンで 『月』 をシフトできます。

１０． 作成した休日マップはワークシート上に出力して保存します。
出力先のブック は事前に開いておく必要があります。

１１． ブック の コンボボックス には 「現在開いているブック一覧」 が設定されていますので､その中から
出力先ブック を選択して下さい。ブックを選択すると 「そのブックのシート一覧」 がシートのコンボ
ボックス に設定されますので､出力先シートを選択して下さい（選択したシートが Active になります）。

最後に基点となるセル位置を マウスパッド で指定します（位置を確認するのにフォームが邪魔な
場合は､ 『▲』 ボタンでフォームを折り畳んで下さい）。

マウスパッド内で [ Shift ] キーを押しながらマウス を動かすと、その方向にアクティブセルが移動し、
セルアドレスが隣のボックスに表示されます。

１２． 「休日マップデータ だけ」 出力する場合は【マップデータのみ】をクリックします。

１３． 【カレンダー出力】 をクリックすると､休日マップデータ（圧縮 ＆ ノーマル）と縦型カレンダーおよび操作
内容（リストボックスの内容）が出力されます。この場合には､出力先シートはクリアされますので注意して
下さい。

１４． 【[ 関数式 ] 出力】 をクリックすると、『 kt固定休日EX 関数 』 を使った定義を出力する事ができます。

１５． 既存の休日マップを修正する場合は､「カレンダー出力」 でシート上に書き出された 『休日条件データ』
を【読込】ボタンで取り込みます。


【 §５-５　kt関数メニュー ： 休日Map情報 】

休日マップデータ が格納されている セル を選択してから、この メニュー コマンドクリック を
実行すると､ 下記のように休日マップデータ の タイムスタンプ が表示されます。

セルの内容が 『 固定休日コード 』 の場合には その内容が表示されます。

『 ktMsgBox 関数 』 を使って表示しています。


【 §５-６　kt関数メニュー ： 暦シートの作成 】

カレンダー を ワークシート上に作成するツールです。

「月単位」 または 「１年間」 のカレンダーが作成できます。

『１６日～翌月１５日』 といった形式での作成も可能です。

１． 作成できる暦は 『縦型』 『横型』 『Box (大)』 『Box (小)』 の４種類です。
Box 型の場合には､[ ３×４ ] [ ４×３ ] の配置にする事も可能です。
Box 型で配置を選択しない場合は縦１列となります。
[ ３×４ ] [ ４×３ ] 配置を選択した場合は､自動的に 『１年間＆Ｂｏｘ （小）』 に切り替わります。
（Ｂｏｘ （大） が既に選択されている場合は､そのまま）

２． Box 型の場合には､『 日月火水木金土 』 と 『 月火水木金土日 』 の２種類の並びで作成できます。
『 月～土日 』 並びの場合にはチェックボックスをオンにします。
『 月～土日 』 をチェックすると､自動的に 『 Ｂｏｘ （小） 』 に切り替わります。
（Ｂｏｘ （大） が既に選択されている場合は､そのまま）

３． テキストボックス に暦を作成する期間の開始日を入力し､『 １ヶ月 』 『 １年分 』 をどちらかを選択します。
テキストボックスをダブルクリック すると､カレンダー入力フォームがポップアップします。
１年分の場合には出力先シートはクリアされます。

４． 期間の開始日は任意です。『 １日 』 以外を指定しても構いません。
『 １日 』 を指定した場合は､その月の月末までが期間となります。
『 １日以外 』 を指定した場合は､翌月の応当日前日までが期間となります（１６日を指定すれば､１６～翌１５日）。

５． 『 １年分 』 の場合の開始月も任意です。『 １月１日 』 を指定すれば､その年の 『 １２月 ３１日 』 までが期間となります。
『 ４月１日 』 を指定すれば､翌年の 『 ３月３１日 』 までが期間となります。
もちろん､【日】 は 『 １日 』 以外でも構いません。

６． カレンダーに表示する 『 休業日 』 を指定する方法をチェックボックスで選択してください。

７． 「固定休日」 の場合は､各ボタンをクリックして 押し下げれば 『 休日指定 』 となります。
再度クリックすれば戻ります。また､チェックボックス を解除すれば 「全て解除」 されます。
年始 ： １月１～３日 , 年末 ： １２月２９～３１日 , 大晦日 ： １２月３１日

８． 「休日マップ」 の場合には､その休日マップが書き込まれているブックが予め開いている必要があります。
休日マップが書き込まれているセルを 『ブック/シート/セル』 で指定します。
暦の作成先シートに 「休日マップ」 が用意されている場合､暦作成後に消えますので注意して下さい（暦自体
には､ちゃんと休日マップが反映されます）。この場合には､注意のダイアログが表示されます。

９． 暦を作成する出力先を 『ブック/シート/セル』 で指定して【作成】ボタンをクリックしてください。

１０． ブック の コンボボックスには 「現在開いているブック一覧」 が設定されていますので､その中から出力先ブックを
選択して下さい。ブックを選択すると 「そのブックのシート一覧」 がシート の コンボボックス に設定されますので､
出力先シート を選択して下さい （コンボボックス から ブック/シート を選択すると､その シート が Active になります）。

１１． 最後に基点となるセル位置を指定します。
パッド 領域内で [ Shift ] キーを押しながら マウス を動かすと、その方向に アクティブセル が移動して、その
アドレス が ボックス に表示されます。

『 ｋｔ暦作成 』 サブルーチン を記述すればＶＢＡマクロ から カレンダーを作成できます。


【 §５-７　kt関数メニュー ： 祝日一覧の表示 】

指定した 「年」 の全ての祝日を表示するツールです。
祝日に関する情報は こちら を参照してください。

表示された 『祝日』 はワークシート上に出力することもできます。

分析ツール【WORKDAY，NETWORKDAYS 】に指定する 『祭日』 データ
として利用してください （関数に指定するのは [日付] の１列 だけです。曜日/
祝日名の列まで指定すると関数はエラーになり ます）。

１． 年（西暦） を入力して 「祝日表示」 ボタン を クリック すると､その年の祝日が表示されます。

２． [ 年始 （1/2～1/3） ] [ 年末 （12/29～12/31） ] [ 大晦日 （12/31） ] に チェック を入れると､
その日付も一緒に展開されます。

３． 「シート出力」 ボタン を クリック すると、ActiveCell を基点にして祝日一覧を書き出します。
マウスパッド 内 で [ Shift ] キーを押しながらマウスを動かすと、その方向に ActiveCell が動きます。

下記のサブルーチンで､同じ出力を得ることができます。

Sub 祝日一覧(ByVal 対象年 As Integer)
Dim str祝日名 As String
Dim MyDate As Date
Dim LastDate As Date
Dim i As Integer

MyDate = DateSerial(対象年, 1, 1)
LastDate = DateSerial(対象年, 12, 31)
i = 0
Do
str祝日名 = kt祝日名取得 (MyDate)
If (str祝日名 <> "") Then
i = i + 1
With ActiveSheet
.Cells(i, 1).Value = Format(MyDate, "yyyy/m/d")
.Cells(i, 2).Value = Format(MyDate, "（aaa）")
.Cells(i, 3).Value = str祝日名
End With
End If
MyDate = DateAdd("d", 1, MyDate)
Loop Until (MyDate >= LastDate)
End Sub


【 §５-８　kt関数メニュー ： 万年暦の表示 】

指定した年の年間カレンダーを表示するツールです。
祝日に関する情報は こちら を参照してください。

「年月」 にマウスを合わせると 『和暦年・十二支・和風月名』 を表示します。
祝日の日にマウスを合わせると祝日名を表示 します。

このフォームを表示する際、Frame コントロールを１２個 も使用している為に、エクセルが作業バッファ等の
確保を行なっているものと思われるディスク動作が起きるかもしれません（実際に暦を作っているktPasteCal
はディスクアクセスに繋がる処理は一切行なっていません）。

テキストボックスに表示したい 『年』 を西暦で入力すると暦を表示します。
暦を表示した後はスピンボタンで前年/翌年を表示する事ができます。

チェックボックスの指定で 『月→土・日』 並びにする事もできます。


【 §５-９　kt関数メニュー ： カラーパレットＥＸ 】

カラー情報 を パレット または ＲＧＢ 指定で作成する支援ツールです。

カラーパレット は ＡｃｔｉｖｅＢｏｏｋ のものが適用されます。

クリップボード に ”&HBBGGRR” という形式の文字列が コピー されます。

-- 左 画面 （カラーパレット） --

１． Web Safe Color
凹状態 にすると､ＲＧＢ各色が [ 0x00 , 33 , 66 , 99 , CC , FF ] の組み合わせとなる [ WebSafeColor ] のみが
選択可となります。WebSafeColor は､Win とMac で同じ発色になります。

２． スピンボタン
左右の スピンボタン によって、右側の ＲＧＢ画面 を展開したり、畳んでパレットのみにしたりの切替ができます。

３． パレット ボタン （５６ 色）
ＲＧＢ画面が出ていない時は､クリック するとそのカラーの１６進 ”＆ＨＢＢＧＧＲＲ” がクリップボード に コピーされます。
ＲＧＢ画面が出ている時は､選択した カラー がＲＧＢ画面に反映されます。

５６色の パレット上にマウスカーソルを重ねると､そのカラーの [ ColoIndex ] と 「 １６進 」 がポップアップ表示されます。

４． ワークブック 名
ここに表示されている ワークブック の カラーパレット が表示されています。
通常は アクティブ ブック です。

５． Cancel ボタン
閉じるボタン　（×）　を無効にしてあります。入力をキャンセルする場合にクリックします。

-- 右 画面 （ＲＧＢ 画面） --

６． スクロールバー ＆ スピンボタン （Ｒ , Ｇ , Ｂ）
ＲＧＢ の値を変更して 「カラー」 を作成します。
スピンボタン と スクロールバーは連動しています。

７． [ ３ Ｃｏｌｏｒ ] スピンボタン
カラーの 『明度』 を調整します。このボタンは３色を同時に増減します。

８． [ Lock ] ボタン （Ｒ , Ｇ , Ｂ）
明度』調整の際に【固定】するカラーを１色指定できます。
これで 『彩度』 に似た調整を行なうことができます。

９． カラー 表示枠
ＲＧＢ を調整して作成したカラーを表示します。

１０． Color ボタン
ＲＧＢ画面（右 画面） が表示されている時のカラー決定ボタンです。
そのカラーの１６進 ”＆ＨＢＢＧＧＲＲ” が クリップボード に コピー されます。

このフォームは 『 ktPaletteColorEX 』 サブルーチンを記述すればＶＢＡマクロから呼び出すことができます。

※　Excel 2003 以前では、ワークシートのセルに設定できる色は 『カラーパレットの５６色』 だけです。
これ以外の色を設定しようとすると 『５６色』 のいずれかに置換されます。
（別に公開している 『色見本作成フォーム (Ver2.1) 』 というソフトで確認できます）

UserForm のコントロールには､ＲＧＢ指定の全ての色が設定できます。
UserForm 設計時の色設定のサポートツールとして利用して下さい。


【 §５-１０　kt関数メニュー ： ＦａｃｅＩｄ一覧 】

コマンドバー（ツールバー）のアイコンとして 指定する 『 FaceId 』 を一覧表示するツール です。
（Excel2007 以降では 使用できません）。

一度に５００個ずつ表示されます。【←】【→】 ボタンをクリックすると前後の５００個が表示されます。
アイコンの上にマウスを合わせると､そのアイコンの 『 FaceId 』 番号がポップアップ表示されます。


【 §５-１１　kt関数メニュー ： ktMsgBox ウィザード 】

ktMsgBox / ktMsgBoxEX の ウィザード ツールです。

引数が非常に多いですが､この ウィザード で テスト した設定は、 そのまま ソースコード に変換してくれ
ますので､クリップ ボード から モジュールウィンドウ へ貼り付ければ直ぐに動かす事が出来ます。

Test
このダイアログで設定した内容でテスト表示します

Source Code
このダイアログで設定した内容のマクロ コード を クリップボード に コピーします。
そのまま､モジュールウィンドウに貼り付けてください。

Prompt
表示するメッセージを記入します。
改行する場合は [ Shift + Enter ] です。

Font
ＰＣ に インストール されている フォント および [ フォント の略記号 ] が コンボボックス に
設定されていますので、使用するフォント をリストから選択します。

【 略記号 】
"UIG" | : MS UI Gothic |
"MSG" | : ＭＳ ゴシック |
"MSPG" | : ＭＳ Ｐゴシック |
"MSM" | : ＭＳ 明朝 |
"MSPM" | : ＭＳ Ｐ明朝 |
"ARI" | : Arial | （英語フォント）
"CENT" | : Century | （英語フォント）
"COUR" | : Courier New | （英語フォント）
"ROMAN" | : Times New Roman | （英語フォント）
"TAHOMA" | : Tahoma | （英語フォント）

Size
フォントサイズ を ９～２０ の中から選択します。

Bold
Ex チェックボックス が オン （ktMsgBoxEX ) の場合に指定できます。

Ex チェックボックス / Clear
オフ の場合は ktMsgBox 、オン の場合は ktMsgBoxEx による表示です。
ktMsgBoxEX では、太字指定 および
行グループ単位でのフォント/カラー指定が可能です。

Clear ボタンで 登録した全ての行グループの内容が消去され、初期状態に戻ります。

Group
Ex チェックボックス が オン の場合に、行グループ番号（ Max 10 ） の指定を行ないます。
指定した 行グループ の内容が Prompt 欄に表示されます。

Resp Code
テスト表示で応答したボタン種類、または InputBox 機能で入力した内容を表示します。

PromptColor / BackColor / Clear
メッセージボックス の 文字色/背景色を指定します。
左クリック で パレットフォーム、右クリック で 色名フォーム が ポップアップ します。
Clear ボタンで色指定が リセット されます。

Title
メッセージボックス の キャプションに表示する文字を指定します。
省略すると､ktMsgBox or ktMsgBoxEX になります。

Buttons
メッセージボックス に表示する標準のボタン＆アイコンを選択します。

Icon
標準の 「警告・問合せ・注意・情報」 の他に､１３ 種のオリジナルアイコンが指定できます。

Default Button
デフォルトボタンの番号を指定します。

ボタン表示を英語版に合わせる
「はい､いいえ」 などの ボタンキャプション を英語版Excel と同じ 「ＯＫ , Ｃａｎｃｅｌ」 などに
変更できます。

Top ＆ Left
表示位置を指定します。
一方もしくは両方を省略するとウィンドウ中央に表示されます。

特定の セル の付近に表示させたい場合には、 Top/Left に設定する座標データ を
ktCell2Position 関数を使って取得します。使用方法は ktMsgBox の 使用例 を参照
して下さい。 ( Ver 4.00 ～ )

Chime
Wave音の連続再生を指定します。
Wave音はボタンを押すまで鳴り続けます。

Wait Second
一定時間表示したら自動的に閉じる秒数を指定します。

Chime/Wait Guidance Color
Chime/Wait 機能時に表示されるガイダンスメッセージの文字色を指定します。
省略すると 「茶色」 になります。
左クリック で パレットフォーム、右クリック で 色名フォーム がポップアップします。
Clear ボタンでリセットされます。

Input Type
InputBox 機能を利用する場合に､その属性・入力欄の幅・デフォルト値を指定します。

User Define Button
ユーザー定義ボタンを利用する場合に､その内容を定義します。

Wave/Icon File
Wave音やアイコン画像を指定する場合に､そのフルパスを指定します。
ダブルクリックで [ ファイルを開く ] ダイアログが表示されます。

BackImage/Width/Height
メッセージボックス に背景画像を使用する場合に､そのフルパスを指定します。
ダブルクリック で [ ファイルを開く ] ダイアログが表示されます。
メッセージボックス の 大きさを指定する事も出来ます。

HyperLink
ハイパーリンクメッセージを使用する場合に記入します。
ＨＰは [ http: ～ ] 。
メールは [ mailto: ] に続けてメールアドレスを記述します。


【 §５-１２　kt関数メニュー ： カレンダーマーク描画 】

アクティブセルに 「円・三角・菱形・ハート など」 の Shape 画像 を描画する事が出来ます。
Ver 4.00 から 図形に 『二重丸』 が追加されました。

ktCalShape2 サブルーチン を対話的に実行 するツールです。

※ Excel 2007以降で、「枠線のみ（塗り潰し無し」 の指定が 【塗り潰し】 になる不具合は Ver 4.00 で修正しました。

１． 図形は 「アクティブセル」 に丁度収まるように描画されます。
左下の枠内を [ Shift ] を押しながらマウスを動かすと、それに合わせてアクティブセルが移動します。

２． [ 種類 ] [ 色 ] [ 可視 ] [ 透過 ] を選択後に 『 描画 』 ボタンをクリックすると、アクティブセルに描画されます。
『 ktCalShape/ktCalShape2/カレンダーマーク描画 』 で描画されるシェープ画像は全て
[ "ktshp_" + セルアドレス（A1形式） ]
という名前になります（例： ktshp_A1 , ktshp_G5）。

尚、そのセルが 『保護 （オブジェクト）』 されている場合は、図形描画されません。

３． [ 種類 ] は下記の９種の図形が選択できます。 （二重丸 は Ver 4.00～ ）
１ ： 円 , ２ ： 上三角 , ３ ： 下三角 , ４ ： 四角 , ５ ： 菱形
６ ： 星型 , ７ ： 十字 , ８ ： 六角形 , ９ ： ハート , １０ ： 二重丸

４． [ 色 ] のボックスをクリックするとパレットフォームが開きますので、それで色を決定してください。

５． [ 可視 ] のチェックを外すと 『 非表示 』 状態で描画されます

６． [ 透過 ] はスクロールバーを動かして、
塗潰し（０） ～ 半透明（０．１～０．９） ～枠線のみ（１）
を選択できます。透過効果はエクセルバージョンによって見栄えが異なります。

７． [ Reset ] [ 全表示 ] [ 全削除 ] は 『 ktCalShape 関数 』 に対する補助機能になります。

ktCalShape 関数をセルに記述し、コピー＆ペーストやオートフィルなどを繰り返すと、
・ 同じ名前の図形が出来たり （例： ktshp_A1 という名前の図形が２つ）
・ ひとつのセル上に違う名前の図形が重なってしまったり
する場合があります。そうすると、ktCalShape 関数の引数値が変化しているのに図形に反映されない（実際は反映
されているけれども、上に別の図形が乗っかっていて隠されている） などの症状がでる場合があります。そのような
場合は 『 Reset ボタン』 を実行して、不要な図形の削除/名前重複の解消を行なって下さい。

ktCalShape 関数には [ 可視 ] 引数があります。
シート設計時に、引数の内容（表示/非表示）に係わらず、そこに図形が有るのか無いのか確認したくなる場合が
あります。そのような場合には 『 全表示 ボタン 』 をクリックすれば、全ての [ ktshp_xx ] という名前の図形が [ 表示 ]
状態になります。引数の内容通りに 「非表示」 状態に戻すには、そのセルの式を選択するなどして、再計算させて
ください。

セルに記述した ktCalShape 関数の式を消しても図形は残ります。ひとつふたつ位なら、個々に選択して「削除」で
済みますが、数が多い場合には 『全削除 ボタン』 をクリックすれば、そのシートにある [ ktshp_xx ] という名前の
図形のみ一括で削除します。


【 §５-１３　kt関数メニュー ： kt関数ヘルプ 】

この 『ヘルプ』 を表示する メニュー コマンドです。

『 ｋｔ関数Addin.xla ( または kt関数Addin.xlam ) 』 と同じフォルダに 「ｋｔFuncHelp.chm」 が
入っていないと、kt関数メニューから表示できません。


【 §５-１４　kt関数メニュー ： バージョン情報 】

『 kt関数Addin. xla / kt関数Addin. xlam 』 のバージョン情報を表示する メニュー コマンドです。

『 ktSound 』 で鳴らしたWave音が止まらなくなった場合はこの画面から停止させる事が出来ます。

Ver 4.00 まで有った 「右クリックメニュー 作成機能」 は Ver 5.00 で廃止になりました。
( アドイン 起動時に ４ コマンド共 アドイン側で作成するようになりました）


【 §６　関数リファレンス 】

※ kt関数は Ver 5.30 で 新元号[令和]に対応しました。
kt関数アドインが提供する関数は、新元号「令和」対応になっていない環境でも
[日付] 引数に 「令和 日付文字列(元年 表記を含む)」を指定可能です。

関数によっては [ VBA ONLY ] [ #VALUE! ] といった制限/注意事項があります。

※ 『条件付書式』 の条件式にアドイン関数は指定できません。
ｋｔ祝日判定 などを使ってセルに色を付ける等の効果を施す場合は､非表示のダミー列を用意して､
そこに条件式 を記述し､『条件付書式』ではダミー列の結果を参照するようにします。

※ 関数説明の 「構文」 における、返却値 および 引数の【型】 について
「構文」 項での【型】は、ＶＢＡでの定義を基に記載してあります。
ＶＢＡを知らない人は、下記のように読み替えて貰えば充分です。
Integer 型 / Long 型 ‥‥‥ 数値 （小数なし）
Single 型 / Double 型 ‥‥‥ 数値 （小数あり）
String 型 ‥‥‥ 文字列 （日付文字列も、ここに含まれます）
Date 型 ‥‥‥ 日付 （シリアル値）
Variant 型 ‥‥‥ 複数の型の混在 （例えば、日付 or 日付文字列）

返却値 が [ Variant 型 ] となっている場合は、本来の返却値の他に【#VALUE!】の返る可能性があります。

[ 日付チェック ] [ 日付情報 ] [ 時刻 ] [ 祝日 ] [ 営業日計算 ] [ 休日Map情報 ] [ カレンダー ]
[ 電話番号 ] [ UserForm / 他 ] [ ブック ・ シート ] [ カラー ] [ プリンター ] [ 文字 ] [ プログレスバー ]

【 日付チェック 関連 】
1. ktIs月
「１≦月≦１２」 を判定する関数です。

2. ktIs日
「１≦日≦３１」 を判定する関数です。
月・年(オプション)を指定すると､その月に応じた月末日で判定します。

3. ktIs月末日
指定した日付が 『月末日』 かどうかを判定する関数です。

4. kt閏年判定
指定した年が 「閏年」 かを判定する関数です。

5. kt年月 [ #VALUE! ]
指定した 「日付」 または 「年 ＆ 月」 から "yyyymm" という文字列を返す関数です。
月を シフト させて 「当月？　翌月？」 といった判定に利用します。

【 日付情報 関連 】
6. kt元号変換 [ #VALUE! ]
年の 「西暦 ⇔ 和暦」 変換を行なう関数です。

7. kt月末日付 [ #VALUE! ]
ｙ年ｍ月の 「月末日」 をシリアル値で返す関数です。
分析ツールアドインのEOMONTH に相当する関数です。

8. kt第n週 [ #VALUE! ]
日曜日から始まるカレンダーで､指定の日付が第何週になるのかを調べる関数です。

9. kt第n曜日 [ #VALUE! ]
指定の日付が月の第何？曜日になるのかを調べる関数です。

10. kt曜日日付 [ #VALUE! ]
指定した年月の第何？曜日に当たる日付をシリアル値で求める関数です。

11. ktPeriodYMD [ #VALUE! ]
日付間の期間を､”ｙ年ｍヶ月ｄ日”の形式で求める関数です。

12. ktJR運賃期間 [ #VALUE! ]
ＪＲの特急/急行料金を求める為の 『繁忙/閑散/通常期』 を判定する関数です。

13. kt前年同曜日 [ #VALUE! ]
指定日と [ 同月 ＆ 同曜日 ] 位置の日付を返す関数です。

14. ktDAYS360 [ #VALUE! ]
30日/月、360日/年のルールに基づいた日数計算を行なう関数です。

15. ktDATEDIF [ #VALUE! ]
期間から日数・月数などの日付計算を行なう関数です。

16. ktEraFormat [ #VALUE! ] ( Ver 5.30 ～ )
新元号「令和」対応で日付編集を行なう関数です。

17. ktEraCDate [ #VALUE! ] （ Ver 5.30 ～ ）
新元号「令和」対応で日付変換を行なう関数です。

18. ktEraIsDate （ Ver 5.30 ～ ）
新元号「令和」対応で日付データの妥当性をチェックする関数です。

【 時刻 関連 】
19. ktWorkingTime [ #VALUE! ]
始業・終業時刻から､各就業時間帯での実働時間を求める関数です。
就業時間帯はパラメータで自由にカスタマイズできます。

20. ktBoundaryTime [ #VALUE! ]
FLOOR/CEILING関数の代替関数です。
『小数誤差』 を含む時刻の場合でも正しく算出します。

21. ktCTime [ #VALUE! ]
時刻シリアル値の小数誤差を取り除きます。
[ 24:00 ] 以上の時刻文字列もシリアル値に変換できます。

22. ktSelClock [ VBA ONLY ]
アナログ時計風フォームで時刻を入力する関数です。

【 祝日 関連 】
１９４８年制定の現 「祝日法」 で定められた 『祝日(1949年～)』 に関する関数です。

23. kt祝日日付 [ #VALUE! ]
変動する祝日(成人の日・春分の日など)のシリアル値を求める関数です。

24. kt祝日判定
指定した日付が 祝日(または振替休日) かどうかを判定する関数です。

25. kt祝日名取得
指定した日付が 祝日(または振替休日) の場合に､その祝日名を返す関数です。

26. kt祝日PreMap設定
祝日判定を高速化する為の 『祝日プリマップ』 を設定するサブルーチンです。

【 営業日 計算 関連 】
下記の関数で利用する 『 休日マップ 』 の作成方法は､ ここ をクリック

27. kt営業日判定
指定した日付が 「営業日」 かを判定する関数です。

28. kt営業日数 [ #VALUE! ]
日付間の 「営業日数」 を求める関数です。
分析ツールアドインのNETWORKDAYS に相当する関数です。

29. kt営業日算出 [ #VALUE! ]
ある日付から指定した営業日数後の 「営業日」 をシリアル値で求める関数です。
分析ツールアドインのWORKDAY に相当する関数です。

30. kt月初営業日 [ #VALUE! ]
月の 「月初営業日」 をシリアル値で求める関数です。

31. kt月末営業日 [ #VALUE! ]
月の 「月末営業日」 をシリアル値で求める関数です。

32. kt締日算出 [ #VALUE! ]
「１５日締め」 等に対応する 「営業日」 をシリアル値で求める関数です。

【 休日Map 情報 関連 】
下記の関数で利用する 『 休日マップ 』 の作成方法は､ ここ をクリック

33. ktIs休日Map
「休日マップデータ」 のフォーマットチェックを行なう関数です。

34. ktIs固定休日
「固定休日コード」 のフォーマットチェックを行なう関数です。

35. kt休日MapIdGet [ #VALUE! ]
「休日マップデータ」 の 「Id フィールド」 から各種情報を取り出す関数です。

36. kt休日MapId編集
「休日マップデータ」 のタイムスタンプを返す関数です。

37. ktIs有効期間
指定した日付が 「休日マップデータ」 の範囲内かを判定する関数です。

38. ktマップ圧縮解凍
「休日マップデータ」 を圧縮・解凍するサブルーチンです。

39. ktTemp休日Map
『固定休日コード』 を 「休日マップデータ」 に変換するサブルーチンです。
ＶＢＡで大量の一括処理する場合には､『固定休日コード』 では非常にパフォーマンスが落ちるので､
『固定休日コード』 の内容を 「休日マップデータ」 に変換して処理の高速化を図る為のサブルーチンです。

40. kt固定休日EX [ #VALUE! ]
『固定休日コード』 に任意休日の日付一覧を付加して 「休日マップデータ」 に変換する関数です。

41. ktMapLinker [ #VALUE! ]
閉じている ブック に用意されている１～３個の 「休日マップ（４ ( or ２ )年＆圧縮）」 を読み込んで､
２～１２年の休日マップ（ノーマル）を展開する関数です。

【 カレンダー 関連 】
下記の関数で利用する 『休日マップ』 の作成方法は､ ここ をクリック

42. ktCalDate [ VBA ONLY ]
カレンダーフォーム を使って日付入力を行なう関数です。

43. ktCalRepeat
カレンダーフォーム を使って連続して日付入力を行なうサブルーチンです。

44. ktMultiCal [ VBA ONLY ]
カレンダーフォーム を使って期間日付入力を行なう関数です。

45. kt暦作成
１ヶ月分の暦をシート上に作成するサブルーチンです。
縦・横・BOX（大）・BOX（小）の４種類を指定できます。

46. ktPasteCal
UserForm上に用意したフレーム内にカレンダーを作りこむサブルーチンです。

47. kt和風月名 [ #VALUE! ]
１月～１２月に対応した 「睦月～師走」 という名前を返す関数です。

48. kt干支 [ #VALUE! ]
年・月・日の各々の干支（十干/十二支）を求める関数です。

49. kt旧暦 [ #VALUE! ]
新暦日付に対する旧暦日付と六曜（大安・仏滅‥‥）を求める関数です。

50. kt六曜検索 [ #VALUE! ]
「次の大安は何日？」 といった日付検索をする関数です。

51. kt節気日付 [ #VALUE! ]
「二十四節気」 の日付を求める関数です。

52. ktCalShape [ ワークシート ONLY ]
セルに値を返しつつ､そのセル上にShape図形を描画する関数です。

53. ktCalShape2
ktCalShape関数の描画モジュールです。
ＶＢＡから利用する場合には、こちらを使います。

【 電話番号 関連 】
54. ktPhoneNumber （ Ver 5.30 ～ ）
電話番号をハイフン等で編集 ＆ 編集済み電話番号の検証を行なう 関数です。

【 UserForm / 他 関連 】
55. kt閉じるボタン
UserForm の 「閉じるボタン（X）」 をＡＰＩを使って無効化するサブルーチンです。

56. ktMsgBox [ VBA ONLY ]
     表示位置/文字色/背景色などを変更できる､MsgBox の代替関数です。

57. ktMsgBoxEX [ VBA ONLY ]
ktMsgBox を更に拡張させて行単位で文字装飾できる MsgBox の代替関数です。

58. ktMsgBoxPromptTypeInit
ktMsgBoxEX の [ Prompt ] 引数を初期化するサブルーチンです。

59. ktSound
Wave音を [ PlaySound ] ＡＰＩによって再生するサブルーチンです。

60. ktCellMovePad
モーダルフォーム上で アクティブセル を移動させるパッド（ラベル）を実現させる為のサブルーチンです。

61. ktCell2Position [ #VALUE! ] [ VBA ONLY ] ( Ver 4.00 ～ )
セル 位置を UserForm の表示位置（ X ＆ Y ） の値に変換する関数です。
ktMsgBox / ktMsgBoxEX を アクティブセル などの指定セル位置に表示する為に使用します。

【 ブック・シート 関連 】
62. ktFolder選択 [ VBA ONLY ]
「フォルダー選択ダイアログ」 を操作する関数です。
ＡＰＩ 回りの処理を関数内に閉じ込めて扱い易くしました。

63. ktBookAlive [ VBA ONLY ] [ #VALUE! ]
指定の 「ブック」 が開いているかを判定する関数です。

64. ktSheetAlive [ VBA ONLY ] [ #VALUE! ]
指定の 「シート」 が､ 「ブック」 内に存在するかを判定する関数です。

65. ktCellAddr [ VBA ONLY ] [ #VALUE! ]
文字列が 「Ａ１形式」 のセルアドレスとして妥当かを判定する関数です。

66. kt終端 [ ワークシート ONLY ] [ #VALUE! ]
１行または１列の範囲で最終データの行/列番号を求める関数です。

67. ktColumnChar [ #VALUE! ]
列番号と列アドレス文字を相互変換する関数です。

【 カラー 関連 】
68. ktColorIndexGet [ VBA ONLY ]
Ａブック での カラーパレット番号(Ｎ) の 「色」 が Ｂブックでは何番になるのかを調べる関数です。

69. ktPaletteColorEX
カラーパレットフォーム を使って 「色」 を選択するサブルーチンです。

70. ktWebColor2Num
HTML の 「色名」 に対する RGB を数値で返す関数です。

【 プリンター 関連 】
71. kt変換ActPRT [ VBA ONLY ] ※ 現在の Excel バージョン では必要はありません ※
 Excel 2000 (未SR1)での不具合
『 ActivePrinter 文字列が ”LPTn: の プリンタ名” 形式 』
を回避する為の関数です。
”プリンタ名 on LPTn:”形式での コーディング だけで､全てのバージョンでの動作が可能になります。

【 文字 関連 】
72. kt全角有無
文字列内に 「全角文字」 が含まれているかを判定する関数です。

73. kt文字種変換
数字・英字・カナの文字種別に全角⇔半角変換する関数です。

74. kt補正StrConv
StrConv 関数の不具合
『 アポストロフィ(’) , クォーテーション(”) の 半角⇒全角 変換が不可逆 』
を回避する為の関数です。
誤変換された(’)(”)の全角文字を正しい文字に直します。

75. kt反転
指定した文字列の並びを反転する関数です。

【 プログレスバー 】
76. ktRunPrgsWait
「プログレスバー」 の起動サブルーチンです。

77. ktInitPrgsWait
「プログレスバー」 の動作条件を設定するサブルーチンです。

78. ktDispPrgsWait
ループ内からCall して「プログレスバー」 の表示を更新するサブルーチンです。
キャンセル入力を受け取る事もできます。


[ ktIs月 ] 関数

指定した数値が 「月」 として妥当かどうかを判定する関数です。

【 構 文 】

ktIs月 | ( 月 )
返却値 | -- | Boolean 型
月 | -- | Variant 型

【 返却値 】

True ‥‥‥ １≦月≦１２
False ‥‥‥ 上記以外 （もしくは数値以外）

【 パラメータ 内容 】

[ 月 ]
 | 【月】 として処理するデータ （テキストボックス で入力したもの等）を 指定します。 Variant 型で受けているので、数値・文字列（数字/英字/カナ/漢字） の違いを意識する必要はありません。

【 解 説 】

[ Variant ] で受けているので､
呼び元での 『数値チェック』 『数値への型変換』
は必要ありません。

この関数は【数値チェック ＆ 月判定】です。
テキストボックス等での入力値判定に使用してください。

【 使 用 例 】

Private Sub txt月_Exit( ByVal Cancel As MSForms.ReturnBoolean)
If (txt月.Value = "") Then
' 何もしない
ElseIf ktIs月(txt月.Value) Then '[CInt関数による型変換は必要なし]
' 正常
Else
MsgBox "１～１２を入力して下さい"
Cancel = True
End If
End Sub


[ ktIs日 ] 関数

指定した数値が 「日」 として妥当かどうかを判定する関数です。

【 構 文 】

ktIs日 | ( 日, [月], [年] )
返却値 | -- | Boolean 型
日 | -- | Variant 型
月 | -- | Variant 型 (省略可, 1 ～ 12 )
年 (西暦) | -- | Variant 型 (省略可)

【 返却値 】

[ True ]
日 のみを指定 １ ≦ 日 ≦ ３１

日, 月 を指定 １ ≦ 日 ≦ ３１ (大の月)
１ ≦ 日 ≦ ３０ (小の月)
１ ≦ 日 ≦ ２９ (２月, 平年/閏年の判定はせずに 一律で ２９日です)

日, 月, 年 を指定 １ ≦ 日 ≦ ３１ (大の月)
１ ≦ 日 ≦ ３０ (小の月)
１ ≦ 日 ≦ ２９ (２月 : 閏年)
１ ≦ 日 ≦ ２８ (２月 : 平年)

[ False ]
上記以外 （もしくは 日・月・年 が数値以外 , 月の内容が不正 (≠１～１２) ）

【 パラメータ 内容 】

[ 日 ]
 | 【日】 として処理するデータ （テキストボックス で入力したもの等）を指定します。 Variant 型で受けているので、数値・文字列（数字/英字/カナ/漢字） の違いを意識する必要はありません。
[ 月 ]
 | 省略可能です。 【月】 として処理するデータ （テキストボックス で入力したもの等）を指定します。 Variant 型で受けているので、数値・文字列（数字/英字/カナ/漢字） の違いを意識する必要はありません。
[ 年 ]
 | 省略可能です。 【年】 として処理するデータ （テキストボックス で入力したもの等）を指定します。 Variant 型で受けているので、数値・文字列（数字/英字/カナ/漢字） の違いを意識する必要はありません。

【 解 説 】

テキストボックス等での入力値判定に使用してください。

[ Variant ] で受けているので､
呼び元での 『数値チェック』 『数値への型変換』
は必要ありません。
この関数は【数値チェック ＆ 日判定】です。

【 使 用 例 】

Private Sub txt日_Exit( ByVal Cancel As MSForms.ReturnBoolean)
If (txt日.Value = "") Then
' 何もしない
ElseIf ktIs日(txt日.Value) Then    ' [ CInt関数による型変換は必要なし
]
' 正常
Else
MsgBox "１～３１を入力して下さい"
Cancel = True
End If
End Sub


[ ktIs月末日 ] 関数

指定した日付が､その月の 「月末日か、否か」 を判定する関数です。

【 構 文 】

ktIs月末日 | ( 日付 )
返却値 | -- | Boolean 型
日付 | -- | Variant ( Date ) 型

【 返却値 】

[ True ]
指定の日付は月末日です

[ False ]
上記以外 （もしくは日付データではない）

【 パラメータ 内容 】

[ 日付 ]
 | シリアル値 または 日付文字列 で指定します。 ※ 新元号「令和」対応になっていない環境でも 「令和 日付文字列(元年 表記を含む)」を指定可能です。

【 解 説 】

[ Variant ] で受けているので､
呼び元での 『 日付チェック 』 『 日付への型変換 』
は必要ありません。
この関数は【日付チェック ＆ 判定】です。

【 使 用 例 】

If ktIs月末日(日付) Then
'月末日である
Else
'月末日ではない
End If

下記でも同じ判定が出来ます。
If (Day(CDate(日付) + 1) = 1) Then
'月末日である
Else
'月末日ではない
End If


[ kt閏年判定 ] 関数

指定した 「年」 が 「閏年か否か」 を判定する関数です。

【 構 文 】

kt閏年判定 | ( 年 )
返却値 | -- | Boolean 型
年 (西暦) | -- | Integer 型

【 返却値 】

[ True ]
指定した 「年」 は閏年

[ False ]
指定した 「年」 は平年

【 パラメータ 内容 】

[ 年 ]
 | 判定する 年 を 西暦で指定します。

【 解 説 】

西暦年 が ４ で割り切れる年は 閏年
ただし、西暦年 が １００ で割り切れる年は 平年
ただし、西暦年 が ４００ で割り切れる年は 閏年

【 使 用 例 】

If kt閏年判定(年) Then
'閏年
Else
'平年
End If

=IF(kt閏年判定(A1), "閏年", "平年")

下記でも同様の結果が得られます。
If (Day(DateSerial(年, 3, 0)) = 29) Then
'閏年
Else
'平年
End If

=IF(DAY(DATE(A1, 3, 0))=29, "閏年", "平年")


[ kt年月 ] 関数

指定した 「日付」 の月に対する 『年月』 を "yyyymm" の６文字で返す関数です。
[ #VALUE! ]

【 構 文 】

kt年月 | ( 日付, [シフト月] )
返却値 | -- | Variant ( String ) 型
日付 | -- | Variant ( Date ) 型
シフト月 | -- | Integer 型 (省略可, 省略時: ０, マイナス可)

【 返却値 】

「日付」 の シフト月 （省略時：０） だけ 前後した日付 の 『年月』 を ”ｙｙｙｙｍｍ” （６文字固定）
の文字列で返します。

「日付」 に 日付以外のデータ を指定した場合はエラー値 (#VALUE!) が返ります。

【 パラメータ 内容 】

[ 日付 ]
 | シリアル値 または 日付文字列 で指定します。 ※ 新元号「令和」対応になっていない環境でも 「令和 日付文字列(元年 表記を含む)」を指定可能です。
[ シフト月 ]
 | 「日付」 の 前後の 月 を処理したい場合に指定します。 １ ならば 翌月、－１ ならば 前月 の 結果を返します。

【 解 説 】

２つの日付の 「年月」 を比較する場合に、コード を簡略化する為に用意した関数です。

【 使 用 例 】

日付１ は 日付２ の 前月か？

If (kt年月(日付1) = kt年月(日付２, -1)) Then
‥‥‥

ｋｔ年月 を使わない場合は下記のようなマクロになります。
If (Year(日付1) = Year(DateAdd("m", -1, 日付2))) And _
(Month(日付1) = Month(DateAdd("m", -1, 日付2))) Then
‥‥‥
または
If (Format(日付1, "yyyymm") = Format(DateAdd("m", -1, 日付2), "yyyymm")) Then
‥‥‥


[ kt元号変換 ] 関数

西暦年 と 和暦年 の 相互変換 を行なう関数です ( 新元号 「 令和 」 対応 )。。
[ #VALUE! ]

【 構 文 】

kt元号変換 | ( 年号, 年 )
返却値 | -- | Variant ( Integer / String ) 型
年号 | -- | String 型
年 | -- | Integer 型

【 返却値 】

年号 / 年 に 和暦 を指定した場合は、西暦年に変換し 数値 として返します。

年号 / 年 に 西暦 を指定した場合は、和暦年 （"H13"等の形式） に変換し文字列として返します。
年号が不正、年がマイナス等の場合は [ #VALUE! ] が返ります。

「年」 のみの指定ですので、以下の換算で変換しています（改元の年の月日は無視されます）。
西暦年 = 明治 + 1867 , 明治年 = 西暦 - 1867 （ 1868 ≦ 西暦年 ≦ 1911 )
西暦年 = 大正 + 1911 , 大正年 = 西暦 - 1911 （ 1912 ≦ 西暦年 ≦ 1925 )
西暦年 = 昭和 + 1925 , 昭和年 = 西暦 - 1925 （ 1926 ≦ 西暦年 ≦ 1988 )
西暦年 = 平成 + 1988 , 平成年 = 西暦 - 1988 （ 1989 ≦ 西暦年 ≦ 2018 )
西暦年 = 令和 + 2018 , 令和年 = 西暦 - 2018 （ 2019 ≦ 西暦年 )

月日も考慮した変換が必要な場合は TEXT 関数/Format 関数 を使用して下さい。

【 パラメータ 内容 】

[ 年号 ]
 | 半角文字で、「年」 の元号を指定します。 明治 ： "M" 大正 ： "T" 昭和 ： "S" 平成 ： "H" 令和 ： "R" 西暦 ： "Y"
[ 年 ]
 | 元号に 和暦 （M, T, S, H, R ） を指定した場合は [ １ ≦ 年 ] 。 元号に 西暦 （Y） を指定した場合は [ １８６８ ≦ 年 ] 。

【 解 説 】

『 改 元 』
明治 ： M1.10.23 ～ M45. 7.29 ( 1868.10.23 ～ 1912. 7.29 )
大正 ： T1. 7.30 ～ T15.12.24 ( 1912. 7.30 ～ 1926.12.24 )
昭和 ： S1.12.25 ～ S64. 1. 7 (1926.12.25 ～ 1989. 1. 7 )
平成 ： H1. 1. 8 ～ H31.4.30 (1989. 1. 8 ～ 2019.4.30 )
令和 ： R1. 5. 1 ～ (2019. 5. 1 ～ )

  （補） 「明治改元の布告」 の詔書に記されている日付は【明治元年九月八日】になっていますが､
「改暦の布告」 が発せられたのは【明治五年】です。
        即ち､それ以前の日付は旧暦日付で記されている訳で､明治元(1868)年九月八日を新暦に
直すと【１８６８年１０月２３日】になります。

【 使 用 例 】

Dim int西暦年 As Integer
int西暦年 = kt元号変換("H", 13)
 ⇒ [ int西暦年 ] には [ 2001 ] が返ります。

Dim str和暦年 As String
Dim int和暦年 As Integer
str和暦年 = kt元号変換("Y", 2001)
int和暦年 = Val(Mid(str和暦年, 2))
 ⇒ [ str和暦年 ] には [ "H13" ] が返ります。


[ kt月末日付 ] 関数

指定した 「日付」 または 「年 & 月」 に対する月末日（シリアル値）を返す関数です。
[ #VALUE! ]

【 構 文 】

kt月末日付 | ( 日付_年, [月] )
返却値 | -- | Variant ( Date ) 型
日付_年 | -- | Variant ( Date / String / Integer ) 型
月 | -- | Integer 型 (省略可)

【 返却値 】

指定した 「日付」 または 「年 ＆ 月」 に対する月末日（シリアル値） を返します。
日付_年・月 が不正な値の場合は [ #VALUE! ] が返ります。

【 パラメータ 内容 】

[ 日付_年 ]
 | 日付 （年月日） で指定する場合には､シリアル値 または 日付文字列で 指定します。 ※ 新元号「令和」対応になっていない環境でも 「令和 日付文字列(元年 表記を含む)」を指定可能です。 年 ＆ 月 で指定する場合には、西暦年 を数値で指定します。
[ 月 ]
 | 年 ＆ 月 で指定する場合に、月 （１～１２） を数値で指定します。

【 解 説 】

Excel 関数 [ EOMONTH ] は使っていませんから 『 分析ツール 』 をアドインする必要はありません。

【 使 用 例 】

If (Date = kt月末日付(Date)) Then
MsgBox "今日は月末日です"
End If

-- kt月末日付を使わない場合 --
If (Date = DateSerial(Year(Date), Month(Date) + 1, 0)) Then
MsgBox "今日は月末日です"
End If


[ kt第n週 ] 関数

指定した 「日付」 が 【日曜～土曜】 カレンダー上で その月の 第何週 になるのかを返す関数です。
[ #VALUE! ]

【 構 文 】

kt第n週 | ( 日付 )
返却値 | -- | Variant ( Integer ) 型
日付 | -- | Variant ( Date ) 型

【 返却値 】

指定した 「日付」 が 【日曜～土曜】 カレンダー上で、その月の 第何週 になるのかを返します。
１～６ の値が返ります。

日付 が不正な値の場合は [ #VALUE! ] が返ります。

※ kt第n曜日の 『 第何 』 とは意味が違いますので注意してください。

【 パラメータ 内容 】

[ 日 付 ]
 | 調べる 日付 を シリアル 値 または 日付文字列で指定します。 ※ 新元号「令和」対応になっていない環境でも 「令和 日付文字列(元年 表記を含む)」を指定可能です。

【 使 用 例 】

kt第n週 (DateValue ("2001/12/10")) ⇒ ３

kt第n週 (DateValue ("2001/12/30")) ⇒ ６


[ kt第n曜日 ] 関数

指定した 「日付」 が 【日曜～土曜】 カレンダー上で、その月の 『 第何Ｘ曜日 』 かを返す関数です。
[ #VALUE! ]

【 構 文 】

kt第n曜日 | ( 日付 )
返却値 | -- | Variant ( Integer ) 型
日付 | -- | Variant ( Date ) 型

【 返却値 】

指定した 「日付」 が 【日曜～土曜】 カレンダー上で、その月の 第何 X曜日 になるのかを、
下記のような文字列で返します。
”第2火曜日” , ”第４土曜日” など （ ”第2” などの数字は 『半角』 です）

日付 が不正な値の場合は [ #VALUE! ] が返ります。

※ kt第n週の 『 第何 』 とは意味が違いますので注意してください。

【 パラメータ 内容 】

[ 日 付 ]
 | 調べる 日付 を シリアル 値 または 日付文字列で指定します。 ※ 新元号「令和」対応になっていない環境でも 「令和 日付文字列(元年 表記を含む)」を指定可能です。

【 使 用 例 】

kt第n曜日 (DateValue ("2001/12/10")) ⇒ "第2月曜日"

kt第n曜日 (DateValue ("2001/12/29")) ⇒ "第5土曜日"


[ kt曜日日付 ] 関数

「ｙ年ｍ月 の 第ｎ 何曜日」 の日付を求める関数です。
[ #VALUE! ]

【 構 文 】

kt曜日日付 | ( 年, 月, 第n, 曜日 )
返却値 | -- | Variant ( Date ) 型
年 | -- | Integer 型
月 | -- | Integer 型
第ｎ | -- | Integer 型
曜日 | -- | Integer 型

【 返却値 】

「 ｙ年 ｍ月 第ｎ 何曜日」 の 日付 を シリアル値で返します。

存在しない日付位置を指定 または パラメータ不正の場合は [ #VALUE! ] が返ります。

【 パラメータ 内容 】

[ 年 ]
 | 西暦年 を数値で指定します。
[ 月 ]
 | 月 （１ ～ １２ ） を数値で指定します。
[ 第ｎ ]
 | １ ～ ５ の数値で指定します。
[ 曜日 ]
 | 曜日を 日（１） ～ 土（７） の数値で指定します。 ＶＢＡ では vbSunday などのシステム定数で指定できます。

【 使 用 例 】

kt曜日日付 (2001, 12, 2, vbMonday) ⇒ 2001/12/10

kt曜日日付 (2001, 12, 5, vbSaturday) ⇒ 2001/12/29

kt曜日日付 (2001, 12, 5, vbFriday) ⇒ #VALUE!


[ ktPeriodYMD ] 関数

開始日～終了日の期間 （ ｙ年ｍヶ月ｄ日 ） を計算する関数です。
[ #VALUE! ]

【 構 文 】

ktPeriodYMD | ( 計算方法, 開始日, 終了日,
 | [ 初日算入 ], [ 末日算入 ], [ 算出対象 ], [ ゼロ抑制 ] )
返却値 | -- | Variant ( String / Integer ) 型
計算方法 | -- | String 型
開始日 | -- | Variant ( Date ) 型
終了日 | -- | Variant ( Date ) 型
初日算入 | -- | Boolean 型 (省略可, 省略時: False )
末日算入 | -- | Boolean 型 (省略可, 省略時: True )
算出対象 | -- | String 型 (省略可, 省略時: "ymd" )
ゼロ抑制 | -- | Boolean 型 (省略可, 省略時: False )

【 返却値 】

算出対象 の指定によって、以下の結果を返します。
[ "ymd" ] …… 『 ｙ年ｍヶ月ｄ日』 形式の 文字列 （計算方法： ４ or 4-xx では 『 ｙ年ｍヶ月』 ） で返します。
[ "ym" ] …… 上記結果の 【日】 部分を切り捨てて 『ｙ年ｍヶ月』 の 文字列で返します。
[ "y" ] …… 〃 『年数』 部分を 数値 で返します。
[ "m" ] …… 〃 『月数』 部分 〃
[ "d" ] …… 〃 『日数』 部分 〃
[ "mm" ] …… 〃 総月数 （ 12 * 年数 + 月数 ） を 数値 で返します。

※ 計算方法 = ５ （学齢） の場合は､算出対象の指定に拠らず､常に 年数 を 数値 で返します。

※ ゼロ抑制 = True ＆ 算出対象 = "ymd" or "ym" の場合は下記のように編集されます。

[ ｙｍｄ ] 1年1ヶ月1日 ⇒ 1年1ヶ月1日
0年1ヶ月1日 ⇒ 1ヶ月1日
0年0ヶ月1日 ⇒ 1日
0年0ヶ月0日 ⇒ 0日
1年0ヶ月1日 ⇒ 1年0ヶ月1日
1年0ヶ月0日 ⇒ 1年0ヶ月0日

[ ｙｍ ] 1年1ヶ月 ⇒ 1年1ヶ月
0年1ヶ月 ⇒ 1ヶ月
0年0ヶ月 ⇒ 0ヶ月
1年0ヶ月 ⇒ 1年0ヶ月

引数の内容 が不正な値の場合は [ #VALUE! ] が返ります。

【 パラメータ 内容 】

[ 計算方法 ]
期間 の 計算方法の種類 を 以下に示す文字列 （ 1a , 2a 等 ） で指定します。
（アルファベットは大文字/小文字のどちらでもＯＫです）

※ 下記で云う 「起算日／満了日/ 応当日」 について
起算日 ： 初日算入 = True の場合は 『 開始日 』
〃 = False の場合は 『 開始日の翌日 』 ( 既定値 )

満了日 ： 末日算入 = True の場合は 『 終了日 』 ( 既定値 )
〃 = False の場合は 『 終了日の前日 』

xxx の応当日 ： 個々の 『月』 で xxx の 『日』 と 同じ日付
( 2015/9/5 の場合、 10/5 , 11/5 , 12/5 … が 応当日 )

----- 応当日を基にして算出 （民法 に 則った計算） -----

--+--------+--------+--------+--------+--------+--- 暦 ( + ～ + が １ヶ月 )
<----------------------------------------> 計算期間
#========#--------#========#--------#***** 応当日単位で １ヶ月カウント
この例では [ ４ヶ月 ＋ 端数日数 ]
[ 1a ]
民法（第139～143条）で定められている 『期間』 の定義に沿った結果が得られます。
起算日の応当日を基準にして月数をカウントします。
民法での定義内容については ここ を参照して下さい。

(補) [ 1a ] での算出は ktDATEDIF 関数でも行なえます。

[ 1b ]
上記の [ 1a ] では 『起算日＝月末日 』 の場合に､起算月と満了月の組み合わせによっては
「見た目と異なる」 結果が得られます。
[ 1b ] では､【月末日の応当日は月末日とする】 という条項を独自に加える事によって､このケース
を矯正してカウントします。詳細は ここ の 『期間計算の問題点』 を参照して下さい。

（注） 民法では [ 1b ] で問題にしているケースについて言及していません。したがって､この部分
の扱いは､当事者間での取り決めに拠る事となります。

----- 暦上の 『月』 と、両端の 『日』 に分けて算出 -----

--+--------+--------+--------+--------+--------+--- 暦 ( + ～ + が １ヶ月 )
<----------------------------------------> 計算期間
*******#========#--------#========#****** 暦の月で １ヶ月カウント
この例では [ ３ヶ月 ＋ ( 端数日数1 + 端数日数2 ) ]
[ 2a ]
起算日～満了日の間に挟まる暦上の【月】から年月数をカウントします。
日数は 「起算日～起算月の月末」＋「１日～満了日」 でカウントします。
ただし､ 『起算の"日" ≦ 満了の"日"』 の場合には 「日数合計で１ヶ月を満たす」 とし､
月数に１ヶ月を加え､日数は 『起算日の応当日 ～ 満了日』 で求めます。

[ 2b ]
起算日～満了日の間に挟まる暦上の【月】から年月数をカウントします。
日数は 「起算日～起算月の月末」＋「１日～満了日」 でカウントします。
[ 2a ] と違って､「日数合計」 の月数への調整はしません。
したがって､この計算法では 「日数合計」 が 【３１】 を超える場合もあります。

----- １ヶ月を 『３０日間』 として算出 -----
この計算方法の詳細は ktDAYS360 関数の 『 解説 』 を参照して下さい。

[ 3a ]
エクセル関数の 「DAYS360 (NASD方式)」 で求めています。

開始日(起算日前日)が月末日の場合には [30日扱い] とします。
（31日，2000/2/29，2001/2/28 ⇒ [30日扱い]、2000/2/28は28日のまま）

終了日(満了日)が 『31日』 の場合は [翌 １日扱い] とします。 …… (*1)
ただし､開始日(起算日前日)が 『30/31日』 の場合には、終了日 『31日』 は [30日扱い] です。
終了日で､2000/2/29は29日､ 2001/2/28は28日のままです。
(注) ↑はDAYS360関数の実際の動作によるものです。
DAYS360 (NASD) は実際の NASD仕様に一致していません。詳しくは、こちら を参照。

(*1) [～ 3/31] の場合は、 [3月31日] という日付をカウントに加えるのと同じ効果になる。
[～ 4/ 1] の場合は 〃 をカウントに加えない。

[ 3b ]
エクセル関数の 「DAYS360 (ヨーロッパ方式)」 で求めています。

開始日(起算日前日)・終了日(満了日) ともに 『31日』 は [30日扱い] です。 …… (*2)

開始/終了日で､2000/2/29は29日､2001/2/28は28日のままです。

(*2) [～ 3/31] でも、 [～ 4/1] でも、 [3月31日] という日付はカウントに加えません。

[ 3c ]
[ 3a , 3b ] (DAYS360関数) と異なり､起算/満了日ともに月末日は１律 [30日扱い] として
算出します。 …… (*3)
〔31日，2000/2/29，2001/2/28 ⇒ [30日扱い] , 2000/2/28 は28日のまま〕

(*3) [～ 3/31] でも、 [～ 4/1] でも、 [3月31日] という日付はカウントに加えません。

----- 在籍期間 -----
[ 4 ]
"１日"でも在籍した月は 『丸１ヶ月』 在籍と見故して算出します。

この計算方法の場合は【 ｙ年ｍヶ月 】という編集で返します。
算出対象＝"D" の場合には常に ゼロ が返ります。

----- 日数切り上げ -----
[ 4-1a , 4-1b , 4-2a , 4-3a , 4-3b , 4-3c ]
[ 1a, 1b, 2a, 3a, 3b, 3c ] の各計算方法で求めた結果に対して､日数 ( >0 ) を 『月数』 へ
切り上げます（[ 2b ]に対するものはありません）。
算出対象＝"D" の場合には常に ゼロ が返ります。

----- 学　齢 -----
[ 5 ]
開始日に 「誕生日」 を指定し､終了日時点での 学齢 を求めます。

算出対象に拠らず､常に年数が数値で返ります。
初日算入/末日算入の指定は不要です。
開始日＞終了日の場合は [ #VALUE! ] が返ります。

【 学齢の算出条件 】
・ 『４月２日～翌年４月１日』 誕生日で同一学齢
・ 『４月１日』 から１Ｕｐ
・ 誕生年度では１、小学校入学年度では７
[ 開始日 / 終了日 ]
期間の 開始日 と 終了日 を シリアル値 または 日付文字列で指定します。

※ 新元号「令和」対応になっていない環境でも
「令和 日付文字列(元年 表記を含む)」を指定可能です。

計算方法 [ 5 ] を除き、『開始日 ＞ 終了日』 の指定も可能です。
[ 初日算入 / 末日算入 ]
各々、期間の中に 開始日 / 終了日 の日付を含めるか否かを True / Falseで指定します。

省略時の既定値は 初日算入（ False ） , 末日算入（ True ） です。

民法の規定は 『 初日 不算入 ＆ 末日 算入 』 です。

※ 計算方法：５ （学齢） の場合には､初日算入/末日算入の指定は不要です。
[ 算出対象 ]
返却値 の 形式 を [ ymd , ym , y , m , d , mm ] の文字列で指定します。
（アルファベットは大文字/小文字のどちらでもＯＫです）

省略時の既定値は [ ymd ] です。

詳細は 上記の 返却値 の項を参照して下さい。
[ ゼロ抑制 ]
「０年」 などを表示しないようにする場合には [ True ] を指定します。
省略時の既定値は [ False ] （「０年」 も表示）です。

【 解 説 】

『 どの計算方法を採用したら良いのか 』 という事を､私の方から推薦する事は出来ません。
対象とする事務手続きが､どのような計算方法を採っているのかを調べ、それに合ったものを利用して下さい。
適合する計算方法が無い場合には利用しないで下さい（その事務処理にとっては､間違った結果を返すという事ですから）。

[ 2a/2b ] については､法的な根拠のある計算方法ではありません。「こういう計算方法も有り得るかな」 という程度の意味で加えたものです。
[ 1b ] についても､「月末絡みの問題」 を見た目に合うように､ [ 1a ] に対して補正処理を加えたものであり､法的な根拠はありません。

エクセル の DATEDIF 関数 には、下記に示す MD/YD の有名なバグ があります。
（ 他に Excel 2007 のみの バグ もあります）
・ 1998/10/31 ～ 2000/3/21 ⇒ １年 ４ヶ月 19日
（初日不算入なので 実際は 11/1～3/21 で １年 ４ヶ月 21日 が正解）
・ 1998/10/31 ～ 2000/3/ 1 ⇒ １年 ４ヶ月 -1日
（初日不算入なので 実際は 11/1～3/1 で １年 ４ヶ月 １日 が正解）
他にも、[ 月末～月末 ] が 月の大小閏 に絡んで下記のような結果になります。
・ 1998/ 5/31 ～ 1998/6/30 ⇒ ０年 ０ヶ月３０日 ( 正解は ０年１ヶ月０日 )
・ 1998/ 6/30 ～ 1998/7/31 ⇒ ０年 １ヶ月 １日 ( 正解は ０年１ヶ月０日 )
・ 1998/11/30 ～ 1999/2/28 ⇒ ０年 ２ヶ月２９日 ( 正解は ０年３ヶ月０日 )
・ 1998/12/31 ～ 1999/2/28 ⇒ ０年 １ヶ月２８日 ( 正解は ０年２ヶ月０日 )
・ 1999/ 2/28 ～ 2000/2/29 ⇒ １年 ０ヶ月 １日 ( 正解は １年０ヶ月０日 )
・ 2000/ 2/29 ～ 2001/2/28 ⇒ ０年１１ヶ月３０日 ( 正解は １年０ヶ月０日 )
元々 アメリカ製ですから、日本の民法は考慮されていませんが、上記のように明らかに可笑しい結果を返します。

ktPeriodYMD 関数（ 1a ） は 日本の民法に準拠した期間計算を行ないます（勿論、上記のような可笑しな結果は返しません）。
他に エクセル関数のインターフェース に合わせた ktDATEDIF / ktDAYS360 という関数もあります。

【 使 用 例 】

(1) 民法の定義に従った期間計算は 『"1a"，初日算入=False，末日算入=True 』 です。

(2) 年齢計算で､法律上の加齢される日（２４ 時 と読む側の日なので生年月日の前日）に加齢する計算は
『"1a"，初日算入=True，末日算入=True 』 です。

(3) 年齢計算で､慣例として呼ばれている【今日からXX歳】 という場合､つまり生年月日の当日に加齢する
計算は 『"1a"，初日算入=True，末日算入=False 』 です。

(4) 年齢計算では 『算出対象="y"』 とすれば､年数部分だけが数値 として返ります。

(5) 『日』 部分を切り上げ/切り捨てて 『ｙ年ｍヶ月』 という形式にするには､
切り上げ ⇒ 算出対象：ymd ＆ 計算方法：4-xx
切り捨て ⇒ 算出対象：ym ＆ 計算方法：xx （ xx は 1a ～ 3c ）


ktPeriodYMD 関数 ： 補足説明（期間計算の解説）

民法 総則 第６章 期間 （現代語訳）

第139条 期間を時・分又は秒で定めたときは、即時から起算する。

第140条 期間を日・週・月又は年で定めたときは、期間の初日は、算入しない。
ただし、その期間が午前0時から始まるときは、この限りでない。

第141条 期間を日・週・月又は年で定めたときは、期間末日の終了で期間が満了する。

第142条 期間の末日が大祭日、日曜日その他の休日に当たる場合､その日に取引を行なう慣習がある場合を除いて､
期間は、その翌日をもって満了する。

第143条 週、月または年によって期間を定めるときは、暦(太陽暦)に従って期間を計算する。
２ 週、月または年の始めより期間を起算する場合を除き、その期間は、最後の週、月または年の起算日に
相当する日の前日で満了する。ただし、最後の月に応当する日がないときは、その月の末日に満了する。

年齢計算ニ関スル法律 （明治35年12月22日 施行）

１ 年齢は出生の日より起算する。

２ 年齢の計算には民法第１４３条の規定を準用する。

期間計算の一般原則（日・週・月・年を単位として定める場合）

１． 期間が午前０時 から始まる場合を除いて､期間の 『初日』 は不算入とする。 …… (第140条)

２． その期間の 『末日の終了(24時)』 をもって､期間の満了とする。 …… (第141条)

３． 期間を週・月・年を単位として定める場合は､暦(太陽暦) に従って計算する。 …… (第143条-1)
（週・月・年の始めから期間を起算する場合は､最後の週・月・年の末日をもって満了する。
１日からは月末をもって､日曜日からは土曜日をもって満了とする）

４． 週・月・年の始めから期間を起算する場合を除いて､起算日の応当日前日で期間は満了する。
但し､最後の月に応当する日がないときは、その月の末日をもって満了する。 …… (第143条-2)

５． 期間の満了する日が取引上の休日の場合は､その翌日をもって満了とする。 …… (第142条)

６． 年齢は出生の日より起算し､出生日の応当日前日の満了をもって加齢する。

学齢について

年齢は 『初日算入』 ですから､出生日に応当する前日で 『１年間』 となります。

では２００１年４月１日生まれの人が 満１歳 になるのは２００２年４月１日の朝からかというと､そうでもない。
満年齢の考え方と民法の定めにより､加齢されるのは 『(出生日に)応当する前日の満了をもって』 と
なっているので､３月３１日２４時 を迎えた瞬間に始めて 満１歳 となる （２３時５９分までは満１１ヶ月）。

なお､３月３１日２４時＝４月１日０時だから､「４月１日の今日から満１歳」 という呼び方も間違っていないが
法律上の加齢される日はあくまでも３月３１日である。

４月１日生まれの子供が法律上加齢されるのは３月３１日なので 「学校教育法第２２条第１項」 の 『満６歳
に達した翌日以後～』 に該当する。

したがって､４月１日生まれは４月２日生まれより､１学年早くなる。

---- 学校教育法第２２条第１項 ----
保護者の小学校の就学義務を子どもの満６歳に達した翌日以後における最初の学年の初めから
満１２歳に達した日の属する学年の終りまでとする。

期間計算の問題点

１． 「期間：月末～月末」 は 『丸Ｎヶ月』 です。
（初日不算入により 『起算日＝1日』 となる為）

２． 初日"算入"を謳った場合は 「期間：1日～月末」 が 『丸Ｎヶ月』 です。

３． では､初日"算入"を謳った場合の 「期間：月末～月末」 はどうなるか？
これは､初日"不算入"を謳った場合の 「期間：月末前日～月末」 と等しい。

    ２．の結果に 『前日が１日加わっている』 と考えれば 『丸Ｎヶ月＋1日』 ですが､ [第143条-2] を基に考えると､
その月の 大/小/閏 によって異なってきます。

３月３１日～５月３１日 ⇒ 「応当日前日：５月３０日」 で 丸２ヶ月となり､プラス１日。
３月３１日～４月３０日 ⇒ 「応当日前日：４月３０日」 で 丸１ヶ月丁度。
３月３１日～２月28/29日 ⇒ 「応当日前日：２月３０日」 が無いので 末日(28/29日)で 丸１１ヶ月丁度。
４月３０日～５月３１日 ⇒ 「応当日前日：４月２９日」 で 丸１ヶ月 となり､プラス２日。
４月３０日～６月３０日 ⇒ 「応当日前日：６月２９日」 で 丸２ヶ月 となり､プラス１日。
４月３０日～２月28/29日 ⇒ 「応当日前日：２月２９日」 で 丸１０ヶ月丁度。
（平年の場合も [第143条-2] により丸１０ヶ月）
２月２８日～３月３１日 ⇒ 「応当日前日：３月２７日」 で 丸１ヶ月 となり､プラス４日（平年）。
２月２９日～３月３１日 ⇒ 「応当日前日：３月２８日」 で 丸１ヶ月 となり､プラス３日（閏年）。
２月２８日(平年)～２月２９日(閏年) ⇒ 「応当日前日：２月２７日」 で 丸１２ヶ月 となり､プラス２日。
２月２９日(閏年)～２月２８日(平年) ⇒ 「応当日前日：２月２８日」 で 丸１２ヶ月丁度。

４． 民法では､このような場合に日数を何日間とするかについては言及していません。
民法で謳っているのは 「 『 Ｘ日からＮヶ月間』 とした場合の 『満了日はＹ日』 です」 という定義です。
そして､ここには 『Ｎヶ月 と １日間』 といった 『日の端数』 は出てきません。
第141条 期間を日・週・月又は年で定めたときは、期間末日の終了で期間が満了する。
第143条 週、月または年によって期間を定めるときは、暦(太陽暦)に従って期間を計算する。
２ 週、月または年の始めより期間を起算する場合を除き、その期間は、最後の週、月または年の
起算日に相当する日の前日で満了する。

この問題は､期間計算の処理を 『丁度　Ｎヶ月』 となる 「日付の組み合わせ」 以外でも実行させるが故に発生
してしまうものです。法律での定めが無い以上､この部分は､
(1) 期間計算に関わる当事者間で取り決めて､それに従うアルゴリズムを利用する （もしくは作り上げる）。
(2) 満了日かどうかを判断する為ならば､日数の値には拘らずに､単に 「端数の日数がゼロか否か （丁度Ｎヶ月か）」
のみに注視する。
のどちらかで対処するしかないでしょう。

ktPeriodYMD 関数の 計算方法 『 １ｂ 』 では、 【民法 第１４３条２項】 に
『 ３項 月末日の応当日は月末日とする。』
という条項を独自に加える事で､上記のパターン全てについて【Ｎヶ月＋１日】 という結果を返します。


[ ktJR運賃期間 ] 関数

ＪＲの特急/急行料金を求める為の 『繁忙/閑散/通常期』 を判定する関数です。
[ #VALUE! ]

【 構 文 】

ktJR運賃期間 | ( 日付, [[区間] )
返却値 | -- | Variant ( String ) 型
日付 | -- | Variant ( Date ) 型
区間 | -- | Integer 型 (省略可, 省略時: 0)

【 返却値 】

"繁忙"，"閑散"，"通常" のいずれかが返ります。

日付 が不正な値の場合は [ #VALUE! ] が返ります。

【 パラメータ 内容 】

[ 日付 ]
 | 判定する日付を シリアル値 または 日付文字列で指定します。 ※ 新元号「令和」対応になっていない環境でも 「令和 日付文字列(元年 表記を含む)」を指定可能です。
[ 区間 ]
 | ０ ： 東日本/東海/西日本/四国 の各会社区間内 または ､ＪＲ全社相互間 および 九州新幹線 / 北海道新幹線 １ ： ＪＲ北海道 の区間内のみ（在来線） ２ ： ＪＲ九州 の区間内のみ （在来線） ※ 九州新幹線/北海道新幹線 は ０ を指定 します。

【 解 説 】

『 繁忙 / 閑散 / 通常期 』 の条件は下記の通りです。

--- 東日本/東海/西日本/四国の各会社区間内 または ＪＲ全社相互間
および 九州新幹線 / 北海道新幹線 ---

【 通常期 】 繁忙期、閑散期 以外の日

【 繁忙期 】 下記の期間
３月 ２１日 ～ ４月 ５日
４月 ２８日 ～ ５月 ６日
７月 ２１日 ～ ８月 ３１日
１２月 ２５日 ～ １月 １０日

【 閑散期 】 下記の各期間の 『 月～木曜日 （ただし、祝日 及び 祝日の前日 と 振替休日は除く） 』
１月 １６日 ～ ２月 末日
６月
９月
１１月 １日 ～ １２月 ２０日

--- JR 北海道内のみをご利用の場合（在来線） ---
【 通常期 】 通年で全ての日が通常期です。

【 繁忙期 】 繁忙期はありません

【 閑散期 】 閑散期はありません

--- JR 九州内のみをご利用の場合 （在来線） ---
【 通常期 】 通年で全ての日が通常期です。

【 繁忙期 】 繁忙期はありません

【 閑散期 】 閑散期はありません


[ kt前年同曜日 ] 関数

「基準日」 に対して、指定 「年数」 だけ前後した年の 『 同月＆同曜日位置の日付 』 を返す関数です。
[ #VALUE! ]

【 構 文 】

kt前年同曜日 | ( 基準日, [年数], [七曜] )
返却値 | -- | Variant ( Date ) 型
基準日 | -- | Variant ( Date ) 型
年数 | -- | Integer 型 （省略可, 省略時： -1 ）
七曜 | -- | Integer 型 (省略可, 省略時: 2 )

【 返却値 】

基準日 から 「年数」 だけ 前後した年 の中から､基準日と 『同月 ＆ 同曜日位置』 になる日付を返します。
年数＝０ の場合は 「基準日」 が､そのまま返ります。

基準日 が不正な値の場合は [ #VALUE! ] が返ります。

【 パラメータ 内容 】

[ 基準日 ]
 | 基準となる日付をシリアル値 または 日付文字列で指定します。 ※ 新元号「令和」対応になっていない環境でも 「令和 日付文字列(元年 表記を含む)」を指定可能です。
[ 年数 ]
 | 省略時の既定値は 「－１」 で 【前年】 になります。 "前々年" の場合は 「－２」 を､ "翌年" の場合は 「１」 を指定します。
[ 七曜 ]
 | 暦の並びが 「月⇒日」 と 「日⇒土」 の どちらかを指定します。 ２ ‥‥ 「月⇒日曜」 （既定値） １ ‥‥ 「日⇒土曜」 １／２ 以外を指定した場合は 「２」 と解釈します。

【 解 説 】

流通業など､曜日変動に起因して売上が変動するような場合､ 「前年の同曜日と比較する」 といった処理が
出て来ますが､この比較対照となる日付を求める為の関数です。

基準日が 「第１週」 の場合は､シフト先の 「年」 では 『前月』 になる場合もあります。

【 使 用 例 】

=kt前年同曜日("2003/9/3", -1, 2) ⇒ 2002/8/28
=kt前年同曜日("2003/9/7", -1, 2) ⇒ 2002/9/ 1
=kt前年同曜日("2003/9/9", -1, 2) ⇒ 2002/9/ 3
=kt前年同曜日("2003/9/30", -1, 2) ⇒ 2002/9/24


[ ktDAYS360 ] 関数

30日/月、360日/年のルールに基づいた日数計算を行なう関数です。
[ #VALUE! ]

【 構 文 】

ktDAYS360 | ( Start_Date, End_Date, Method, [Fraction] )
返却値 | -- | Variant ( Integer / Double ) 型
Start_Date | -- | Variant ( Date ) 型
End_Date | -- | Variant ( Date ) 型
Method | -- | Integer 型
Fraction | -- | Boolean 型 (省略可, 省略時: False )

【 返却値 】

「30日/月、360日/年」 のルールに基づいて、Start_Date ～ End_Date 間の日数を計算します。

Fraction = True の場合は、[ 日数 ÷ ３６０ ] の 年比率 を返します。

[ Start_Date , End_Date , Method の指定値が不正 ] または [ Start_Date ＞ End_Date ] の
場合は [ #VALUE! ] が返ります。

( 補 ) 月数 について
ktDAYS360 で得られる結果は 日数 ( 310日間 など ) です。
月数 が必要な場合は下記の計算で求めて下さい。
月数 = INT ( 日数 ÷ ３０ ) , 端数日数 = MOD ( 日数 , ３０ )

【 パラメータ 内容 】

[ Start_Date ]
 | 開始日を シリアル値 または 日付文字列で指定します。 ※ 新元号「令和」対応になっていない環境でも 「令和 日付文字列(元年 表記を含む)」を指定可能です。
[ End_Date ]
 | 終了日を シリアル値 または 日付文字列で指定します。指定します。 ※ 新元号「令和」対応になっていない環境でも 「令和 日付文字列(元年 表記を含む)」を指定可能です。
[ Method ]
 | 日数の計算方式を下記から指定します (詳細は解説を参照)。 ０ : 30/360 ( SIA ) １ : 30/360 ( PSA ) or ( BMA ) ２ : 30/360 ( ISDA ) or ( MSRB ) ３ : 30E/360 or 30/360 ( ISMA ) ４ : 30E+/360 Excel/DAYS360 関数 との対応は下記の通りです (Fraction = False 時)。 [ 方式 = False (NASD方式) ] ⇒ １ ： 30/360 (PSA) [ 方式 = True (ヨーロッパ方式) ] ⇒ ３ ： 30E/360
[ Fraction ]
 | 省略 または False ⇒ 日数 を返します。 True ⇒ 「日数÷３６０」 の 年比率 を返します。 Excel/YEARFRAC関数 との対応は下記の通りです (Fraction = True 時)。 [ 基準 = ０ (NASD方式) ] ⇒ ０ ： 30/360 ( SIA ) … 注：Excelのバグ参照 [ 基準 = ４ (ヨーロッパ方式) ] ⇒ ３ ： 30E/360

【 解 説 】

欧米圏の通貨/債券 などは 「３０日/月 ＆ ３６０日/年」 で取り扱うものがあります。
これに合わせた日数計算と年比率計算を行ないます。
より詳しい解説は 「AddinBox / ねぇ、DAYS360でホントに良いの？ 」 を参照してください。

Excel のDAYS360/YEARFRAC にはバグが有って正しい計算が行なわれていません。
DAYS360/YEARFRAC の代替関数として使ってください。

---------------------------------------------------------------------------------------------
『３０日/月 ＆ ３６０日/年』 方式での 「開始日～終了日」 間の日数は以下の式で計算されます。

日数 = 360*(年(終了日) - 年(開始日)) + 30*(月(終了日) - 月(開始日)) + (日(終了日) - 日(開始日))

ただし、この式に当て嵌める前に、開始日/終了日に対して、 『月末日などの条件による日付の調整』 が行なわれます。
この 【調整】 の内容が 各計算方法で異なり，各計算方法は 「調整方法の定義」 という形で定義されています。

また、調整方法の説明の中で、

〔 終了日の３１日は、３１日のままとする ← 同義 → 終了日の３１日を、翌月１日とする 〕

という補足をしてありますが、これは下記の ２ 式が等しい事から理解できるでしょう。

３１日のまま ： 30*(月(終了日) - 月(開始日)) + (31 - 日(開始日))
翌月 １日 ： 30*(月(終了日) + 1 - 月(開始日)) + (1 - 日(開始日))

---------------------------------------------------------------------------------------------
３０／３６０ （ＳＩＡ）

(1) 期間の最終日が ２月末日で、期間の開始日も ２月末日の場合、終了日を ３０日に置き換える。
(2) 開始日が ３１日または ２月末日の場合、開始日を ３０日に置き換える。
(3) 上記 (2) 適用後の開始日が ３０日で、且つ、終了日が ３１日の場合、終了日を ３０日に置き換える。
（つまり、開始日が ２９日以前ならば、最終日は ３１日のまま。これは、翌月１日に置換と同義）

---------------------------------------------------------------------------------------------
３０／３６０ （ＰＳＡ） or ３０／３６０ （ＢＭＡ） （PSA は BMA の前身 )

(1) 開始日が ３１日または ２月末日の場合、３０日に置き換えます。
(2) 上記 (1) 適用後の開始日が ３０日で、且つ、終了日が ３１日の場合は、終了日を ３０日に置き換える。
（つまり、開始日が ２９日以前ならば、最終日は ３１日のまま。これは、翌月１日に置換と同義）。

---------------------------------------------------------------------------------------------
３０／３６０ （ＩＳＤＡ） or ３０／３６０ （ＭＳＲＢ）

(1) 開始日が ３１日の場合、３０日に置き換える。
(2) 上記(1)適用後の開始日が ３０日で、且つ、最終日が ３１日の場合、最終日を３０日に置き換える。
（つまり、開始日が ２９日以前ならば、最終日は ３１日のまま。これは、翌月１日に置換と同義）。

---------------------------------------------------------------------------------------------
３０Ｅ／３６０ or ３０／３６０ （ＩＳＭＡ）

(1) 開始日が ３１日の場合、３０日に置き換える。 終了日が ３１日の場合、３０日に置き換える。
(2) 終了日が ２月末日の場合、２月を ３０日/月には拡張しない。
（正確に言えば、２月の実日数が使用されます）
---------------------------------------------------------------------------------------------
３０Ｅ＋／３６０

(1) 開始日が ３１日の場合、３０日に置き換える。
(2) 終了日が ３１日の場合、翌月の １日に置き換える 。
（これは、３１日のままにする事と同義）

なお、ktDAYS360 関数 の マクロ コード は こちら で公開しています。

【 Excel のバグについて 】

Excel の DAYS360/YEARFRAC 関数 にある 「NASD方式」 の計算には不具合があります。

NASD （アメリカ証券業協会） が定める日数計算は 『 ＳＩＡ 準拠』 となっていますが、Excel が行なっている
計算は ＳＩＡ の定義通りには行なわれていません。

DAYS360 (NASD) では、前記の ＳＩＡ-(1) の条件が抜けています。これは30/360 (PSA) の計算となります。
（詳細は こちら を参照）。

YEARFRAC (NASD) では多少複雑で、バージョン によって異なります （詳細は こちら を参照）。
Excel 97
30/360 (SIA) の計算で正しく行なわれています。

Excel 2000 以降
大筋では 30/360 (SIA) での 計算ですが、条件の一部が欠落しています。
ＳＩＡ-(3) の条件内の 「上記(2) 適用後の開始日が ３０日で」 （これは「開始日=30,31日 or ２月末日」 の
意味です） から２月末日の条件が漏れて、『 開始日=30 or 31日 』 のみの計算になっています。
これにより、「２月末日～大の月の月末 (31日)」 という期間の場合に、Excel 97 と Excel 2000以降で結果
が異なります。


[ ktDATEDIF ] 関数

期間から日数・月数などの日付計算を行なう関数です。
[ #VALUE! ]

【 構 文 】

ktDATEDIF | ( StartDate, EndDate, [ Interval ], [ FirstDay ] )
返却値 | -- | Variant ( String / Integer / Double ) 型
StartDate | -- | Variant ( Date ) 型
EndDate | -- | Variant ( Date ) 型
Interval | -- | String 型 ( 省略可、省略時 ： "YMD" )
FirstDay | -- | Boolean 型 ( 省略可、省略時 ： False )

【 返却値 】

Interval の 指定に応じて、年数 ・ 月数 ・ 日数 ・ 年比率 などを計算します。

[ StartDate , EndDate , Interval 指定値が不正 ] または [ StartDate > EndDate ] の場合には
[ #VALUE! ] が返ります。

【 パラメータ 内容 】

[ StartDate ]
 | 開始日 を シリアル値 または 日付文字列で指定します。 ※ 新元号「令和」対応になっていない環境でも 「令和 日付文字列(元年 表記を含む)」を指定可能です。
[ EndDate ]
 | 終了日を シリアル値 または 日付文字列で指定します。 ※ 新元号「令和」対応になっていない環境でも 「令和 日付文字列(元年 表記を含む)」を指定可能です。
[ Interval ]
 | 計算方式 を 下記の文字 で指定します (小文字でも可)。 "YMD" …… "y年mヶ月d日" で編集 (文字列) "Y" …… 期間内 満年数 "M" …… 期間内 満総月数 ( 13ヶ月 など ) "YM" …… 年未満 の 端数の月数 ( 0～11 ) "MD" …… 月未満 の 端数の日数 ( 0～30 ) "YD" …… 年未満 の 端数の日数 ( 0～365 ) "FR" …… 年比率 ( Double型 , YEARFRAC モード ) 省略時の既定値は 『 "YMD" 』 です。
[ FirstDay ]
 | 民法規定 の 期間計算では 『 初日不算入 （即ち、開始日 の 日付は カウント に加えない） 』 が基本です。 [ FirstDay = True ] とすると 『 初日算入 』 で計算します。 省略時の既定値は [ False ] で 『 初日不算入 』 です。

【 解 説 】

Excel の DATEDIF 関数 と 同等の計算を行ないます。

エクセル の DATEDIF 関数 には、下記に示す MD/YD の有名なバグ があります。
（ 他に Excel 2007 のみの バグ もあります）
・ 1998/10/31 ～ 2000/3/21 ⇒ １年 ４ヶ月 19日
（初日不算入なので 実際は 11/1～3/21 で １年 ４ヶ月 21日 が正解）
・ 1998/10/31 ～ 2000/3/ 1 ⇒ １年 ４ヶ月 -1日
（初日不算入なので 実際は 11/1～3/1 で １年 ４ヶ月 １日 が正解）

他にも、[ 月末～月末 ] が 月の大小閏 に絡んで下記のような結果になります。
・ 1998/ 5/31 ～ 1998/6/30 ⇒ ０年 ０ヶ月３０日 ( 正解は ０年１ヶ月０日 )
・ 1998/ 6/30 ～ 1998/7/31 ⇒ ０年 １ヶ月 １日 ( 正解は ０年１ヶ月０日 )
・ 1998/11/30 ～ 1999/2/28 ⇒ ０年 ２ヶ月２９日 ( 正解は ０年３ヶ月０日 )
・ 1998/12/31 ～ 1999/2/28 ⇒ ０年 １ヶ月２８日 ( 正解は ０年２ヶ月０日 )
・ 1999/ 2/28 ～ 2000/2/29 ⇒ １年 ０ヶ月 １日 ( 正解は １年０ヶ月０日 )
・ 2000/ 2/29 ～ 2001/2/28 ⇒ ０年１１ヶ月３０日 ( 正解は １年０ヶ月０日 )

元々 アメリカ製ですから、日本の民法は考慮されていませんが、上記のように明らかに可笑しい結果を
返します。また、Excel 2007 ではバグの状況が更に悪化しており、DATEDIF 関数 を安易に利用できる
状況ではなくなってきています。

この ktDATEDIF 関数 (Y, M, YM, MD, YD) は DATEDIF の代替関数 として使ってください （上記
のような バグ はありません）。なお、Interval="FR" 以外は、ktPeriodYMD 関数の [ 1a ] でも同じ計算
結果が得られます。

Interval="FR" は、Excel の YEARFRAC関数 [ 基準 ：１ (Actual/Actual ) ] に相当しますが、計算結果は
異なります。これについては後述の 「年比率について」 を参照してください。

-------------------------------------------------------------------------
ktDATEDIF 関数の日付計算は 「民法規定」 に従って計算しています。
民法規定 を判り易く整理すると下記のようになります。

a ) 「期間の初日」 はカウントしない （初日不算入）。
即ち、開始日に指定した日付は カウント せず、その翌日から カウント する。
（FirstDay = True と指定すると 『初日算入』 で計算します）

b ) 「１日」 から カウント する場合 （即ち、開始日＝月末日） は、月の大小閏に係わりなく、
月末日までで 「満 ｎヶ月」 となり、開始日と同月の月末日までで 「満 n 年」 となる。

c ) 「１日」 以外から カウント する場合 （即ち、開始日≠月末日） は、開始日と 「同日」 までで
「満 n ヶ月」 となり、開始日と 「同月 同日」 までで 「満 n 年」となる。
但し、月の大小閏の関係で、対応する 「同日」 「同月 同日」 が存在しない場合は、月末日までで
「満 n ヶ月」 「満 n 年」 となる。

--+--------+--------+--------+--------+--------+--- 暦 ( + ～ + が １ヶ月 )
<----------------------------------------> 計算期間
#========#--------#========#--------#***** 応当日単位で １ヶ月カウント
この例では [ ４ヶ月 ＋ 端数日数 ]

（補足） 引数： Y , M , YM , MD , YD の意味
上記仕様 で 計算される 「満 n ヶ月 ( 13ヶ月 など )」 が [ M ] の月数。
それを １２ で割った 商 が [ Y ] の年数。
その余りが [ YM ] の 月数。
「満 n ヶ月」 となる日付の翌日から 終了日 までの日数が [ MD ] の日数。
「満 n 年」 となる日付の翌日から 終了日 までの日数が [ YD ] の日数。

なお、ktDATEDIF 関数のソースは こちら で公開しています。

【 年比率 について 】

Interval = "FR" は Excel / YEARFRAC 関数の [ 基準：１ ( Actual / Actual ) ] に相当します。

ただし、Excel / YEARFRAC 関数 とは計算方法が異なります。
そもそも、YEARFRAC 関数 ( Actual / Actual ) の計算方法は、公的機関・債券/通貨を扱う準公的機関が
定めて国際的に通用している計算方法の何れとも合致しません。Excel 独自の計算方法 （下記） が採られ
ています。
(1) 開始日 と 終了日が 同一年 の場合、その年の日数 (365 or 366) で割る
(2) 開始日～終了日 が 複数年 に跨る場合、開始日～終了日の 期間 （開始日除く） が
(a) １年 以下
開始日～終了日 （開始日も含む） の間に、 [ 2/29 ] が含まれれば 366 で、
無ければ 365 で 期間日数 を割る
(b) １年 超
期間の跨る全ての年 （開始日=12/31 の場合でも 開始年を含む ） から、
年間日数 (365 or 366) の 平均 を求め、その値 ( 365.25 , 365.33 … 等 )で
期間日数を割る

ktDATEDIF 関数では、『抽象的２月２９日説』 という日本での年比率計算で 一般的な計算方法に
基づいて計算しています。

詳細 は下記サイト を参照して下さい。
ILCジャーナル / 「金利及び弁済金額計算に関する法律と実務」 抜粋
『金利計算と閏年・端数処理について』 大阪弁護士会所属 弁護士 服部 廣志
http://www.ilc.gr.jp/journal/000109/ (by Internet Archive )
補：インターネット法律協議会 ( ILC ) - 2017年5月31日 閉鎖 -

難しく書かれていますが、『抽象的２月２９日説』 を要約すると 以下のように計算します。
(a) [ 開始日～終了日] から [ ｙ 年 と ｄ 日間 ] という期間を算出する。
（ d 日間は "YD" による端数日数 のことです)
(b) 年比率 ＝ ｙ ＋ ( ｄ ÷ 年間日数 [ 365 or 366 ] ) で比率を計算する。
(c) ３６５ と ３６６ の何れで割るかの判断は、半端日数部分 ( ｄ日間 ) の 初日から見て 向こう１年間の間に
２月２９日が有れば ３６６、無ければ３６５ で割ります。
（向こう １年間の 年間日数 で割るという事です）

-- 例 --
・ 2003/5/10 ～ 2007/6/20 ⇒ ４年 ４１日間 ⇒ 4.1120218579 ( ４１÷３６６ )
[ 2003/5/10 (除) ～ 2007/5/10 (含) ] で ４年間。
[ 2007/5/11 (含) ～ 6/20 (含) ] で ４１日間。
[ 2007/5/11 (含) ～ 6/20 ～ 2008/5/10 (含) ] の間に 2/29 があるので 366日/年。

・ 2003/5/10 ～ 2008/6/20 ⇒ ５年 ４１日間 ⇒ 5.1123287671 ( ４１÷３６５ )
[ 2003/5/10 (除) ～ 2008/5/10 (含) ] で ５年間。
[ 2008/5/11 (含) ～ 6/20 (含) ] で ４１日間。
[ 2008/5/11 (含) ～ 6/20 ～ 2009/5/10 (含) ] の間に 2/29 がないので 365日/年。


新元号変換 ヘルプ

[ ktEraFormat ] 関数

2019年5月1日からの新元号 ( 令和 ) に対応した Excel の TEXT 関数 / VBA の Format 関数の代替関数です。
Office2007 以前 または 対応アップデートが施されていない環境で 新元号の和暦変換を提供します。
( Ver 5.30 ～ )

( 補 ) 日付専用 ですので、数値変換 ( カンマ編集, 通貨編集 等 )等には使用しないでください。
数値変換等には 通常の TEXT / Format 関数を使用してください。
AddinBox サイト で ソースコード を掲載しています。

【 構 文 】

ktEraFormat | ( 日付, 編集文字 , [ 元年表記 ] )
返却値 | -- | Variant 型 ( String 型 or #VALUE! )
日付 | -- | Variant 型 ( シリアル値 or 日付文字列 )
編集文字 | -- | String 型
元年表記 | -- | Boolean 型 ( 省略可 , 既定値 : False )

【 返却値 】

編集文字で指定した書式定義にしたがって日付を編集した結果が返ります。

元号/和暦年の書式文字 ( ggg , gg , g , ee , e , rr , r ) については、
使用環境・Office バージョン に係わらず 新元号に対応 した結果が得られます。

元年表記=True とすると、各元号の 「1年」 が "元年" と編集されます。
( レジストリ の InitialEraYear キー値 ： "元年" or "1年" には影響されません )

編集文字列が 空文字 の場合は #VALUE! が返ります。

(注) 日付に シリアル値[ 0 ～ 60 ] の値を指定した場合に得られる日付編集は、
シート上での [ 書式 or TEXT 関数 ] で得られる 結果 とは １日ズレ ます。
-- EraFormat による 編集結果 --
0 ⇒ 1899/12/30 , 1 ⇒ 1899/12/31 , 2 ⇒ 1900/1/1 , 60 ⇒ 1900/2/28 , 61 ⇒ 1900/3/1
-- シート上での [ 書式 or TEXT 関数 ] による 編集結果 --
0 ⇒ 1900/1/0 , 1 ⇒ 1900/1/1 , 2 ⇒ 1900/1/2 , 60 ⇒ 1900/2/29 , 61 ⇒ 1900/3/1
(Excel は Lotus1-2-3互換の為に [ 1900/1/1～1900/2/29 ] の シリアル値を敢えてズラしています)

【 パラメータ 内容 】

[ 日付 ]
 | 任意の日付 ( シリアル値 or 日付文字列 ) を指定します。 日付文字列 に 時刻文字列 が付随していても構いません。 ( 時刻情報も一緒に読み込みます) 新元号に対応していない環境( Office2007 以前もしくは対応アップデートが施され ていない Office2010 以降 )でも [令和]日付を直接指定可能です。 ( ktEraCDate を経由する必要はありません ) 記述可能な日付文字列のフォーマットは ktEraCDate 関数の仕様に準拠します。
[ 編集文字 ]
 | Excel および VBA で規定された表示書式文字を使った文字列を指定します。 TEXT 関数 / Format 関数 で使用可能な表示書式文字は全て使用できます。
[ 元年表記 ]
 | 省略可能です。 省略した場合は False になります。 True … 各元号の 1年 (元号施行日以降) を "元年" と編集します。 False … 各元号の 1年 (元号施行日以降) は [ 1年 ] のままで編集します。 VBA / Format 関数が "元年" と編集する レジストリ 設定になって いても [ 1年 ] で編集されます。 2019/4/11 現在、最新の アップデート まで実施済みの Format 関数では下記の レジストリ 設定にしたがって、元号最初の年を [ 元年 or 1年 ] の何れかに編集 しますが、ktEraFormat 関数は この レジストリ 設定の影響を受けません。 [元年表記] 引数の指定にしたがって編集します。 [ HKEY_LOCAL_MACHINE\SYSTEM \CurrentControlSet\Control\Nls\Calendars\Japanese ] の InitialEraYear キー値 ： "元年" or "1年" [元年表記] は編集文字 として [ g + e + "年" ] もしくは [ e + "年" ] の パターン に限ります ( "年" の文字が必須 ) g は ggg or gg or g , e は ee or e です。 ktEraFormat("2019/4/30", "ggge年m月d日", True) ⇒ 平成31年4月30日 ktEraFormat("2019/5/1", "ggge年m月d日", True) ⇒ 令和元年5月1日 ktEraFormat("2019/5/1", "ggge年m月d日", False) ⇒ 令和1年5月1日 ktEraFormat("2020/1/1", "ggge年m月d日", True) ⇒ 令和2年1月1日 ktEraFormat("2019/5/1", "ggge/m/d", True) ⇒ 令和1/5/1 ktEraFormat("2019/5/1", "ggge年", True) ⇒ 令和元年 ktEraFormat("2019/5/1", "e年", True) ⇒ 元年

【 解 説 】

2019年5月1日に、平成 から 新元号 ( 令和 ) への改元が行なわれます。

マイクロソフトの発表では、新元号が公表され次第、Office2010 以降の製品に対して、
新元号対応アップデートのネット配信を行なうとの事です。

そうしますと、Office2007 以前の環境では新元号＆和暦年の表示/変換が行なえず、
『平成』のままとなります。また、Office2010以降の環境でも諸々の事情により アップ
デートが施されない場合には、同じように新元号＆和暦年の表示/変換が行なえません。

この ktEraFormat 関数を利用すれば、セル上の TEXT 関数 / マクロ内の Format 関数 を
差し替える ( [ 引数/編集文字の定義 ] はそのままで、関数名のみ書き換え ) だけで
新元号に対応した和暦変換が可能です。

但し、「セルの書式設定」 の定義には利用できません。

--- セル内の式 ---
=TEXT(日付 , "本日は yyyy(ggge)年m月d日 (aaaa) です")

--- VBA マクロ ---
Format(日付 , "本日は yyyy(ggge)年m月d日 (aaaa) です")

上記の式で 「 関数名だけを書き換える」
ktEraFormat(日付 , "本日は yyyy(ggge)年m月d日 (aaaa) です")

これだけで、新元号が未対応な環境であっても
「本日は 2019(平成31)年5月1日 (水曜日) です」
という表示が
「本日は 2019(令和1)年5月1日 (水曜日) です」
という新元号に対応した表示に変わります。

ktEraFormat 関数では、元号/和暦年の書式文字 ( ggg , gg , g , ee , e , rr , r ) についてのみ
関数内で独自に処理し、それ以外の部分の編集については Format 関数に委ねています。
その為、TEXT 関数 / Format 関数 で使用可能な表示書式文字は全て使用できます。

【 補 足 】

TEXT 関数で、１つの編集文字内に 西暦年 と 和暦年 を共に定義した場合、下記の通りバージョン によって
異なる結果となります。尚、[$-411] は日本 / [$-409] は米国を表すロケールID です。
(VBA の Format関数では問題なく正しく変換されます）

2018/1/1 を変換 | Excel2003 SP3 | Excel2007 SP3 | Excel2010 SP2 | Excel2016
ggge(yyyy)年 | 平成30(30)年 | 平成30(30)年 | 平成30(30)年 | 平成30(30)年
[$-411]ggge(yyyy)年 | 平成30(30)年 | 平成30(30)年 | 平成30(30)年 | 平成30(30)年
ggge([$-409]yyyy)年 | 平成30(2018)年 | 2018(2018)年 | 2018(2018)年 | 平成30(30)年
[$-411]ggge([$-409]yyyy)年 | #VALUE! | #VALUE! | #VALUE! | #VALUE!
yyyy(ggge)年 | 2018(平成30)年 | 2018(平成30)年 | 2018(平成30)年 | 2018(平成30)年
yyyy([$-411]ggge)年 | 2018(平成30)年 | 2018(平成30)年 | 2018(平成30)年 | 2018(平成30)年
[$-409]yyyy(ggge)年 | 2018(2018)年 | 2018(2018)年 | 2018(2018)年 | 2018(平成30)年
[$-409]yyyy([$-411]ggge)年 | #VALUE! | #VALUE! | #VALUE! | #VALUE!

ktEraFormat 関数では、上記の全てのケースで "平成30(2018)年" / 2018(平成30)年" の結果が得られます。

K.Tsunoda(AddinBox) Mail:addinbox@h4.dion.ne.jp CopyRight(C) 2018 Allrights Reserved.


新元号変換 ヘルプ

[ ktEraCDate ] 関数

2019年5月1日からの新元号 ( 令和 ) に対応した Excel の DATEVALUE 関数 / VBA の DateValue /
CDate 関数 の代替関数です。Office2007以前 または 対応アップデートが施されていない環境で [ 新元号
の和暦日付 ⇒ シリアル値 ] 変換を提供します。 ( Ver 5.30 ～ )

AddinBox サイト で ソースコード を掲載しています。

【 構 文 】

ktEraCDate | ( 日付文字列, [ 元号範囲 ] )
返却値 | -- | Variant 型 ( Date 型 or #VALUE! )
日付文字列 | -- | String 型 ( 補足 も参照の事 )
元号範囲 | -- | Boolean 型 ( 省略可 , 既定値 ： False )

【 返却値 】

日付文字列 を シリアル値に変換した結果が返ります。
使用環境・Office バージョン に係わらず 新元号にも対応 した結果が得られます。

日付文字列が不正の場合は #VALUE! が返ります。
[ 元号範囲 = True ] 指定では、元号の範囲を超えている日付文字列 の場合は #VALUE! が返ります。

(注) 日付文字列に [ 1900/1/1～1900/2/28 ] の期間の日付を指定した場合に得られる
シリアル値は、シート上に入力した値/DATEVALUE関数の結果 とは１日ズレます。
-- EraCDate による 変換結果 --
1900/1/1 ⇒ 2 , 1900/2/28 ⇒ 60 , 1900/3/1 ⇒ 61 ( 1900/2/29 はエラーになります )
-- シート上での [ 手入力 or DATEVALUE 関数 ] による シリアル値 --
1900/1/1 ⇒ 1 , 1900/2/28 ⇒ 59 , 1900/2/29 ⇒ 60 , 1900/3/1 ⇒ 61
( Excelは Lotus1-2-3互換の為に [ 1900/1/1～1900/2/29 ] のシリアル値を敢えて ズラしています )

【 パラメータ 内容 】

[ 日付文字列 ]
指定可能な 日付フォーマット は以下の通りです。

( a ) 区切り 形式 ( 年月日 , スラッシュ , ハイフン , ピリオド )
[ H31年4月30日 ] [ H31/4/30 ] [ H31-4-30 ] [ H31.4.30 ]
年/月/日 は １ 桁 or ２ 桁

( b ) 元 号
[ 明治 , 明 , M/m ] [ 大正 , 大 , T/t ] [ 昭和 , 昭 , S/s ]
[ 平成 , 平 , H/h ] [ 令和 , 令 , R/r ]

( c ) 西暦年 も変換可能です ( 年は ４桁 , ３桁 , ２桁 )
２桁年は 2000年代と見做します。尚、西洋式の[ 月/日/年 or
日/月/年 ] フォーマットはサポートしていません。
[ 2019年4月30日 ] [ 2019/4/30 ] [ 2019-4-30 ] [ 2019.4.30 ]

( d ) 平成 32 年 等の 改元 以後 の 年数 でも OK としています
但し、[ 元号範囲 = True ] 指定の場合は
元号期間内の日付のみが OK となります。

( e ) "明治元年","大正元年","昭和元年","平成元年","令和元年"という
表記の日付文字列も可とします ( "明治1年","大正1年","昭和1年",
"平成1年","令和1年" として扱います)

下記も指定可能です。
"明元年","大元年","昭元年","平元年","令元年"
"M元年","T元年","S元年","H元年","R元年"

但し、"平成元/5/1" など "年" が無いフォーマットはエラーになります。

(補足) [ 文字列 ] 以外のデータ を指定した場合の挙動に付いて
・Date 型 データ を指定した場合
日付文字列 変換 されて【 "yyyy/m/d" 形式の日付文字列 】として
受け取り、対応する シリアル値 として返します。
[日付書式のセル] は和暦書式であっても "yyyy/m/d" 形式 として
受け取ります。
--- Date 型 データ ---
[ Date 型の変数 ]
[ DateValue / DateSerial / CDate の結果 ]
[ 日付書式のセル ]

・数値 or 数字文字列 を指定した場合
Date 型の範囲( 下記 )内であれば シリアル値 として返します。
範囲外の場合は #VALUE! が返ります。
[ 100/1/1 ( -657434 ) ～ 9999/12/31 ( 2958465 ) ]
・[ 空セル ] を指定した場合
[空文字]として受け取りますので、 #VALUE! が返ります。
[ 元号範囲 ]
省略可能です。 省略した場合は False になります。
日付文字列 に指定した 和暦日付 が、元号の範囲に入っているかも
合わせて チェック する場合には True を指定します。
日付文字列 が 和暦 の場合のみ有効です。

明治 ： 1868 (M1)/10/23 ～ 1912 (M45)/ 7/29
大正 ： 1912 (T1)/ 7/30 ～ 1926 (T15)/12/24
昭和 ： 1926 (S1)/12/25 ～ 1989 (S64)/ 1/ 7
平成 ： 1989 (H1)/ 1/ 8 ～ 2019 (H31)/ 4/30
令和 ： 2019 (R1)/ 5/ 1 ～ 9999 (---)/12/31

尚、[ 和暦日付書式 の セル ] を [日付文字列] 引数に指定した場合は
機能しません( 上記:補足 参照 )。

【 解 説 】

2019年5月1日に、平成 から 新元号 ( 令和 ) への改元が行なわれます。

マイクロソフトの発表では、新元号が公表され次第、Office2010 以降の製品に対して、新元号対応
アップデートのネット配信を行なうとの事です。

そうしますと、Office2007 以前の環境では新元号で記述された和暦日付 を シリアル値に変換する
事ができません。また、Office2010以降の環境でも諸々の事情により アップデートが施されない場合
には、同じように和暦日付 を シリアル値に変換する事ができません。

この ktEraCDate 関数を使えば、新元号で記述された和暦日付 も シリアル値に変換することが可能です。
UserForm 等での入力値チェック としても活用できます。

K.Tsunoda(AddinBox) Mail:addinbox@h4.dion.ne.jp CopyRight(C) 2018 Allrights Reserved.


新元号変換 ヘルプ

[ ktEraIsDate ] 関数

2019年5月1日からの新元号 ( 令和 ) に対応した VBA の IsDate 関数の代替関数です。
Office2007以前 または 対応アップデートが施されていない環境で 「日付 として妥当か否か」 の
判定を行ないます。 ( Ver 5.30 ～ )

AddinBox サイト で ソースコード を掲載しています。

【 構 文 】

ktEraIsDate | ( 日付データ )
返却値 | -- | Boolean 型
日付データ | -- | Varianr 型 ( 日付文字列 or シリアル値 )

【 返却値 】

日付データ ( 日付文字列 or シリアル値 ) が 『 日付 として妥当か否か 』 を True / False で返します。
使用環境・Office バージョン に係わらず 新元号にも対応 した結果が得られます。

[ 元年 表記 ] の日付文字列 も 日付として有効と判定します。

【 パラメータ 内容 】

[ 日付データ ]
 | 日付文字列 または シリアル値 ( 数値 or 数字文字列 ) を指定します。 指定可能な 日付フォーマット は以下の通りです。 ( a ) 区切り 形式 ( 年月日 , スラッシュ , ハイフン , ピリオド ) [ H31年4月30日 ] [ H31/4/30 ] [ H31-4-30 ] [ H31.4.30 ] 和暦年/月/日 は １ 桁 or ２ 桁 ( b ) 元 号 [ 明治 , 明 , M/m ] [ 大正 , 大 , T/t ] [ 昭和 , 昭 , S/s ] [ 平成 , 平 , H/h ] [ 令和 , 令 , R/r ] ( c ) 西暦年 も変換可能です ( 年は ４ 桁 , ３桁 , ２桁 ) ２桁年は 2000年代と見做します。尚、西洋式の [ 月/日/年 or 日/月/年 ] フォーマットはサポートしていません。 [ 2019年4月30日 ] [ 2019/4/30 ] [ 2019-4-30 ] [ 2019.4.30 ] ( d ) 平成 32 年 等の 改元 以後 の 年数 でも ＯＫ としています 但し、[ 元号範囲 = True ] 指定の場合は 元号期間内の日付のみが ＯＫK となります。 ( e ) "明治元年","大正元年","昭和元年","平成元年","令和元年"という 表記の日付文字列も可とします ( "明治1年","大正1年","昭和1年", "平成1年","令和1年" として扱います) 下記も指定可能です。 "明元年","大元年","昭元年","平元年","令元年" "M元年","T元年","S元年","H元年","R元年" 但し、"平成元/5/1" など "年" が無いフォーマットは False になります。 ( f ) 数値 or 数字文字列 の場合は、シリアル値の有効範囲( 下記 ) 内で あれば ＯＫ となります。 [ -657434 ( 100/1/1 ) ～ 2958465 ( 999/12/31 ) ]
K.Tsunoda(AddinBox) Mail:addinbox@h4.dion.ne.jp CopyRight(C) 2018 Allrights Reserved.


[ ktWorkingTime ] 関数

〔始業～終業時刻〕 間の勤務時間を 『勤務区割』 別 に求める関数です。
[ #VALUE! ]

【 構 文 】

ktWorkingTime | ( 始業時刻, 終業時刻, 勤務区割,
 | [算出種別], [算出帯], [Serial ] )
返却値 | -- | Variant ( Date ( or Long ) 型配列 / Date / Long ) 型
始業時刻 | -- | Date 型
終業時刻 | -- | Date 型
勤務区割 | -- | Variant (Date 型配列 / Array 配列 / Range ) 型
算出種別 | -- | Integer 型 (省略可, 省略時: ０ )
算出帯 | -- | Variant (Integer/String ) 型 (省略可)
Serial | -- | Boolean 型 (省略可, 省略時: True )

【 返却値 】

〔始業～終業時刻〕 間の勤務時間を 『勤務区割』 別 に求めます。
日付跨り を考慮して、求められる勤務時間は【本日 および 翌日】 に分けられます。

得られる結果は､指定によって下記の３ 種類に分かれます。
(a) 算出種別 ： ０ (本日) または １ (翌日)
ワークシート用に 個々の時間帯の勤務時間を個別 に返します。
算出帯で､どの時間帯を算出するのか指定する必要があります。
算出帯で指定する値は【０ ～ 〔勤務区割数－１〕 】の範囲内です。

後述の図を参照して下さい。

(b) 算出種別 ： ２ (配列で受取)
ＶＢＡ用に ２ 日間 (本日～翌日） を２次元配列 で返します。
この場合は､必ず Variant 型変数 で受け取って下さい。
配列は [ Option Base 句 ] に関係なく 【 ０オリジン 】 で作成されます。
第１次元 ： ０ (本日) ，１ (翌日)
第２次元 ： ０ ～ 〔勤務区割数－１〕

後述の図では 【 結果（０，２） 】 は 【本日の [9:00 ～ 12:00] 】 の値になります。

(c) 算出種別 ： ３ (集計)
パラメータ 「算出帯」 で指定した 複数の時間帯の勤務時間を合計 して返します。
「午前/午後の通常勤務」 や 「早出/夜間残業」 の合計を １回で求められます。

[ Serial ] 引数 によって 返却値の値 の形式を指定できます。
省略、もしくは [ True ] とすれば シリアル値 （Date 型） で返します。
[ False ] を指定すると､分 （Long 型） で返します。

パラメータが不正な場合は [ #VALUE! ] が返ります。

【 パラメータ 内容 】

[ 始業時刻 ]
 | ０：００ ～ ２３：５９ の範囲の 時刻シリアル値 を指定します。
[ 終業時刻 ]
 | ０：００ ～ ４８：００ の範囲の 時刻シリアル値 を指定します。 [ 始業時刻 ≧ 終業時刻 ] の場合は 【 翌日 】 と 判断します。
[ 勤務区割 ]
 | 各勤務時間帯 の 終了時刻 の 一覧表 を指定します。 セル範囲 や Array 配列 など を指定できます。 詳細は下記解説を参照して下さい。
[ 算出種別 ]
 | 個別時間帯別 や 全時間帯 の計算結果の受け取り方を指定します。 ０ (本日) または １ (翌日) ワークシート用に個々の時間帯の勤務時間を個別に返します。 算出帯で､どの時間帯を算出するのか指定する必要があります。 ２ ( 配列 で受取り ) ＶＢＡ用に２日間 (本日～翌日） を２次元配列で返します。 この場合は､必ず Variant 型変数で受け取って下さい。 配列は [ Option Base 句 ] に関係なく 【 ０オリジン 】 で作成されます。 第１次元 ： ０ (本日) ，１ (翌日) 第２次元 ： ０ ～ 〔勤務区割数－１〕 ３ ( 集計 ) パラメータ 「 算出帯 」 で指定した複数の時間帯の勤務時間を合計して返します。 「午前/午後の通常勤務」 や 「早出/夜間残業」 の合計を１回で求められます。
[ 算出帯 ]
 | 算出種別 により指定する内容が異なります。 算出種別 が ０ (本日) または １ (翌日) 勤務区割 の並び から､どの 時間帯を求めるのかを 勤務区割 内の順番 （先頭はゼロ） で指定します。 算出種別 が ２ (配列で受取) 指定する必要はありません。省略して下さい。 算出種別 が ３ (集計) 各時間帯に対して 【 "1" ： 集計する / "0" ： 集計しない 】 を並べて、下記のような 文字列で指定します。＃文字を間に挟んで 本日/翌日 を指定します。 したがって､文字数 は 『 ２ * 時間帯数＋１ 』 になります。 (例） 後述の図で 午前/午後 の 通常勤務 の合計 算出帯 = "00101000#00101000"
[ Serial ]
 | True または 省略 ・・・ 結果を シリアル値 で返します。 False ・・・ 結果を 「分 （ 10 , 60 , 180 などの整数） 」 で返します。

【 解 説 】

【 始業時刻 ≧ 終業時刻 】 は 日付跨り と判断します（ [ 8:00 ～ 5:00 ] は [ 8:00 ～ 29:00 ] と同義です）。

終業 が日付を跨いで且つ始業時刻を越えている場合､終業時刻の指定は必ず【 24:00 ～ 48:00 】の値で
行なって下さい。

『 勤務区割 』 には各勤務時間帯の終了時刻 を表形式で渡します。
勤務区割 の 最終時刻 は必ず 【２４：００】 にして下さい。
ワークシートで利用する場合は､後述の図のようにセル範囲 （１行または１列形式） を指定します。

ＶＢＡ から利用する場合は下記のいずれかで指定して下さい。
・ ワークシート上に 『勤務区割』 データを用意して､そのセル範囲を【Range 】で指定する。
Dim vnt結果 As Variant
vnt結果 = ktWorkingTime（始業時刻，終業時刻，Range("B3:B10")，2）

・ Array 関数 を使って指定する。 【２４：００】 は 『数値の１』 で定義します。
Dim vnt結果 As Variant
vnt結果 = ktWorkingTime（始業時刻，終業時刻，_
Array(#7:00:00 AM#, #9:00:00 AM#, #12:00:00 PM#, _
#1:00:00 PM#, #5:30:00 PM#, #6:00:00 PM#, _
#10:00:00 PM#, 1)，2）
もしくは
Dim vnt結果 As Variant
Dim vnt勤務区割 As Variant
vnt勤務区割 = Array(#7:00:00 AM#, #9:00:00 AM#, #12:00:00 PM#, _
#1:00:00 PM#, #5:30:00 PM#, #6:00:00 PM#, _
#10:00:00 PM#, 1)
vnt結果 = ktWorkingTime（始業時刻，終業時刻，vnt勤務区割，2）

・ Array 関数 を使わないで､Date 型配列 を作成して指定する。この場合､必ず【０ オリジン】 として下さい。
Dim vnt結果 As Variant
Dim　dtm勤務区割(0 To 7) As Date
dtm勤務区割( 0 ) = #7:00:00 AM#
dtm勤務区割( 1 ) = #9:00:00 AM#
：
dtm勤務区割( 6 ) = #10:00:00 PM#
dtm勤務区割( 7 ) = 1 '[1]=24:00
vnt結果 = ktWorkingTime（始業時刻，終業時刻，dtm勤務区割，2）

上の例で､集計オプションを利用すると下記のように求められます。
通常勤務 …… ktWorkingTime(B1, C1, B3:B10, 3, "00101000#00101000")
普通残業 …… ktWorkingTime(B1, C1, B3:B10, 3, "01000010#01000010")
深夜残業 …… ktWorkingTime(B1, C1, B3:B10, 3, "10000001#10000001")

※ 時刻データの小数誤差について
ktWorkingTime 関数では、始業時刻 / 終業時刻 に 小数誤差 を持った時刻データ を与えた場合でも
正しく算出します。

ktWorkingTime 関数内では､小数誤差が表れないように 『分』 に変換した上で整数演算で処理し､結果を
返す段階で シリアル値に変換しています。
しかし､ ktWorkingTime で得られた日々の結果には小数誤差が無くても､それを集計 （月合計や年合計など）
すれば､そこには再び小数誤差が含まれてきます。
    ktWorkingTime で返す内容も 『分』 の整数のままにすれば､集計したとしても､そこには小数誤差など存在
しません。ただ､このままでは､時間データ として利用できませんので､下記のようにして シリアル値 （または
時刻数値） に変換して下さい （ktWorkingTime を使うセル （列） を非表示で隠して､シリアル値に変換した
結果だけ表示させます）。

「 Serial = False 」 指定により 『分』 で結果を得た場合､
(1) シリアル値に変えるには、結果を １４４０ で割ります （表示形式を 時刻タイプ にする）。
(2) 時給計算 などを計算する為に、時間を 【数値 （7：45 ⇒ 7.75） 】 で得たい場合は､
結果を ６０ で割ります （表示形式は標準 または 数値）。

【 使 用 例 】

日付跨り （15:00 ～ 8:00 など) の対処例

-- 下記 サンプル の 条件 --
・ 勤務時間は１５分単位で丸める
・ 日曜/祝日が休日
・ 日付跨り勤務 は､通常勤務の始まる ９ 時以降を翌日分として扱い､９ 時で一旦終業とし､
９ 時以降は翌日の勤務として新たに起票する （このように運用できると､本日の勤務時間を
求めるのに､前日から本日へ跨って勤務（前日起票）の翌日分を足し込まなくても済みます）。

(A) (B) (C)
( 5) 時間帯 開始時刻 終了時刻
( 6) 深夜(朝) 0:00 5:00
( 7) 残業(朝) 5:00 9:00
( 8) 午前 9:00 12:00
( 9) 昼休み 12:00 13:00
(10) 午後 13:00 17:30
(11) 残業(夜) 17:30 22:00
(12) 深夜(夜) 22:00 24:00
(A) (B) (C) (D) (E) (F)
(15) 日 付 曜日 始業 終業 始業(丸め) 終業(丸め)
(16) 7月27日 (金) 9:00 23:12 9:00 23:00
(17) 7月28日 (土) 16:12 9:00 16:15 9:00 ← ("9:00" は 33:00 の意)
(18) 7月29日 (日) 9:00 15:40 9:00 15:30 ← (９時で切り分け)
(19) 7月30日 (月) 9:03 19:20 9:15 19:15

(G) (H) (I) (J)
(15) 通常 残業 深夜 休日
(16) 7:30 4:30 1:00 0:00
(17) 1:15 8:30 7:00 0:00
 (18) 0:00 0:00 0:00 5:30
 (19) 7:15 1:45 0:00 0:00

E16： =IF(C16="", "", ktBoundaryTime(C16, 15, "U")) １５分単位で切り上げ

F16： =IF(D16="", "", ktBoundaryTime(D16, 15, "D")) １５分単位で切り捨て

G16： =IF(OR(E16="", F16=""), "", IF(kt営業日判定("10000001000@", A16),
ktWorkingTime(E16, F16, $C$5:$C$11, 3, "0010100#0000000"), 0))

H16： =IF(OR(E16="", F16=""), "", IF(kt営業日判定("10000001000@", A16),
ktWorkingTime(E16, F16, $C$5:$C$11, 3, "0100010#0100000"), 0))

I16： =IF(OR(E16="", F16=""), "",
ktWorkingTime(E16, F16, $C$5:$C$11, 3, "1000001#1000000"))

J16： =IF(OR(E16="", F16=""), "", IF(kt営業日判定("10000001000@", A16), 0,
ktWorkingTime(E16, F16, $C$5:$C$11, 3, "0110110#0100000")))

※ kt営業日判定("10000001000@",A16) ‥‥ 日曜/祝日以外 ⇒ True , 日曜/祝日 ⇒ False


[ ktBoundaryTime ] 関数

FLOOR / CEILING 関数の代替関数です。
時刻データ に 『小数誤差』 が含まれていても正しく算出します。
[ #VALUE! ]

【 構 文 】

ktBoundaryTime | ( 時刻, 丸め分, 丸め方向, [ Serial ] )
返却値 | -- | Variant ( Date / Long ) 型
時刻 | -- | Date 型
丸め分 | -- | Integer 型
丸め方向 | -- | String 型
Serial | -- | Boolean 型 (省略可, 省略時: True )

【 返却値 】

時刻データ を､指定した方法 （１５分単位で切り上げ 等） で 丸めた時刻 を返します。

[ Serial ] 引数 によって 返却値の値 の形式を指定できます。
省略、もしくは [ True ] とすれば シリアル値 （Date 型） で返します。
[ False ] を指定すると､分 （Long 型） で返します。

パラメータ が不正な場合は [ #VALUE! ] が 返ります。

【 パラメータ 内容 】

[ 時刻 ]
 | ２４：００ 以上 の 時刻 も指定可能です。
[ 丸め 分 ]
 | １～６０ の範囲で 丸め の単位（分） を指定します。
[ 丸め 方向 ]
 | "U" （切り上げ） または "D" （切り捨て） を指定します （小文字でも可）。
[ Serial ]
 | True または 省略 ・・・ 結果を シリアル値 で返します。 False ・・・ 結果を 「分 （ 10 , 60 , 180 などの整数） 」 で返します。

【 解 説 】

時刻 （シリアル値） は 実数 の 小数部 で表現されており､

１時間 ＝ １／２４ ⇒ 0.0416666666666666 ‥‥‥
１分 ＝ １／（２４×６０） ⇒ １／１４４０ ⇒ 0.0006944444444444 ‥‥‥
１秒 ＝ １／（２４×６０×６０） ⇒ １／８６４００ ⇒ 0.0000115740740740 ‥‥‥

という単位で刻まれています。

更に､ コンピュータ で 小数を表現する方式 （二進数） も影響して､
「何らかの演算を通した時刻データ」 と
「直接その時刻 を入力 （もしくは TIME 関数 などで生成） したもの」
とを比べると､僅かな小数誤差が含まれている場合があります。

この 小数誤差 を含んだ 『 時刻 データ 』 に FLOOR / CEILING 関数 を施すと､ 期待通りの結果が
得られないケースが出てきます。

ktBoundaryTime 関数は､ 小数誤差 を取り除いて 【通算分 （120 分, 180 分 など）】 に変換した上で、
整数演算 によって 算出している為､このような場合でも正しく結果が得られます （結果を返す段階で
シリアル値 に変換しています）。

しかし､ktBaundaryTime で得られた日々の結果には小数誤差が無くても､それを集計（月合計や年合計
など）すれば､ そこには再び小数誤差が含まれてしまいます。

ktBaundaryTime で返す内容も 『分』 の整数のまま （ Serial = False ） にすれば､集計したとしても､そこには
小数誤差など存在しません。

ただ､このままでは､時間データ として利用できませんので､下記のようにして シリアル値 （または時刻数値）
に変換して下さい （ktBaundaryTime を使うセル （列） を非表示で隠して､シリアル値に変換した結果だけ
表示させます）。

[ Serial = False ] 指定 により 『分』 で結果を得た場合､
(1) シリアル値 にするには､ １４４０ で割ります（表示形式を時刻タイプへ）。
(2) 時給計算などを計算する為に時間を 【数値 （7：45 ⇒ 7.75）】 で得たい場合は､６０ で割ります。
（表示形式は 標準 または 数値）


[ ktCTime ] 関数

時刻 シリアル値 の 小数誤差 を取り除く関数です。
また、[ 24:00 ] 以上の 時刻文字列でも シリアル値 に変換できます。
角度文字列 （90:45:30 , 90°45’ 30” , 90度45分30秒 ） の シリアル値変換にも利用できます。
[ #VALUE! ]

【 構 文 】

ktCTime | ( 時刻, [秒有効] )
返却値 | -- | Variant ( Date ) 型
時刻 | -- | Variant ( Date / String ) 型
秒有効 | -- | Boolean 型 (省略可, 省略時 ： True )

【 返却値 】

シリアル値 を指定した場合は 小数誤差 を 取り除いた シリアル値で返します。
その際、指定する 時刻データ の 『秒』 部分に対して 有効/無効 が選択できます。

時刻/角度文字列 を指定した場合は、シリアル値に変換して返します。
[ ２４ 時 ] 以上の時刻文字列でも変換できます。
時刻文字列の内容が正しくない内容の場合は [ #VALUE! ] を返します。

【 パラメータ 内容 】

[ 時刻 ]
 | 時刻 シリアル値、もしくは 時刻／角度文字列 を指定します。 -- シリアル値 の場合 -- 第２ 引数で 『秒』 部分 を有効とするかを選択できます。 （２４：００ 以上の 時刻 も指定可能です） -- 時刻文字列 の場合 -- hh:mm 形式､または hh:mm:ss 形式で指定します。 （ 時は １ 桁以上､ 分 と 秒 は １～２ 桁） 他に下記のようなパターンの 時刻/角度文字列 も指定できます。 （数字は半角のみ可） 90時45分30秒 90度45分30秒 90°45’ 30” （ 度/分/秒 の 記号は 全角/半角 ともに可） ※ 時 （度） を省略して 「分＆秒」 のみの指定はできません。 [ 秒 ] の省略はできます。
[ 秒有効 ]
 | 時刻 シリアル値 を指定した場合に、『 秒 』 部分まで有効 とするか否かを指定します。 True (既定値) ： 有効 False ： 無効 勤務時間 など、『 秒 』 まで扱わない場合は [ False ] を指定します。

【 解 説 】

時刻 シリアル値 は、時/分/秒 の単位 が 元々【無限小数】 である為に、時刻シリアル値 同士 の演算を
繰り返すと小数誤差 が 発生してきて、エクセルの丸め関数である [ CEILING , FLOOR ] などの結果が
期待した値にならない場合がありえます。

この小数誤差は、
一旦 TEXT関数 で 時刻文字列 に変換して、それを再び シリアル値に戻す
事で取り除く事ができます。

つまりは、「何時 何分 何秒」 という整数表現にする事で、エクセルがその値を認識している 時刻 （セル などに
表示される時刻、イコール人間が認識する時刻） を小数誤差を気にする事無く得て、それを再び シリアル値に
戻せば、手入力したものと同じように小数誤差のない時刻シリアル値になります。

これだけならば、TEXT 関数 と TIMEVALUE 関数の組み合わせで出来そうですが、ひとつ問題があります。

TEXT 関数は 『 [h]:mm:ss 』 という編集文字で 【２４時】以上の結果を得る事が可能ですが、TIMEVALUE 関数
で扱える時刻文字列は [ 23:59:59 ] までです。

ktCTime 関数は、この問題 を クリアする為に作った関数です。この内部処理を利用して、引数には時刻シリアル
値の他に、直接、２４ 時以上の時刻文字列や [ 度 , 分 , 秒 ] [ °, ’ , ” ] で区切った角度文字列も指定出来ます。

２４ 時以上の値が指定できるので、１８０度３０分 などといった角度文字列が 一発でシリアル値に変換できます。
（補） 角度文字列 を ラジアン数値 に変換するには、シリアル値 を [ 度 ] 単位の １０進表現 に直し（×２４）、
それに [ π/180 ] を掛けます。
=ktCTime("180度20分15秒")*24*PI()/180

単位 デリミタ として使える文字は [ 時 , 分 , 秒 , 度 ] の他に下記の文字が使えます （カッコ内はShift_JIS コード ）
度 (半濁点) ⇒ 半角 ﾟ (df) , 全角 ゜ (814b) , °(818b)
分 (ｱﾎﾟｽﾄﾛﾌｨ) ⇒ 〃 ' (27) , 〃 ’ (8166) , ′(818c) , ´ (814c)
秒 (ｸｫｰﾃｰｼｮﾝ) ⇒ 〃 " (22) , 〃 ” (8168) , ″(818d)
秒 (濁点) ⇒ 〃 ﾞ (de) , 〃 ゛ (814a)


[ ktSelClock ] 関数

アナログ 時計 フォーム を ポップアップ して､時刻入力を行なう関数です。
[ VBA ONLY ]

【 構 文 】

ktSelClock | ( 時刻, [ AMPM ], [ Title ], [ Pos_X ], [ Pos_Y ] )
返却値 | -- | Boolean 型
時刻 | -- | Date 型 ( ByRef )
AMPM | -- | String 型 (省略可, 省略時: "AMPM" )
Title | -- | String 型 (省略可, 省略時: "ktFormClock" )
Pos_X | -- | Variant ( Integer / Empty ) 型 (省略可 )
Pos_Y | -- | Variant ( Integer / Empty ) 型 (省略可 )

【 返却値 】

時刻 が 選択された場合は 返却値 として True が返ります。
入力した 時刻データ は 引数 「時刻」 に設定されます。

入力を キャンセル した場合は False が返ります。

ワークシート 関数 として セル に記述すると False が返ります （ＶＢＡ専用関数です）。

【 パラメータ 内容 】

[ 時刻 ] ( ByRef )
 | この項目に、選択した時刻が設定されて呼び元に返されます。 呼び元での 変数定義 が必要です。
[ AMPM ]
 | ２４ 時以上の入力可否 および フォーム 初期表示の際に選択しておく 『 時 』 を指定します。 省略 or "AMPM" マシン時刻 に合わせて午前/午後を切り替えます。 初期選択の [ 時 ] はマシン時刻の [ 時 ] になります。 "AM" 午前 の マシン時刻 [ 時 ] で初期表示されます。 "PM" 午後 の マシン時刻 [ 時 ] で初期表示されます。 "0" ～ "11" 午前 の 指定 [ 時 ] で初期表示されます。 "12" ～ "23" 午後 の 指定 [ 時 ] で初期表示されます。 "24" ～ "35" 翌日午前 の 指定 [ 時 ] で初期表示されます。 "36" ～ "47" 翌日午後 の 指定 [ 時 ] で初期表示されます。 既定では､入力できる時刻は [ 0:00 ～ 23:59 ] ですが､上記の指定値の末尾に "#" を付加すると [ 0:00 ～ 47:59 ] の範囲の入力が可能になります。なお、AMPM 引数が "24"～"47" の場合には、 "#" を付けなくてもＯＫです。 (注) [ 0 ～ 47 ] に # を付ける場合､必ずクォーテーションで囲んで文字列として下さい。 ( "3#" , "15#" 等 ) 3# と 記述すると､ Double 型数値の [ 3 ] という風に､ # が型宣言文字と解釈されてしまいます。
[ Title ]
 | ここに指定した文字列が キャプション 部分に表示されます。 全角１２文字/半角２０文字程度まで指定できます。 省略時 はフォーム名である [ ktFormCLock ] が表示されます。
[ Pos_X および Pos_Y ]
 | 時計フォーム を 画面の どの位置 に表示するかを指定するパラメータです。 UserForm のプロパティ （Left / Top )で指定する値です。 一方 もしくは 両方 を省略すると 『オーナーフォーム中央』 に表示します。 または、一方 もしくは 両方に Empty 値 を指定した場合も、省略 と 同じ扱いで 『 オーナーフォーム中央 』 に表示します。 ( Ver 4.00 ～ ) 参考 ： 表示位置による Pos_X および Pos_Y の値 （1024×768サイズの画面） 画面全体の左上 ‥‥‥ Pos_X = 0 , Pos_Y = 0 〃 中央 ‥‥‥ Pos_X = 300 , Pos_Y = 170 〃 右下 ‥‥‥ Pos_X = 580 , Pos_Y = 350 『Ｂ１０ セル の上 』 などの位置指定が必要な場合は、ktCell2Position 関数 によって、 セル座標を フォーム座標（Ｘ＆Ｙ） に変換してください。

【 解 説 】

従来の 時刻入力コントロール は､ ドロップダウンリスト から選択したり､スピンボタン で 時/分の値を変更する方式が
一般的でしたが､この ktSelClock 関数 では下記のように 直感的/視覚的 なマウス 操作で時刻入力が可能です。

・ アナログ時計を模した 時計盤フォーム が ポップアップ
・ ＡＭ/ＰＭ (＆当日/翌日) はオプションボタンで切り替え
・ 「時」 は １～１２ の 時刻文字 を 『右クリック』 で選択
・ 時計盤上で マウス を滑らせれば 「分」 が [０～５９] の間で、マウス に合わせて リアルタイム に変化
・ ３ 時 の位置に マウスカーソル を置けば､それだけで 「１５分」
・ 入力する時刻の位置に マウス を合わせたら､その場所で クリック すれば､それで 時刻 が取り込まれます
・ 時計盤の下には【現在日時】が表示されます （マウス を動かしている限りは リアルタイム で更新されます）
・ 【現在日時】の上で マウスクリック すると､ 『現在時刻 (時＆分) 』で取り込まれます。
【現在日時】上に マウス がある時は､時計盤中央の 「選択時刻」 も現在時刻になります。

(注) 時刻文字 【付近】では 「５分単位」 の値になります。
[ １分 ] とか [ ４分 ] 等は､時刻文字の近くでは反応
しませんので､少し内側を探って下さい。

【 使 用 例 】

Dim MyTime As Date

--- 基本形 --- ( キャプション に 本日日付 を表示しています )
If ktSelClock (MyTime, "AMPM", Format(Date, "yyyy/m/d")) Then
xxxx = MyTime
または
xxxx = Format(MyTime, "hh:mm")
または
xxxx = WorksheetFunction.Text(MyTime, "[h]:mm")
End If

(注) ＶＢＡ の Format 関数での 時刻書式 では ２４ 時 以上の値を指定しても ０～２３ 時 にしか編集されません。
２４ 時 以上 の 時刻入力 が考えられる場合は､ ワークシート の TEXT 関数 を利用して編集してください。

--- パラメータ の指定パターン例 ---
(1) 省略できる パラメータ を全て省略
マシン 時刻 に合わせて午前/午後で初期表示されます。
ktSelClock (MyTime)
これは､下記の指定と同じ意味になります。
ktSelClock (MyTime, "AMPM", "")

(2) 午前/午後 を指定して初期表示
ktSelClock (MyTime, "AM")
または
ktSelClock (MyTime, "PM")

(3) ２４ 時以降も入力できるようにする
ktSelClock (MyTime, "AM#")
または
ktSelClock (MyTime, "PM#")
または
ktSelClock (MyTime, "AMPM#")

(4) 予め 指定の時刻 を選択した状態で表示する
ktSelClock (MyTime, "3")
ktSelClock (MyTime, "3#")
ktSelClock (MyTime, "28") など

(5) 現在時刻 を 予め 選択した状態で表示する
ktSelClock (MyTime, Hour(Now))
または
ktSelClock (MyTime, Hour(Now) & "#")

【 利 用 例 】

[ DblClick ] アクション を無効にする為に 『 Cancel = True 』 は必須です。

(1) テキストボックス での利用例
UserForm の場合は、その UserForm モジュール に、シート上 の コントロールの 場合は、その シート
モジュール に記述してください。TextBox1 を ダブルクリック すると 時刻入力フォーム を表示して､入力
した時刻を編集して TextBox1 に設定します。なお､ Format関数では ２４ 時 以上の編集が出来ません
ので､ワークシートの Text 関数 を利用します。

Private Sub TextBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Dim MyTime As Date
If ktSelClock(MyTime, Hour(Now)) Then
TextBox1.Value = WorksheetFunction.Text(MyTime, "[h]:mm")
End If
Cancel = True
End Sub

(2) ワークシート での利用例 （その１）
その シート の モジュール に記述して下さい。
セル を ダブルクリック すると 時刻入力フォーム を表示して､時刻 を入力します。
入力した内容は､ダブルクリック した セル の 「表示形式」 で表示されます。

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim MyTime As Date
If ktSelClock(MyTime, Hour(Now)) Then
Target.Value = MyTime
End If
Cancel = True
End Sub

(3) ワークシート での利用例 （その２）
その シート の モジュール に記述して下さい。上記に､表示形式の指定を追加した例です。

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim MyTime As Date
If ktSelClock(MyTime, Hour(Now) & "#") Then
Target.NumberFormatLocal = "[h]:mm"
Target.Value = MyTime
End If
Cancel = True
End Sub

(4) ワークシート での利用例 （その３）
その シート の モジュール に 記述して下さい。
ダブルクリック で 時刻入力 する セル を 限定 (B5 セル) する場合の例です。

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim MyTime As Date
If (Target.Address = "$B$5") Then
If ktSelClock(MyTime, Hour(Now) & "#") Then
Target.NumberFormatLocal = "[h]:mm"
Target.Value = MyTime
End If
Cancel = True
End If
End Sub

[ Cancel = True ] を記述する位置に注意して下さい。
Ｂ５ セル以外 では 『ダブルクリック で セル への キー入力 』 は有効にしなければなりません。

(5) ワークシート での利用例 （その４）
そのシートのモジュールに記述して下さい。
ダブルクリック で 時刻入力する セル を 限定(Ｃ 列) する場合の例です。

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim MyTime As Date
If (Target.Column = 3) Then
If ktSelClock(MyTime, Hour(Now) & "#") Then
Target.NumberFormatLocal = "[h]:mm"
Target.Value = MyTime
End If
Cancel = True
End If
End Sub

[ Cancel = True ] を記述する位置に注意して下さい。
Ｃ 列 以外では 『ダブルクリック で セル への キー入力』 は有効にしなければなりません。

(6) ワークシート での利用例 （その５）
そのシートのモジュールに記述して下さい。
実際に業務で利用する場合は､下記のような工夫をして下さい。

ダブルクリック したセルに 時刻 が入っていない場合は､１行上のセルの時刻で初期表示する。
明細の１行目の場合は､１行上が タイトル行になるが､ 『時刻データ 以外』 なので､１行目は「本日の年月」
で表示される。

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim strAMPM As String
Dim MyTime As Date
If (Target.Column = 3) Then
If (Target.Value = "") Then
If (Target.Offset(-1, 0).Value = "") Then
strAMPM = "AMPM#"
'１行上が時刻データかを判定
ElseIf Not IsError(WorksheetFunction. _
Text(Target.Offset(-1, 0).Value, "[h]")) Then
strAMPM = WorksheetFunction. _
Text(Target.Offset(-1, 0).Value, "[h]") & "#"
Else
strAMPM = "AMPM#"
End If
          'そのセルが時刻データかを判定
ElseIf Not IsError(WorksheetFunction.Text(Target.Value, "[h]")) Then
strAMPM = WorksheetFunction.Text(Target.Value, "[h]") & "#"
Else
strAMPM = "AMPM#"
End If

If ktselclock(MyTime, strAMPM) Then
Target.NumberFormatLocal = "[h]:mm"
Target.Value = MyTime
End If
Cancel = True
End If
End Sub

[ Cancel = True ] を記述する位置に注意して下さい。
Ｃ 列 以外では 『ダブルクリック でセルへのキー入力』 は有効にしなければなりません。

(7) ワークシート での利用例 （その６）
カーソル を 「そのセル」 に移しただけで、ポップアップ させたい場合は、Worksheet_BeforeDoubleClick
イベント の代わりに Worksheet_SelectionChange イベント を使ってください。
この場合は [ Cancel ] 引数が有りませんので、『Cancel = True 』 ステップは不要です。

(8) ワークシート での利用例 （その７）
ダブルクリック したセル の 付近に ポップアップ します。 (Ver 4.00 から利用可能)

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim MyTime As Date
Dim vntPos As Variant
Dim vntTop As Variant
Dim vntLeft As Variant

vntPos = ktCell2Position(Target)
'ウィンドウの表示範囲内かをチェック（このダブルクリック例では実際には不要）
If IsError(vntPos) Then
'表示範囲外 ⇒ Top/Left を省略(Empty)
vntTop = Empty
vntLeft = Empty
Else
vntTop = vntPos(0) + 5
vntLeft = vntPos(1) + 5
End If

If ktSelClock(MyTime, Hour(Now) & "#", _
Pos_X:=vntLeft, Pos_Y:=vntTop) Then
Target.NumberFormatLocal = "[h]:mm"
Target.Value = MyTime
End If
Cancel = True
End Sub

(9) F5 セル の 付近に表示する (Ver 4.00 から利用可能)

Dim vntPos As Variant
Dim vntTop As Variant
Dim vntLeft As Variant
vntPos = ktCell2Position(ActiveSheet.Range("F5"))
If IsError(vntPos) Then
'F5 セル が 表示範囲外 ⇒ Top/Left を省略(Empty)
vntTop = Empty
vntLeft = Empty
Else
vntTop = vntPos(0) + 5
vntLeft = vntPos(1) + 5
End If
If ktSelClock(MyTime, Hour(Now) & "#", _
Pos_X:=vntLeft, Pos_Y:=vntTop) Then
:
:


[ kt祝日日付 ] 関数

指定した 「年」 の 『春分の日・体育の日など、年によって変動する祝日』 の日付を返す関数です。
Ver 5.40 では 2019年 ～ 2021年 施行の全ての祝日改正に対応しています。 詳細は こちら。
[ #VALUE! ]

【 構 文 】

kt祝日日付 | ( 年, 祝日名 )
返却値 | -- | Variant ( Date ) 型
年 | -- | Integer 型
祝日名 | -- | String 型

【 返却値 】

指定した 「年」 の 『祝日名』 に当たる 日付 を返します。
「９月の国民の休日」 は発生 「する年」 と 「しない年」 があります。

後述 の 祝日名 以外を指定した場合は [ #VALUE! ] が返ります。
年 が 祝日法施行前 （ ＜ １９４９ ）、または、その 祝日の施行前 の場合は [ #VALUE! ] が返ります。
「９月の国民の休日」 を指定した場合、発生しない年では [ #VALUE! ] が返ります。

【 パラメータ 内容 】

[ 年 ]
 | 西暦年 を 数値で指定します。 祝日法施行年 の １９４９ 年 以降の年を指定してください。
[ 祝日名 ]
 | 下記の､何れかを指定します。 ”成人の日” ”春分の日” ”海の日” "山の日" ”敬老の日” ”９月の国民の休日” …… "９" は全角です ”体育の日” or "スポーツの日" ”秋分の日” (補) 「スポーツの日」 改名は 2020年以降ですが、 ”体育の日” or "スポーツの日" の どちらでも可とします。


[ kt祝日判定 ] 関数

指定 した日付が 「祝日法で定められた祝日」 か否かを判定する関数です。
Ver 5.40 では 2019年 ～ 2021年 施行の全ての祝日改正に対応しています。 詳細は こちら。

【 構 文 】

kt祝日判定 | ( 日付 )
返却値 | -- | Boolean 型
日付 | -- | Variant ( Date ) 型

【 返却値 】

指定した 日付 が
祝日 （ 振替休日 , 国民の休日 を含む ） の場合 …… True
上記 以外 ( 日付の不正 を含む ) の場合 …… False
が 返ります。

【 パラメータ 内容 】

[ 日付 ]
 | 祝日 か 否か を判定する日付を シリアル値 または 日付文字列で指定します。 ※ 新元号「令和」対応になっていない環境でも 「令和 日付文字列(元年 表記を含む)」を指定可能です。

【 解 説 】

『祝日』 に 関しての 詳細は こちら を参照して下さい。


[ kt祝日名取得 ] 関数

指定 した日付が 「祝日法で定められた祝日」 の 場合、祝日名を返す関数です。
Ver 5.40 では 2019年 ～ 2021年 施行の全ての祝日改正に対応しています。 詳細は こちら。

【 構 文 】

kt祝日名取得 | ( 日付 )
返却値 | -- | String 型
日付 | -- | Varianr ( Date ) 型

【 返却値 】

指定した 日付 が
祝日 （ 振替休日 , 国民の休日 を含む ） の場合 …… 祝日名
上記 以外 ( 日付が不正 を含む ) の場合 …… 空文字 ( "" )
が 返ります。

祝日名 の 一覧は こちら を参照して下さい。

【 パラメータ 内容 】

[ 日付 ]
 | 祝日名を取得する日付を シリアル値 または 日付文字列で指定します。 ※ 新元号「令和」対応になっていない環境でも 「令和 日付文字列(元年 表記を含む)」を指定可能です。

【 解 説 】

『祝日』 に 関しての 詳細は こちら を参照して下さい。

【 使 用 例 】

下記 の サブルーチン で 「その年の祝日一覧」 が得られます。

Sub 祝日一覧(ByVal 対象年 As Integer)
Dim str祝日名 As String
Dim MyDate As Date
Dim LastDate As Date
Dim i As Integer

MyDate = DateSerial(対象年, 1, 1)
LastDate = DateSerial(対象年, 12, 31)
i = 0
Do
str祝日名 = kt祝日名取得(MyDate)
If (str祝日名 <> "") Then
i = i + 1
With ActiveSheet
.Cells(i, 1).Value = Format(MyDate, "yyyy/m/d")
.Cells(i, 2).Value = Format(MyDate, "（aaa）")
.Cells(i, 3).Value = str祝日名
End With
End If
MyDate = DateAdd("d", 1, MyDate)
Loop Until (MyDate >= LastDate)
End Sub


[ kt祝日PreMap設定 ] サブルーチン

祝日判定 を 高速化する為の 『祝日プリマップ』 を設定するサブルーチンです。
kt関数アドイン では、ブックオープン時に、既定で 『今年の前後５年間 （計１１年間） 』 で
設定されています。
Ver 5.40 では 2019年 ～ 2021年 施行の全ての祝日改正に対応しています。 詳細は こちら。

【 構 文 】

Call kt祝日PreMap設定 | ( 基準年 )
基準年 | -- | Integer 型

【 パラメータ 内容 】

[ 基準年 ]
 | 西暦 で 『 祝日プリマップ 』 を作成する 基準年 を指定します。 この 基準年 の 前後 ５ 年間 （前５年＋基準年＋後５年 計１１年間） で作成されます。

【 解 説 】

祝日判定 （逆に言えば 「この日は祝日ではない」 という判定） 処理は、多くの条件判断を必要とする為､
結構時間の掛かる処理です。

「ある１日」 に対してだけ判定するなら微々たるものですが､祝日判定 を使って大量のデータに対して
「日数計算」 を行なう場合等では､非常に莫大な回数の実行となります （平均して１年程度の隔たりの
ある日数計算を １０００ 件のデータ に対して行なうと ⇒ 365回×1000件 ≒ ３６万回）。

この 祝日判定処理 を高速化する為に､予め 年間の祝日日付の位置を シリアル値を基にして マッピング
してあります （祝日プリマップ期間）。

これにより､このマップ期間内ならば 「シリアル値の位置にフラグが立っているか？」 という､たった１回の単純な
判定処理で済ます事が出来ます。

祝日判定 を繰り返す中で日付が マップ期間から外れた場合は､自動的に通常の判定処理 （個々の祝日との
比較）に移行するようにしてありますし､マップの作成は kt関数Addin.xla の オープン時に 『今年の前後５年間
（計１１年間）』 の期間で自動的に行なわれていますので､ユーザー側では一切意識する必要はありません。

しかしながら､これから処理しようとしている データ が 「１０年前～今年」 や 「今年～１０年後」 というものだった
場合には､マップ期間から外れるデータも多くあるので､あまり効果的ではありません。

このような場合は､臨時に 祝日プリマップ期間 を リセット してから データ の処理を行うと高速化できます。
（処理が終わったら､元に戻しておいて下さい）

【 使 用 例 】

１９９０ ～ ２０００年 の データ を処理する場合の例

Call kt祝日PreMap設定( 1995 )
：
データ処理
：
Call kt祝日PreMap設定( Year(Date) ) '[本日年]を基準年として元に戻す


[ kt営業日判定 ] 関数

指定の「日付」が営業日か休業日かを判定する関数です。

【 構 文 】

kt営業日判定 | ( 休日Map, 日付 )
返却値 | -- | Boolean 型
休日Map | -- | String 型
日付 | -- | Variant ( Date ) 型

【 返却値 】

True ‥‥‥ 『 休日Map 』 で指定された 【 休日 】 ではありません （ ⇒ 営業日）。
False ‥‥‥ 〃 〃 【 休日 】 です（ ⇒ 休業日 ）。

『 休日Map 』 に 休日マップデータ を指定した場合に､ 『 日付 』 が､マップの期間外の場合には
[ True ] を返します。

日付が不正な値の場合は [ False ] を返します。

【 パラメータ 内容 】

[ 休日Map ]
 | 休日マップデータ を 指定します。詳細は こちら を参照。
[ 日付 ]
 | 判定対象の日付を シリアル値 または 日付文字列で指定します。 ※ 新元号「令和」対応になっていない環境でも 「令和 日付文字列(元年 表記を含む)」を指定可能です。


[ kt営業日数 ] 関数

２つの日付間の 『営業日数』 または 『休業日数』 を計算する関数です。
分析ツールの [ NETWORKDAYS ] [ NETWORKDAYS.INTL ] に相当します。
[ #VALUE! ]

【 構 文 】

kt営業日数 | ( 休日Map, 日付1, 日付2, [休業日数] )
返却値 | -- | Variant ( Integer ) 型
休日Map | -- | String 型
日付1 | -- | Variant ( Date ) 型
日付2 | -- | Variant ( Date ) 型
休業日数 | -- | Boolean 型 (省略可, 省略時: False )

【 返却値 】

日付１ ＞ 日付２ の場合は マイナスの値 になります。

〔日付２ = 日付１〕 の結果は １ （日付１ が休業日の場合は ０ ）
〔日付２ = 日付１の翌営〕 の結果は ２ （日付１ が休業日の場合は １ ）
〔日付２ = 日付１の前営〕 の結果は －２ （日付１ が休業日の場合は －１ ）

「休業日数」 に [ True ] を指定した場合
営業日数の代わりに休業日数を返します。
休業日数 とは ２日付間の 『暦日日数－営業日数』 です。
「休業日数」 を 省略 もしくは [ False ] を指定した場合
従来通りに 「営業日数」 を返します。

『休日Map』 に休日マップデータ を指定した場合で､ 『日付1/2』 が､その期間外の場合には
[ #VALUE! ] を返します。

日付が不正な値の場合には [ #VALUE! ] を返します。

【 パラメータ 内容 】

[ 休日Map ]
 | 休日マップデータ を 指定します。詳細は こちら を参照。
[ 日付1 および 日付2 ]
 | 営業日数 を求める 期間の 開始日付/終了日付 を シリアル値 または 日付文字列で指定します。 日付1 ＞ 日付2 の指定も可能です。 ※ 新元号「令和」対応になっていない環境でも 「令和 日付文字列(元年 表記を含む)」を指定可能です。
[ 休業日数 ]
 | 営業日数 を求める場合は 「省略 もしくは False 」 休業日数 を求める場合は 「 True 」


[ kt営業日算出 ] 関数

営業日ベースで 「日付」 から 「日数」 後の日付を算出する関数です。
分析ツールの [ WORKDAＹ ] [ WORKDAY.INTL ] に相当します。
[ #VALUE! ]

【 構 文 】

kt営業日算出 | ( 休日Map, 日付, 日数, [休日前営] )
返却値 | -- | Variant ( Date ) 型
休日Map | -- | String 型
日付 | -- | Variant ( Date ) 型
日数 | -- | Integer 型
休日前営 | -- | Boolean 型 (省略可, 省略時: True )

【 返却値 】

日数が マイナス の場合は、過去日付 を返します。

〔 日数 ＝ １ 〕 は、 「日付」 の 翌営業日
〔 日数 ＝ －１ 〕 は、 「日付」 の 前営業日
〔日数 ＝ 0 〕 は、 「日付」＝営業日の場合は 当日、
「日付」≠営業日 の場合は [休日前営 ( True / False ) ] にしたがって､
前営 / 翌営業日 になります。

『 休日Map 』 に 休日マップデータ を指定した場合に､ 『 日付 』 が､マップの期間外の場合には
[ #VALUE! ] を返します。

日付が不正な値の場合には[ #VALUE! ] を返します。

【 パラメータ 内容 】

[ 休日Map ]
 | 休日マップデータ を 指定します。詳細は こちら を参照。
[ 日付 ]
 | 基準 となる 日付 を シリアル値 または 日付文字列で 指定します。 ※ 新元号「令和」対応になっていない環境でも 「令和 日付文字列(元年 表記を含む)」を指定可能です。
[ 日数 ]
 | 「日付」 から シフト する 『営業日数』 を指定します （マイナス可）。
[ 休日前営 ]
 | 「日数」 ＝ ０ で､ 「日付」 が 休業日だった場合に求める 日付 を 前営業日( True ) にするか、翌営業日 ( False ) にするかを指定します。 「日数」≠０ の場合には意味を持ちません。

【 使 用 例 】

決済日のように､暦日で 『 ９０日後 』 という場合には､ 【日数＝０】 を利用すると､ 該当日が 休日の場合に
前/翌営業日 への シフト が行なえます。

９０日後決済日（休日の場合は翌営）
Dim dtm決済日　As Date
dtm決済日 = kt営業日算出（kt_銀行休日，(日付 + 90)，0，False）


[ kt月初営業日 ] 関数

指定した月の 『月初営業日』 を返す関数です。
[ #VALUE! ]

【 構 文 】

kt月初営業日 | ( 休日Map, 日付, [月数] )
返却値 | -- | Variant ( Date ) 型
休日Map | -- | String 型
日付 | -- | Variant ( Date ) 型
月数 | -- | Integer 型 (省略可, 省略時： ０ )

【 返却値 】

「日付」 の 月 を 「月数」 だけ シフト した月 の 月初営業日 を返します。

"１日" が 休業日 の場合は 【 １日の 翌営業日 】 になります。
月数 が マイナス の場合は過去日付を返します。

『 休日Map 』 に 休日マップデータ を指定した場合に､
『 日付 』 が マップの期間外
または
    求めようとする 日付 が マップの期間外になってしまう
場合には [ #VALUE! ] を返します。

日付の値が不正の場合には [ #VALUE! ] が返ります。

【 パラメータ 内容 】

[ 休日Map ]
 | 休日マップデータ を 指定します。詳細は こちら を参照。
[ 日付 ]
 | 月初営業日を求める 基準 となる 日付 を シリアル値 または 日付文字列で指定します。 ※ 新元号「令和」対応になっていない環境でも 「令和 日付文字列(元年 表記を含む)」を指定可能です。
[ 月数 ]
 | 「日付」 から シフト する 月数 を指定します （マイナス可）。 ０ または 省略すると､ 「日付」 の 月 から月初営業日を求めます。


[ kt月末営業日 ] 関数

指定した月の 『月末営業日』 を返す関数です。
[ #VALUE! ]

【 構 文 】

kt月末営業日 | ( 休日Map, 日付, [月数] )
返却値 | -- | Variant ( Date ) 型
休日Map | -- | String 型
日付 | -- | Variant ( Date ) 型
月数 | -- | Integer 型 (省略可, 省略時： ０ )

【 返却値 】

「日付」 の 月 を 「月数」 だけ シフト した月 の 月末営業日 を返します。

"月末日" が 休業日 の場合は 【 月末日の 前営業日 】 になります。
月数 が マイナス の場合は過去日付を返します。

『 休日Map 』 に 休日マップデータ を指定した場合に､
『 日付 』 が マップの期間外
または
    求めようとする 日付 が マップの期間外になってしまう
場合には [ #VALUE! ] を返します。

日付の値が不正の場合には [ #VALUE! ] が返ります。

【 パラメータ 内容 】

[ 休日Map ]
 | 休日マップデータ を 指定します。詳細は こちら を参照。
[ 日付 ]
 | 月末営業日を求める 基準 となる 日付 を シリアル値 または 日付文字列で指定します。 ※ 新元号「令和」対応になっていない環境でも 「令和 日付文字列(元年 表記を含む)」を指定可能です。
[ 月数 ]
 | 「日付」 から シフト する 月数 を指定します （マイナス可）。 ０ または 省略すると､ 「日付」 の 月 から月末営業日を求めます。


[ kt締日算出 ] 関数

「日付」 から 「月数」 後の 月 から 「締日」 の日付を求める関数です。
[ #VALUE! ]

【 構 文 】

kt締日算出 | ( 休日Map, 日付, 締日, [月数], [休日前営] )
返却値 | -- | Variant ( Date ) 型
休日Map | -- | String 型
日付 | -- | Variant ( Date ) 型
締日 | -- | Integer 型
月数 | -- | Integer 型 ( 省略可、省略時： ０ )
休日前営 | -- | Boolean 型 ( 省略可、省略時： True )

【 返却値 】

「日付」 の 月 を 「月数」 だけ シフト した月 から 「締日」 の 日付 を求めます。

シフト した先の 「月」 に 「締日」 に当たる日が無い場合 （締日３０ を指定して ２月 など）は、
その月の月末日（又は月末営業日）が返ります。

求めた 日付 が 休業日 の場合は [ 休日前営 ] の指定によって､
前営業日 または 翌営業日
が返ります。

月数 が マイナス の場合は 過去日付 を返します。

『 休日Map 』 に 休日マップデータ を指定した場合に､
『 日付 』 が マップの期間外
または
    求めようとする 日付 が マップの期間外になってしまう
場合には [ #VALUE! ] を返します。

日付の値が不正の場合には [ #VALUE! ] が返ります。

【 パラメータ 内容 】

[ 休日Map ]
 | 休日マップデータ を 指定します。詳細は こちら を参照。
[ 日付 ]
 | 基準となる日付を シリアル値 または 日付文字列で指定します。 ※ 新元号「令和」対応になっていない環境でも 「令和 日付文字列(元年 表記を含む)」を指定可能です。
[ 締日 ]
 | １０日 , １５日 , ２０日 , ３１日 など 締日 を 数値で指定します。 月末締 では ３１日 を指定してください。 対象の月が 小の月/２月（平年/閏年） の場合には、自動的に月末日（３０日, ２８日, ２９日） が締日となります。
[ 月数 ]
 | 「日付」 から シフト する 月数 を指定します （マイナス可）。 ０ または 省略すると､ 「日付」 の 月 から 締日 を求めます。
[ 休日前営 ]
 | 求めた締日の日付 が 休業日だった場合に求める 日付 を 前営業日( True ) にするか、翌営業日 ( False ) にするかを指定します。

【 解 説 】

Ｎヶ月後 の 「２０日締め」 といった日付を求める為の関数です。

※ 月初/月末締日 を求める場合は､ kt月初営業日 / kt月末営業日 を利用してください。

【 使 用 例 】

本日から ３ヶ月後 の 「２０日締め」 （休日の場合は翌営）
Dim dtm日付 As Date
dtm日付 = kt締日算出(kt_土日祝, Date, 20, 3, False )）

kt営業日算出でも､同じような処理は可能です。
Dim dtm日付　As Date
dtm日付 = kt営業日算出(kt_土日祝, _
DateAdd("m", 3, DateSerial(Year(Date), Month(Date), 20)), _
0, False )


[ ktIs休日Map ] 関数

『 休日Map 』 として渡された データ が有効 な内容かどうかを判定する関数です。

【 構 文 】

ktIs休日Map | ( 休日Map )
返却値 | -- | Boolean 型
休日Map | -- | String 型

【 返却値 】

True ‥‥‥ 『 休日Map 』 として有効です。

False ‥‥‥ 上記以外 （ 『 固定休日コード 』 の場合も False が返ります）。

【 パラメータ 内容 】

[ 休日Map ]
 | 休日マップデータ を指定します。 詳細は ここ を参照。

【 解 説 】

休日マップデータ （ ノーマル / 圧縮 ） として渡された データ が 有効な フォーマット か を
判定する関数です。各 ｋｔ関数 内で､ パラメータチェック に利用している関数であり､ ユーザー
側では敢えて使用する必要はありません。

ただし､ ループ処理 などで 休日マップ を渡す関数を利用する場合､ ループ に入る前に､ この
関数で チェック しておけば､ ループ内で 休日マップ を原因とするエラー値 ( #VALUE! ) が返る
心配は無くなります。

なお､日付 が 休日マップ の期間外になる場合には、各 kt関数 にて エラー値 ( #VALUE! ) が
返ります。


[ ktIs固定休日 ] 関数

休日マップ として渡された 『固定休日コード』 が 有効な内容かどうかを判定する関数です。

【 構 文 】

ktIs固定休日 | ( 固定休日コード )
返却値 | -- | Boolean 型
固定休日コード | -- | String 型

【 返却値 】

True ‥‥‥ 『 固定休日コード 』 として有効です。

False ‥‥‥ 上記以外 （ 『 休日マップ 』 の場合も False が返ります）。

【 パラメータ 内容 】

[ 固定休日コード ]
 | 固定休日コード を指定します。 詳細は ここ を参照。

【 解 説 】

休日マップデータ （ 固定休日コード ） として渡された データ が 有効な フォーマット か を
判定する関数です。各 ｋｔ関数 内で､ パラメータチェック に利用している関数であり､ ユーザー
側では敢えて使用する必要はありません。

ただし､ ループ処理 などで 固定休日コード を渡す関数を利用する場合､ ループ に入る前に､
この関数で チェック しておけば､ ループ内で 固定休日コード を原因とするエラー値 ( #VALUE! )
が返る心配は無くなります。


[ kt休日MapIdGet ] 関数

「休日マップデータ 」 の 先頭１０文字に記録されている各種情報を取得する関数です。
[ #VALUE! ]

【 構 文 】

kt休日MapIdGet | ( 休日Map, 種別 )
返却値 | -- | Variant ( Integer/Date ) 型
休日Map | -- | String 型
種別 | -- | Integer 型

【 返却値 】

種別 の 指定によって、以下の情報を返します。

1 : 基準年 ‥‥　休日マップの 対象期間 の 「開始年 （西暦年） 」
2 : 年数 ‥‥ 〃 の 対象期間 の 「年数 （２, ４，６，８，１０，１２） 」
3 : 日時 ‥‥　　　〃 を 作成した 「タイムスタンプ （年月日時分秒） 」
4 : サイズ ‥‥　　　〃 が 採るべき 「文字数」 （これと一致しない場合は異常）
5 : 開始日 ‥‥　　　〃 の 対象期間 の 開始日（開始年の１月１日）
6 : 終了日 ‥‥　　　〃 の 対象期間 の 終了日（[ 開始年 + 年数 - 1 ] の１2月3１日）

日時・開始日・終了日は Date 型､ 他は Integer 型 で返ります。

指定された 休日マップデータ が 「固定休日コード」 の場合、または、休日マップデータ の 内容が
不正な場合には [ #VALUE! ] が返ります。

【 パラメータ 内容 】

[ 休日Map ]
 | 休日マップデータ （ノーマル or 圧縮 ） を指定します。 詳細は ここ を参照。
[ 種別 ]
 | 休日マップデータ の ＩＤ内 から取得する情報の対象を指定します。 指定値 ならびに 取得情報は 「返却値」 の項を参照。

【 解 説 】

各 ｋｔ関数 内で、休日マップコード の 有効期間 を求めるのに使用している関数です。
ユーザー側で敢えて利用する必要はありません。

休日マップコード の有効期間判定を行いたい場合は ktIs有効期間 を利用して下さい。
休日マップコード の有効期間等の情報を表示したい場合は ｋｔ休日MapId編集 を利用して下さい。


[ kt休日MapId編集 ] 関数

「休日マップデータ」 の タイムスタンプ （作成日時） を編集して返す関数です。

【 構 文 】

kt休日MapId編集 | ( 休日Map )
返却値 | -- | String 型
休日Map | -- | String 型

【 返却値 】

『 休日Map / 固定休日コード 』 以外を指定した場合、"≠『休日マップ』" の文字列が返ります。

『固定休日コード』 を指定した場合、下記のように編集した結果を返します。

『 休日マップデータ 』 を指定した場合、下記のように編集した結果を返します （赤/青字のコメント部分）。

【 パラメータ 内容 】

[ 休日Map ]
 | 休日マップデータ または 固定休日コード を指定します。 詳細は ここ を参照。


[ ktIs有効期間 ] 関数

指定の 「日付」 が 『 休日マップ 』 の 期間内かどうかを判定する関数です。

【 構 文 】

ktIs有効期間 | ( 休日Map, 日付 )
返却値 | -- | Boolean 型
休日Map | -- | String 型
日付 | -- | Variant ( Date ) 型

【 返却値 】

True ‥‥‥ 『 休日Map 』 の期間内です（休日Map を使う関数を利用できます）。

False ‥‥‥ 〃 の期間外です（ 〃 を利用できません）。

『 固定休日コード 』 が指定されている場合は､常に True を返します。

日付の値が不正の場合には False が返ります。

【 パラメータ 内容 】

[ 休日Map ]
 | 休日マップデータ または 固定休日コード を指定します。 詳細は ここ を参照。
[ 日付 ]
 | 有効期間内か を判定する日付を シリアル値 または 日付文字列で指定します。 ※ 新元号「令和」対応になっていない環境でも 「令和 日付文字列(元年 表記を含む)」を指定可能です。


[ ktマップ圧縮解凍 ] サブルーチン

休日マップデータ を圧縮・解凍するサブルーチンです。

【 構 文 】

Call ktマップ圧縮解凍 | ( 変換先Map, 休日Map, [ 解凍のみ ] )
変換先Map | -- | String 型 ( ByRef )
休日Map | -- | String 型
解凍のみ | -- | Boolean 型 (省略可, 省略時： True )

【 パラメータ 内容 】

[ 変換先Map ] ( ByRef )
 | 変数定義 が必要です。 ここに 「休日Map」 を 圧縮 or 解凍 した結果を設定して返します。 休日Map が 圧縮マップ の場合は 解凍して ノーマルマップ を返します。 〃 が ノーマルマップ の場合は 圧縮して 圧縮マップ を返します。
[ 休日Map ]
 | 休日マップデータ を指定します。 詳細は ここ を参照。
[ 解凍のみ ]
 | [ False ] の場合､ 圧縮・解凍 両方 を行ないます。 [ True ] の場合､解凍処理のみ行ないます。 （ノーマルマップ を渡しても 圧縮せずに そのまま返します）

【 解 説 】

BASE 64 の手法 を応用して､
『 ６ 文字のマップデータ ←→ １ 文字の圧縮データ 』
という 圧縮/解凍処理 を行います。圧縮結果に使用する文字は [ 64種 : A～Z, a～z, 0～9, +, / ] です。

圧縮・解凍のいずれを行なうかは､渡された 「休日Map」 によって判断していますので､指定は不要です。
（圧縮マップ の場合 ⇒ 解凍処理 , ノーマルマップ の場合 ⇒ 圧縮処理）

「解凍のみ」 を省略するか "True" を設定すると､ノーマルデータ を渡しても圧縮せずに渡した内容をそのまま
返します。圧縮する場合は 「解凍のみ = False 」 とします。

シート 全体 の コピー を行なう場合、個々の セル で
『 ２５５文字を越えるの文字列は､２５６文字目以降が欠落する 』
という制限があるので､これに対処する為の機能です。

ただし､有効なのは【４年間】のみです。
【６年間】以上 は、圧縮しても 「２５６文字」 以上になるので､上記の制限に抵触します。


[ ktTemp休日Map ] サブルーチン

『固定休日コード』 を 「休日マップデータ」 に変換するサブルーチンです。

ＶＢＡで大量のデータを一括処理する場合には､『固定休日コード』 では非常にパフォーマンスが落ちるので､
『固定休日コード』 の内容を 「休日マップデータ」 に変換して処理の高速化を図るのに利用します。

【 構 文 】

Call ktTemp休日Map | ( 固定休日, 開始年, 年数, 休日Map )
固定休日 | -- | String 型
開始年 | -- | Integer 型
年数 | -- | Integer 型
休日Map | -- | String 型 ( ByRef )

【 パラメータ 内容 】

[ 固定休日 ]
 | １２ 文字 の 固定休日コード を指定します。 第１～第５ 曜日の組み合わせ指定も定義できます。
[ 開始年 ]
 | 西暦 （４桁） を指定します。
[ 年数 ]
 | ２ , ４ , ６ , ８ , １０ , １２ のいずれかを指定します。
[ 休日Map ] ( ByRef )
 | 変数定義が必要です。 生成された 休日マップデータ が、この引数に設定されます。 パラメータ の内容が不正な場合は 空文字 ( "" ) が返ります。 詳細は ここ を参照。

【 解 説 】

ＶＢＡ での大量の データ を一括処理する場合には 「固定休日コード」 を使うと非常にレスポンスが悪くなります。
（ パフォーマンス上の注意 を参照）

そこで､一括処理する前に使用する 「固定休日コード」 から 『休日マップ』 を生成して、一括処理の中では､
その 『休日マップ』 を利用するようにして下さい。

【 使 用 例 】

Dim str休日Map As String
Call ktTemp休日Map(kt_土日祝, 2001, 4, str休日Map)

※ [ kt_土日祝 ] は kt関数Addin.xla 内で定義されている定数名です。

・休日なし …… "00000000000@" ( kt_休日なし )
・土日を休日 …… "10000010000@" ( kt_土日 )
・土日/祝日を休日 …… "10000011000@"　( kt_土日祝 )
・日/祝日を休日 …… "10000001000@"　( kt_日祝 )
・銀行休日 …… "10000011101@"　( kt_銀行休日 )
・官庁（日祝） …… "10000001111@"　( kt_官庁1 )
・官庁（土日祝） …… "10000011111@"　( kt_官庁2 )


[ kt固定休日EX ] 関数

『固定休日コード』 に 『任意休日』 『休日解除』 の 一覧を付け加えて 休日マップデータ を作成する関数です。
「休日マップの作成」 フォームで作成できる休日マップを関数で定義できます。
[ #VALUE! ]

【 構 文 】

kt固定休日EX | ( 固定休日, 開始年, 年数, [任意休日], [休日解除] )
返却値 | -- | Variant ( String ) 型
固定休日 | -- | String 型
開始年 | -- | Integer 型
年数 | -- | Integer 型
任意休日 | -- | Variant ( Range/Date 配列/Array 関数) 型 （省略可）
休日解除 | -- | Variant ( Range/Date 配列/Array 関数) 型 （省略可）

【 返却値 】

『 固定休日コード 』 および 『 任意休日 』 『 休日解除 』 の日付一覧で作成された 【休日マップ】データ
を返します。
パラメータ内容が不正な場合は [ #VALUE! ] が返ります。

詳細は ここ を参照。

【 パラメータ 内容 】

[ 固定休日 ]
 | １２ 文字 の 固定休日コード を指定します。 『祝日』 を休日指定する場合でも､祝日テーブルなどを別個に用意する必要はありません。 全て関数内で祝日日付を算出して判定しています。 祝日情報に関しては､ここ をクリックして下さい。 第１～第５ 曜日の組み合わせ指定も定義できます。
[ 開始年 ]
 | １９０１年 以降の 西暦 （４桁） を指定します。
[ 年数 ]
 | ２ , ４ , ６ , ８ , １０ , １２ のいずれかを指定します。
[ 任意休日 ]
 | 固定休日コード で定義できない 『 休日の日付一覧 』 を シリアル値 または 日付文字列で指定します。 ※ 新元号「令和」対応になっていない環境でも 「令和 日付文字列(元年 表記を含む)」を指定可能です。 セル範囲（VBA では Range ） または Date型変数 の 配列/Array 関数 で 指定します。 不正な値の日付は 無視します。
[ 休日解除 ]
 | 固定休日で 一括定義 した 休日 から 除外 して 営業日に戻したい 『 日付の一覧 』 を シリアル値 または 日付文字列で指定します。 ※ 新元号「令和」対応になっていない環境でも 「令和 日付文字列(元年 表記を含む)」を指定可能です。 セル範囲（VBA では Range ） または Date型変数 の 配列/Array 関数 で 指定します。 不正な値の日付は 無視します。
任意休日/休日解除 の 日付一覧 を ワークシート上 に用意する場合は ・ 一覧は複数列になっても構いません。 ・ 日付は昇順に並んでいる必要はありません。 ・ そのセル範囲に 「日付以外のデータ （空セル含む）」 や 開始年・年数で 定義される期間から外れる日付が含まれていても構いません。 （そのセル範囲内 から有効な日付データ のみを取り出すようにしています） また、任意休日/休日解除 の 両方に 『 同じ日付 』 を指定した場合は、休日解除 が有効となり、 その日は営業日となります。

【 解 説 】

固定休日コード による 休日指定 は簡便に利用できますが、曜日/祝日に拠らない任意の休日も
ある為に、実際の営業カレンダーに対応できない場合が有り得ます。

逆に任意の休日でも カバーできる 『休日マップ』 には、任意休日に追加/変更が有った場合、
再び【休日マップ作成】 ツールで作り直さなければならないという若干不便な部分があります。

この関数は、ワークシート上に固定休日コードで指定できない任意休日の一覧表 （祝日は当然
不要です） を用意し、その範囲 と 固定休日コード を引数として 『休日マップデータ』 を作成します。

任意休日の指定方法の特徴として、
『 複数列が可，昇順の必要なし，範囲内に空セルが有っても良い 』
という、かなり柔軟な条件にしています。したがって、予め大きめな範囲を指定しておく事も可能です。
これにより、関数記述はそのままでも、任意休日の 一覧 に 追加/変更する都度、即座に変更が反映
されるという利便性があります。

kt固定休日EX の 結果を セル または 変数（VBA 処理の場合）に格納し、kt営業日算出 などの
[ 引数：休日マップ ]に、その内容を指定して利用します。

注 ： kt営業日算出 などの引数に、直接 [ kt固定休日EX ] を指定しないでください。
関数計算の都度、マップ生成が動いて、非常に レスポンス が悪くなります。
あくまで、どこかの セル または変数に先ず格納して、それから、その内容を利用
するという運用を採ってください。

【 使 用 例 】

Dim str休日Map As String
str休日Map = kt固定休日EX(kt_土日祝, 2001, 4, Range("A5:D15"))
If kt営業日判定(str休日Map, Date) Then
MsgBox "今日は営業日です"
Else
MsgBox "今日は休業日です"
End If

※ [ kt_土日祝 ] は kt関数Addin.xla 内で定義されている定数名です。

・休日なし …… "00000000000@" ( kt_休日なし )
・土日を休日 …… "10000010000@" ( kt_土日 )
・土日/祝日を休日 …… "10000011000@"　( kt_土日祝 )
・日/祝日を休日 …… "10000001000@"　( kt_日祝 )
・銀行休日 …… "10000011101@"　( kt_銀行休日 )
・官庁（日祝） …… "10000001111@"　( kt_官庁1 )
・官庁（土日祝） …… "10000011111@"　( kt_官庁2 )


[ ktMapLinker ] 関数

閉じている [ 他のブック ] にある休日マップ 「４ (２) 年＆圧縮 」 を １～３個読み込んで、
２年～１２年の休日マップ（ノーマル）に展開する関数です。
[ #VALUE! ]

【 構 文 】

ktMapLinker | ( Map1, [ Map2 ], [ Map3 ] )
返却値 | -- | Variant ( String ) 型
Map1 | -- | String 型
Map2 | -- | String 型 ( 省略可 )
Map3 | -- | String 型 ( 省略可 )

【 返却値 】

Map1/Map2/Map3 の指定に応じて､ ２～１２年の 休日マップ （ノーマル） を返します。

Map1/Map2/Map3 が 「休日マップの作成」 で作られた 『分解マップ』 でない場合は [ #VALUE! ]
が返ります。

【 パラメータ 内容 】

[ Map1 / Map2 / Map3 ]
「休日マップの作成」 で作成した 『 分解マップ (1) ～ (3) 』 の セルを指定してください。

※ 閉じている ブック の セル を指定する場合
'C:\My Documents\xxxx\[Book1.xls]Sheet1'!$A$1
という記述になります。
実際に式を入力する際は､対象ブック を予め開いておいて､ [ =ktMapLinker( ] までタイプしたら ブック を
切り替え､休日マップ が入っている セル を クリック すれば【外部参照】になります。
対象ブック を閉じれば､上記のような ドライブ からの記述に自動的になります。

【 解 説 】

閉じている ブック から､セルの内容 を 外部参照式で読み込む場合は ２５５文字 が上限です。
２５６ 文字以上の文字列の場合は先頭の ２５５ 文字までが読み込まれて､それ以降は欠落します。

休日マップ は最短の４年間でも １４７４ 文字､ 最長の１２年間では ４３９６ 文字もの大きな データ である
為に､閉じている ブック から読み込む事ができません。

これに対処する為に､当初から 『圧縮モード』 が用意 （４年間の場合､２５４ 文字となるので､閉じている
ブック から外部参照で読み込める） されていましたが､圧縮モードの休日マップ を直接セルの関数に
記述すると レスポンス 的に実用的では無い為に､結局､ブック のひとつひとつに､休日マップ を用意
してやる必要がありました。

「休日マップの作成」 フォーム で カレンダー管理ブック に休日マップ を作成し､ kt関数を利用する
個々のブック を作る場合には､そこから 「コピー＆ペースト」 すれば良いとは言っても､ 『一元管理』
にならない為に､ カレンダーが変更された場合には メンテナンス 的に負担が多かったと思います。

この 『 ktMapLinker 関数』 は､閉じているブック から読み込める【４ (２)年/圧縮】の休日マップ を
１～３個指定する事で､２～１２年のノーマル休日マップ を展開する関数です。

「休日マップの作成」 フォーム は､期間に応じて､ １～３個の 【４ (２)年/圧縮】休日マップに分解出力
します。ktMapLinker の引数には､この分解出力された休日マップ　を指定して下さい。

なお､ ktMapLinker 関数を記述する ブック では､
・ [ ツール / オプション / 編集 ]
『 リンク の自動更新前に メッセージ を表示する 』 の チェック を外す
・ [ ツール / オプション / 計算方法 ]
『 リモート 参照を更新する 』 『 外部 リンク の値を保持する 』 に チェック を入れる
として下さい。

※ 注意事項 ※
ktMapLinker 関数 を、他の関数などの引数に指定しないで下さい。
必ず、どこかの セル で単独で記述し、その セル を、
その ブック での 「休日マップ」 セル として参照する
というようにして下さい。


[ ktCalDate ] 関数

カレンダー入力フォーム を ポップアップ して､日付入力を行なう関数です。
[ VBA ONLY ]

【 構 文 】

ktCalDate | ( 日付, [ 基準日 ], [ 休日Map ], [ Pos_X ], [ Pos_Y ],
 | [ 入力Msg ], [ 営休制限 ], [ 期間制限Fr ], [ 期間制限To ] ,
 | [ 六曜 ], [ 時刻 ] )
返却値 | -- | Boolean 型
日付 | -- | Date 型 ( ByRef )
基準日 | -- | Variant ( Date / 日付文字列 ） 型 (省略可)
休日Map | -- | String 型 (省略可)
Pos_X | -- | Variant ( Integer / Empty ) 型 (省略可)
Pos_Y | -- | Variant ( Integer / Empty ) 型 (省略可)
入力Msg | -- | String 型 (省略可)
営休制限 | -- | Variant ( Integer ) 型 (省略可)
期間制限Fr | -- | Variant ( Date / 日付文字列 ) 型 (省略可)
期間制限To | -- | Variant ( Date / 日付文字列 ) 型 (省略可)
六曜 | -- | String 型 (省略可、 省略時： "禁止" )
時刻 | -- | String 型 (省略可、 省略時： "なし" )

【 返却値 】

日付 が 選択された場合は、True が返ります。
入力 キャンセル した場合は、False が返ります。

【 パラメータ 内容 】

[ 日付 ] ( ByRef )
 | この項目に、選択した日付 （及び 時刻） が設定されて呼び元に返されます。 呼び元での 変数定義 が必要です。
[ 基準日 ]
 | この日付の 『 年月 』 で カレンダー が 初期表示 されます。 通常は、選択した「日付」 を設定する項目/オブジェクト (Value値) を指定します （こうすると､ 再度 フォーム を表示させた時に､前回選択した日付の 『 年月 』 で表示させる事ができます）。 指定した項目/オブジェクト の内容が 『 Empty や 日付以外 』 の場合は、既定値として本日日付 が適用されます。 ※ 新元号「令和」対応になっていない環境でも 「令和 日付文字列(元年 表記を含む)」を指定可能です。 省略時には､既定値として本日日付が適用されます。
[ 休日Map ]
 | 休日Map または 固定休日コード を指定します。 これで指定した休日は、日付の背景色が ピンク で表示されます。 省略時は､「休日なし」 として ピンク 表示されません。
[ Pos_X および Pos_Y ]
 | カレンダーフォーム を画面の､どの位置に表示するかを指定する パラメータ です。 UserForm のプロパティ （Left / Top ) で指定する値です。 一方 もしくは 両方を省略すると 『 オーナーフォーム中央 』 に表示します。 または、一方 もしくは 両方に Empty 値 を指定した場合も、省略 と 同じ扱いで 『 オーナーフォーム中央 』 に表示します。 ( Ver 4.00 ～ ) 「あるセルの付近に表示する」 という場合には、ktCell2Position 関数 を使って、セルの 座標を変換した値を指定してください （使用例を参照）。
[ 入力Msg ]
 | ここに指定した文字列が キャプション 部分に表示されます。 全角20文字/半角28文字程度まで指定できます。 省略時は フォーム名である [ ktFormCal ] が表示されます。
[ 営休制限 ]
 | [ 営業日のみ ] or [ 休業日のみ ] 等の入力制限を施す場合に指定します。 省略 or ０ ： [ 営/休 ] 制限なし １ ： [ 営業日のみ ] 入力可 ２ ： [ 休業日のみ ] 入力可 ３ ： 休日Map の期間内のみ入力可 ４ ： 休日Map の期間内で [ 営業日のみ ] 入力可 ５ ： 休日Map の期間内で [ 休業日のみ ] 入力可 ※ ３ ～ ５ では、期間制限Fr / To の指定は不要です。
[ 期間制限Fr および 期間制限To ]
 | 日付入力できる期間を [ From / To ] で指定します。 日付文字列/Date型変数/日付データ の セル等で指定します。 ※ 新元号「令和」対応になっていない環境でも 「令和 日付文字列(元年 表記を含む)」を指定可能です。 『 月初～月末 』 だけでなく 『 １６日～１５日 』 といった期間も指定できます。 [ 月末まで ] という場合は 『 正しい月末日 』 を指定して下さい。 「 2/30 や 11/31 」 といった指定等、不正な日付は無効とされます。 -- [ 営休制限 = ３～５ ] の場合 -- 休日Map の有効期間が適用されますので、Fr / To を指定する必要はありません。 Fr / To も一緒に指定した場合は､両方の重なる期間が適用されます。 全く重なる期間が無い場合は、休日Map の有効期間が適用されます。
[ 六曜 ]
 | 六曜表示モード （後述の 解説 を参照） の 可否を指定します。 なお、六曜表示 できるのは 「１９５０～２０５０年」 の期間です。 省略 or "禁止" 六曜表示モードを禁止します。 "六曜" 通常モード で初期表示されますが、『右クリック』 で 六曜表示モード へ移行します。 -- 最初 から 六曜表示モード で表示する場合 -- 表示対象の 六曜 を下記の文字で並べて指定します。 『 先勝 , 友引 , 先負 , 仏滅 , 大安 , 赤口 』 赤字の １文字でも構いません。 並び順はありません。表示対象としたいものを並べて下さい。 全ての六曜を表示する場合は "勝友負仏安赤" を指定します。 「大安・友引」 だけを表示するなら "友安" を指定します。 ※ 六曜モード では､六曜 が 表示されていない日付は選択できません。 ※ "六曜" と指定した場合､右側の カラーガイダンス を クリック する事で､個別に 六曜 の 表示/非表示を切り替えられます。 "安友" など パラメータ で個別指定した場合は､カラーガイダンス による切り替えはできません。 したがって､全ての 六曜 が常に選択可とする場合は､パラメータ に "勝友負仏安赤" と全てを 指定します。
[ 時刻 ]
 | 日付選択 に続けて、時刻入力フォームによる 『 時刻入力 』 を行なうかを指定します。 省略 or 『 "なし" 指定 』 の場合は､日付のみの入力です。 時刻入力 も一緒に行なう場合は、[ ktSelClock ] 関数/AMPM 引数 の 値を指定します。

【 解 説 】

パラメータ の指定にしたがって カレンダーフォーム を表示します。

Dim MyDate As Date
ktCalDate(MyDate,Date,kt_土日祝,,,"開始日を入力して下さい",1,"2001/4/1","2002/3/31")
この定義で下記のようになります。

入力制限により 「入力不可」 となっている日付は マウスカーソル を合わせても水色表示されません。
水色表示される日付が入力可能な日付です。

ktCalDate(MyDate,Date,kt_土日祝,,,"開始日を入力して下さい",0,"2001/12/16","2002/1/15")
この定義で下記のようになります。

「日付」 以外の部分を右クリック すると、下記のように 六曜 が カラー表示されます。

更に、右側の大安・仏滅 などのガイダンス部分を クリック すると、その六曜の表示有無を切り替える事も
できます。ＶＢＡ から 六曜表示 を指定する場合はパラメータ 「六曜」 を指定します。

「時刻」 引数を指定した場合は､日付選択後 に 時刻入力フォーム が ポップアップ しますので､続けて
時刻を選択して下さい。時刻選択 を以って入力完了となり､呼び元には 『日付＋時刻』 のシリアル値が
返ります。時刻選択でキャンセル （×ボタン）した場合は日付入力自体もキャンセルになります。

【 使 用 例 】

Dim MyDate As Date
Dim str休日Map As String ‥‥‥ 「休日マップ」 が設定されている変数

※ [ kt_土日祝 ] などは 「 kt関数Addin.xla 」 内で定義されている 『 固定休日 』 の定数です。

--- 基本形 ---
If ktCalDate(MyDate, Date, kt_土日祝) Then
xxxx = MyDate または xxxx = Format(MyDate, "yyyy/m/d")
End If

--- パラメータ の 指定パターン例 ---
（１） 省略できる パラメータ を全て省略
ktCalDate(MyDate)

本日日付の 「年月」 ＆ 『休日表示なし』 で表示されます。
これは､下記の指定と同じ意味になります。
ktCalDate(MyDate, Date, kt_なし)

（２） 『土日』 を休業日表示する
ktCalDate(MyDate, ,kt_土日) または
ktCalDate(MyDate, Date, kt_土日)

（３） 『土日』 及び 『祝日/振替休日』 を休業日表示する
ktCalDate(MyDate, ,kt_土日祝) または
ktCalDate(MyDate, Date, kt_土日祝)

（４） 『休日マップ』 を指定
ktCalDate(MyDate, , str休日Map) または
ktCalDate(MyDate, , Rang("A1").Value) …… A1セル が休日マップデータ

（５） ある日付の 「年月」 で表示する。
Dim dtm年月日 As Date
dtm年月日 = DateValue("2000/2/20")
ktCalDate(MyDate, dtm年月日)
または
ktCalDate(MyDate, DateValue("2000/2/20"))
または
ktCalDate(MyDate, "2000/2/20")
または
ktCalDate(MyDate, "平成13年2月20日")

上記の例は､全て「2000年2月」で表示されます。

（６） テキストボックス や セルに入っている日付で表示する。
ktCalDate(MyDate, TextBox1.Value) または
ktCalDate(MyDate, Rang("B5").Value)

TextBox1 / B5セル の内容が 【シリアル値/日付文字列】 以外の場合は､本日日付が
適用されます。

（７） 表示位置を指定する。
ktCalDate(MyDate, , , 100, 50)
Excel ウィンドウ内で 「Left = 100, Top = 50 」 の位置に表示します。

-- UserForm の位置/入力項目の位置に合わせて調整 --
ktCalDate(MyDate, , , (Me.Left + 10), (Me.Top + 10))
ktCalDate(MyDate, , , (Me.Left + TextBox1.Left + 10), (Me.Top + TextBox1.Top + 10))

-- F5 セル の 付近に表示する ( ktCell2Position を利用 ) -- (Ver 4.00 から 利用可能)
Dim rc As Boolean
Dim vntPos As Variant
Dim vntTop As Variant
Dim vntLeft As Variant
vntPos = ktCell2Position(ActiveSheet.Range("F5"))
If IsError(vntPos) Then
'F5 セル が 表示範囲外 ⇒ Top/Left を省略
vntTop = Empty
vntLeft = Empty
Else
vntTop = vntPos(0) + 5
vntLeft = vntPos(1) + 5
End If
rc = ktCalDate(MyDate, Pos_X:=vntLeft, Pos_Y:=vntTop)

（８） 入力Msg と入力制限の例
ktCalDate(MyDate, Date, kt_土日祝, , , _
"開始日を入力してください", 1, "2001/12/16", "2002/1/15")

（９） 右クリックでの六曜表示モードを可にする
ktCalDate(MyDate, Date, kt_土日祝, , , , , , , "六曜")
または
ktCalDate(MyDate, Date, kt_土日祝, 六曜:= "六曜")

（１０） 最初から六曜表示モードにする
ktCalDate(MyDate, Date, kt_土日祝, , , , , , , "勝友負仏安赤")
または
ktCalDate(MyDate, Date, kt_土日祝, 六曜:="勝友負仏安赤")

（１１） 大安・友引だけで六曜表示する
ktCalDate(MyDate, Date, kt_土日祝, , , , , , , "友安")
または
ktCalDate(MyDate, Date, kt_土日祝, 六曜:= "友安")

（１２） 日付＆時刻の入力を行なう
この場合､当然､編集は"yyyy/m/d" ではなく､ "yyyy/m/d h:m" 等として下さい。
ktCalDate(MyDate, Date, kt_土日祝, , , , , , , ,"AMPM#")
または
ktCalDate(MyDate, Date, kt_土日祝, 時刻:= "AMPM#")

【 利用コード例 】

[ DblClick ]アクション を無効にする為には 『 Cancel = True 』 は必須です。

（１） テキストボックス での利用例
UserForm の場合は、そのUserForm のモジュールに、シート上のコントロールの場合は、
そのシートのモジュールに記述してください。
TextBox1 を ダブルクリック すると カレンダーフォーム を表示して､入力した日付を
[ yyyy/m/d ] 形式に編集してTextBox1 に設定します。
      表示の際は､既に TextBox1 に日付文字列が設定されている場合は 「その年月」 で､
空白や日付以外の文字列が設定されていた場合は 「本日の年月」 で表示します。

Private Sub TextBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Dim MyDate As Date
If ktCalDate(MyDate, TextBox1.Value, kt_土日祝) Then
TextBox1.Value = Format(MyDate, "yyyy/m/d")
End If
Cancel = True
End Sub

（２） ワークシートでの利用例 -- その１ --
その シート の モジュール に記述して下さい。
セル を ダブルクリック すると カレンダーフォーム を表示して､日付を入力します。
表示の際は､既に セル に シリアル値/日付文字列が設定されている場合は 「その年月」で､
それ以外の場合は 「本日の年月」 で表示します。
入力した内容は､ダブルクリック した セル の 「表示形式」 で表示されます。

Private Sub Worksheet_BeforeDoubleClick _
(ByVal Target As Range, Cancel As Boolean)
Dim MyDate As Date
If ktCalDate(MyDate, Target.Value) Then
Target.Value = MyDate
End If
Cancel = True
End Sub

（３） ワークシートでの利用例 -- その２ --
その シート の モジュール に記述して下さい。
上記に､表示形式の指定を追加した例です（平成13年2月20日といった形式）。

Private Sub Worksheet_BeforeDoubleClick _
(ByVal Target As Range, Cancel As Boolean)
Dim MyDate As Date
If ktCalDate(MyDate, Target.Value) Then
Target.NumberFormatLocal = "ggge年m月d日"
Target.Value = MyDate
End If
Cancel = True
End Sub

（４） ワークシートでの利用例 -- その３ --
その シート の モジュール に記述して下さい。
ダブルクリック で日付入力する セル を限定（Ｂ５ セル） する場合の例です。

Private Sub Worksheet_BeforeDoubleClick _
(ByVal Target As Range, Cancel As Boolean)
Dim MyDate As Date
If (Target.Address(False, False) = "B5") Then
If ktCalDate(MyDate, Target.Value) Then
Target.Value = MyDate
End If
Cancel = True
End If
End Sub

（５） ワークシートでの利用例 -- その４ --
      その シート の モジュール に記述して下さい。
      ダブルクリック で日付入力する セル を限定（Ｃ 列） する場合の例です。

Private Sub Worksheet_BeforeDoubleClick _
(ByVal Target As Range, Cancel As Boolean)
Dim MyDate As Date
If (Target.Column = 3) Then
If ktCalDate(MyDate, Target.Value) Then
Target.Value = MyDate
End If
Cancel = True
End If
End Sub

（６） ワークシートでの利用例 -- その５ --
その シート の モジュール に記述して下さい。
実際に業務で利用する場合は､下記のような工夫をして下さい。
ダブルクリック した セル に日付が入っていない場合は､１行上の セル の日付に対する 「年月」
で表示する。明細の１行目の場合は､そこが タイトル行になるが､ 『日付データ 以外』 なので､
明細の １行目は 「本日の年月」 で表示される。

Private Sub Worksheet_BeforeDoubleClick _
(ByVal Target As Range, Cancel As Boolean)
Dim MyDate As Date
If (Target.Column = 3) Then
If IsDate(Target.Value) Then
'日付入力済みのセルは「その日付」で初期表示
If ktCalDate(MyDate, Target.Value) Then
Target.Value = MyDate
End If
ElseIf (Target.Row > 1) Then
'２行目以降（明細１行目以降）
'２行目の場合、第２引数はタイトル行セルを指し示すが、
'日付ではないので自動的に「本日日付」で表示される
If ktCalDate(MyDate, Target.Offset(-1, 0).Value) Then
Target.Value = MyDate
End If
Else
'１行目（タイトル行）では表示しない
End If
Cancel = True
End If
End Sub

（７） ワークシートでの利用例 -- その６ --
カーソル を 「そのセル」 に移しただけで、ポップアップ させたい場合は、
Worksheet_BeforeDoubleClick イベント の代わりに Worksheet_SelectionChange イベント
を使ってください。この場合は [ Cancel ] 引数が有りませんので、『 Cancel = True 』
ステップは不要です。


[ ktCalRepeat ] サブルーチン

カレンダー 入力 フォーム から、指定した セル 範囲に対して
連続して日付入力を行なう サブルーチン です。。

【 構 文 】

Call ktCalRepeat | ( 入力範囲, [ 基準日 ], [ 休日Map ], [ Pos_X ], [ Pos_Y ],
 | [ 入力Msg ], [ 営休制限 ], [ 期間制限Fr ], [ 期間制限To ] ,
 | [ 六曜 ], [ 時刻 ] )
入力範囲 | -- | Range 型
基準日 | -- | Variant ( Date / 日付文字列 ） 型 (省略可)
休日Map | -- | String 型 (省略可)
Pos_X | -- | Variant ( Integer / Empty ) 型 (省略可)
Pos_Y | -- | Variant ( Integer / Empty ) 型 (省略可)
入力Msg | -- | String 型 (省略可)
営休制限 | -- | Variant ( Integer ) 型 (省略可)
期間制限Fr | -- | Variant ( Date / 日付文字列 ) 型 (省略可)
期間制限To | -- | Variant ( Date / 日付文字列 ) 型 (省略可)
六曜 | -- | String 型 (省略可、 省略時： "禁止" )

【 パラメータ 内容 】

[ 入力範囲 ]
 | 入力 した 日付 を書き込む セル範囲 を指定します。 単一セル の場合には 「何もせず」 に終了します。 必ず 複数セル の範囲を指定して下さい。 なお、プロテクト されている セル を含む場合は 「何もせず」 に終了します。 指定された セル範囲の シート が Active でない場合は、自動的に、その シート は Active になります。 単に [ Range("A1:A5") ] 等と記述すると、その マクロ の実行時の状況によって 目的 とする シート とは別の シート が対象になる可能性があります。 [ ActiveSheet ] や [ WorkSheets("Sheet1") ]等、シート 指定も付するように して下さい。 ※ Range("B2:D4") という指定の場合の入力順は 【左⇒右 / 上⇒下】 と行単位 で進みます（下側の図）。 列単位で 【上⇒下 / 左⇒右】 の順 （上側の図） に進めたい場合は、 Range("B2:B4, C2:C4, D2:D4") という風に指定します。 Union(Range("B2:B4"), Range("C2:C4"), Range("D2:D4")) という 指定 方法 もありますが、隣接するセル範囲では 「一繋がり」 の範囲として補正され てしまい、Range("B2:D4") という意味になってしまいます。 離れている セル ならば、Union を使っても大丈夫です。
[ 基準日 ] ～ [ 六曜 ]
 | 基準日 ～ 六曜 は ktCalDate を参照して下さい。 （ ktCalRepeat には [ 時刻 ] 引数はありません。）

【 解 説 】

マクロ を記述しなくても 「kt関数メニュー：日付連続入力」 で、この機能を利用できます。

[ ktCalDate ] 関数は、ひとつの日付入力に対する処理なので、複数セル範囲に連続して入力しよう
とした場合、カレンダーフォーム の 表示/消去 が繰り返されます。

この [ ktCalRepeat ] サブルーチン は、セル範囲を引数として渡す事で、その範囲に、カレンダー
フォーム を表示したまま、日付入力を続ける事ができます。

その代わりに、入力した日付は マクロ 側には戻らず、直接その セル範囲に書き込まれます。
（"yyyy/m/d" 以外の日付書式にしたい場合は、事前に、その セル に書式を定義しておいて下さい）

日付入力は、セル範囲全てに入力を終えるか、「 入力キャンセル：×ボタン押下 」 まで続きます。

※ 「入力範囲」 が 【プロテクト】 されている場合は、何も処理せずに即終了します。

【 使 用 例 】

Call ktCalRepeat(Worksheets("Sheet1").Range("B2:B4, D2:D4, F2:F4"), _
Date, kt_土日祝 )


[ ktMultiCal ] 関数

期間日付を入力する カレンダーフォーム を ポップアップ する関数です。
[ VBA ONLY ]

【 構 文 】

ktMultiCal | ( 日付1, 日付2, [ 基準日 ], [ 月数 ], [ 休日Map ],
 | [ Pos_X ], [ Pos_Y ], [ 入力Msg ],
 | [ 営休制限 ], [ 期間制限Fr ], [ 期間制限To ] ,
返却値 | -- | Boolean 型
日付1 | -- | Date 型 ( ByRef )
日付2 | -- | Date 型 ( ByRef )
基準日 | -- | Variant ( Date / 日付文字列 ） 型 (省略可)
月数 | -- | Variant ( Integer ) 型 (省略可、省略時： 1 )
休日Map | -- | String 型 (省略可)
Pos_X | -- | Variant ( Integer / Empty ) 型 (省略可)
Pos_Y | -- | Variant ( Integer / Empty ) 型 (省略可)
入力Msg | -- | String 型 (省略可)
営休制限 | -- | Variant ( Integer ) 型 (省略可)
期間制限Fr | -- | Variant ( Date / 日付文字列 ) 型 (省略可)
期間制限To | -- | Variant ( Date / 日付文字列 ) 型 (省略可)

【 返却値 】

日付 が 選択された場合は、True が返ります。
入力 キャンセル した場合は、False が返ります。

【 パラメータ 内容 】

[ 日付1 ] および [ 日付2 ] ( ByRef )
 | この項目に、選択した日付 が設定されて呼び元に返されます。 日付1 が [ 開始日 ] ､ 日付2 が [ 終了日 ] です。 呼び元での 変数定義 が必要です。
[ 基準日 ]
 | この日付の 『 年月 』 で カレンダー が 初期表示 されます。 ※ 新元号「令和」対応になっていない環境でも 「令和 日付文字列(元年 表記を含む)」を指定可能です。 通常は、選択した「日付」 を設定する項目/オブジェクト (Value値) を指定します （こうすると､ 再度 フォーム を表示させた時に､前回選択した日付の 『 年月 』 で表示させる事ができます）。 指定した項目/オブジェクト の内容が 『 Empty や 日付以外 』 の場合は、既定値として本日日付 が適用されます。 省略時には､既定値として本日日付が適用されます。
[ 月数 ]
 | カレンダーフォーム には 「２つの月」 が表示されます。 その２つの月の隔たりの初期値を､１ 以上 の数値で指定します。 既定は 「 １ 」 で 翌月 です。
[ 休日Map ]
 | 休日Map または 固定休日コード を指定します。 これで指定した休日は、日付の背景色が ピンク で表示されます。 省略時は､「休日なし」 として ピンク 表示されません。
[ Pos_X および Pos_Y ]
 | カレンダーフォーム を画面の､どの位置に表示するかを指定する パラメータ です。 UserForm のプロパティ （Left / Top ) で指定する値です。 一方 もしくは 両方を省略すると 『 オーナーフォーム中央 』 に表示します。 または、一方 もしくは 両方に Empty 値 を指定した場合も、省略 と 同じ扱いで 『 オーナーフォーム中央 』 に表示します。 ( Ver 4.00 ～ ) 「あるセルの付近に表示する」 という場合には、ktCell2Position 関数 を使って、セルの 座標を変換した値を指定してください （使用例を参照）。
[ 入力Msg ]
 | ここに指定した文字列が キャプション 部分に表示されます。 全角20文字/半角28文字程度まで指定できます。 省略時は フォーム名である [ ktMultiCal ] が表示されます。
[ 営休制限 ]
 | [ 営業日のみ ] or [ 休業日のみ ] 等の入力制限を施す場合に指定します。 省略 or ０ ： [ 営/休 ] 制限なし １ ： [ 営業日のみ ] 入力可 ２ ： [ 休業日のみ ] 入力可 ３ ： 休日Map の期間内のみ入力可 ４ ： 休日Map の期間内で [ 営業日のみ ] 入力可 ５ ： 休日Map の期間内で [ 休業日のみ ] 入力可 ※ ３ ～ ５ では、期間制限Fr / To の指定は不要です。
[ 期間制限Fr および 期間制限To ]
 | 日付入力できる期間を [ From / To ] で指定します。 日付文字列/Date型変数/日付データ の セル等で指定します。 ※ 新元号「令和」対応になっていない環境でも 「令和 日付文字列(元年 表記を含む)」を指定可能です。 『 月初～月末 』 だけでなく 『 １６日～１５日 』 といった期間も指定できます。 [ 月末まで ] という場合は 『 正しい月末日 』 を指定して下さい。 「 2/30 や 11/31 」 といった指定等、不正な日付は無効とされます。 -- [ 営休制限 = ３～５ ] の場合 -- 休日Map の有効期間が適用されますので、Fr / To を指定する必要はありません。 Fr / To も一緒に指定した場合は､両方の重なる期間が適用されます。 全く重なる期間が無い場合は、休日Map の有効期間が適用されます。

【 解 説 】

この ktMultiCal 関数は 期間（開始日～終了日の２日付） を一度に入力する為の ツール です。

普通は２つの テキストボックス を用意して､各々に日付を入力して貰い､
・ Exit イベント で個々の日付妥当チェック
・ 実行開始の コマンドボタン等の Click イベント 時に､
開始/終了ともに入力済か？
開始日≦終了日になっているか？
といった チェック を行ない、「エラー ならば再入力」 といった処理が必要になります。

この ktMultiCal 関数を使えば､その結果として得られる内容は
・ [ 開始日≦終了日 ] 条件を満たす [ ２つの日付が セット ] で返る
・ 結果は [ 日付シリアル値 ] そのもの
が保証されていますので､今までのような チェック 処理は一切不要になります。

ただし､ テキストボックス など 「手入力可」 状態の コントロール に受け取ったのでは､ ktMultiCal 関数の
後に 「手入力で直される」 可能性があり､ その為の チェック 処理を残さざるを得ません。

これでは、折角の機能が無駄になりますので､下記の例のように､ コマンドボタン で ktMultiCal 関数を呼び
出し､ ラベル に結果を表示するようにした方が効果的です（加えて、内部処理用として Date 型変数にも
結果の日付を保存しておけば楽です）。この場合､内容 クリア 用の ボタン も必要になります。

更に､ktCalDate 関数と同様に選択する日付に対して 「営業日/休業日」 の制限や 「選択可能な期間」
の制限を指定できますので､この機能を利用すれば､より コンパクト な処理で済みます。

【 フォーム操作方法 】

フォーム には､２つの月が並んでおり､各々に [ 月 ]表示切替用の年/月 スピンボタン があります。
また､２つの月の間隔を指定する [ 月数 ] 用の スピンボタン も設けてあります。

これらは全て連動しています。
左側 カレンダー の年月を変えると､右側 カレンダー も一緒に年月が変わります。
右側 カレンダー の年月を変えても左側は動きませんが､変わりに [ 月数 ] の内容が
連動して上下します。 [ 月数 ] を変更する場合も右側 カレンダー だけが変わります。

初期表示は､左側 カレンダー が引数 [ 基準日 ] の年月で表示され､右側 カレンダー は､
左側の年月に引数 [ 月数 ] を加えた年月になります。

営休制限 / 期間制限 を指定した場合は､フォーム上に 『 日付指定制限条項 』 という表示
が出ます。この部分に マウス を重ねると､その条件が表示されます。

カレンダー上で マウス を動かすと､それに合わせて日付部分が水色背景で アクティブ 表示
されます。営休制限 / 期間制限 を指定している場合､入力不可の日付に対しては アクティブ
表示されません。

期間の指定は 『 ２ クリック 』 で行ないます。
・ 先ず､１ 回目の クリック で開始日を指定します。
・ その後は マウス の動きに合わせて期間範囲が アクティブ 表示されます。
・ ２ 回目の クリック で終了日を指定すると 【ＯＫボタン】 が 入力可 になりますので､ＯＫ をクリック
して完了します。
・ 終了日は開始日より前の部分では クリック できないようになっています。

ＯＫ を クリック しないで､もう一度 カレンダー部分を クリック すると､終了日の指定が解除されて
再び期間指定が可能になります。

開始日を解除する場合は 【 Clear 】 を クリック してください。また､カレンダーの年月を切り替えた
場合も開始日が解除されます。

【 使 用 例 】

Dim dtm開始日 As Date
Dim dtm終了日 As Date
Dim str休日Map As String ‥‥‥　「休日マップ」 が設定されている変数

※ [ kt_土日祝 ] などは 「 kt関数Addin.xla 」 内で定義されている 『 固定休日 』 の定数です。

--- 基本形 ---
If ktMultiCal(dtm開始日, dtm終了日, Date, 1, kt_土日祝) Then
aaaa = Format(dtm開始日, "yyyy/m/d")
bbbb = Format(dtm終了日, "yyyy/m/d")
End If

--- パラメータの指定パターン例 ---
（１） 省略できる パラメータ を全て省略

ktMultiCal(dtm開始日, dtm終了日)

本日日付の 「年月」 ＆ 「今月/翌月」 ＆ 「休日表示なし」 で表示されます。
これは､下記の指定と同じ意味になります。

ktMultiCal(dtm開始日, dtm終了日, Date, 1, kt_なし)

（２） 『土日』 を休業日表示する
ktMultiCal(dtm開始日, dtm終了日, , ,kt_土日)

（３） 『土日』 及び 『祝日/振替休日』 を休業日表示する
ktMultiCal(dtm開始日, dtm終了日, , ,kt_土日祝)

（４） 『休日マップ』 を指定
ktMultiCal(dtm開始日, dtm終了日, , ,str休日Map)
または
ktMultiCal(dtm開始日, dtm終了日, , ,Rang("A1").Value)
（A1セル に休日マップデータ が格納されている場合）

（５） ある日付の 「年月」 で表示する。
Dim dtm年月日 As Date
dtm年月日 = DateValue("2000/2/20")
ktMultiCal(dtm開始日, dtm終了日, dtm年月日)
または
ktMultiCal(dtm開始日, dtm終了日, DateValue("2000/2/20"))
または
ktMultiCal(dtm開始日, dtm終了日, "2000/2/20")
または
ktMultiCal(dtm開始日, dtm終了日, "平成13年2月20日")

上記の例は､全て 「2000年2月」 で表示されます。

（６） テキストボックス や セル に入っている日付で表示する。
ktMultiCal(dtm開始日, dtm終了日, TextBox1.Value)
または
ktMultiCal(dtm開始日, dtm終了日, Rang("B5").Value)

TextBox1 / B5セル の内容が 【シリアル値/日付文字列】 以外の場合は 本日日付が適用されます。

（７） 表示位置を指定する。
ktMultiCal(dtm開始日, dtm終了日, , , ,100, 50)
Excel ウィンドウ内で 「 Left=100, Top=50 」 の位置に表示します。

-- F5 セル の 付近に表示する ( ktCell2Position を利用 ) -- (Ver 4.00 から利用可能)
Dim rc As Boolean
Dim vntPos As Variant
Dim vntTop As Variant
Dim vntLeft As Variant
vntPos = ktCell2Position(ActiveSheet.Range("F5"))
If IsError(vntPos) Then
'F5 セル が 表示範囲外 ⇒ Top/Left を省略
vntTop = Empty
vntLeft = Empty
Else
vntTop = vntPos(0) + 5
vntLeft = vntPos(1) + 5
End If
rc = ktMultiCal(dtm開始日, dtm終了日, Pos_X:=vntLeft, Pos_Y:=vntTop)

（８） 入力Msg と 入力制限の例
ktMultiCal(dtm開始日, dtm終了日, Date, 1, kt_土日祝, , , _
"開始日を入力してください", 1, "2001/12/16", "2002/1/15")

【 利用コード例 】

CommandButton1 を クリック すると カレンダーフォーム を表示して､入力した日付を 「yyyy/m/d 」 形式
に編集して Label1 / Label2 に設定します。
表示の際は､既に Label1 に日付文字列が設定されている場合は 「その年月」で､空白や日付以外の
文字列が設定されていた場合は 「本日の年月」 で表示します。

Private Sub CommandButton1_Click()
Dim MyDate1 As Date
Dim MyDate2 As Date
If ktMultiCal(MyDate1, MyDate2, Label1.Caption, 1, kt_土日祝) Then
Label1.Caption = Format(MyDate1, "yyyy/m/d")
   ' 開始日
Label2.Caption = Format(MyDate2, "yyyy/m/d")
   ' 終了日
End If
End Sub

Private Sub CommandButton2_Click()    ' クリアボタン
Label1.Caption = ""    ' 開始日
Label2.Caption = ""    ' 終了日
End Sub


[ kt暦作成 ] サブルーチン

ｋｔ関数メニュー 「 暦シートの作成 」 で作成している カレンダー を出力する サブルーチン です。
ＶＢＡ から操作すると､基本形出力後に カスタマイズ する事も出来ます。

※ 暦を作成する シート が プロテクト されている場合、暦は作成されません。

【 構 文 】

Call kt暦作成 | ( 暦種別, 基準日付, 休日Map, 作成シート, 基準セル, [ 月曜から ] )
暦種別 | -- | Integer 型
基準日付 | -- | Variant ( Date ) 型
休日Map | -- | String 型
作成シート | -- | Worksheet 型
基準セル | -- | String 型
月曜から | -- | Boolean 型 (省略可, 省略時: False )

【 パラメータ 内容 】

[ 暦種別 ]
 | １ ： 縦型 , ２ ： 横型 , ３ ： ＢＯＸ/七曜型（大） , ４ ： ＢＯＸ/七曜型（小）
[ 基準日付 ]
 | カレンダー を作成する 『 初日 』 を シリアル値 または 日付文字列で指定します。 ※ 新元号「令和」対応になっていない環境でも 「令和 日付文字列(元年 表記を含む)」を指定可能です。 日付の値が不正の場合は、暦を作成せずに終了します。 「基準日付～翌月応当日の前日」 までが １月分となります。 通常は 「ｙ年ｍ月１日」 を指定しますので 「１日～月末日」 ですが､ 月の中日を指定する事も出来ます。 「ｙ年ｍ月１６日」 を指定した場合は 「１６日～翌１５日」 で作成します。
[ 休日Map ]
 | 休日Map または 固定休日コード を指定します。
[ 作成シート ]
 | カレンダー の出力先 シート を Worksheet オブジェクト で指定します。 （Activesheet ，Worksheets("Sheet1") など）
[ 基準セル ]
 | カレンダー を書き出す範囲の 左上隅セル を 【Ａ１形式】 の文字列で指定します。
[ 月曜から ]
 | 『月 ⇒ 土日』 並びの Box /七曜型暦 を作成する場合は True を指定します。 省略 または False 指定時は 『日月 ⇒ 土 』 並びになります。 縦型/横型 の場合には､この パラメータ は無視されます。

【 解 説 】

この サブルーチン が出力するのは 『１月分』 です。
１年分の カレンダー を作成する場合は サンプルコード のように､ ループ 処理で行ないます。

暦を作成する シート が プロテクト されている場合には、暦は作成されません （ユーザーサイド への
エラー通知はありません） が、ユーザーサイド でも事前に プロテクトチェック を行なう事をお薦めします。
（使用例 を 参照して下さい）

【 使 用 例 】

縦型 サンプルマクロ

横型 サンプルマクロ

Box /七曜型（大） サンプルマクロ

Box /七曜型（小） サンプルマクロ


【 kt暦作成 ： 縦型 暦のサンプルコード 】

[ 戻る ]

サンプル のように､ ユーザー側での追加加工を考慮して､ 『ｋｔ暦作成』 内では､ScreenUpdating = False/True を
行なっていません。 ユーザー側で必ず行なって下さい。

また、『kt暦作成』 内では シート の プロテクトチェック を行ない、プロテクト時には作成しないようになっていますが、
ユーザーサイド でも事前に チェック する事をお薦めします。

下記の サンプルコード では､出力先 シート の クリア[ Cells.Clear ] を行なっています。
休日表示に 『休日マップ』 を使用する場合で､その 『休日マップ』 が出力先 シート上に用意されていると､
シートクリア によって消えてしまいます。
クリア 前に文字列変数に保存して 「kt暦作成」 にはその文字列変数を渡すようにして下さい。

Sub 縦サンプル標準()
Dim dtm基準日 As Date
Dim str基点セル As String
Dim i As Integer
Dim strADDR As String

dtm基準日 = DateValue("2001/1/1")
str基点セル = "B2"

If (ActiveSheet.ProtectContents = True) Then
MsgBox "出力先シートがプロテクトされています"
Exit Sub
End If

Application.ScreenUpdating = False
ActiveSheet.Cells.Clear

' 1月目の暦作成後に[基点セル]の位置が[2列の結合セル]になる為､
' 2ヶ月目以降の[Offset計算]が1列分ズレてしまう。
' これを避ける為､結合セルにならない位置を基点セルとして定義し直す。
str基点セル = ActiveSheet.Range(str基点セル).Offset(0, 2).Address(False,
False)

For i = 1 To 12
strADDR = ActiveSheet.Range(str基点セル).Offset(0, 4 * (i - 1) - 2).Address(False, False)
Call kt暦作成(1, dtm基準日, kt_土日祝, ActiveSheet, strADDR)
dtm基準日 = DateAdd("m", 1, dtm基準日)
Next i
Application.ScreenUpdating = True
End Sub

-- １枠 追加 --

Sub 縦サンプル1枠追加()
Dim dtm基準日 As Date
Dim str基点セル As String
Dim i As Integer
Dim j As Integer
Dim strADDR As String
Dim strADDR2 As String
Dim rng追加枠 As Range

dtm基準日 = DateValue("2001/1/1")
str基点セル = "B2"

If (ActiveSheet.ProtectContents = True) Then
MsgBox "出力先シートがプロテクトされています"
Exit Sub
End If

Application.ScreenUpdating = False
ActiveSheet.Cells.Clear

' 1月目の暦作成後に[基点セル]の位置が[2列の結合セル]になる為､
' 2ヶ月目以降の[Offset計算]が1列分ズレてしまう。
' これを避ける為､結合セルにならない位置を基点セルとして定義し直す。
str基点セル = ActiveSheet.Range(str基点セル).Offset(0, 2).Address(False, False)

For i = 1 To 12
With ActiveSheet
strADDR = .Range(str基点セル).Offset(0, 5 * (i - 1) - 2).Address(False, False)
strADDR2 = .Range(strADDR).Offset(0, 3).Address(False, False)
Set rng追加枠 = .Range(.Range(strADDR2).Offset(1, 0), .Range(strADDR2).Offset(31, 0))
End With

Call kt暦作成(1, dtm基準日, kt_土日祝, ActiveSheet, strADDR)

'『追加した枠内の書式設定』
With rng追加枠
.Columns(1).ColumnWidth = 5
.Font.Name = "ＭＳ Ｐ明朝"
.Font.Size = 11
With .Borders
.Item(xlEdgeTop).LineStyle = xlDouble
.Item(xlEdgeBottom).LineStyle = xlDouble
.Item(xlEdgeRight).LineStyle = xlDouble
.Item(xlEdgeLeft).LineStyle = xlNone '一旦２重線を削除
.Item(xlEdgeLeft).LineStyle = xlContinuous
.Item(xlInsideHorizontal).LineStyle = xlContinuous
End With
For j = 1 To 31
With .Cells(j, 1)
.Interior.Color = .Offset(0, -1).Interior.Color '休日表示のコピー
End With
Next j
End With
dtm基準日 = DateAdd("m", 1, dtm基準日)
Next i
Set rng追加枠 = Nothing
Application.ScreenUpdating = True
End Sub

-- ２枠 追加 --

Sub 縦サンプル2枠追加()
Dim dtm基準日 As Date
Dim str基点セル As String
Dim i As Integer
Dim j As Integer
Dim strADDR As String
Dim strADDR2 As String
Dim rng追加枠 As Range

dtm基準日 = DateValue("2001/1/1")
str基点セル = "B2"

If (ActiveSheet.ProtectContents = True) Then
MsgBox "出力先シートがプロテクトされています"
Exit Sub
End If

Application.ScreenUpdating = False
ActiveSheet.Cells.Clear

' 1月目の暦作成後に[基点セル]の位置が[2列の結合セル]になる為､
' 2ヶ月目以降の[Offset計算]が1列分ズレてしまう。
' これを避ける為､結合セルにならない位置を基点セルとして定義し直す。

str基点セル = ActiveSheet.Range(str基点セル).Offset(0, 2).Address(False, False)
For i = 1 To 12
With ActiveSheet
strADDR = .Range(str基点セル).Offset(0, 6 * (i - 1) - 2).Address(False, False)
strADDR2 = .Range(strADDR).Offset(0, 3).Address(False, False)
Set rng追加枠 = .Range(.Range(strADDR2).Offset(1, 0), .Range(strADDR2).Offset(31, 1))
End With

Call kt暦作成(1, dtm基準日, kt_土日祝, ActiveSheet, strADDR)
'『追加した枠内の書式設定』
With rng追加枠
.Columns(1).ColumnWidth = 5
.Columns(2).ColumnWidth = 8
.Font.Name = "ＭＳ Ｐ明朝"
.Font.Size = 11
With .Borders
.Item(xlEdgeTop).LineStyle = xlDouble
.Item(xlEdgeBottom).LineStyle = xlDouble
.Item(xlEdgeRight).LineStyle = xlDouble
.Item(xlEdgeLeft).LineStyle = xlNone ' 一旦２重線を削除
.Item(xlEdgeLeft).LineStyle = xlContinuous
.Item(xlInsideHorizontal).LineStyle = xlContinuous
.Item(xlInsideVertical).LineStyle = xlContinuous
End With
For j = 1 To 31
With .Cells(j, 1)
.Interior.Color = .Offset(0, -1).Interior.Color ' 休日表示のコピー
.Offset(0, 1).Interior.Color = .Offset(0, -1).Interior.Color
End With
Next j
End With
dtm基準日 = DateAdd("m", 1, dtm基準日)
Next i
Set rng追加枠 = Nothing
Application.ScreenUpdating = True
End Sub

[ 戻る ]


【 kt暦作成 ： 横型 暦のサンプルコード 】

[ 戻る ]

サンプル のように､ ユーザー側での追加加工を考慮して､ 『ｋｔ暦作成』 内では､ScreenUpdating = False/True を
行なっていません。 ユーザー側で必ず行なって下さい。

また、『kt暦作成』 内では シート の プロテクトチェック を行ない、プロテクト時には作成しないようになっていますが、
ユーザーサイド でも事前に チェック する事をお薦めします。

下記の サンプルコード では､出力先 シート の クリア[ Cells.Clear ] を行なっています。
休日表示に 『休日マップ』 を使用する場合で､その 『休日マップ』 が出力先 シート上に用意されていると､
シートクリア によって消えてしまいます。
クリア 前に文字列変数に保存して 「kt暦作成」 にはその文字列変数を渡すようにして下さい。

Sub 横サンプル標準()
Dim i As Integer
Dim strADDR As String
Dim dtm基準日 As Date
Dim str基点セル As String

dtm基準日 = DateValue("2001/1/1")
str基点セル = "B2"

If (ActiveSheet.ProtectContents = True) Then
MsgBox "出力先シートがプロテクトされています"
Exit Sub
End If

Application.ScreenUpdating = False
ActiveSheet.Cells.Clear

' 1月目の暦作成後に[基点セル]の位置が[3列の結合セル]になる為､
' 2ヶ月目以降の[Offset計算]が2列分ズレてしまう。
' これを避ける為､結合セルにならない位置を基点セルとして定義し直す。
str基点セル = ActiveSheet.Range(str基点セル).Offset(0, 3).Address(False,
False)

For i = 1 To 12
strADDR = ActiveSheet.Range(str基点セル).Offset(5 * (i
- 1), -3).Address(False, False)
Call kt暦作成(2, dtm基準日, kt_土日祝, ActiveSheet, strADDR)
dtm基準日 = DateAdd("m", 1, dtm基準日)
Next i
Application.ScreenUpdating = True
End Sub

-- １枠追加 --

Sub 横サンプル1枠追加()
Dim dtm基準日 As Date
Dim str基点セル As String
Dim i As Integer
Dim j As Integer
Dim strADDR As String
Dim strADDR2 As String
Dim rng追加枠 As Range

dtm基準日 = DateValue("2001/1/1")
str基点セル = "B2"

If (ActiveSheet.ProtectContents = True) Then
MsgBox "出力先シートがプロテクトされています"
Exit Sub
End If

Application.ScreenUpdating = False
ActiveSheet.Cells.Clear

' 1月目の暦作成後に[基点セル]の位置が[3列の結合セル]になる為､
' 2ヶ月目以降の[Offset計算]が2列分ズレてしまう。
' これを避ける為､結合セルにならない位置を基点セルとして定義し直す。
str基点セル = ActiveSheet.Range(str基点セル).Offset(0, 3).Address(False, False)

For i = 1 To 12
With ActiveSheet
strADDR = .Range(str基点セル).Offset(6 * (i - 1), -3).Address(False, False)
strADDR2 = .Range(strADDR).Offset(4, 0).Address(False, False)
Set rng追加枠 = .Range(.Range(strADDR2), .Range(strADDR2).Offset(0, 30))
End With

Call kt暦作成(2, dtm基準日, kt_土日祝, ActiveSheet, strADDR)
'『追加した枠内の書式設定』
With rng追加枠
.Rows(1).RowHeight = 21
.Font.Name = "ＭＳ Ｐ明朝"
.Font.Size = 11
With .Borders
.Item(xlEdgeTop).LineStyle = xlNone ' 一旦２重線を削除
.Item(xlEdgeTop).LineStyle = xlContinuous
.Item(xlEdgeBottom).LineStyle = xlDouble
.Item(xlEdgeRight).LineStyle = xlDouble
.Item(xlEdgeLeft).LineStyle = xlDouble
.Item(xlInsideVertical).LineStyle = xlContinuous
End With
For j = 1 To 31
With .Cells(1, j)
.Interior.Color = .Offset(-1, 0).Interior.Color ' 休日表示のコピー
End With
Next j
End With
dtm基準日 = DateAdd("m", 1, dtm基準日)
Next i
Set rng追加枠 = Nothing
Application.ScreenUpdating = True
End Sub

-- ２枠追加 --

Sub 横サンプル2枠追加()
Dim dtm基準日 As Date
Dim str基点セル As String
Dim i As Integer
Dim j As Integer
Dim strADDR As String
Dim strADDR2 As String
Dim rng追加枠 As Range

dtm基準日 = DateValue("2001/1/1")
str基点セル = "B2"

If (ActiveSheet.ProtectContents = True) Then
MsgBox "出力先シートがプロテクトされています"
Exit Sub
End If

Application.ScreenUpdating = False
ActiveSheet.Cells.Clear

' 1月目の暦作成後に[基点セル]の位置が[3列の結合セル]になる為､
' 2ヶ月目以降の[Offset計算]が2列分ズレてしまう。
' これを避ける為､結合セルにならない位置を基点セルとして定義し直す。
str基点セル = ActiveSheet.Range(str基点セル).Offset(0, 3).Address(False, False)

For i = 1 To 12
With ActiveSheet
strADDR = .Range(str基点セル).Offset(7 * (i - 1), -3).Address(False, False)
strADDR2 = .Range(strADDR).Offset(4, 0).Address(False, False)
Set rng追加枠 = .Range(.Range(strADDR2), .Range(strADDR2).Offset(1, 30))
End With

Call kt暦作成(2, dtm基準日, kt_土日祝, ActiveSheet, strADDR)
'『追加した枠内の書式設定』
With rng追加枠
.Rows(1).RowHeight = 21
.Rows(2).RowHeight = 21
.Font.Name = "ＭＳ Ｐ明朝"
.Font.Size = 11
With .Borders
.Item(xlEdgeTop).LineStyle = xlNone ' 一旦２重線を削除
.Item(xlEdgeTop).LineStyle = xlContinuous
.Item(xlEdgeBottom).LineStyle = xlDouble
.Item(xlEdgeRight).LineStyle = xlDouble
.Item(xlEdgeLeft).LineStyle = xlDouble
.Item(xlInsideHorizontal).LineStyle = xlContinuous
.Item(xlInsideVertical).LineStyle = xlContinuous
End With
For j = 1 To 31
With .Cells(1, j)
.Interior.Color = .Offset(-1, 0).Interior.Color ' 休日表示のコピー
.Offset(1, 0).Interior.Color = .Offset(-1, 0).Interior.Color
End With
Next j
End With
dtm基準日 = DateAdd("m", 1, dtm基準日)
Next i
Set rng追加枠 = Nothing
Application.ScreenUpdating = True
End Sub

[ 戻る ]


【 kt暦作成 ： Box/七曜型（大） 暦のサンプルコード 】

[ 戻る ]

サンプル のように､ ユーザー側での追加加工を考慮して､ 『ｋｔ暦作成』 内では､ScreenUpdating = False/True を
行なっていません。 ユーザー側で必ず行なって下さい。

また、『kt暦作成』 内では シート の プロテクトチェック を行ない、プロテクト時には作成しないようになっていますが、
ユーザーサイド でも事前に チェック する事をお薦めします。

下記の サンプルコード では､出力先 シート の クリア[ Cells.Clear ] を行なっています。
休日表示に 『休日マップ』 を使用する場合で､その 『休日マップ』 が出力先 シート上に用意されていると､
シートクリア によって消えてしまいます。
クリア 前に文字列変数に保存して 「kt暦作成」 にはその文字列変数を渡すようにして下さい。

Sub BOX大サンプル標準()
Dim i As Integer
Dim strADDR As String
Dim dtm基準日 As Date
Dim str基点セル As String

dtm基準日 = DateValue("2001/1/1")
str基点セル = "B2"

If (ActiveSheet.ProtectContents = True) Then
MsgBox "出力先シートがプロテクトされています"
Exit Sub
End If

Application.ScreenUpdating = False
ActiveSheet.Cells.Clear

For i = 1 To 12
strADDR = ActiveSheet.Range(str基点セル).Offset(15 * (i
- 1), 0).Address(False, False)
Call kt暦作成(3, dtm基準日, kt_土日祝, ActiveSheet, strADDR)
dtm基準日 = DateAdd("m", 1, dtm基準日)
Next i
Application.ScreenUpdating = True
End Sub

-- ２ 列表示 ( 2 × 6 ) --

Sub BOX大サンプル2列()
Dim i As Integer
Dim j As Integer
Dim strADDR As String
Dim dtm基準日 As Date
Dim str基点セル As String

dtm基準日 = DateValue("2001/1/1")
str基点セル = "B2"

If (ActiveSheet.ProtectContents = True) Then
MsgBox "出力先シートがプロテクトされています"
Exit Sub
End If

Application.ScreenUpdating = False
ActiveSheet.Cells.Clear

' 1月目の暦作成後に[基点セル]の位置が[3列の結合セル]になる為､
' 2ヶ月目以降の[列方向Offset計算]が2列分ズレてしまう。
' これを避ける為､結合セルにならない位置を基点セルとして定義し直す。
str基点セル = ActiveSheet.Range(str基点セル).Offset(0, 3).Address(False,
False)
For i = 1 To 6
For j = 1 To 2
strADDR = ActiveSheet.Range(str基点セル) _
.Offset(15 * (i - 1), 8 * (j - 1) - 3).Address(False, False)
Call kt暦作成(3, dtm基準日, kt_土日祝, ActiveSheet,
strADDR)
dtm基準日 = DateAdd("m", 1, dtm基準日)
Next j
Next i
Application.ScreenUpdating = True
End Sub

--  ３ 列表示 ( 3 × 4 ) --

Sub BOX大サンプル3列()
Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim strADDR As String
Dim dtm基準日 As Date
Dim str基点セル As String

dtm基準日 = DateValue("2001/1/1")
str基点セル = "B2"

If (ActiveSheet.ProtectContents = True) Then
MsgBox "出力先シートがプロテクトされています"
Exit Sub
End If

Application.ScreenUpdating = False
ActiveSheet.Cells.Clear

' 1月目の暦作成後に[基点セル]の位置が[3列の結合セル]になる為､
' 2ヶ月目以降の[列方向Offset計算]が2列分ズレてしまう。
' これを避ける為､結合セルにならない位置を基点セルとして定義し直す。
str基点セル = ActiveSheet.Range(str基点セル).Offset(0, 3).Address(False,
False)
For i = 1 To 4
For j = 1 To 3
strADDR = ActiveSheet.Range(str基点セル)
_
.Offset(15 * (i - 1), 8 * (j - 1) - 3).Address(False, False)
Call kt暦作成(3, dtm基準日, kt_土日祝, ActiveSheet,
strADDR)
dtm基準日 = DateAdd("m", 1, dtm基準日)
Next j
Next i
Application.ScreenUpdating = True
End Sub

[ 戻る ]


【 kt暦作成 ： Box/七曜型（小） 暦のサンプルコード 】

[ 戻る ]

サンプル のように､ ユーザー側での追加加工を考慮して､ 『ｋｔ暦作成』 内では､ScreenUpdating = False/True を
行なっていません。 ユーザー側で必ず行なって下さい。

また、『kt暦作成』 内では シート の プロテクトチェック を行ない、プロテクト時には作成しないようになっていますが、
ユーザーサイド でも事前に チェック する事をお薦めします。

下記の サンプルコード では､出力先 シート の クリア[ Cells.Clear ] を行なっています。
休日表示に 『休日マップ』 を使用する場合で､その 『休日マップ』 が出力先 シート上に用意されていると､
シートクリア によって消えてしまいます。
クリア 前に文字列変数に保存して 「kt暦作成」 にはその文字列変数を渡すようにして下さい。

Sub BOX小サンプル標準()
Dim i As Integer
Dim strADDR As String
Dim dtm基準日 As Date
Dim str基点セル As String

dtm基準日 = DateValue("2001/1/1")
str基点セル = "B2"

If (ActiveSheet.ProtectContents = True) Then
MsgBox "出力先シートがプロテクトされています"
Exit Sub
End If

Application.ScreenUpdating = False
ActiveSheet.Cells.Clear
For i = 1 To 12
strADDR = ActiveSheet.Range(str基点セル) _
.Offset(9 * (i - 1), 0).Address(False, False)
Call kt暦作成(4, dtm基準日, kt_土日祝, ActiveSheet, strADDR)
dtm基準日 = DateAdd("m", 1, dtm基準日)
Next i
Application.ScreenUpdating = True
End Sub

-- ２ 列表示 ( 2 × 6 ) --

Sub BOX小サンプル2列()
Dim i As Integer
Dim j As Integer
Dim strADDR As String
Dim dtm基準日 As Date
Dim str基点セル As String

dtm基準日 = DateValue("2001/1/1")
str基点セル = "B2"

If (ActiveSheet.ProtectContents = True) Then
MsgBox "出力先シートがプロテクトされています"
Exit Sub
End If

Application.ScreenUpdating = False
ActiveSheet.Cells.Clear

' 1月目の暦作成後に[基点セル]の位置が[3列の結合セル]になる為､
' 2ヶ月目以降の[列方向Offset計算]が2列分ズレてしまう。
' これを避ける為､結合セルにならない位置を基点セルとして定義し直す。
str基点セル = ActiveSheet.Range(str基点セル).Offset(0, 3).Address(False,
False)
For i = 1 To 6
For j = 1 To 2
strADDR = ActiveSheet.Range(str基点セル)
_
.Offset(9 * (i - 1), 8 * (j - 1) - 3).Address(False, False)
Call kt暦作成(4, dtm基準日, kt_土日祝, ActiveSheet,
strADDR)
dtm基準日 = DateAdd("m", 1, dtm基準日)
Next j
Next i
Application.ScreenUpdating = True
End Sub

-- ３ 列表示 ( 3 × 4 ) --

Sub BOX小サンプル3列()
Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim strADDR As String
Dim dtm基準日 As Date
Dim str基点セル As String

dtm基準日 = DateValue("2001/1/1")
str基点セル = "B2"

If (ActiveSheet.ProtectContents = True) Then
MsgBox "出力先シートがプロテクトされています"
Exit Sub
End If

Application.ScreenUpdating = False
ActiveSheet.Cells.Clear

' 1月目の暦作成後に[基点セル]の位置が[3列の結合セル]になる為､
' 2ヶ月目以降の[列方向Offset計算]が2列分ズレてしまう。
' これを避ける為､結合セルにならない位置を基点セルとして定義し直す。
str基点セル = ActiveSheet.Range(str基点セル).Offset(0, 3).Address(False,
False)
For i = 1 To 4
For j = 1 To 3
strADDR = ActiveSheet.Range(str基点セル)
_
.Offset(9 * (i - 1), 8 * (j - 1) - 3).Address(False, False)
Call kt暦作成(4, dtm基準日, kt_土日祝, ActiveSheet,
strADDR)
dtm基準日 = DateAdd("m", 1, dtm基準日)
Next j
Next i
Application.ScreenUpdating = True
End Sub

[ 戻る ]


[ ktPasteCal ] サブルーチン

ユーザーフォーム上に カレンダー を貼り付ける サブルーチン です。
フレーム だけ用意すれば、ktPasteCal が、その中に カレンダー を作り込みます。。

【 構 文 】

Call ktPasteCal | ( BaseDate, MyFrame, [ MonToSun ], [ 休日Map ] )
BaseDate | -- | Variant ( Date ) 型
MyFrame | -- | オブジェクト 型 （ Frame コントロール ）
MonToSun | -- | Boolean 型 (省略可, 省略時：False )
休日Map | -- | String 型 (省略可 )

【 パラメータ 内容 】

[ BaseDate ]
 | 作成する月の 「１日」 を表すシリアル値 または 日付文字列を指定します。 （年月 の 指定用ですので、特に １日 でなくても構いません） ※ 新元号「令和」対応になっていない環境でも 「令和 日付文字列(元年 表記を含む)」を指定可能です。 日付の値が不正の場合は、暦を作成せずに終了します。
[ MyFrame ]
 | UserForm 上 に用意した フレーム コントロール を指定します。 引数への書き方は 『 Me.Frame1 』 等としてください。 フレーム コントロール は下記の条件で定義します。 ・ キャプション 無し ・ [ Height = 105 ] ・ [ Width = 108 ] ・ 上記以外の プロパティ （枠や背景色など） は任意です。
[ MonToSun ]
 | 省略 or Flase ： 『 日・月～土 』 並び True ： 『 月～土・日 』 並び
[ 休日Map ]
 | 休日Map または 固定休日コード を指定します。 これで指定した休日は、日付の背景色が ピンク で表示されます。 省略時は､「休日なし」 として ピンク 表示されません。

【 解 説 】

ktPasteCal は、ユーザーフォーム上に カレンダー を ダイナミック に貼り付ける サブルーチン です。
フレームコントロール さえ用意すれば、後は ktPasteCal を呼び出すだけで、その フレーム 内に
カレンダー を作成/貼付けます。

貼り付けられた カレンダー は、スピンボタン と組み合わせることで 『 月表示 』 を切り替える事も
出来ます（使用例参照）。

ktPasteCal で作成する カレンダー は日付入力用には使えません。あくまで ユーザーフォーム を
飾る アクセサリー として利用して下さい。

カレンダー には祝日表示も付けてあります。
祝日の日に マウス を合わせると、祝日名を表示します。
年月に マウス を合わせると、和暦/干支/和風月名を表示します。
1900年以前の年でも動作します。

（注） ひとつの フレーム 内に作成できるのは 『 １ヶ月分 』 です。
複数月の カレンダー を作成する場合は、その月数分の フレームコントロール を用意してください。
ktPasteCal が フレーム 内に作成するのは、全て ラベルコントロール です。
その ラベルコントロール の オブジェクト名には、フレーム名を プリフィックス として付してありますので、
フレーム を幾つ用意しても名前が重複する事はありません。

万年暦 を作る場合は、１２ヶ月分の カレンダー が必要ですから、フレーム を １２個用意する必要があります。
尚、この場合、ユーザーフォーム を表示する際に、フレーム が多い為に エクセル が作業バッファ 確保を
行なっていると思われる ディスク 動作が発生するかもしれません（ktPasteCal は、一切 ディスクアクセス に
繋がるような処理は行なっていません）。

【 使 用 例 】

『 休日マップ作成フォーム 』 の 確認用カレンダー で利用しています。

月表示 を 切り替える機能を持たせたい場合には、上図のように フレーム コントロール 内の 『 右上隅 』 に
スピンボタン コントロール を配置します。
この スピンボタン コントロール を クリックする都度、日付を １ヶ月前後させて ktPasteCal を再度実行させる
事により月表示が変わります。

--- 最初 から表示する ケース ---
Private Frame3用日付 As Date 'Initialize と SpinButton3 で共有なので Private

Private Sub UserForm_Initialize()
Frame3用日付 = Date
Call ktPasteCal(Frame3用日付, Me.Frame3)
End Sub

Private Sub SpinButton3_SpinDown()
Frame3用日付 = DateAdd("m", -1, Frame3用日付)
Call ktPasteCal(Frame3用日付, Me.Frame3)
End Sub

Private Sub SpinButton3_SpinUp()
Frame3用日付 = DateAdd("m", 1, Frame3用日付)
Call ktPasteCal(Frame3用日付, Me.Frame3)
End Sub

--- テキストボックス で初期日付を指定する ケース ---
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If (Trim(TextBox1.Value) = "") Then
Exit Sub
ElseIf IsDate(TextBox1.Value) Then
Call ktPasteCal(DateValue(TextBox1.Value), Me.Frame1)
Else
Beep
Cancel = True
End If
End Sub

Private Sub SpinButton1_SpinDown()
If (Trim(TextBox1.Value) = "") Then
Beep
Exit Sub
End If
TextBox1.Value = Format(DateAdd("m", -1, DateValue(TextBox1.Value)), "yyyy/m/d")
Call ktPasteCal(DateValue(TextBox1.Value), Me.Frame1)
End Sub

Private Sub SpinButton1_SpinUp()
If (Trim(TextBox1.Value) = "") Then
Beep
Exit Sub
End If
TextBox1.Value = Format(DateAdd("m", 1, DateValue(TextBox1.Value)), "yyyy/m/d")
Call ktPasteCal(DateValue(TextBox1.Value), Me.Frame1)
End Sub

--- 万年暦 の マクロ ---
UserForm上に１年分として [ Frame1 ] ～ [ Frame12 ] の１２個の フレーム コントロールを用意します。

' TextBox1 に 『 年 』 を入力します
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If (Trim(TextBox1.Value) = "") Then
Exit Sub
ElseIf IsNumeric(TextBox1.Value) Then
If (CInt(TextBox1.Value) >= 100) Then
Call 年間暦
Else
Beep
Cancel = True
End If
Else
Beep
Cancel = True
End If
End Sub

Private Sub CheckBox1_Click() '[月～土日]表示用 CheckBox
If (Trim(TextBox1.Value) = "") Then
'何もしない
ElseIf Not IsNumeric(TextBox1.Value) Then
'何もしない
Else
Call 年間暦
End If
End Sub

Private Sub SpinButton1_SpinDown()
If (Trim(TextBox1.Value) = "") Then
Beep
ElseIf Not IsNumeric(TextBox1.Value) Then
Beep
Else
If (CInt(TextBox1.Value) > 100) Then
TextBox1.Value = CInt(TextBox1.Value) - 1
Call 年間暦
Else
Beep
End If
End If
End Sub

Private Sub SpinButton1_SpinUp()
If (Trim(TextBox1.Value) = "") Then
Beep
ElseIf Not IsNumeric(TextBox1.Value) Then
Beep
Else
TextBox1.Value = CInt(TextBox1.Value) + 1
Call 年間暦
End If
End Sub

Private Sub 年間暦()
Dim i As Integer
Dim MyDate As Date
For i = 1 To 12
MyDate = DateSerial(CInt(TextBox1.Value), i, 1)
Call ktPasteCal(MyDate, Me.Controls("Frame" & i), CheckBox1.Value)
Next i
End Sub


[ kt和風月名 ] 関数

指定した 「月」 の 月名（睦月・如月など）を返す関数です。
[ #VALUE! ]

【 構 文 】

kt和風月名 | ( 月, [ 読み ], [ 節気 ] )
返却値 | -- | Variant ( String ) 型
月 | -- | Variant ( Integer / Date / String ) 型
読み | -- | Boolean 型 (省略可, 省略時：False )
節気 | -- | Boolean 型 (省略可, 省略時：False )

【 返却値 】

読み = False ‥‥‥ ”睦月” , ”如月” という風に漢字名で返ります。
読み = True ‥‥‥ ”睦月(むつき)” , ”如月(きさらぎ)” という風に読みが付きます。

節気 = Flase ・・・・・・ 月≠１～１２ の場合は [ #VALUE! ] が返ります。
節気 = True ・・・・・・ 月≠[ 1950/1/1 ～ 2050/12/31 ] または 日付の内容が不正 の場合は
[ #VALUE! ] が返ります。

【 パラメータ 内容 】

[ 月 ]
 | 節気 = False の場合 数値で １～１２ を指定します。 節気 = True の場合 [ 1950/1/1 ～ 2050/12/31 ] の期間内の シリアル値 もしくは 日付文字列 を指定します。 ※ 新元号「令和」対応になっていない環境でも 「令和 日付文字列(元年 表記を含む)」を指定可能です。
[ 読み ]
 | 返却値 に 「読み」 を付ける場合には True を指定します。
[ 節気 ]
 | 『新暦の月』 に対してではなく、二十四節気に沿った結果を得たい場合には True を 指定します （解説参照）。 ただし、指定できるのは上記の期間に限られます。

【 解 説 】

二十四節気に沿った 『月の数え方』 では、立春・立夏 など二十四節気の内の【節】に当たる日付で
月を区切り、概ね 「２月４日頃～翌年２月３日頃」 を１年とします。
（ [ 概ね / 頃 ] と書いたのは、春分日と同じ様に年によって １日程前後するからです）

【節】に当たる日付は、概ね下記の通りです（年によって １日程前後します）。
立春（２月４日） 啓蟄（３月５日） 清明（４月４日） 立夏（５月５日）
芒種（６月５日） 小暑（７月７日） 立秋（８月７日） 白露（９月７日）
寒露（10月８日） 立冬（11月７日） 大雪（12月７日） 小寒（１月６日）

月名 は下記の通りです。
睦月（１月） 如月（２月） 弥生（３月） 卯月（４月）
皐月（５月） 水無月（６月） 文月（７月） 葉月（８月）
長月（９月） 神無月（10月） 霜月（11月） 師走（12月）

【 使 用 例 】

本日が 「2002年2月5日」 の場合
=kt和風月名(MONTH(TODAY)) ⇒ 如月
=kt和風月名(TODAY,,TRUE) ⇒ 睦月


[ kt干支 ] 関数

指定した日付について 「年・月・日・時刻」 の干支 （十干/十二支） を返す関数です。
[ #VALUE! ]

【 構 文 】

kt干支 | ( 日付, [ 対象 ], [ 読み ] )
返却値 | -- | Variant ( String ) 型
日付 | -- | Variant ( Date / String ) 型
対象 | -- | String 型 (省略可, 省略時: "\" )
読み | -- | Boolean 型 (省略可, 省略時：False )

【 返却値 】

「日付」 に対する 『十干 ＆ 十二支』 を返します。
「対象」 の指定によっては 『十干のみ』　『十二支のみ』 とする事もできます。

「読み」 = False ‥‥‥ "壬午" という風に漢字名で返ります。
「読み」 = True ‥‥‥ "壬午(みずのえ・うま)" という風に 読み が付きます。

パラメータ 指定が不正の場合は [ #VALUE! ] が返ります。

【 パラメータ 内容 】

[ 日付 ]
 | 干支 を求める 日付 を、シリアル値 または 日付文字列 で指定します。 ※ 新元号「令和」対応になっていない環境でも 「令和 日付文字列(元年 表記を含む)」を指定可能です。 「対象」 の指定によって 可能な期間が異なります。 対象 ： \ or d ⇒ 1800/1/1 以降 y or m ⇒ 1950/1/1～2050/12/31 時刻 の 干支 を求める場合は 「日付＋時刻」 のデータを指定します。 対象= \ 以外では、時刻 を持つ データ を指定した場合には、日付の区切りを 時刻の干支に合わせて２３時とします。 ※ したがって､基本的に 「日付」 パラメータに 『 NOW() 関数 』 は使用しないで下さい。 『 TODAY() 関数 （ VBA なら Date 関数 ） 』 を指定するようにして下さい。
[ 対象 ]
 | １ 文字 または ２ 文字で、求める 干支 の種類を指定します。 （アルファベット は大文字でも構いません） -- １ 文字目 -- "\" ⇒ 年の干支 (１月１日 から新年) "y" ⇒ 年の干支 (立春 (2/4 頃) から新年) "m" ⇒ 月の干支 (立春 (2/4 頃) から新年, 月は節～節) "d" ⇒ 日の干支 "h" ⇒ 時刻の干支 （前日２３ 時 ～ ２３ 時 で １日） -- ２ 文字目 -- "1" ⇒ 十干のみ "2" ⇒ 十二支のみ 省略 ⇒ 十干 ＆ 十二支
[ 読み ]
 | 返却値 に 「読み」 を付ける場合には True を指定します。

【 解 説 】

干支 の ［ 十干 と 十二支 ］ は下記の通りです。
十干 ‥‥‥ 甲（きのえ），乙（きのと），丙（ひのえ），丁（ひのと）
戊（つちのえ），己（つちのと），庚（かのえ），辛(かのと）
壬（みずのえ），癸（みずのと）

十二支 ‥‥ 子（ね），丑（うし），寅（とら），卯（う），辰（たつ），巳（み）
午（うま），未（ひつじ），申（さる），酉（とり），戌（いぬ），亥（い）

干支 は 「年・月・日」 の各々で別個に持っており、それぞれ 「１年・１月・１日」 過ぎるごとに、１つずつ
進めて循環していきます。１０ 種 と １２ 種 の組み合わせなので、干支 が 再び元に戻るには ６０ 回
かかります。そこで、６１歳のことを 『 還暦 』 という呼び名は、暦 が一巡りして元に戻ってきたという事
から付けられています。

日については問題ないのですが、年・月の場合には、二十四節気に沿って考える為に、その「１年・１月」
という期間が 新暦 とは対応しません。

二十四節気に沿った 『月の数え方』 では、立春・立夏など二十四節気の内の 【節】 に当たる日付で
月を区切り、概ね 「２月４日頃～翌年２月３日頃」 を１年とします。
（ [ 概ね/頃 ] と書いたのは、春分日と同じ様に年によって１日程前後するからです）

【節】 に当たる日付は、概ね下記の通りです（年によって１日程前後します）。
立春（２月４日） 啓蟄（３月５日） 清明（４月４日） 立夏（５月５日）
芒種（６月５日） 小暑（７月７日） 立秋（８月７日） 白露（９月７日）
寒露（10月８日） 立冬（11月７日） 大雪（12月７日） 小寒（１月６日）

したがって、立春より前の日付では、年の干支は、新暦で言えば 「前年」 の干支 になります。
また、月の干支は立春より前が１２月、小寒より前が１１月になります。

ただし、年の干支については、通常呼び習わしている 『新暦に沿った１月１日から』 という求め方
も用意しています。この場合には 「対象」 に "\" を指定して下さい。

『時刻の十二支』 は下記のように 【２３時】 で１日を区切ります。
子 23:00～ 1:00 , 午 11:00～13:00
丑 1:00～ 3:00 , 未 13:00～15:00
寅 3:00～ 5:00 , 申 15:00～17:00
卯 5:00～ 7:00 , 酉 17:00～19:00
辰 7:00～ 9:00 , 戌 19:00～21:00
巳 9:00～11:00 , 亥 21:00～23:00

時刻 だけから 「時刻 の 十二支」 を求めるには、下記の式で充分です。
=MID("子丑寅卯辰巳午未申酉戌亥",
INT(HOUR(時刻セル+TIMEVALUE("1:00"))/2+1), 1)
ただし、時刻 だけでは 「 時刻の十干 」 を求める事はできません。

（補） 十干 の 『読み』 である 「きのえ、きのと‥‥‥」 は、中国の五行 （木火土金水） から
きています。
甲 （きのえ） ⇒ 木の兄 （え）
乙 （きのと） ⇒ 木の弟 （と）
丙 （ひのえ） ⇒ 火の兄
丁 （ひのと） ⇒ 火の弟
戊 （つちのえ） ⇒ 土の兄
己 （つちのと） ⇒ 土の弟
庚 （かのえ） ⇒ 金の兄
辛 (かのと） ⇒ 金の弟
壬 （みずのえ） ⇒ 水の兄
癸 （みずのと） ⇒ 水の弟

【 使 用 例 】

=kt干支("2001/1/1", "\", TRUE) ⇒ 辛巳（かのと・み）
=kt干支("2002/1/1", "\", TRUE) ⇒ 壬午（みずのえ・うま）
=kt干支("2002/1/1", "y", TRUE) ⇒ 辛巳（かのと・み）
=kt干支("2002/2/4", "y", TRUE) ⇒ 壬午（みずのえ・うま）

=kt干支("2002/2/3","y",TRUE) ⇒ 辛巳（かのと・み）
=kt干支("2002/2/3","m",TRUE) ⇒ 辛丑（かのと・うし）
=kt干支("2002/2/3","d",TRUE) ⇒ 壬寅（みずのえ・とら）

=kt干支("2002/2/3 23:30","y",TRUE) ⇒ 壬午（みずのえ・うま）
=kt干支("2002/2/3 23:30","m",TRUE) ⇒ 壬寅（みずのえ・とら）
=kt干支("2002/2/3 23:30","d",TRUE) ⇒ 癸卯（みずのと・う）
=kt干支("2002/2/3 23:30","h",TRUE) ⇒ 壬子（みずのえ・ね）

=kt干支("2002/2/4","y",TRUE) ⇒ 壬午（みずのえ・うま）
=kt干支("2002/2/4","m",TRUE) ⇒ 壬寅（みずのえ・とら）
=kt干支("2002/2/4","d",TRUE) ⇒ 癸卯（みずのと・う）


[ kt旧暦 ] 関数

指定した新暦日付に対する旧暦日付と六曜（大安・仏滅‥‥）を返す関数です。
[ #VALUE! ]

【 構 文 】

kt旧暦 | ( 新暦, [ 対象 ], [ 編集 ] )
返却値 | -- | Variant ( String ) 型
新暦 | -- | Variant ( Date/String ) 型
対象 | -- | String 型 (省略可, 省略時: "dr" )
編集 | -- | String 型 (省略可, 省略時： "md1" )

【 返却値 】

「対象」 の指定によって、旧暦日付 と 六曜 を文字列で返します。

「対象」 / 「編集」 の指定によって、下記のような結果で返ります。
新暦 ＝ 2001/6/1 の場合
dr/ymd1 ⇒ 2001/閏4/10(先勝)
dr/md1 ⇒ 閏4/10(先勝)
d/ymd1 ⇒ 2001/閏4/10
r ⇒ 先勝

パラメータ指定が不正の場合は [ #VALUE! ] が返ります。

【 パラメータ 内容 】

[ 新暦 ]
 | 旧暦/六曜 を求める日付を、シリアル値 または 日付文字列で指定します。 ※ 新元号「令和」対応になっていない環境でも 「令和 日付文字列(元年 表記を含む)」を指定可能です。 指定できる期間は1950～2050年です。
[ 対象 ]
 | 旧暦日付 と 六曜 の どちらを求めるか指定します （大文字でも可）。 dr ⇒ 旧暦 ＆ 六曜 d ⇒ 旧暦 のみ r ⇒ 六曜 のみ
[ 編集 ]
 | 旧暦 を求める場合に 日付文字列 の 編集形式 を指定します （大文字でも可）。 対象＝"r" の場合には指定不要です。 md1 ⇒ m/d md2 ⇒ m月d日 ymd1 ⇒ yyyy/m/d ymd2 ⇒ yyyy年m月d日 ※ 閏月の場合には、[ m ] の前に "閏" が付きます。

【 解 説 】

旧暦には 「２月３０日」 という日付も存在します。
また閏月の場合には月の前に ”閏” という文字が付きます。
したがって、この関数で得られる結果を日付データ （シリアル値） として加工/編集する
事は出来ません。

『六曜』 は 「先勝・友引・先負・仏滅・大安・赤口」 の ６種 が 循環 して割当てられるもの
ですが、旧暦日付の 【月の１日】 ごとに下記のように開始値が決まっています。

１/ ７月：先勝 ２/ ８月：友引 ３/ ９月：先負
４/１０月：仏滅 ５/１１月：大安 ６/１２月：赤口

-----------------------------------------------------------------
この 『 kt旧暦 』 で求まるのは日本標準時を基にしたものです。したがって、中国 および
韓国での行事などを求めるのに使用しないで下さい。年によっては【１日のズレ】が出る
場合があります（例：旧暦２００１年４月）。

旧暦は【新月になった瞬間の日】 を 『月の１日』 としていますが、日本と中国では １時間の
時差がありますので、日本時で 『 ０時～１時 』 の間に 【新月】 を迎える場合には、中国
では 『未だ前日』 です。

したがって、この場合には 『 旧暦月の１日 』 に対応する新暦の日付には、日本と中国で
【１日のズレ】 が発生します（旧暦2001年4月1日は、日本では新暦4月24日、中国では
新暦4月23日）。

また、これによって当然 「 六曜 」 も違ってきます。新暦2001年5月6日（日） の六曜は、
日本時に基づく旧暦では【仏滅】、中国時に基づく旧暦では【大安】になります。
（ こよみのページ という ＨＰ の 『暦と天文の雑学』 というコラムに詳しい話が紹介さ
れています）

韓国は日本との時差は無いそうですが、現在は中国の旧暦に基づいたものを使用している
そうですので、やはり日本とは【ズレる】場合があります。

【 使 用 例 】

kt旧暦("2001/6/1", "dr", "ymd1") ⇒ 2001/閏4/10(先勝)
kt旧暦("2001/6/1", "dr", "md1" ) ⇒ 閏4/10(先勝)
kt旧暦("2001/6/1", "d", "ymd1") ⇒ 2001/閏4/10
kt旧暦("2001/6/1", "r") ⇒ 先勝
kt旧暦("2001/6/1", "dr", "ymd2") ⇒ 2001年閏4月10日(先勝)
kt旧暦("2001/6/1", "dr", "md2" ) ⇒ 閏4月10日(先勝)
kt旧暦("2001/6/1", "d", "ymd2") ⇒ 2001年閏4月10日


[ kt六曜検索 ] 関数

「次の大安は何日？」 といった日付検索をする関数です。
[ #VALUE! ]

【 構 文 】

kt六曜検索 | ( 開始日, 六曜, 回数, [開始日含む] )
返却値 | -- | Variant ( Date ) 型
開始日 | -- | Variant ( Date / String ) 型
六曜 | -- | String 型
回数 | -- | Integer 型
開始日含む | -- | Boolean 型 (省略可, 省略時: False )

【 返却値 】

開始日 から数えて、「回数」分の、指定 「六曜」 になる日付 を 新暦 で返します。

[ 回数 ＜ ０ ] の場合は、開始日より過去へ遡って検索します。

求めようとした日付が 「１９５０～２０５０年」 から外れる場合、および
パラメータ指定が不正の場合は [ #VALUE! ] が返ります。

【 パラメータ 内容 】

[ 開始日 ]
 | 基準日付 を シリアル値 または 日付文字列 で指定します。 ※ 新元号「令和」対応になっていない環境でも 「令和 日付文字列(元年 表記を含む)」を指定可能です。 なお、指定できる期間は 1950～2050年です。
[ 六曜 ]
 | 検索対象 とする 六曜 について、下記文字を並べて指定します。 太字部分の １文字 でも構いません。 また、並び順は関係ありません。 先勝 , 友引 , 先負 , 仏滅 , 大安 , 赤口 「大安 と 友引 」 を指定する場合は "安友" と指定します。 上記の太字の文字のみ認識しますので､例えば "大安と友引" という風に 指定しても構いません。
[ 回数 ]
 | 正数 の場合は 「 開始日より未来 」 負数 の場合は 「 開始日より過去 」 を検索します。 ゼロ を指定すると [ #VALUE! ] が返ります。
[ 開始日含む ]
 | 「開始日」 が、丁度 「指定の六曜」 と等しい場合に、回数に含めるか否かを True / False で指定します。

【 解 説 】

この 『 kt六曜検索 』 で求めている 六曜 は 日本標準時 を基にしたものです。

したがって、中国および韓国での行事などを求めるのに使用しないで下さい。
年によっては【１日のズレ】が出る場合があります（例：旧暦２００１年４月）。
詳しくは 『 kt旧暦の解説 』 を参照して下さい。

【 使 用 例 】

今日の 次の大安
=kt六曜検索(TODAY(), "大安", 1, FALSE )

今月の 最初の大安
=kt六曜検索(DATE(YEAR(TODAY()), MONTH(TODAY()), 1), "大安", 1, TRUE )

今月の 最後の大安
=kt六曜検索(DATE(YEAR(TODAY()), MONTH(TODAY())+1, 1), "大安", -1, FALSE )

-- 大安 と 友引の日付一覧の作成 --
[A2] =kt六曜検索(DATE($A$1,$B$1,1),"安友",(ROW()-1),TRUE)
[B2] =kt旧暦(A2,"r")
を記述して、フィルドラッグすれば出来上がります。

Ａ Ｂ
1 2002　　　　　7
2　7月 2日 友引
3 7月 5日 大安
4 7月 8日 友引
5 7月12日 友引
6 7月15日 大安
7 7月18日 友引
8 7月21日 大安
9 7月24日 友引
10 7月27日 大安
11 7月30日 友引


[ kt節気日付 ] 関数

二十四節気 の日付を求める関数です。
[ #VALUE! ]

【 構 文 】

kt節気日付 | ( 西暦年, 節気名 )
返却値 | -- | Variant ( Date ) 型
西暦年 | -- | Integer 型
節気名 | -- | String 型

【 返却値 】

指定した年の、指定した 「節気」 の日付を シリアル値で返します。

求めようとした日付が １９５０～２０５０年 から外れる場合、および
パラメータ 指定が不正の場合は [ #VALUE! ] が返ります。

【 パラメータ 内容 】

[ 西暦年 ]
 | 1950～2050年の範囲で 「年」 を指定します。
[ 節気名 ]
 | 下記の文字列から指定します。 １月： 小寒 ，大寒 ７月： 小暑 ，大暑 ２月： 立春 ，雨水 ８月： 立秋 ，処暑 ３月： 啓蟄 ，春分 ９月： 白露 ，秋分 ４月： 清明 ，穀雨 １０月： 寒露 ，霜降 ５月： 立夏 ，小満 １１月： 立冬 ，小雪 ６月： 芒種 ，夏至 １２月： 大雪 ，冬至

【 解 説 】

春分/秋分については、 『 kt祝日日付 』 での [ 春分の日 / 秋分の日 ] と同じ結果が得られます。

この 『 kt節気日付 』 は、下記サイト で公開されている 略算式 で算出しています。
Ishiyama's Home Page ( キャッシュ ) / 天文関係/天文メモ ( キャッシュ )
したがって、kt節気日付 を利用しなくても、ワークシート 関数 だけで、同じ様に算出する事ができます。
詳しくは 「 AddinBox / 二十四節気の略算式 」 を参照してください。

【 使 用 例 】

=kt節気日付( 2003, "立春" ) ⇒ 2003/2/4
=kt節気日付( 2003, "秋分" ) ⇒ 2003/9/23


[ ktCalShape ] 関数

セル に値を返しつつ､ シェープ図形を描画する関数です。
[ ワークシート ONLY ]

【 構 文 】

ktCalShape | ( 表示値, [ 種類 ], [ 色 ], [ 透過 ], [ 可視 ] )
返却値 | -- | Variant 型
表示値 | -- | Variant 型
種類 | -- | Variant ( Integer ) 型 (省略可, 省略時: 1)
色 | -- | Variant ( Long / String ) 型 (省略可, 省略時："H0000FF" )
透過 | -- | Variant ( Boolean / Double ) 型 (省略可, 省略時: True )
可視 | -- | Variant (Boolean ) 型 (省略可, 省略時: True )

【 返却値 】

「表示値」 で指定した内容が､そのまま返ります。

空セル（Empty） を参照している場合は空文字 ( "" ) を返します。

【 パラメータ 内容 】

[ 表示値 ]
 | その セル の 値 としたい内容を指定します。 本来､その セル に記述するはずの [ 数値・文字列・セル参照・式 ] などを､この引数に記述して下さい。 セル に何も表示する必要が無い場合は空文字 ( "" ) を指定して下さい。
[ 種類 ]
 | その セル に描画する シェープ図形の種類を指定します。 １ ： 円 , ２ ： 上三角 , ３ ： 下三角 , ４ ： 四角 , ５ ： 菱形 ６ ： 星型 , ７ ： 十字 , ８ ： 六角形 , ９ ： ハート形 １０ : 二重丸 ( Ver 4.00～ ) ０ ： 描画しない､ または、その セル に描画されている シェープ図形の消去 省略した場合は 「 １ ： 円 」 と見故します。
[ 色 ]
 | シェープ図形の色を下記の何れかで指定します。 ・ カラーインデックス番号 １ ～ ５６ の数値 ・ １６進数 で ＲＧＢ を指定 "HBBGGRR" 形式の文字列 （７文字 固定） 省略 した場合は 「赤 （ "H0000FF" ） 」 と見故します。 １～５６ の色番号は､図形で指定するスキームカラー番号ではなく､ セルの文字/背景色で指定するカラーインデックスです。 [ kt関数メニュー / カラーパレット ] で確認できます。
[ 透過 ]
 | 図形 の 枠線内 の 塗り潰し の程度を指定します。 塗潰し (透過度 : 0% ) ： False または 数値の [ ０ ] 枠線のみ (透過度 : 100% ) ： True または 数値の [ １ ] 半透明 (透過度 : 10%～90% ) ： 数値で [ ０．１ （濃） ～ ０．９ （淡） ] 省略 した場合は 「 True （枠線のみ）」 と見故します。 ※ Excel 2007以降で、「枠線のみ（塗り潰し無し」 の指定が 【塗り潰し】 になる不具合は Ver 4.00 で修正しました。
[ 可視 ]
 | True ： 描画した シェープ 図形を 表示状態 とします。 False : 〃 を 非表示状態 とします。 省略 した場合は 「 True （ 表示 ） 」 と見故します。 シェープ図形の 種類 が 固定で､ 条件によって表示有無が変化するといった場合､ 「種類」 には、その図形種類を固定で設定しておき､表示有無は「可視」 条件で対応 してください。 「種類」 を 『 ０ (図形消去) ←→ 図形種類 』 で切り換えても同じ効果が得られますが､ こちらの方法の場合には､シェープ図形の 【追加 / 削除】 という処理になりますので､ ktCalShape を多用している場合に負荷が大きくなります。 「可視」で対応すれば､一度描画した図形がそのまま使われ､プロパティ変更だけで済み ますので､その分だけ負荷が小さくなります。
※ [ 種類・色・透過・可視 ] の各引数は エラー値 （#N/A 等） を受け取る事が可能です。 これらの引数の何れかが エラー値の場合は、他の引数の内容に係わらず 『 図形は非表示 』 となります。 したがって、日付 などを キー にして 設定一覧表 などから 引数データ を 検索設定する ような場合に、一端、MATCH 関数 などの結果で、存在有無を チェック する ネスト構造 の式にする必要はありません。最初から、VLOOKUP 関数などで引数を指定して大丈夫 です。データ無しで 検索エラー（#N/A） の場合には、自動的に 『図形は非表示』 になります。 とは言っても、「表示しない」 方が多いような場合では、個々の引数で毎回 [ 検索エラー ] とするよりも、一端、MATCH 関数で検索値の有無を チェック して、有る場合だけ個々の 引数に VLOOKUP 関数で条件を取り込む方が レスポンス 的には有利ですので、そのシート の状況に応じて式の組み方を判断して下さい。

【 解 説 】

この ktCalShape 関数はＶ ＢＡ からは利用できません。
ＶＢＡから利用する場合は ktCalShape2 サブルーチン を使って下さい。

尚、ktCalShape を記述している セル が 『保護 （オブジェクト） 』 されている場合は 図形描画 されません。

配布ファイル内に [ 体験ktCalShape.xls ] という ワークブック を収録しています。この ワークブック には
実例としての ktCalShape を使った サンプルが載っていますので、それを参考にして使用方法を確認してく
ださい。

カレンダー の 祝日マーク を 「赤い ○」 にするとか､カレンダー上に早番/遅番などのマークを重ねると
いった要望は結構ありますが､ これらシェープ画像を付けるには､マニュアルでひとつひとつ描画するか､
ＶＢＡマクロ を実行させる必要がありました。

これは､今まで 『 ワークシート 関数 』 内では､ シート/セル などへの直接の操作が出来ないといった制限
によるものですが､この ktCalShape 関数 は ワークシート関数でありながら､シェープ画像の描画が可能です。

これによって例えば､祝日の場合に 【文字色 [ 赤 ]＆赤丸 】 という仕様を
(a) セルの内容は､ktCalShape の第１ 引数（ 表示値 ） に シリアル値を指定する事で､
この値をそのままセルに渡します
(b) セルの表示形式を [ d ] にして 「日」 のみを表示する
(c) 作業セルに [ =kt祝日判定(シリアル値) ] を用意する
(d) 条件付書式で 祝日条件が TRUE なら 文字色 [ 赤 ] に設定する
(e) ktCalShape の第２ 引数( 種類 ) は [ 1 (円) ] を指定します。「色」 は省略すれば [赤] になります。
(f) ktCalShape の第５ 引数( 可視 ) に (c) の作業セルを指定する
といった定義で可能になります。

なお､透過処理はエクセルのバージョンによって見栄えが異なります。

（注） カラーインデックス に対応する カラーパレット は 『 ブック ごと 』 で定義されています（標準では
３番は赤ですが､ある ブック では３番を[赤]以外の色に変更する事が可能です）。
引数 [色] に カラーインデクッス 番号を指定した場合は､この ktCalShape 関数 が記述されている
ブック の カラーパレット の色で塗られます。

シェープ図形は､関数を記述した セル に丁度収まるよう （セルの 高さ/幅 の内､ 小さい方の サイズ
での正方形領域でセルの中央） に描画されます。

関数記述後 （シェープ図形描画後） に セル の 高さ/幅 を変更した際は､シェープ図形の サイズ は
「大きくした⇒そのままのサイズ､ 小さくした⇒潰れる」となりますが､引数の何れかが変化して再計算
された際に､セルサイズに合わせて再度図形サイズが調整されます。

【 注 意 事 項 】

１． ktCalShape は、関数処理 としては､ レスポンス的に重い部類に入る処理です。

１ヶ月カレンダー （７曜×６段＝４２セル） を単位に､そのセル全てを 再計算させた場合の
レスポンスを､開発マシン[ PentiumⅢ 450MHz （２００４年頃） ]でテストしたところでは
・ １ヶ月分（４２セル）では 「再計算 xx ％」 の表示が出る事も無く､ストレス無く更新されます。
・ ２ヶ月分（８４セル）では 「再計算 xx ％」 の表示が出てしまいますが､０ ％ の次は直ぐ １００ ％
になる程度で済みます。
・ ３ヶ月分（１２６セル）では､％表示が読み取れるようになります。
・ ４ヶ月分（１６８セル）では 「遅い」 と感じ始める程度までレスポンスが落ちます。
という結果になっています。現在市販されている１GHｚ 超のマシンなら 「４ヶ月分」 位でも大丈夫かと
思いますが､あまり沢山のセルに使い過ぎないように注意して下さい。

２． シート設計時には、１セルに式を記述してから、そのセルを オートフィル または コピー/ペースト と
いった操作によって展開していくと思います。 その際、一度、式が作られた後 （図形描画済） に式を
修正して、再度オートフィル等を行なった場合に、図形が引数値の変更に正しく反応しないように見え
る場合があります。

これは、既にセル上に図形が描画されている状態で、オートフィル等により、コピー元セルの図形が重なる
ように貼り付けられる為です。引数値変更に応じて正しく元々の図形は反応していますが、上に載っている
図形に隠されてしまっている状態です。

このような場合は、[ kt関数メニュー ： カレンダーマーク描画 ] にある 『 Reset 』 ボタンをクリックする事で
解消されます。

３． シート 設計時に 「可視 = FALSE」 になっているセルも含めて、本当に図形があるのかどうかを確認したい
場合もあります。そのような場合は、[ kt関数メニュー： カレンダーマーク描画 ] にある 『 全表示 』 ボタン を
クリック してください。全ての [ ktshp + xx ] という名前の図形が表示されます。

引数の内容に合わせて再び 「 非表示 」 に戻す場合は、面倒でも、個々の セルで、一度入力選択状態に
して、即 [ ENTER ] する等して再計算させて下さい。

４． セル に記述してある ktCalShape 関数の式を消去しても、図形自体は削除されません。個々に図形を選択
して削除して下さい。シート全体で図形を削除する場合は [ kt関数メニュー： カレンダーマーク描画 ] にある
『 全削除 』 ボタンをクリックして下さい。

【 使 用 例 】

「AddinBox / カレンダーの作り方」 http://addinbox.sakura.ne.jp/CalendarTopic.htm
の 解説に従って七曜暦が作られている （各セルは シリアル値で表示形式が [ d ] ） とすると､
[ D7 ] セルの値は 『 =C7+1 』 という式で得られます。

[ D7 ] セル に 「祝日の場合には赤丸を付ける」 という式は
=ktCalShape(C7+1, IF(kt祝日判定(C7+1), 1, 0))
または､引数を省略せずに
=ktCalShape(C7+1, IF(kt祝日判定(C7+1), 1, 0), "H0000FF", TRUE)
となります。

添付の 『 体験ktCalShape.xls 』 に実際のカレンダーを想定したサンプルを用意してありますので
参考にして下さい。


[ ktCalShape2 ] サブルーチン

ktCalShape 関数の 描画モジュールです。
ＶＢＡ から利用する場合は､こちらの サブルーチン を使います。

【 構 文 】

Call ktCalShape2 | ( 位置, [ 種類 ], [ 色 ], [ 透過 ], [ 可視 ] )
位置 | -- | Range 型
種類 | -- | Variant ( Integer ) 型 (省略可, 省略時: 1)
色 | -- | Variant ( Long / String ) 型 (省略可, 省略時："H0000FF" )
透過 | -- | Variant ( Boolean / Double ) 型 (省略可, 省略時: True )
可視 | -- | Variant (Boolean ) 型 (省略可, 省略時: True )

【 パラメータ 内容 】

[ 位置 ]
 | シェープ 図形を描画する セル の Range オブジェクト を指定します。 単独セル を指定してください（結合セルは可）。 セル範囲を指定した場合は、その先頭セル（左上セル）が対象になります。
[ 種類 ] ～ [ 可視 ]
 | ktCalShape 関数を参照して下さい。

【 解 説 】

ktCalShape 関数の 描画処理本体 です。

マクロ を記述しなくても 「kt関数メニュー： カレンダーマーク描画」 で描画させる事ができます。

なお、指定のセルが 『 保護 （オブジェクト） 』 されている場合は、図形描画されません。

[ 種類 ] を [ １～１０ ] にすると､ [ 位置 ] に指定したセルに シェープ図形を描画します。

図形のサイズは､指定のセルに丁度収まるよう （セルの高さ/幅の内､小さい方のサイズでの正方形領域
でセルの中央） に描画されます。

[ 種類 ] を [ ０ ] にすると､指定セル内にある シェープ図形を削除します。

[ 色 ] に １６進 で RGB を指定する場合は 『 "H" + ６文字 』 固定サイズです。
例えば､赤色の場合は以下のようにして指定します。
・ 直接､ "H0000FF" と １６進文字列 を記述する。
・ RGB 関数 や vbRed といったシステム定数を １６進文字列 に変換する。
Dim strColor As String
strColor = "H" & Right("000000" & Hex(vbRed), 6)
strColor = "H" & Right("000000" & Hex(RGB(255, 0, 0)), 6)

（注） カラーインデックス に対応する カラーパレット は 『 ブック ごと 』 で定義されています。
（標準では３番は赤ですが､あるブックでは３番を [ 赤 ] 以外の色に変更する事が可能です）
引数 [ 色 ] に カラーインデックス 番号を指定した場合は､この [ ktCalShape2 サブルーチン ]
が記述されているマクロ の ワークブック の カラーパレット ではなく､引数 [ 位置 ] に指定した
セル が在る ワークブック の カラーパレット が適用されます。

論理値 [ True ] を数値として扱う場合､ ワークシート上では [ １ ] として解釈される為､ 引数 [ 透過 ] は
枠線のみ ： TRUE または 数値の [ １ ]
という仕様になっています。
ところが､VBA上で論理値 [ True ] を数値に変換すると [ －１ ] という値になります。
ktCalShape2 サブルーチンでは､ [ 透過 ] に 【 True 】 を指定した場合は [ －１ ] という数値ではなく､
ちゃんと 『 論理値の True 』 として認識しますので､正しく 「枠線のみ」 という描画が行なわれます。


電話番号 編集/検証ツール( TelephoneCheck ) ヘルプ

[ ktPhoneNumber ] 関数

電話番号をハイフン等で編集 ＆ 編集済み電話番号の検証を行なう 関数です。 ( Ver 5.30 ～ )

AddInBox サイト で ソースコード を掲載しています。

【 構 文 】

PhoneNumber ( TelCode , Action )

返却値 : 数値 型 or 文字列 型
TelCode : 文字列 型
Action : 文字列 型

【 返却値 】

Action = "V" の場合
0: 検証エラー , 1 : 検証OK , 2 : 検証OK ( 電話番号が数字のみ )
( Boolean 変換すると 0 ⇒ False , 1/2 ⇒ True になります )

Action = "F1"～"F6" の場合
電話番号が正しい場合 : [ Action 2桁目 ] に従って編集した電話番号
電話番号が誤っている場合 : "Phone Error"

Action が上記以外 の場合
空文字が返ります 。

【 パラメータ 内容 】

[ TelCode ]
固定電話/携帯電話などの電話番号( '0' 始まり の 10桁以上の数字文字列 )を指定します。
Action = "V" の場合は ハイフン/括弧で編集された電話番号。
Action = "F1"～"F6" の場合は 未編集の電話番号。

[ Action ]
処理方法を以下の値で指定します。
"V" --- ハイフン等で編集された電話番号の編集パターンが正しいかを検証します。
"F1"～"F6" --- 電話番号を指定のパターンでハイフン/括弧編集します。

"F1"～"F6" の２ 桁目が編集パターンになります。
1 or 4 : 0AB-CDE-FGHJ
2 or 5 : 0AB(CDE)FGHJ
3 or 6 : (0AB)CDE-FGHJ
( 携帯電話のみ、[ 3-4-4 桁 ]で区切る ⇒ 1～3 , [ 3-3-5 桁 ]で区切る ⇒ 4～6 )

【 解 説 】

詳しい解説は AddinBox サイト 「 Tips29: JavaScript で電話番号（局番）の検証/編集 」 を参照してください。

【 使 用 例 】

    If (CBool(ktPhoneNumber( 編集電話番号 , "V" )) Then
        ' 検証ＯＫ ( 1 or 2 )
    Else
        ' 検証ＮＧ ( 0 )
    End If

    Select Case (ktPhoneNumber( 編集電話番号 , "V" )
        Case 0:    ' 検証ＮＧ
        Case 1:    ' 検証ＯＫ
        Case 2:    ' 未編集の正しい電話番号
    End Select

    =ktPhoneNumber( 電話番号 , "F1" )

K.Tsunoda(AddinBox) Mail:addinbox@h4.dion.ne.jp CopyRight(C) 2019 Allrights Reserved.


[ kt閉じるボタン ] サブルーチン

UserForm の [ 閉じるボタン (×) ] を無効化するサブルーチンです。

【 構 文 】

Call kt閉じるボタン | ( MyCaption, CloseSW, Resp )
MyCaption | -- | String 型
CloseSW | -- | String 型
Resp | -- | String 型 ( ByRef )

【 パラメータ 内容 】

[ MyCaption ]
 | [ 閉じる ボタン (×) ] を 無効化する UserForm の Caption 名を指定します。 Me.Caption を 指定してください。
[ CloseSW ]
 | "無効" または "有効" を指定します。 [ 閉じる ボタン (×) ] を無効化する場合は、 "無効" を指定します。 一度無効 にしたのを 復活させる 場合には、"有効" を指定します。
[ Resp ] ( ByRef )
 | 呼び元 での 変数定義 が 必要です。 正常時は 空文字 ( "" ) ､エラー時はその旨のメッセージが返ります。

【 解 説 】

UserForm の [ 閉じるボタン (×) ] を無効化するには ＡＰＩ の使用が必要ですが､
その ＡＰＩ 処理を サブルーチン 内 に隠蔽していますので､利用する側では一切
意識する必要はありません。

しかしながら、一応 [ QueryClose ] イベントプロシジャー において、オペレーター
操作の チェック も一緒に記述しておく事をお薦めします。

【 使 用 例 】

Private Sub UserForm_Initialize()
Dim Resp As String
Call kt閉じるボタン(Me.Caption, "無効", Resp)
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
' 一応 [ QueryClose ]での判定も残す
If (CloseMode = vbFormControlMenu) Then
Cancel = True '閉じるボタン(X)は無効
End If
End Sub


ktMsgBoxAddin

[ ktMsgBox ] 関数

位置指定/カラー指定等が出来る､MsgBox 関数の代替関数です。
[ VBA ONLY ]

kt関数メニュー 「 ktMsgBox ウィザード 」 を使えば､細かい構文/規則を全て
覚えなくても､簡単に コード を作り出せます。

[ 構文 ] [ 返却値 ] [ パラメータ内容 ] [ 解説 ] [ 使用例 ]

【 構 文 】

ktMsgBox | ( Prompt, [Buttons], [Title], [Top], [Left],
 | [PromptColor], [BackColor], [Chime], [WaveFile], [IconFile],
 | [FontName], [FontSize], [WaitSecond], [InputType], [UserDefBtn],
 | [BackImage], [ImageWidth], [ImageHeight], [ChimeColor],
 | [HyperLink1], [HyperLink2], [HyperLink3] )

返却値 | -- | Variant ( Integer/String/Boolean ) 型
Prompt | -- | String 型
Buttons | -- | Long 型 (省略可)
Title | -- | String 型 (省略可)
---以降は[ktMsgBox]独自インターフェース---
Top | -- | Variant ( Integer / Empty ) 型 (省略可)
Left | -- | Variant ( Integer / Empty ) 型 (省略可)
PromptColor | -- | Long 型 (省略可, 省略値= -1 → vbWindowText 扱い)
BackColor | -- | Long 型 (省略可, 省略値= -1 → vbButtonFace 扱い)
Chime | -- | Boolean 型 (省略可, 省略時：False )
WaveFile | -- | String 型 (省略可)
IconFile | -- | String 型 (省略可)
Font Name | -- | String 型 (省略可)
FontSize | -- | Integer 型 (省略可)
WaitSecond | -- | Integer 型 (省略可)
InputType | -- | String 型 (省略可)
UserDefBtn | -- | String 型 (省略可)
BackImage | -- | String 型 (省略可)
ImageWidth | -- | Integer 型 (省略可)
ImageHeight | -- | Integer 型 (省略可)
ChimeColor | -- | Long 型 (省略可，省略値= -1 → [ 茶色 ] 扱い)
HyperLink1 - HyperLink3 | -- | String 型 (省略可)

※ＶＢＡ専用関数です※

【 返却値 (ktMsgBox) 】

クリックしたボタンの番号が返ります。値は「MsgBox 」の場合と同じです。
vbOK | 1 | [ OK ]
vbCancel | 2 | [ キャンセル ]
vbAbort | 3 | [ 中止 ]
vbRetry | 4 | [ 再試行 ]
vbIgnore | 5 | [ 無視 ]
vbYes | 6 | [ はい ]
vbNo | 7 | [ いいえ ]
ユーザー定義ボタンを利用した場合は､左側から順に「第１ボタン」～「第４ボタン」と呼ばれ､ それに対応して下記の値が返ります（カッコ内はアドイン内で用意してある定数名です）。
第１ボタン | 9 | ( kt_MsgBox_UserBtn1 )
第２ボタン | 10 | ( kt_MsgBox_UserBtn2 )
第３ボタン | 11 | ( kt_MsgBox_UserBtn3 )
第４ボタン | 12 | ( kt_MsgBox_UserBtn4 )
Wait機能を利用した場合は､常に[vbOK(1)]が返ります。
InputBox機能を利用した場合は､下記の内容が返ります。
キャンセルボタンをクリック
Variant変数で受け取った場合は､Boolean型の [ False ] String変数で受け取った場合は､String型の"False"
テキスト入力後にエンターキーもしくはＯＫボタンをクリック
入力したテキストが文字列として返ります。 数値/日付指定であっても､返るのは､入力したそのままの文字列です。
※セルに記述した場合には [ #VALUE! ] が返ります。

【 パラメータ 内容 (ktMsgBox) 】

※ Prompt/Buttons/Title の指定内容は [ MsgBox 関数 ] と同じです。

既定のフォントとは､コントロールパネル/画面のプロパティ/デザインで指定されている
[ メッセージボックス ] のフォントのことです。
文字色 ： システムカラー定数 [ vbWindowText ]で取得できます
背景色 ： システムカラー定数 [ vbButtonFace ]で取得できます

[ ktMsgBox ] にはフォントの[太字]指定はありません。太字指定が必要な場合は [ ktMsgBoxEX ]
を使って下さい。

Prompt
表示するメッセージを指定します。
複数行にする場合は､[ vbCrLf ] で区切ってください。
メッセージの量に応じてフォームの大きさは自動調整されます。

既定では『画面のプロパティ』で設定されているフォントで表示されます。
Buttons
表示されるボタンの種類と個数/使用するアイコンのスタイル/標準ボタンを
下記定数の「和」で指定します。ktMsgBox で有効な定数は下記になります。
--- ボタンの種類 ---
 | vbOKOnly ( 0 )
 | vbOKCancel ( 1 )
 | vbAbortRetryIgnore ( 2 )
 | vbYesNoCancel ( 3 )
 | vbYesNo ( 4 )
 | vbRetryCancel ( 5 )
--- アイコンの種類 ---
 | vbCritical ( 16 )
 | vbQuestion ( 32 )
 | vbExclamation ( 48 )
 | vbInformation ( 64 )
<< ktMsgBoxAddin オリジナルアイコン >>
 | kt_MsgBox_MelodyIcon ( 80 )
 | kt_MsgBox_LimitIcon ( 96 )
 | kt_MsgBox_ErrIcon ( 112 )
 | kt_MsgBox_PencilIcon ( 4194320 )
 | kt_MsgBox_KeyIcon ( 4194336 )
 | kt_MsgBox_TrashIcon ( 4194352 )
 | kt_MsgBox_PinIcon ( 4194368 )
 | kt_MsgBox_ClipIcon ( 4194384 )
 | kt_MsgBox_MemoIcon ( 4194400 )
 | kt_MsgBox_CalendarIcon ( 4194416 )
 | kt_MsgBox_SandglassIcon ( 8388624 )
 | kt_MsgBox_CoffeeIcon ( 8388640 )
 | kt_MsgBox_AlarmClockIcon ( 8388656 )

--- 標準ボタン ---
 | vbDefaultButton1 ( 0 )
 | vbDefaultButton2 ( 256 )
 | vbDefaultButton3 ( 512 )
 | vbDefaultButton4 ( 768 )

省略時は「ゼロ」扱いになりますので
[ vbOKOnly + vbDefaultButton1 ] （アイコン無し）
と解釈されます。

※ユーザー定義ボタンを指定すると､[ ボタンの種類 ] 指定は無効になります。

※ InputBox機能を指定すると､ [ ボタンの種類][標準ボタン ] で指定した内容に
係わらず [ vbOKCancel + vbDefaultButton1 ] 扱いとなります。

※ Wait機能を指定すると､ボタンは一切表示されませんので､[ ボタンの種類 ]
および [ 標準ボタン ] の指定は無効になります。

※日本語版 限定機能
[ Buttons ] 指定で､2048を足し込むと､ボタンの表記が英語バージョンに
なります。2048は､アドイン内で [ kt_MsgBox_English ] の名前で定数
定義してあります。下記のように使ってください。
vbOKCancel + vbInformation + kt_MsgBox_English
Title
ここに指定した文字列がキャプション部分に表示されます。
省略時は[ ktMsgBox ] が表示されます。
Top and Left
メッセージボックス を画面の､どの位置に表示するかを指定する パラメータ です。
UserForm の プロパティ （Left / Top )で指定する値です。

一方 もしくは 両方を省略すると 『オーナーフォーム中央』 に表示します。

または、一方 もしくは 両方に Empty 値 を指定した場合も、省略 と 同じ扱いで
『 オーナーフォーム中央 』 に表示します。

「あるセルの付近に表示する」 という場合には、ktCell2Position 関数 を使って、セルの
座標を変換した値を指定してください （使用例を参照）。

(注) もし誤って画面からはみ出し､クリック出来ないような位置を指定してしまった
場合は､[ スペースキー ] を押して下さい。
デフォルトボタンの設定(未指定時は [ vbDefaultButton1 (0) ] と解釈されます)
が効いていますので､それでktMsgBoxフォームを閉じる事ができます。
PromptColor
メッセージの文字色を指定します。
カラー定数 / RGB関数 / 16進 などで指定します。
ktWebColor2Num 関数を通す事で「色名」による指定もできます。
例) PromptColor:=ktWebColor2Num("AquaMarine")

省略解釈値は [ -1 ] で､ [ vbWindowText ]で表示されます。
BackColor
フォームの背景色を指定します。
カラー定数 / RGB関数 / 16進 などで指定します。
ktWebColor2Num 関数を通す事で「色名」による指定もできます。
例) BackColor:=ktWebColor2Num("AquaMarine")

省略解釈値は [ -1 ] で､ [ vbButtonFace ] で表示されます。
Chime
音を連続再生してチャイムにする場合は [ True ] を指定します。
[ WavFile ] を省略
アイコンの有無に係わらず [ システム音 / 新着メールの通知 ] で再生
[ WavFile ] を指定
指定した [ wav ] ファイルで再生
WaveFile
独自の音を鳴らしたい場合は､Waveファイルを 『ドライブからのフルパス』で指定します。
省略すると､下記のシステム音で再生します。
アイコン無し | システム音 : 一般の警告音
アイコン有り |
vbCritical | システム音 : システムエラー
vbQuestion | システム音 : メッセージ(問い合わせ)
vbExclamation | システム音 : メッセージ(警告)
vbInformation | システム音 : メッセージ(情報)
上記以外 | システム音 : メッセージ(情報)
IconFile
独自のアイコンを表示したい場合は､その画像ファイル(ico,gif,bmp,wmf)を
『ドライブからのフルパス』で指定します。表示サイズは [ 36×36ピクセル ] です。
尚､IconFile を指定した場合は[vbCritical]等のアイコン指定は無視されます。
FontName
既定のフォントから変更する場合に指定します。
指定できるのは下記の１０種の記号(大文字/小文字OK)､
もしくはインストールされている「フォント名」を直接指定します。
"UIG" | : MS UI Gothic |
"MSG" | : ＭＳ ゴシック |
"MSPG" | : ＭＳ Ｐゴシック |
"MSM" | : ＭＳ 明朝 |
"MSPM" | : ＭＳ Ｐ明朝 |
"ARI" | : Arial | （英語フォント）
"CENT" | : Century | （英語フォント）
"COUR" | : Courier New | （英語フォント）
"ROMAN" | : Times New Roman | （英語フォント）
"TAHOMA" | : Tahoma | （英語フォント）
（英語版では､[MS UI Gothic ～ MS P明朝]の日本語フォントは不可です）

上記の記号以外/インストールされていない 「フォント名」 を指定した場合は､
既定のフォントになります。
FontSize
既定のフォントサイズから変更する場合に指定します。
指定できるのは [ 9, 10, 11, 12, 14, 16, 18, 20 ] の８種です。
他の数値を指定すると既定のフォントサイズになります。
WaitSecond
ボタンクリックによる応答待ちではなく､指定した時間で自動的に閉じるようにする
場合に､その秒数を指定します。指定できるのは「５～６０秒」です。

Wait中は､ウィンドウ上部に現在時刻がリアルタイムで表示されます。
尚､この指定を行なった場合は､[ Buttons ] でのボタン指定､および[ InputType ]
[ UserDefBtn ] [ HyperLink ] は全て無効になり､メッセージボックス上にボタンは
表示されません。

※ユーザーの不安解消の為に 「xx秒で自動的に閉じます」 というガイダンス
メッセージを引数 [ Prompt ] の中に含める事をお薦めします。
InputType
InputBox機能を利用する場合に
a) 入力値の属性 ："N"(数値), "D"(日付), "S"(文字列),
"J"(文字列, IMEオン），"P"(パスワード)
b) 入力欄の幅 ："１"～"８"　（１０文字幅～８０文字幅）
c) デフォルト値 ：任意の文字列（不要の場合は省略）
を､「属性､幅､デフォルト値」の順で､ひとつの文字列として指定します。
幅とデフォルト値の間にはセミコロンを挟みます。
例）文字列､３０文字幅､デフォルト"abc"
"S3;abc"
日付､２０文字幅､デフォルト本日日付
"D2;" & Format(Date, "yyyy/mm/dd")

数値(N)/日付(D)の場合には､入力内容の妥当性チェックが入ります。
"J" を指定した場合は､ktMsgBox/ktMsgBoxEX 表示の際にIMEオンになります。

"P"を指定した場合､タイプした文字は"*"で表示されます。
また､デフォルト値を指定すると､その内容との一致判定を行ないます
（デフォルト値自体は表示されません）。

InputBox機能を指定すると､[ボタンの種類][標準ボタン]で指定した内容に
係わらず [ vbOKCancel + vbDefaultButton1 ] 扱いとなります。

※ Excel のInutBoxメソッドによる [ Type:=8 ] セル範囲入力の機能はありません。
UserDefBtn
ボタンキャプションを自由に設定したい場合に指定します。
（ボタン幅は固定ですので､表示できる文字数には限りがあります）

この指定をすると､[Buttons : ボタンの種類]指定は無効になります。

第１ボタン～第４ボタンまで指定でき､各々にアクセスキーを持たせることも可能です。
定義フォーマットは下記になります。
Cap1[;Key1][,Cap2[;key2][,Cap3[;key3][,Cap4[;key4]]]]
Cap（ボタンキャプション）　Key（アクセスキー）
アクセスキーは「数字もしくはアルファベット」の１文字です。
日本語のボタンキャプションで､アクセスキーを持たせる場合はキャプション内に
「アクセスキーをカッコで括った」文字列を含めるようにしてください。

例）　"全てはい(A);A,全ていいえ(B);B,はい(Y);Y,いいえ(N);N"
BackImage
メッセージボックスの背景に画像を使う場合に､その画像ファイルのフルパスを
指定します。指定できるのは[ jpg ,gif ,bmp ,wmf ]です。
メッセージウィンドウの左上を基点に配置されます（タイリング配置などの機能は
ありません）。
ImageWidth / ImageHeight
[BackImage]を指定した場合のみ有効です。
通常はメッセージ量/アイコンとボタンの有無に応じて､ウィンドウサイズが自動的
に決まりますが､[ BackImage ] 指定時には､背景画像の端が切れないように､この
パラメータでウィンドウサイズを直接指定することが出来ます。
幅/高さの一方のみの指定でもＯＫです。省略した方は自動フィットモードになり
ます。

尚､指定した値が､自動フィットサイズより小さい場合には､自動フィットサイズが有
効になります。画像より大きい値を指定すると､ウィンドウ背景が覗き見えてしまい
ますので､画像より若干小さい値を指定して下さい。
ChimeColor
Chime機能またはWait機能使用時に表示されるウィンドウ上部のメッセージカラー
を変更する場合に指定します。省略すると､「茶色」で表示されます。
ktWebColor2Num 関数を通す事で「色名」による指定もできます。
例) ChimeColor:=ktWebColor2Num("AquaMarine")
HyperLink1 - HyperLink3
HPのＵＲＬまたはメールアドレスを指定すると､青文字＆下線のリンク表示にな
ります（既定のフォントおよびサイズで表示されます）。
マウスアイコンは指アイコンになり､クリックすると､ブラウザまたはメーラーが起動
します。

HPのＵＲＬの場合は､[ http: ] から指定して下さい。
メールアドレスの場合は､[ mailto: ] の後に空白を空けることなくメールアドレスを
続けて記述してください。

※ PromptColor/BackColor/ChimeColorを16進で [ &H8000 ～ &HFFFF ] と指定すると､Integer型
の認識で負数になってしまいますので､末尾に型宣言子 [ & ] を付してLong型にして
ください [ &H8000& ～ &HFFFF& ] 。

【 解 説 (ktMsgBox) 】

よく 「MsgBox 関数で表示位置を指定したい」 という質問を見掛けますが､ＶＢＡで提供している
「MsgBox 関数」 には表示位置パラメータがありません。

この 『ktMsgBox 関数』 は 「MsgBox 関数」 と全く同じ使い方で､且つ位置指定が出来るようにする
為に開発しました。加えて､文字色/背景色/音/アイコンもカスタマイズ可能としました。

尚､『ktMsgBox 関数』 で既定で利用しているWave音は 「MsgBox 関数」 と同じく、
下記の システム音（コントロールパネル/サウンド) 下記を使っています。

アイコン無し | システム音 : 一般の警告音
アイコン有り |
vbCritical | システム音 : システムエラー
vbQuestion | システム音 : メッセージ(問い合わせ)
vbExclamation | システム音 : メッセージ(警告)
vbInformation | システム音 : メッセージ(情報)
上記以外 | システム音 : メッセージ(情報)
チャイム機能での既定音 | システム音 : 新着メールの通知

文字色/背景色/音がカスタマイズ可能ですので､メッセージの意味合いに応じて使い分けて
下さい(エラー入力時には [ 赤文字 ] ､異常発生時には [ 赤系の背景 ] 等)。

背景色には【淡色系】を指定した方が良いですが､実際に 「どんな色で､どんな値」 を指定すれば
良いのかを決めるには､パレットフォーム が利用できますので､それを使って､ビジュアルに色を
決めつつ､そのＲＧＢを取得してください。
アイコンも自由に変更できますので､例えば「会社ロゴ」 などを表示する事も可能です。

(補) [ vbCritical/vbQuestion/vbExclamation/vbInformation ] で表示されるアイコンは全て改めて
自作した画像を使っています。

「エラーがあります」といった音声をWaveファイル化すれば､音声ガイダンス付きのメッセージボックス
とする事も可能です。

【 使 用 例 (ktMsgBox) 】

ktMsgBox "処理が終わりました"

- - - - - - - - - - - - - - - - - - - - - - - - - - -
Dim Resp As Integer
Resp = ktMsgBox("処理が終わりました。" & vbCrLf & "続けますか？", vbOKCancel)
If (Resp = vbNo) Then
Exit Sub
End If

- - - - - - - - - - - - - - - - - - - - - - - - - - -
『 表示位置を指定 』
-- 固定位置 --
ktMsgBox "入力エラーです", vbOkOnly + vbInformation, "日付入力",100, 200

-- UserForm の位置/入力項目の位置に合わせて調整 --
ktMsgBox "入力エラーです", _
vbOkOnly + vbInformation, "日付入力", _
(Me.Top + 20), (Me.Left + 50)

ktMsgBox "入力エラーです", _
vbOkOnly + vbInformation, "日付入力", _
(Me.Top + TextBox1.Top - 10), (Me.Left + TextBox1.Left + 50)

-- F5 セル の 付近に表示する ( ktCell2Position を利用 ) -- (Ver 3.30 から利用可能)
Dim vntPos As Variant
Dim vntTop As Variant
Dim vntLeft As Variant
vntPos = ktCell2Position(ActiveSheet.Range("F5"))
If IsError(vntPos) Then
'F5 セル が 表示範囲外 ⇒ Top/Left を省略
vntTop = Empty
vntLeft = Empty
Else
vntTop = vntPos(0) + 5
vntLeft = vntPos(1) + 5
End If
ktMsgBox "入力エラーです", vbOkOnly + vbInformation, "日付入力", _
Top:=vntTop, Left:=vntLeft

(注) もし誤って画面からはみ出し､クリック出来ないような位置を指定してしまった場合は､
[ スペースキー ] を押して下さい。
デフォルトボタン の設定 (未指定時は [ vbDefaultButton1 (0) ] と解釈されます)が
効いていますので､それで ktMsgBox フォーム を閉じる事ができます。

- - - - - - - - - - - - - - - - - - - - - - - - - - -
『 入力エラーを赤文字で強調 』
ktMsgBox "入力エラーです", vbOkOnly + vbInformation, "日付入力",,, vbRed

- - - - - - - - - - - - - - - - - - - - - - - - - - -
『 背景色を [ 薄灰色 ] にする 』
ktMsgBox "処理が終わりました", vbOkOnly + vbInformation, "月次処理",,,, &HE0E0E0

- - - - - - - - - - - - - - - - - - - - - - - - - - -
『 チャイム で長時間処理の終了をアナウンス 』
ktMsgBox "処理が終わりました" & vbCrLf & "早く席にお戻りください", _
vbOkOnly + vbInformation, "月次処理", _
PromptColor:=vbBlue, Chime:=True

- - - - - - - - - - - - - - - - - - - - - - - - - - -
『 背景色 ( 薄赤 ) を変えて異常を通知 ( チャイム付き ) 』
ktMsgBox "入力データが異常です" & vbCrLf & "処理を中断します", _
vbOkOnly + vbExclamation, "月次処理", _
BackColor:=&HC0C0FF, Chime:=True

- - - - - - - - - - - - - - - - - - - - - - - - - - -
『 通常の音を [ メール着信音 ] にする 』
ktMsgBox "処理が終わりました", WaveFile:="C:\Windows\Media\Notify.wav"

- - - - - - - - - - - - - - - - - - - - - - - - - - -
『 アイコンを変える 』
ktMsgBox "処理が終わりました", IconFile:="C:\Windows\WinUpd.ico"

(補) 画像は [ ico , gif , bmp ] で、表示サイズは [ 36×36 ピクセル ] です。

- - - - - - - - - - - - - - - - - - - - - - - - - - -
『 文字の フォント を変える ( MS P明朝 / 14p ) 』
ktMsgBox "入力データが異常です" & vbCrLf & "処理を中断します", _
vbOkOnly + vbExclamation, "月次処理", _
FontName:="MSPM", FontSize:=14

- - - - - - - - - - - - - - - - - - - - - - - - - - -
『 ユーザー定義ボタン 』
ktMsgBox ".....................", _
UserDefBtn:="全てはい(A);A,全ていいえ(B);B,はい(Y);Y,いいえ(N);N"

- - - - - - - - - - - - - - - - - - - - - - - - - - -
『 InputBox 機能を使う 』
Dim dtmMyDate As Date
Dim rc As String
rc = ktMsgBox ("日付を入力して下さい", _
InputType:="D2;" & Format(Date, "yyyy/m/d") )
If (rc <> "False") Then
dtmMyDate = CDate(rc)
End If

受け取る内容は､入力したままの文字列です。
シリアル値として扱う場合には､CDate 関数による属性変換が必要です。
尚､エラーチェック 機能が有りますので､この例の場合には受け取った文字列は
「日付として認識できる文字列」 である事は保証されています。

- - - - - - - - - - - - - - - - - - - - - - - - - - -
『 背景に画像を使う 』 『 一定時間表示したら自動的に閉じる 』
ktMsgBox "おはようございます。" & vbCrLf & "今日も一日頑張りましょう。" & _
vbCrLf & vbCrLf & "(３０秒で自動的に閉じます）", _
WaitSecond:=30,
BackImage:="C:\My Documents\ ........ \good_morning.gif", _
ImageWidth:=200, ImageHeight:=150

- - - - - - - - - - - - - - - - - - - - - - - - - - -
『 ハイパーリンク メッセージ 』
ktMsgBox "xxxxxx Ver1.00" & vbCrLf & vbCrLf, _
HyperLink1:="http://www. ........ /index.htm", _
HyperLink2:="mailto:xxxx@........"

K.Tsunoda(AddinBox) Mail:addinbox@h4.dion.ne.jp CopyRight(C) 2001 Allrights Reserved.


AddinBox(ktMsgBoxEX 構文解説)

[ ktMsgBoxEX ] 関数

位置指定/カラー指定等が出来る､MsgBox 関数の代替関数です。
[ VBA ONLY ]

kt関数メニュー 「 ktMsgBox ウィザード 」 を使えば､細かい構文/規則を全て
覚えなくても､簡単に コード を作り出せます。

【 構 文 】

ktMsgBoxEX | ( Prompt, [Buttons], [Title], [Top], [Left],
 | [BackColor], [Chime], [WaveFile], [IconFile],
 | [WaitSecond], [InputType], [UserDefBtn],
 | [BackImage], [ImageWidth], [ImageHeight], [ChimeColor],
 | [HyperLink1], [HyperLink2], [HyperLink3] )

返却値 | -- | Variant ( Integer/String/Boolean ) 型
Prompt | -- | kt_MsgBoxPromptType 型 (ユーザー定義型です)
Buttons | -- | Long 型 (省略可)
Title | -- | String 型 (省略可)
--- 以降は [ ktMsgBoxEX ] 独自インターフェース ---
Top | -- | Variant ( Integer / Empty ) 型 (省略可)
Left | -- | Variant ( Integer / Empty ) 型 (省略可)
BackColor | -- | Long 型 (省略可, 省略値= -1 → vbButtonFace 扱い))
Chime | -- | Boolean 型 (省略可, 省略時：False )
WaveFile | -- | String 型 (省略可)
IconFile | -- | String 型 (省略可)
WaitSecond | -- | Integer 型 (省略可)
InputType | -- | String 型 (省略可)
UserDefBtn | -- | String 型 (省略可)
BackImage | -- | String 型 (省略可)
ImageWidth | -- | Integer 型 (省略可)
ImageHeight | -- | Integer 型 (省略可)
ChimeColor | -- | Long 型 (省略可，省略値= -1 → [ 茶色 ] 扱い)
HyperLink1 - HyperLink3 | -- | String 型 (省略可)

※引数 [ Prompt ] は､利用者側で下記のような 『 変数定義 』 が必要です
Dim Prompt As kt_MsgBoxPromptType

ユーザー定義型 [ kt_MsgBoxPromptType ] は､ [ kt関数Addin.xla ] 内で下記のように
定義されています（参照設定すれば利用できます）。
Public Type kt_MsgBoxPromptType
Message (1 To 10) As String
FName (1 To 10) As String
FSize (1 To 10) As Integer
FColor (1 To 10) As Long
FBold　(1 To 10) As Boolean
End Type

※このユーザー定義型を初期化するには､下記のように初期化用サブルーチン [ ktMsgBoxPromptTypeInit ]
を通します。このサブルーチンも [ kt関数Addin.xla ] 内にありますので､
参照設定すれば利用できます。
Dim Prompt As kt_MsgBoxPromptType
Call ktMsgBoxPromptTypeInit ( Prompt )

【 返却値 】

[ ktMsgBox 関数 ] を参照

【 パラメータ 内容 】

[ Prompt ] 以外の解説は[ ktMsgBox 関数 ] を参照

Prompt
定義方法は前記の説明を参照。

１０ グループまで指定できます。
各グループ単位で フォント (フォント名 , サイズ , 文字色 , 太字 ) を指定できます。

[ ktMsgBoxPromptTypeInit ] による初期値のままにすれば､既定のフォント になります。
( Message )
クリア値は空文字 ( "" ) です
Message 内では､改行コード ( vbCrLf ) も有効です。
[ Message (?) ] は、空文字 ( "" ) の グループ が出てきた所で終了します。

行間を空けたい場合には､半角 ( or 全角 ) スペース を入れたグループを用意するか､
改行コード を利用して下さい。
( FName )
クリア値は空文字 ( "" ) です。
既定のフォント から変更する場合に指定します。
指定できるのは下記の１０ 種の記号 (大文字/小文字OK)､
もしくはインストールされている 「フォント名」 を直接指定します。。
"UIG" | : MS UI Gothic |
"MSG" | : ＭＳ ゴシック |
"MSPG" | : ＭＳ Ｐゴシック |
"MSM" | : ＭＳ 明朝 |
"MSPM" | : ＭＳ Ｐ明朝 |
"ARI" | : Arial | （英語フォント）
"CENT" | : Century | （英語フォント）
"COUR" | : Courier New | （英語フォント）
"ROMAN" | : Times New Roman | （英語フォント）
"TAHOMA" | : Tahoma | （英語フォント）

上記の記号以外/インストールされていない 「フォント名」 を指定した場合は､
既定のフォント になります。
( FSize )
クリア値は [ -1 ] です。
既定のフォントサイズから変更する場合に指定します。
指定できるのは [ 9, 10, 11, 12, 14, 16, 18, 20 ] の８ 種です。
他の数値を指定すると既定のフォントサイズになります。
( FColor )
クリア値は [ -1 ] です。
カラー定数/RGB関数/16進 などで指定します。
ktWebColor2Num 関数を通す事で「色名」による指定もできます。
例) Prompt(1).FColor = ktWebColor2Num("AquaMarine")

省略解釈値は [ -1 ] で､[ vbWindowText ] で表示されます。
( FBold )
クリア値は [ False ] です。
太字にする場合には [ True ] を設定します。
尚､フォントによっては､フォントサイズを大きくすると自動的に太字になるものもあります。

※ Prompt.FColor/BackColor/ChimeColor を16進で [ &H8000 ～ &HFFFF ] と指定すると､Integer 型
の認識で負数になってしまいますので､末尾に型宣言子 [ & ] を付してLong型にして
ください [ &H8000& ～ &HFFFF& ] 。

【 使 用 例 】

Dim Prompt As kt_MsgBoxPromptType

Call ktMsgBoxPromptTypeInit(Prompt)

With Prompt
.Message(1) = "※ エラーが発生しました ※"
.FSize(1) = 14
.FName(1) = "MSM"
.FColor(1) = vbRed

.Message(2) = "エラー発生事由～～" & vbCrLf & "‥‥‥"
& vbCrLf & "‥‥‥"
.FSize(2) = 10
.FColor(2) = vbBlue

.Message(3) = "詳細情報1:～～～" & vbCrLf & _
"詳細情報2:～～～"
& vbCrLf & _
"詳細情報3:～～～"
.FSize(3) = 9
.FColor(3) = vbBlack
End With

ktMsgBoxEX Prompt, vbOkOnly + vbExclamation, "月次処理", Chime:=True


[ ktMsgBoxPromptTypeInit ] サブルーチン

ktMsgBoxEX 関数 の [ Prompt ] 引数を初期化するサブルーチンです。

【 構 文 】

ktMsgBoxPromptTypeInit | ( Prompt )
Prompt | -- | kt_MsgBoxPromptType 型 ( ByRef )

【 パラメータ 内容 】

[ Prompt ] ( ByRef )
 | kt_MsgBoxPromptType 型の変数を指定します。 その変数内の各要素の内容が、所定の初期値で設定されます。 kt_MsgBoxPromptType は kt関数Addin.xla 内で定義されているユーザー定義型です。

【 解 説 】

ktMsgBoxEX 関数 を参照して下さい。

【 使 用 例 】

Dim Prompt As kt_MsgBoxPromptType

Call ktMsgBoxPromptTypeInit(Prompt)

With Prompt
.Message(1) = "※ エラーが発生しました ※"
.FSize(1) = 14
.FName(1) = "MSM"
.FColor(1) = vbRed

.Message(2) = "エラー発生事由～～" & vbCrLf & "‥‥‥"
& vbCrLf & "‥‥‥"
.FSize(2) = 10
.FColor(2) = vbBlue

.Message(3) = "詳細情報1:～～～" & vbCrLf & _
"詳細情報2:～～～"
& vbCrLf & _
"詳細情報3:～～～"
.FSize(3) = 9
.FColor(3) = vbBlack
End With

ktMsgBoxEX Prompt, vbOkOnly + vbExclamation, "月次処理", Chime:=True


[ ktSound ] サブルーチン

Wave 音 を再生するサブルーチンです。

【 構 文 】

Call ktSound | ( 音種, 再生方法 )
音種 | -- | String 型
再生方法 | -- | Integer 型

【 パラメータ 内容 】

[ 音種 ]
 | 再生する Wave ファイル を指定します。 文字列 ( "1" or "2" or "3" ) で､下記の３音を指定できます カッコ内の [ kt関数アドインで用意している定数名 ] で指定する事も可能です。 "1" ( kt_Ding ) Windows ディレクトリ 内の [ Media\Ding.wav ] "2" ( kt_Chord ) 〃 [ Media\Chord.wav ] "3" ( kt_Notify ) 〃 [ Media\Notify.wav ] 連続再生の場合の [ 停止 ( kt_WaveStop ) ] では 空文字( "" )を指定します。 (補) [ Ding.wav ( ピ～ン ) ] ⇒ MsgBox で アイコン無し の時の音 [ Chord.wav ( ボン ) ] ⇒ MsgBox で アイコン有り の時の音 [ Notify.wav ( ピポ ) ] ⇒ メール着信音 Ver 5.00 より下記の 「音種」 が追加されました。 サウンドファイル名の直指定に 拠らず、コントロールパネル/サウンド で設定されているサウンド を鳴らすことが できます。 "Default" ・・・ システム音 : 一般の警告音 "Critical" ・・・ システム音 : システムエラー "Question" ・・・ システム音 : メッセージ(問い合わせ) "Exclamation" ・・・ システム音 : メッセージ(警告) "Information" ・・・ システム音 : メッセージ(情報) "New Mail" ・・・ システム音 / 新着メールの通知 上記の 音 以外を再生する場合は､その Wave ファイル の フルパス （ドライブ から） を 指定します。
[ 再生方法 ]
 | 下記のいずれかを指定します（カッコ内は kt関数アドインで用意している定数名です）。 1 ( kt_ASYNC ) ⇒ 非同期再生 （１回のみ再生） 2 ( kt_Chime ) ⇒ 非同期再生 （連続再生） 3 ( kt_SYNC ) ⇒ 同期再生 （１回のみ再生） 9 ( kt_WaveStop ) ⇒ 連続再生の場合の [ 停止 ] 指示

【 解 説 】

ＡＰＩ の PlaySound 関数 を使用して Wave 音 を簡単に再生できます。

従来 [ Beep ステートメント ] による音しか利用できなかったＶＢＡで､任意の警告・注意音を利用する事が
できます。「ktMsgBox 関数」で利用しています。

「同期再生」 は Wave 音 の再生が終了するまで､呼び元に戻りません。

「非同期再生」 は直ぐに呼び元へ制御が戻り､ Wave 音 の再生と平行して処理を進める事ができます。

「非同期/連続再生」 の場合は､　「停止」 指示を出すまで延々と再生が続きますので､必ず 「停止」 指示
を出す手段を用意して下さい （停止ボタン を用意して クリックイベントで停止 or 処理の開始時に再生を
始め、終了時に停止 など）。

※ マクロ の開発中に、停止手段を用意する前に連続再生してしまった場合や､何らかの原因で停止指示
を出す前に エクセル が ダウン してしまった場合などに対処する為に､ 『kt関数メニュー/バージョン』
画面に 【再生停止ボタン】 を用意してあります。

【 使 用 例 】

メール着信音 ( Media\Notify.wav ) を １回再生
Call ktSound( kt_Notify, kt_ASYNC )

メール着信音( Media\Notify.wav ) を 連続再生
Call ktSound( kt_Notify, kt_Chime )

メール着信音( システム音 / 新着メールの通知) を １回再生
Call ktSound( "New Mail", kt_ASYNC )

連続再生中 の Wave 音 を停止
Call ktSound( "", kt_WaveStop )

入力エラーで Beep の代わりに利用（ Exit イベント内など ）
IF Not IsNumeric(TextBox1.Value ) Then
Call ktSound( kt_Ding, kt_ASYNC )
Cancel = True
Exit Sub
End If

既定の ３音 以外を再生 （下記はWin98/Excel2000の場合の例です）
Call ktSound( "C:\Program Files\Microsoft Office\Office\REMINDER.WAV", kt_Chime )


[ ktCellMovePad ] サブルーチン

モーダルフォーム 上 で マウス を動かした方向へ アクティブセル を移動させる
マウスパッド 機能を提供する サブルーチン です。

【 構 文 】

Call ktCellMovePad | ( Action, Now_X, Now_Y, Now_Shift,
 | Before_X, Before_Y, MousePad,
 | ActRng, [Book名], [Sheet名] )
Action | -- | Boolean 型
Now_X | -- | Single 型
Now_Y | -- | Single 型
Now_Shift | -- | Integer 型
Before_X | -- | Single 型 ( ByRef )
Before_Y | -- | Single 型 ( ByRef )
MousePad | -- | MsForm.Label 型 ( ByRef )
ActRng | -- | Range 型 ( ByRef )
Book名 | -- | String 型 (省略可, 省略時: 空文字( "" ) )
Sheet名 | -- | String 型 (省略可, 省略時: 空文字( "" ) )

【 パラメータ 内容 】

[ Action ]
 | UserForm_Initialize および UserForm_MouseMove イベント内 初期化 または マウス が パッド 外へ出た際の リセット の指示として [ False ] を指定します。 MousePad に指定する ラベル の MouseMove イベント内 パッド 内を操作中 の意味で [ True ] を指定します。
[ Now_X および Now_Y ]
 | UserForm_Initialize および UserForm_MouseMove イベント内 初期化 / リセット の際には 不要なので [ ０ ] を指定します。 MousePad に指定する ラベル の MouseMove イベント内 MouseMove イベントプロシジャー から得られる 引数 [ X ] [ Y ] を指定します。
[ Now_Shift ]
 | UserForm_Initialize および UserForm_MouseMove イベント内 初期化 / リセット の際には 不要なので [ ０ ] を指定します。 MousePad に指定する ラベル の MouseMove イベント内 MouseMove イベントプロシジャー から得られる 引数 [ Shift ] を指定します。
[ Before_X および Before_Y ] ( ByRef )
 | モジュール 宣言 セクション にて [ Private ] で定義した Single 型変数を指定します。 ユーザーサイド で、この引数を使用して何か処理をする必要はありません。 単に Private 変数 を指定しておくだけで構いません。 前回 Call 時の Ｘ／Ｙ 値 を 次回 Call 時へ引き継ぐため、 サブルーチン サイド が 値保存用として利用する項目です。 その為、プロシジャー内変数では駄目です。
[ MousePad ] ( ByRef )
 | マウスパッド 用に用意した ラベルコントロール を指定します。 この ラベル は 背景色 [ 白 ] で用意して下さい。 幅/高さは任意です。
[ ActRng ] ( ByRef )
 | マウス を動かした方向へ アクティブセル を移動させた後の セル の Range オブジェクトが 返ります。 Range 型変数 を指定します （この変数自体は プロシジャー内変数でも構いません）。 ただし、マウスパッド を複数用意して複数の セル位置を指定する場合は、モジュール宣言 セクションにて [ Private ] で定義した Range 型変数を別途用意し、この [ ActRng ] の内容 を保存していくようにします。 Action = False の場合（初期化 / リセット） 常に [ Nothing ] が返ります。 Action = True の場合（パッド 動作中） (a) Book名 / Sheet名 を指定しない場合 ActiveCell の Range オブジェクト が返ります。 (b) Book名 / Sheet名 を指定した場合 ・ Book名 / Sheet名 が存在する場合 その シート が アクティブになります。 そのシートの ActiveCell の Range オブジェクト が返ります。 ・ Book名 / Sheet名が存在しない場合 常に [ Nothing ] が返ります。
[ Book名 および Sheet名 ]
 | フォーム に Book / Sheet の選択機能も持たせる場合に､その Book名 / Sheet名 を指定します。 マウスパッド用ラベル に入った瞬間（Action = Trueで Call 中） に､ Book名/Sheet名 の存在チェック が行なわれます。 存在しない場合は [ ActRng ] に Nothing を返し､マウスパッド用ラベルの背景を薄赤にします。 存在する場合は [ ActRng ] に ActiveCell を返し､背景は白または薄黄（Shift 押下中） になります。 Book / Sheet の切り換えが無く､現在の ActiveSheet のみを対象とする場合は省略します。 [ Action = False ] の場合は省略して構いません。

実際には､後述の【使用例】 を、そのまま コピー して利用して下さい。

【 解 説 】

Excel2000～Excel2003(SP2) と Excel2003(SP3)以降 の間で RefEdit コントロール の バージョン が変わっており、
Excel2003(SP3)以降 で作成された RefEdit コントロール を持つ ワークブック ( *.xls , *.xla ) は、Excel2000～
Excel2003(SP2)環境では実行エラーを引き起こします。 この トラブル に対応するために作成した ツール です。

モードレスフォーム では フォーム表示中に自由にセルを選択して アクティブセルを変えられますが､
モーダルフォーム表示中には シート に触れません。このサブルーチンは､UserForm上にラベルを用意し､
その ラベル内で [ Shift ] を押しながら マウス を動かした時に､
マウス の動いたのと同じ方向へ アクティブセル を移動
させる機能を提供します。

kt関数アドイン では、カレンダーマーク描画フォームの左下にある白枠などで使っています。

【 使 用 例 】

UserForm にラベル 「 lblMousePad 」 を用意し､UserFormモジュール に下記コード をそのまま貼り付けて下さい。

------- ひとつのセル指定 （Book/Sheet 切り換えが無い場合） ---------
Private Before_X As Single
Private Before_Y As Single
Private rngActCell As Range

Private Sub UserForm_Initialize()
Dim rngDummy As Range
'初期化
Call ktCellMovePad(False, 0, 0, 0, _
Before_X, Before_Y, lblMousePad, rngDummy)

Set rngActCell = ActiveCell
End Sub

Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
Dim rngDummy As Range
'マウスパッド用ラベルから外に出たのでリセットする
Call ktCellMovePad(False, 0, 0, 0, _
Before_X, Before_Y, lblMousePad, rngDummy)
End Sub

Private Sub lblMousePad_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
Call ktCellMovePad(True, X, Y, Shift, _
Before_X, Before_Y, lblMousePad, rngActCell )
End Sub

------- ひとつのセル指定 （Book/Sheet 切り換えが有る場合） ---------
txtBook/txtSheet に選択したブック名/シート名が入っているとする。
Active なセルアドレスを txtCell に表示。

Private Before_X As Single
Private Before_Y As Single
Private rngActCell As Range

Private Sub UserForm_Initialize()
Dim rngDummy As Range
'初期化
Call ktCellMovePad(False, 0, 0, 0, _
Before_X, Before_Y, lblMousePad, rngDummy)
Set rngActCell = Nothing
End Sub

Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
Dim rngDummy As Range
'マウスパッド用ラベルから外に出たのでリセットする
Call ktCellMovePad(False, 0, 0, 0, _
Before_X, Before_Y, lblMousePad, rngDummy )
End Sub

Private Sub lblMousePad_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
Call ktCellMovePad(True, X, Y, Shift, _
Before_X, Before_Y, lblMousePad, rngActCell, _
txtBook.Value, txtSheet.Value )
If (rngActCell Is Nothing ) Then
txtCell.Value = ""
Else
If (Application.ReferenceStyle = xlA1) Then
txtCell.Value = rngActCell.Address(False, False, xlA1) 'A1形式
Else
txtCell.Value = rngActCell.Address(True, True, xlR1C1) 'R1C1形式
End If
End If
End Sub

------- 複数のセル指定 （Book/Sheet 切り換えが無い場合） ---------
Active なセルアドレスを txtCell1 に表示（lblMousePad1 ）。
同様に、txtCell2 / lblMousePad2 で処理する。

Private Before_X1 As Single
Private Before_Y1 As Single
Private rngActCell1 As Range

Private Before_X2 As Single
Private Before_Y2 As Single
Private rngActCell2 As Range

Private Sub UserForm_Initialize()
Dim rngDummy As Range
'初期化
Call ktCellMovePad(False, 0, 0, 0, _
Before_X1, Before_Y1, lblMousePad1, rngDummy)
Call ktCellMovePad(False, 0, 0, 0, _
Before_X2, Before_Y2, lblMousePad2, rngDummy)

Set rngActCell1 = Nothing
Set rngActCell2 = Nothing
End Sub

Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
Dim rngDummy As Range
'マウスパッド用ラベルから外に出たのでリセットする
Call ktCellMovePad(False, 0, 0, 0, _
Before_X1, Before_Y1, lblMousePad1, rngDummy)
Call ktCellMovePad(False, 0, 0, 0, _
Before_X2, Before_Y2, lblMousePad2, rngDummy)
End Sub

Private Sub lblMousePad1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
Dim rngActTemp As Range
Call ktCellMovePad(True, X, Y, Shift, _
Before_X1, Before_Y1, lblMousePad1, rngActTemp)
If ((Shift And 1) = 1) Then
'[Shift]押下中のみセル表示を変更
If (Application.ReferenceStyle = xlA1) Then
txtCell1.Value = rngActTemp.Address(False, False, xlA1) 'A1形式
Else
txtCell1.Value = rngActTemp.Address(True, True, xlR1C1) 'R1C1形式
End If
Set rngActCell1 = rngActTemp
Else
'何もしない(セル表示/セル参照は、そのまま)
End If
End Sub

Private Sub lblMousePad2_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
Dim rngActTemp As Range
Call ktCellMovePad(True, X, Y, Shift, _
Before_X2, Before_Y2, lblMousePad2, rngActTemp)
If ((Shift And 1) = 1) Then
'[Shift]押下中のみセル表示を変更
If (Application.ReferenceStyle = xlA1) Then
txtCell2.Value = rngActTemp.Address(False, False, xlA1) 'A1形式
Else
txtCell2.Value = rngActTemp.Address(True, True, xlR1C1) 'R1C1形式
End If
Set rngActCell2 = rngActTemp
Else
'何もしない(セル表示/セル参照は、そのまま)
End If
End Sub

------- 複数のセル指定 （Book/Sheet 切り換えが有る場合） ---------
txtBook1/txtSheet1 に選択したブック名/シート名が入っているとする。
Active なセルアドレスを txtCell1 に表示（lblMousePad1 ）する。
同様に、txtBook2/txtSheet2/txtCell2/lblMousePad2 で処理する。

Private Before_X1 As Single
Private Before_Y1 As Single
Private rngActCell1 As Range

Private Before_X2 As Single
Private Before_Y2 As Single
Private rngActCell2 As Range

Private Sub UserForm_Initialize()
Dim rngDummy As Range
'初期化
Call ktCellMovePad(False, 0, 0, 0, _
Before_X1, Before_Y1, lblMousePad1, rngDummy)
Call ktCellMovePad(False, 0, 0, 0, _
Before_X2, Before_Y2, lblMousePad2, rngDummy)
Set rngActCell1 = Nothing
Set rngActCell2 = Nothing
End Sub

Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
Dim rngDummy As Range
'マウスパッド用ラベルから外に出たのでリセットする
Call ktCellMovePad(False, 0, 0, 0, _
Before_X1, Before_Y1, lblMousePad1, rngDummy)
Call ktCellMovePad(False, 0, 0, 0, _
Before_X2, Before_Y2, lblMousePad2, rngDummy)
End Sub

Private Sub lblMousePad1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
Dim rngActTemp As Range
Call ktCellMovePad(True, X, Y, Shift, _
Before_X1, Before_Y1, lblMousePad1, rngActTemp, _
txtBook1.Value, txtSheet1.Value )
If (rngActTemp Is Nothing ) Then
txtCell1.Value = "" 'Book/Sheet 指定エラー
Set rngActCell1 = Nothing
Else
If ((Shift And 1) = 1) Then
'[Shift]押下中のみセル表示を変更
If (Application.ReferenceStyle = xlA1) Then
txtCell1.Value = rngActTemp.Address(False, False, xlA1) 'A1形式
Else
txtCell1.Value = rngActTemp.Address(True, True, xlR1C1) 'R1C1形式
End If
Set rngActCell1 = rngActTemp
Else
'何もしない(セル表示/セル参照は、そのまま)
End If
End If
End Sub

Private Sub lblMousePad2_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
Dim rngActTemp As Range
Call ktCellMovePad(True, X, Y, Shift, _
Before_X2, Before_Y2, lblMousePad2, rngActTemp, _
txtBook2.Value, txtSheet2.Value)
If (rngActTemp Is Nothing ) Then
txtCell2.Value = "" 'Book/Sheet 指定エラー
Set rngActCell2 = Nothing
Else
If ((Shift And 1) = 1) Then
'[Shift]押下中のみセル表示を変更
If (Application.ReferenceStyle = xlA1) Then
txtCell2.Value = rngActTemp.Address(False, False, xlA1) 'A1形式
Else
txtCell2.Value = rngActTemp.Address(True, True, xlR1C1) 'R1C1形式
End If
Set rngActCell2 = rngActTemp
Else
'何もしない(セル表示/セル参照は、そのまま)
End If
End If
End Sub


[ ktCell2Position ] 関数

UserForm を 「あるセルの上に表示」 という場合に、その セルの スクリーン座標 を UserForm で指定する
値に変換する関数です。 ( Ver 4.00 ～ )
[ #VALUE! ] [ VBA ONLY ]

【 構 文 】

ktCell2Position | ( Target, [ PaneIdx ] )
返却値 | -- | Variant ( Array 関数 ) 型
Target | -- | Range 型
PaneIdx | -- | Integer 型 ( 省略可, 省略時： ０ )

【 返却値 】

Target の セル座標（セル枠の左上） を UserForm の Top/Left 値に変換し、 Array(Top, Left) の
配列として返します。
要素：０ が Top , 要素：１ が Left になります。 Top/Left は Long 型です。

Target の セル が ウィンドウ 表示範囲外 の場合は [ #VALUE! ] が返ります。

『 ウィンドウ 枠の固定/分割 』 を行なっている場合、エクセルバージョン によって動作が異なります。
・ ～ Excel 2003
第 １ Pane （４分割 ならば 左上 , 上下分割 ならば 上部 , 左右分割 ならば 左側） の セル のみが
指定できます。
他 （第 ２～４ Pane ） の 領域のセルを指定すると [ #VALUE! ] が返ります。

・ Excel 2007 ～
第 １～４ Pane の 全ての領域の セル が指定できます。

ワークシート 関数 として セル に記述すると [ #VALUE! ] が返ります （ＶＢＡ専用関数です）。

【 パラメータ 内容 】

[ Target ]
 | UserForm を表示したい セル の Range オブジェクト を指定します。 セル範囲を指定した場合は先頭セル （左上セル） が対象になります。 Target の セル が ウィンドウ 表示範囲外 の場合は [ #VALUE! ] が返ります。
[ PaneIdx ]
 | ０ / 省略 : 分割なし or 対象領域 ( Pane ) の自動検出 １ ： 左上 (４分割) or 左側 (左右分割) or 上側 (上下分割) の 領域 ２ ： 右上 (４分割) or 右側 (左右分割) or 下側 (上下分割) 〃 ３ ： 左下 (４分割) の領域 ４ ： 右下 (４分割) 〃 -- ウィンドウ枠の固定/分割 を行なっていない -- 省略 （または ０ ） してください。 指定しても無視します。 -- ウィンドウ枠の固定 -- 省略 （または ０ ） してください。 指定しても無視します。 対象領域 は Target から自動検出します。 ※ ～Excel 2003 では、対象領域 が ２ ～ ４ の場合には [ #VALUE! ] が返ります。 -- ウィンドウ枠の分割 -- 省略（または ０ ） の場合は、アクティブ領域 を 対象領域 とします。 １ ～ ４ を指定すると、指定の領域が 対象領域 となります。 分割枠の数以上の値を指定すると [ #VALUE! ] が返ります。 ※ ～Excel 2003 では、対象領域 が ２ ～ ４ の場合には [ #VALUE! ] が返ります。

【 解 説 】

セル の スクリーン座標 ( Top , Left ) と、UserForm の表示位置 ( Top , Left ) は、各々が使用する座標の
単位が異なる為に、セル の スクリーン座標 を、そのまま UserForm に使用する事はできません。

ktCell2Position 関数は、セル の スクリーン座標 ( Top , Left ) を UserForm の表示位置の座標 ( Top , Left )
に変換します。

【 使 用 例 】

-- ダブルクリック した セル の位置に UserForm を表示します --

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim vntPos As Variant

vntPos = ktCell2Position(Target)
If IsError(vntPos) Then
MsgBox "Error"
Cancel = True
Exit Sub
End If

Load UserForm1
With UserForm1
.StartUpPosition = 0
.Top = vntPos(0)
.Left = vntPos(1)
.Label1.Caption = Target.Address(False, False) & vbCrLf & vbCrLf & _
"CellTop = " & Target.Top & vbCrLf & vbCrLf & _
"CellLeft= " & Target.Left & vbCrLf & vbCrLf & _
"Top = " & .Top & vbCrLf & vbCrLf & _
"Left= " & .Left
.Show
End With
Cancel = True
End Sub

-- ktMsgBox での 利用 ( F5 セル の位置に表示) --

Dim vntPos As Variant
Dim vntTop As Variant
Dim vntLeft As Variant

vntPos = ktCell2Position(ActiveSheet.Range("F5"))
If IsError(vntPos) Then
'F5 セル が 表示範囲外 ⇒ Top/Left を省略
vntTop = Empty
vntLeft = Empty
Else
vntTop = vntPos(0) + 5
vntLeft = vntPos(1) + 5
End If

ktMsgBox "xxxxxxxx", vbOkOnly + vbInformation, _
Top:=vntTop, Left:=vntLeft
End If


[ ktFolder選択 ] 関数

フォルダ選択ダイアログ を表示し､選択したフォルダ の パス を返す関数です。
[ VBA ONLY ]

【 構 文 】

ktFolder選択 | ( MyWindow, MyCaption, [ タイトル ], [ 既定パス ] )
返却値 | -- | String 型
MyWindow | -- | String 型
MyCaption | -- | String 型
タイトル | -- | String 型 (省略可, 省略時： "フォルダを選択してください" )
既定パス | -- | String 型 (省略可, 省略時: デスクトップ )

【 返却値 】

フォルダ 選択時は、選択 した フォルダ の フルパス が 返ります。

キャンセル時は、空文字 ( "" ) が返ります。

パラメータ不正・他エラー の場合は、[ 半角の "?" + エラー内容 ] が返ります。

【 パラメータ 内容 】

[ MyWindow ]
UserForm から 使用する場合は、"USERFORM" を指定します。
（UserForm から 呼び出された 標準モジュール内 プロシージャーも含みます）

その他 （ワークシート モジュール・標準モジュール） から使用する場合は､ "EXCEL" を指定します。

小文字 ( "Excel" , "UserForm" ) でも構いません。
[ MyCaption ]
呼び元 ウィンドウ の キャプション を指定します。

MyWindow = "USERFORM" の場合、 [ Me.Caption ] を指定します。

MyWindow = "EXCEL" の場合、[ Application.Caption ] を指定します。
[ タイトル ]
フォルダ 選択 ダイアログ の キャプション に表示する メッセージ を指定します。

省略 または 空文字 ( "" ) の場合は 『フォルダを選択してください』 になります。
[ 既定パス ]
フォルダ 選択 ダイアログ で 開く トップフォルダ を指定します。

省略 または 空文字 ( "" ) の場合は 「 デスクトップ」 となります。
"MYDOC" と指定すれば、「マイドキュメント」 になります。

※ 現在、"C:\xxx\yyy" など、パス を直接指定する事はできません。
パス を直接指定しても、 デスクトップ になります。

【 解 説 】

フォルダ選択ダイアログ を表示するには ＡＰＩ を使用しますが､ ＡＰＩ 処理 を サブルーチン内部に
閉じ込めていますので､利用する側では一切意識する必要はありません。

【 使 用 例 】

Dim strPath As String
strPath = ktFolder選択("USERFORM", Me.Caption)


[ ktBookAlive ] 関数

指定の ブック が 現在オープン されているかを チェック する関数です。
ブック名のみ または 「ドライブ～ブック名」 の フルパス のどちらでも可能です。
[ VBA ONLY ] [ #VALUE! ]

【 構 文 】

ktBookAlive | ( ブック名 )
返却値 | -- | Variant ( Boolean ) 型
ブック名 | -- | String 型

【 返却値 】

指定の ブック が オープン中の場合は True が返ります。
未オープン または 実在しないファイル名の場合は False が返ります。

ワークシート 関数 として セル に記述すると [ #VALUE! ] が返ります （ＶＢＡ専用関数です）。

【 パラメータ 内容 】

[ ブック名 ]
 | 調べる ブック名 を指定します。 "Book1.xls" のように ブック名のみ または "C:\My Documents\ABC\Book1.xls" のように フルパス の どちらでも可です。

【 解 説 】

複数の フォルダ に 「同名の ブック 」 がある場合､オープン されている ブック が 処理対象の
フォルダ に属する ブック かを確認するには フルパス を指定します。

【 使 用 例 】

If ktBookAlive("Book1.xls") Then
' [Book1.xls]への処理
Else
MsgBox "Book1.xls はオープンされていません"
End If

------------------------------------------------------
If ktBookAlive("C:\My Documents\AAA\Book1.xls") Then
' [Book1.xls]への処理
Else
MsgBox "[AAA]フォルダのBook1.xls はオープンされていません"
End If


[ ktSheetAlive ] 関数

指定の ブック に、 「シート名」 が存在するかをチェック する関数です。
ブック名のみ または 「ドライブ～ブック名」 の フルパス のどちらでも可能です。
[ VBA ONLY ] [ #VALUE! ]

【 構 文 】

ktSheetAlive | ( シート名 , [ ブック名 ] )
返却値 | -- | Variant ( Boolean ) 型
シート名 | -- | String 型
ブック名 | -- | String 型 （省略可、省略時 ： ActiveBook ）

【 返却値 】

指定の シート が 存在する場合は True が返ります。
指定の シート が存在しない または ブック が 未オープンの場合は False が返ります。

ワークシート 関数 として セル に記述すると [ #VALUE! ] が返ります （ＶＢＡ専用関数です）。

【 パラメータ 内容 】

[ シート名 ]
 | 調べる シート名 を指定します。
[ ブック名 ]
 | 調べる ブック名 を指定します。 "Book1.xls" のように ブック名のみ または "C:\My Documents\ABC\Book1.xls" のように フルパス の どちらでも可です。 省略すると、アクティブ ワークブック を対象とします。

【 解 説 】

複数の フォルダ に 「同名の ブック 」 がある場合､オープン されている ブック が 処理対象の
フォルダ に属する ブック かを確認するには フルパス を指定します。

【 使 用 例 】

If ktSheetAlive("Sheet1") Then
' アクティブブック [Sheet1]への処理
Else
MsgBox "ActiveBookに[Sheet1]はありません"
End If

------------------------------------------------------
If ktSheetAlive("Sheet1", "Book1.xls") Then
' [Book1.xls!Sheet1]への処理
Else
MsgBox "Book1.xls に[Sheet1]はありません"
End If


[ ktCellAddr ] 関数

指定の文字列が 「Ａ１形式アドレス」 として妥当かどうかを チェック する関数です。
[ #VALUE! ]

【 構 文 】

ktCellAddr | ( アドレス )
返却値 | -- | Variant ( Boolean ) 型
アドレス | -- | String 型

【 返却値 】

True ‥‥‥　「Ａ１形式 アドレス」 として妥当な文字列です。
False ‥‥‥ 〃 として使えない文字列です。

ワークシート 関数 として セル に記述すると [ #VALUE! ] が返ります （ＶＢＡ専用関数です）。

(注) kt関数Addin.xla では、 97-2003 形式 ワークブック の 範囲（ A1 ～ IV65536 ） で チェック できます。
kt関数Addin.xlam では、2007 形式 ワークブック の 範囲（ A1 ～ XFD1048576 ） で チェック できます。
上記を超える セル範囲に対しては False が返ります。

【 パラメータ 内容 】

[ アドレス ]
 | Ａ１ 形式 の アドレス文字 かを判定する文字列を指定します。 （ A1 ，$A$2 ，A5:B10 など )

【 解 説 】

手入力した セルアドレス文字列 などの チェック に使用します。

kt関数Addin.xla と kt関数Addin.xlam で、セルアドレス判定の有効範囲（返却値の項を参照）が
異なりますので注意して下さい。

【 使 用 例 】

Private Sub txtADDR_Exit( ByVal Cancel As MSForms.ReturnBoolean)
If (txtADDR.Value = "") Then
' 何もしない
ElseIf　ktCellAddr(txtADDR.Value) Then
' 正常
Else
MsgBox "A1形式アドレス文字を入力して下さい"
Cancel = True
End If
End Sub


[ kt終端 ] 関数

１行 または １列の セル範囲 に対して、「最終データ の 行番号/列番号」
または 「最終セルまでの範囲をアドレス文字」 で返す関数です。
[ ワークシート ONLY ] [ #VALUE! ]

【 構 文 】

kt終端 | ( 範囲, [ 基点 ], [ 始点 ], [ 絶対 ], [ Wksh ] )
返却値 | -- | Variant ( Long / String ) 型
範囲 | -- | Range 型
基点 | -- | Range 型 (省略可)
始点 | -- | Range 型 (省略可 )
絶対 | -- | Boolean 型 (省略可, 省略時: False )
Wksh | -- | Boolean 型 (省略可, 省略時: False )

【 返却値 】

指定 した 「１行 または １列」 のセル範囲において､最終データの 行番号 または 列番号 を返します。

末端 （ 97-2003形式：65536行 / IV列 , 2007形式：1048576行 / XFD列 ) からではなく､途中のセル
から遡って算出したい場合は､その途中セルを [ 基点 ] に指定します。

[ 始点 ] に セル を指定すると､ 「そのセル～最終データ位置のセル」 までの範囲をアドレス文字列として
返します（A1形式/R1C1形式の状態に合わせて､アドレス文字列を生成します）。

[ 絶対 ] = True にすると　絶対参照( $A$1:$A$20 )､ False なら相対参照( A1:A20 )で返します。
[ Wksh ] = True にすると､ シート名付きの アドレス ( Sheet1!A1:A20 )で返します。

指定した内容が不正な場合は [ #VALUE! ] が返ります。
ＶＢＡ で使用すると [ #VALUE! ] が返ります （ワークシート 専用関数です）。

【 パラメータ 内容 】

[ 範囲 ]
 | 最終データ位置を求めたい 「行範囲 または 列範囲」 を A：A や 3：3 （R1C1形式ならば、 C1 や R3 ） という風に行全体/列全体で指定します。 １行または１列に限ります。複数行/列はエラーになります。 同一ブック 内での 「他シート」 は指定できますが､ 他ブック の セル範囲は指定できません。 行全体/列全体 ではなく、『 A10：A100 』 といった対象に対しても求める事ができますが､ 解説に示すような問題がありますので指定しないで下さい。
[ 基点 ]
 | 末端 （ 97-2003形式：65536行 / IV列 , 2007形式：1048576行 / XFD列 ) 以外の途中位置から 遡って検索する場合に､そのセル（単独セル）を指定します。 [ 範囲 ] と 同じシートのセルを指定して下さい。
[ 始点 ]
 | 最終データ位置の 「行（列）番号」 の代わりに､セル範囲のアドレス文字列を求める場合に､ 始点 となる セル（単独セル） を指定します。 [ 範囲 ] と 同じシートのセルを指定して下さい。
[ 絶対 ]
 | [ 始点 ] を指定した場合にのみ有効です。 アドレス文字列 を 相対参照 形式で求める場合は､ 省略 または False を指定します。 〃 絶対参照 形式で求める場合は True を指定します。
[ Wksh ]
 | [ 始点 ] を指定した場合にのみ有効です。 アドレス文字列 を シート参照付き （Sheet2!A1：A20 など）で求める場合は True を指定します。

【 解 説 】

この関数は ＶＢＡ における下記マクロ と同様の算出を ワークシート上で行ないます。
Range("A65536").End(xlUp).Row
Range("IV1").End(xlToLeft).Column
（補） 97-2003形式：65536行 / IV列 , 2007形式：1048576行 / XFD列

他の関数の引数 内で使用する場合（例えばＳＵＭ関数など）､ kt終端 の結果を INDIRECT 関数で
括る必要があります。

使用にあたっては､下記の注意事項を良くお読みください。

[ 範囲 ]の指定の仕方､および 行/列挿入の位置 によっては【再計算】されない場合があります。

この関数は､ [ A：A ] や [ 10：10 ] といった 列全体/行全体ではなく､ [ A5：A100 ] とか [ C10：AA10 ] と
いった列/行の一部分を指定しても動作しますが､そのセル範囲の上側/左側で行挿入/列挿入した場合に
【再計算】の対象とならない為､挿入処理前の内容のままになってしまいます （そのセル範囲の内側で行挿入
/列挿入した場合は大丈夫です）。

この場合は､[ kt終端 ] が書かれている セル を ダブルクリック で入力/編集状態にして､そのまま エンターキー
を押す事によって再計算を実行させる事で正しい位置が得られます。

トラブルの元となりますので､必ず 【 A：A 】 や 【 10：10 】 といった列全体/行全体での指定をするようにして下さい。

【 使 用 例 】

-- Ａ列の最終行番号を求める --
=kt終端(A:A) ,R1C1形態： =kt終端(C1)

-- ３行目の最終列番号を求める --
=kt終端(3:3) ,R1C1形態： =kt終端(R3)

-- Sheet2のA列の最終行番号を求める --
=kt終端(Sheet2!A:A) ,R1C1形態： =kt終端(Sheet2!C1)

-- 他ブックの指定 --
=kt終端([Book2.xls]Sheet2!B:B) ⇒ #VALUE! になります

Book2.xls 内で､例えば Sheet2 の D1セル に
=kt終端(B:B) ,R1C1形態： =kt終端(C2)
として､参照する側の ブック からは
=[Book2.xls]Sheet2!D1 ,R1C1形態： =[Book2.xls]Sheet2!R1C4
という風にします。

-- 実際の利用例 --
=SUM(INDIRECT("A1:A"&kt終端(A:A)))

C1セル⇒ =kt終端(Sheet2!A:A)
=SUMIF(INDIRECT("Sheet2!A1:A"&C1),"りんご",INDIRECT("Sheet2!B1:B"&C1))

-- アドレス文字列で求める --
=SUM(INDIRECT(kt終端(A:A,,A3)))
これは [ =SUM(INDIRECT("A3:A12")) ] などといった意味になります。

=SUM(INDIRECT(kt終端(Sheet2!A:A,,Sheet2!A3,,TRUE)))
これは [ =SUM(INDIRECT("Sheet2!A3:A12")) ] などといった意味になります。

Sheet1 で下記の場合
=SUM(INDIRECT(kt終端(A:A,,A3,,TRUE)))
これは [ =SUM(INDIRECT("Sheet1!A3:A12")) ] などといった意味になります。

-- 途中の セル を下端にして求める --
=kt終端(A:A,A50)
[ A50 ] より下に別のデータがあって､ [ A50 ] まででの最終データ位置を求めるような場合は、
このようにします。


[ ktColumnChar ] 関数

列番号 と 列アドレス文字の相互変換を行なう関数です。
[ #VALUE! ]

【 構 文 】

ktColumnChar | ( Num_Char, [ Num2 ], [ XL2003 ] )
返却値 | -- | Variant ( Long / String ) 型
Num_Char | -- | Variant ( Long / String ) 型
Num2 | -- | Variant ( Long ) 型 (省略可)
XL2003 | -- | Boolean 型 (省略可, 省略時：True ) ( Ver 4.00 ～ )

【 返却値 】

[ Num_Char ] に 列アドレス文字 を指定した場合は 列番号 を返します。
[ Num_Char ] に 列番号 を指定した場合は 列アドレス文字 を返します。
（ 97-2003形式： A ～ IV (256) 列 , 2007形式： A ～ XFD (16384) 列 )

[Num_Char ] と一緒に [ Num2 ] 列番号を指定した場合は、列範囲の アドレス （"A：C" など）
を返します。

パラメータ不正の場合は [ #VALUE! ] が返ります。

【 パラメータ 内容 】

[ Num_Char ]
 | 列番号 または 列アドレス文字 （小文字も可） を指定します。 （ 97-2003形式： A ～ IV (256) 列 , 2007形式： A ～ XFD (16384) 列 )
[ Num2 ]
 | 列範囲を指定する場合、 [ Num_Char ] と共に 列番号を指定します。
[ XL2003 ] ( Ver 4.00 ～ )
 | 省略 もしくは True の場合 97-2003 形式 ワークブック の 範囲 ( A1 ～ IV65536 ) で判定します。 False の場合 2007 形式 ワークブック の 範囲 ( A1 ～ XFD1048576 ) で判定します。

【 使 用 例 】

i = 5 , j = 10 の場合

Columns(ktColumnChar(i,j)).Select ⇒ Columns("E：J").Select


[ ktColorIndexGet ] 関数

指定する【色】が対象ブックのパレットでは [ ColorIndex ] が何番になるのかを確認する関数です。
[ VBA ONLY ]

【 構 文 】

ktColorIndexGet | ( 色, 対象ブック )
返却値 | -- | Variant ( Integer ) 型
色 | -- | Long 型
対象ブック | -- | Workbook 型

【 返却値 】

指定した [ 色 ] が 対象ブック の カラーパレット に在る場合は､その パレットカラー番号
（ColorIndex 番号） を返します。無い場合は､０ を返します。

ワークシート 関数 として セル に記述すると [ #VALUE! ] が返ります （ＶＢＡ専用関数です）。

【 パラメータ 内容 】

[ 色 ]
 | 調べる 『 色 』 の値を指定します。 [ ThisWorkbook.Colors(i) ] 等､マクロ ブック の パレットカラー を指定して下さい。
[ 対象ブック ]
 | WorkBooks("‥‥‥．xls") 等､ Workbook オブジェクトを指定します。

【 解 説 】

カラーパレット は ブック 単位 で定義することができます。

したがって､ 『マクロ が 記述されている ブック 』 と 『 マクロ が カラー を設定する ブック 』 の
カラーパレット が同じという保証は、実は全くありません。

アドイン の フリーソフト を作る場合､アドインブック は開発者の環境の ブック ですから、カラー
パレット の Ｎ番が何色かは判ります。しかし､その アドインソフト が利用される環境のブックで
同じ色である保証はありません。

また､セルに設定できる色はカラーパレットに定義された５６色だけです。これ以外の色を設定しようと
すると､パレット上のいずれかの色に置換されます。

したがって､ 『 パレット が不明なら､ColorIndex ではなく､ Color に [ &HBBGGRR ] を代入』 と
する訳にもいきません。その [ &HBBGGRR ] が対象ブックのパレットに存在する保証が無いで
すから､期待した色になるとは限りません。

一番安全な方法は､マクロブックでの 「カラーパレットのＮ番」 が 『対象ブックではＸ番』 という対応
を調べて､その 【Ｘ番】 を 「ColorIndex プロパティ」 の設定に使う事です。

ｋｔＣｏｌｏｒＩｎｄｅｘＧｅｔ関数は､この対応を調べる関数です。

尚､ｋｔＣｏｌｏｒＩｎｄｅｘＧｅｔ関数では､対象ブックに目的の色が無かった場合に 『 ０ （自動） 』 を返し
ますから､そのまま設定しても 「予想もしなかった色になる」 という危険はありません。

【 使 用 例 】

マクロブック （標準パレット を使用） から、 赤 （３番） を アクティブシート の セル に設定する。

ActiveSheet.Range("A1").Font.ColorIndex
= ktColorIndexGet(ThisWorkbook.Colors(3)，ActiveWorkbook)


[ ktPaletteColorEX ] サブルーチン

「kt関数メニュー：カラーパレットEX 」 で表示される パレットフォーム を マクロ から
利用する為のサブルーチンです。

【 構 文 】

Call ktPaletteColorEX | ( PaletteEXData, [ PaletteEXBook ] )
PaletteEXData | -- | kt_PaletteEXType 型 ( ユーザー定義型 ) ( ByRef )
PaletteEXBook | -- | String 型 (省略可, 省略時: "Active" )
ユーザー定義型 [ kt_PaletteEXType ] は､ [ kt関数Addin.xla ] 内で下記のように定義されています。 （参照設定すれば利用できます）
Public Type kt_PaletteEXType
 | ClipBoard As Boolean | カラー選択時の クリップボード への コピー有無
 | SelectRGB As Boolean | RGB 選択画面の展開有無
 | Flg As String | Call 時 ： 空文字("") , "Init" , "Book" , "UnLoad"
 |  | Return 時 ： "Get" , "Cancel"
 | ColorIndex As Integer | 1 ～ 56 ，RGB 画面展開時は [ 99 ] 固定
 | ColorLong As Long | 0 ～ 16777215
 | ColorHex As String | BBGGRR 形式 ( 6桁固定 )
 | ColorB As Integer | 0 ～ 255
 | ColorG As Integer | 0 ～ 255
 | ColorR As Integer | 0 ～ 255
End Type

【 パラメータ 内容 】

[ PalleteEXData ] ( ByRef )
 | PalleteEXData は､利用者側で下記のような 『 変数定義 』 が必要です Dim PalletEXData As kt_PaletteEXType
 | ( ClipBoard )
 | カラー決定時に､その カラーの １６進文字列 [ &HBBGGRR ] を クリップボード に コピー するか どうかを指定します。 True ： コピーする False ： コピーしない
 | ( SelectRGB )
 | ＲＧＢ 画面の展開可否を指定します。 セル に指定するカラーを取得する場合は False にして パレットカラー 以外の選択を不可に してください。 True ： ＲＧＢ 指定可 False ： パレットカラーのみ可
 | ( Flg )
 | ユーザー が カラー を選択したのか､キャンセル したのか、という情報が返る項目です。 "Get" ： カラーを選択 "Cancel" ： キャンセル 初回Call 時には､この項目に "Init" を設定してください。 「カラーパレットＥＸ」 は Ｈｉｄｅ モード で フォーム を閉じますので､呼び元の マクロ が 終了する直前には､この項目に "UnLoad" を設定して Call してください（使用例参照）。 それ以外の時では､返ってきた"Get"/"Cancel" のままで Call して構いません。 わざわざ 空文字( "" ) に クリア する必要はありません。 カラーパレット を取り込む ブック を途中で切り換える場合は "Book" を設定してから Call します。
 | ( Color ～ )
 | カラーを選択した場合は､色の値 「パレット番号 , 数値 , １６進文字列 , ＲＧＢ各色の数値 」 が 各々の項目に返ります。キャンセルした場合は各々「ゼロ or 空文字( "" )」 が返ります。 尚､ ColorHex は BBGGRR の６ 文字です。 先頭に "&H" は付いていませんので､必要な場合はマクロ側で付加してください。 RGB 画面展開時の [ ColorIndex ] の値は 99 固定です。
[ PaletteEXBook ]
 | パレットブック を取得する ブック名 を指定します。 ここに指定するブックは､オープンされている必要があります。 もし､オープンされていないブックを 指定した場合は [ｋｔ関数Addin.xla ] が適用されます（標準パレット）。 ActiveWorkbook の パレット を利用する場合は "Active" と指定します。 ActiveWorkbook 以外の パレット を利用する場合は､その ブック名を指定します。 ("Book1.xls" など）

【 解 説 】

この サブルーチン を使うと 「ｋｔ関数メニュー： パレットカラーＥＸ 」 の フォーム を マクロ から
利用する事ができます。
パレットフォーム の操作方法は kt関数メニュー の項を参照して下さい。

【 使 用 例 】

---- UserForm での利用例 ----

Private ColorData As kt_PaletteEXType '宣言セクションで定義

Private Sub UserForm_Initialize()
ColorData.ClipBoard = False ' 16進文字のクリップボードコピー無し
ColorData.SelectRGB = True ' RGB画面の展開有り
ColorData.Flg = "Init"
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If (ColorData.Flg <> "Init") Then
'一度でも呼び出されていたら[Load]状態のままなので最後に[UnLoad]する
ColorData.Flg = "UnLoad"
Call ktPaletteColorEX(ColorData, ThisWorkbook.Name)
End If
End Sub

Private Sub Label1_Click()
Call ktPaletteColorEX(ColorData, ThisWorkbook.Name)
'[色]を選択(Get)した場合のみ設定する
If (ColorData.Flg = "Get") Then
Label1.BackColor = ColorData.ColorLong
End If
End Sub

---- シート上のコマンドボタンでセル背景色変更の例 ----

※ セル には パレット の５６色しか使えないので ＲＧＢ展開 はしない

'---------------[標準モジュール]-----------------------
Public ColorData As kt_PaletteEXType

'---------------[ThisWorkbook モジュール]--------------
Private Sub Workbook_Open()
ColorData.ClipBoard = False ' 16進文字のクリップボードコピー無し
ColorData.SelectRGB = False ' RGB画面の展開無し
ColorData.Flg = "Init"
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
If (ColorData.Flg <> "Init") Then
'一度でも呼び出されていたら[Load]状態のままなので最後に[UnLoad]する
ColorData.Flg = "UnLoad"
Call ktPaletteColorEX(ColorData, ThisWorkbook.Name)

'別名保存後に元ブックを保存する時に､既にUnLoad済のところへ
'再びUnLoad指示を出さないようにする為の配慮
ColorData.Flg = "Init"
End If
End Sub

'--------------[シートモジュール]---------------------
Private Sub CommandButton1_Click()
Call ktPaletteColorEX(ColorData, ThisWorkbook.Name)

'[色]を選択(Get)した場合のみ設定する
If (ColorData.Flg = "Get") Then
ActiveCell.Interior.Color = ColorData.ColorLong
End If
End Sub

---- 『色見本 Ver 2.1』のデモマクロ ----

Public Sub ktPaletteEXDemo()
Dim ColorData As kt_PaletteEXType
Dim MsgResp As Integer
ColorData.ClipBoard = True ' 16進文字のクリップボードコピー有り
ColorData.SelectRGB = True ' RGB画面の展開有り
ColorData.Flg = "Init"

Palette1:
Call ktPaletteColorEX(ColorData, ThisWorkbook.Name)
If (ColorData.Flg = "Cancel") Then
MsgResp = MsgBox("【カラーパレットＥＸ　デモ】" & vbCrLf _
& "キャンセルされました" & vbCrLf _
& "繰り返しますか？", vbYesNo + vbInformation)
Else
MsgResp = MsgBox("【カラーパレットＥＸ　デモ】" & vbCrLf _
& "受け取ったカラー情報は下記の通りです" & vbCrLf & vbCrLf _
& "（No） = " & ColorData.ColorIndex & vbCrLf _
& "16進 = 0x" & ColorData.ColorHex & "(BBGGRR)" & vbCrLf _
& "10進 = " & Format(ColorData.ColorLong, "#,##0") & vbCrLf _
& "（青） = " & ColorData.ColorB & vbCrLf _
& "（緑） = " & ColorData.ColorG & vbCrLf _
& "（赤） = " & ColorData.ColorR & vbCrLf _
& vbCrLf & "繰り返しますか？", vbYesNo + vbInformation)
End If

If (MsgResp = vbYes) Then
GoTo Palette1
Else
ColorData.Flg = "UnLoad"
Call ktPaletteColorEX(ColorData, ThisWorkbook.Name)
End If
End Sub


[ ktWebColor2Num ] 関数

HTMLで指定する 『色名』 を RGB 数値に変換する関数です。

【 構 文 】

ktWebColor2Num | ( WebColor, [ Kind ] )
返却値 | -- | Variant ( Long / String ) 型
WebColor | -- | String 型
Kind | -- | String 型 (省略可, 省略時: "D" )

【 返却値 】

「色名」 に対応する ＲＧＢ の値を返します。
Kind = "D" …… 数値 で返します。
Kind = "H" …… １６ 進文字列 （ "&HBBGGRR" の ８ 文字固定 ） で返します。
Kind = "W" …… １６ 進文字列 （ "#RRGGBB" の ７ 文字固定 ） で返します。

色名 が 正しくない場合は －１ もしくは 空文字( "" ) が返ります。

【 パラメータ 内容 】

[ WebColor ]
 | HTML で扱う 「色名」 を指定します 色名 の 一覧は こちら を参照してください。 色名は 大文字 / 小文字 どちらでも構いません。
[ Kind ]
 | 色の値の形式を指定します。 "D" または 省略 …… 数値 で返します。 "H" …… １６ 進文字列 （ "&HBBGGRR" の ８ 文字固定 ） で返します。 "W" …… １６ 進文字列 （ "#RRGGBB" の ７ 文字固定 ） で返します。

【 解 説 】

この関数は､ktMsgBox / ktMsgBoxEX　で文字色/背景色などを指定する際に
「色名」で指定できるようにする為に設けたものです。
ktMsgBox / ktMsgBoxEX]以外でも､各種 [ Color プロパティ ] を ＶＢＡ から指定する場合に
使う事もできます。


[ kt変換ActPRT ] 関数

「ActivePrinter 」 を変更する マクロ を､Excel2000（未SR1） と 他のバージョンで共通に
使えるように ActivePrinter 文字列を自動変換する関数です。 （最近の Excel バージョンでは不要です）
[ VBA ONLY ] [ #VALUE! ]

【 構 文 】

kt変換ActPRT | ( ActPRT名 )
返却値 | -- | Variant ( String ) 型
ActPRT名 | -- | String 型

【 返却値 】

「ActPRT名」 で指定した ActivePrinter 文字列を実行環境の Excel バージョンに合う内容に
変換して返します。

ワークシート 関数 として セル に記述すると [ #VALUE! ] が返ります （ＶＢＡ専用関数です）。

【 パラメータ 内容 】

[ ActPRT名 ]
 | ActivePrinter 文字列を 【プリンタ名 on LPTn: 】 形式 または 【プリンタ名 on ネットワークアドレス】 形式 の定数で指定します。 ※ Application.ActivePrinter プロパティ は指定しないでください。

【 解 説 】

※ 最近の Excel バージョンでは不要です ※
（Excel 2000 (未SR ) が運用されている環境は既に無いでしょうから）

通常 [ ActivePrinter ] に設定する文字列は
"プリンタ名 on LPTn:"
ですが、EXCEL2000(SR1未対応版) のみ
"LPTn: の プリンタ名"
という文字列を使用しています。

この為､EXCEL2000 と他のバージョンの複数環境で プリンター を切り換える マクロ を共通に
使用するには､EXCEL2000 と他の バージョン用の プリンター文字列を２つ用意して､バージョン
によって使い分ける必要があります。

kt変換ActPRT は 【プリンタ名 on LPTn: 】形式のプリンター文字列を実行環境に合わ
せて変換してくれます（ネットワークプリンタも可）。

【 使 用 例 】

Sub xxx()
Const cstEPSON As String = "EPSON PM-670C on LPT1:"
Const cstCanon As String = "Canon BJC-465J on LPT1:"

Dim str保存ActPRT As String
：
：
' 現在の設定値を保存する
str保存ActPRT = Application.ActivePrinter

if (EPSONを選択した場合) Then
Application.ActivePrinter = kt変換ActPRT(cstEPSON)
Else
Application.ActivePrinter = kt変換ActPRT(cstCanon)
End If

～.PrintOut

' 設定値を元に戻す
Application.ActivePrinter = str保存ActPRT
：
：
End Sub


[ kt全角有無 ] 関数

指定した文字列内に全角文字が含まれているかを判定する関数です。

【 構 文 】

kt全角有無 | ( 文字列 )
返却値 | -- | Boolean 型
文字列 | -- | String 型

【 返却値 】

True ： 全角文字を含んでいる
False ： 半角文字のみ

【 パラメータ 内容 】

[ 文字列 ]
 | 全角文字の有無を調べる文字列を指定します。

【 解 説 】

下記の コード でも同じ判定処理が出来ます。

If (Len(文字列) <> LenB(StrConv(文字列, vbFromUnicode))) Then
MsgBox "全角文字があります"
End If


[ kt文字種変換 ] 関数

StrConv 関数では出来ない文字種別の全角⇔半角変換を行なう関数です。

【 構 文 】

kt文字種変換 | ( 変換元, 変換対象, 変換方向 )
返却値 | -- | String 型
変換元 | -- | String 型
変換対象 | -- | String 型
変換方向 | -- | String 型

【 返却値 】

「変換元」の文字列を変換した結果を返します。

パラメータ 不正の場合は、「変換元」 の内容が そのまま返ります。

【 パラメータ 内容 】

[ 変換元 ]
 | 変換する文字列を指定します。
[ 変換対象 ]
 | 変換する 文字種 を下記の文字で指定します。 同時に複数の文字種を指定しても構いません（ "NAK" ， "NA" など）。 数字 ： Ｎ または n 英字 ： A または a カナ ： K または k
[ 変換方向 ]
 | 変換する方向を下記の文字で指定します。 全角 ⇒ 半角 ： Ｎ または n 半角 ⇒ 全角 ： W または w

【 解 説 】

kt文字種変換 を通すと､変換対象/変換方向 に関わりなく､ kt補正StrConv による
クォーテーション/アポストロフィー の補正変換が行なわれます。

詳細は kt補正StrConv を参照してください。

【 使 用 例 】

kt文字種変換("Aｱ1bｲ2", "AK", "W") ⇒ "Ａア1ｂイ2"


[ kt補正StrConv ] 関数

StrConv 関数で誤変換された クォーテーション/アポストロフィー を正しい文字に変換する関数です。

【 構 文 】

kt補正StrConv | ( 文字列 )
返却値 | -- | String 型
文字列 | -- | String 型

【 返却値 】

正しい文字に変換した文字列が返ります。

誤変換された クォーテーション / アポストロフィー が含まれていなければ､
渡された 「文字列」 がそのまま返ります。

【 パラメータ 内容 】

[ 文字列 ]
 | チェック する文字列を指定します。

【 解 説 】

StrConv 関数では アポストロフィー（’） と クォーテーション（”） の 半角⇔全角変換 は不可逆です。

半角の アポストロフィー（’） と クォーテーション（”） を全角変換すると下記の文字に変換されますが､
この文字は半角変換できません。

kt補正StrConv は指定した文字列内にある上記文字を正しい 全角の [ ’ ] [ ” ] に変換します。


[ kt反転 ] 関数

指定した文字列を逆順に並び替える関数です。

【 構 文 】

kt反転 | ( 文字列 )
返却値 | -- | String 型
文字列 | -- | String 型

【 返却値 】

「文字列」 に指定した内容を､逆順に並び替えて返します。

【 パラメータ 内容 】

[ 文字列 ]
 | 任意の文字列を指定します。

【 解 説 】

Excel 2000 以降で利用できる ＶＢＡ関数 [ StrReverse ] と同じ機能です。


[ プログレスバー ]

利用者側で プログレスバー用の UserForm を用意する必要なく､サブルーチンコール だけで
処理の進捗度を示す プログレスバー を表示できます。

また､プログレスバー を省略して 『メッセージのみ』 という指定もありますので､ 【お待ち下さい】
メッセージとして利用する事も可能です。

プログレスバー の フォーム には 『中断ボタン』 も用意しています。

【 解 説 】

AddinBox にて別に公開している 「プログレスバー表示アドイン」 と同じものです。

「データベース の クエリー処理」 や 「AdvancedFilter などの フィルター処理」 といった ＶＢＡ マクロ 側で
ループ を構築しない処理には利用できません。

この機能は [ ktRunPrgsWait / ktInitPrgsWait / ktDispPrgsWait ] の３ つの サブルーチン を使います。
動作の仕組み については【 図 解 】を参照して下さい。

ktRunPrgsWait を Call する プロシジャー と､ ktInitPrgsWait / ktDispPrgsWait を Call する プロシジャー は
必ず分けて作成して下さい。ひとつのプロシジャーで全てを済ませる事は出来ません。

・ ktRunPrgsWait を Call する プロシジャー は [ 標準 / UserForm / シート モジュール ] の どこに
記述しても構いません。

・ ktInitPrgsWait / ktDispPrgsWait を記述するプロシジャー ( ktRunPrgsWait の パラメータ に
指定した プロシジャー ) を作成する場所は 【 標準モジュール 】 だけです。
また､その プロシジャー は必ず 【 Public 】 とし､ 【 引数 ( Variant 型 ) をひとつだけ定義 】 して下さい。

ktInitPrgsWait をもう一度実行すれば､新たな設定で ループ をやり直すことも出来ます （使用例 を参照）。

「AddinBox / プログレスバーの作り方」 も参考にしてください。

【 ktRunPrgsWait : 構文/パラメータ内容 】

[ プログレス フォーム の 表示 ] および
[ フォーム から起動してもらう ループ処理 プロシジャー の指定 ]
を行なう 制御ルーチン です。

ここで指定する プロシジャー は 【 Public 】 とし､ ダミーの引数 ( Variant型 ) を、ひとつだけ定義
します (必須。マクロの実行ダイアログに表示させない為に必要です）。

親プロシジャー との データ の引継ぎには [ Public変数 ] を利用してください。

Call ktRunPrgsWait | ( CallProc, CallModule, CallBook )
CallProc | -- | String 型
CallModule | -- | String 型
CallBook | -- | String 型
[ CallProc ]
 | ループ 処理 を 記述してある [ プロシジャー名 ] を指定します。
[ CallModule ]
 | CallProc に指定する プロシジャー が記述してある [ 標準モジュール名 ] を指定します。
[ CallBook ]
 | この 引数には、必ず ThisWorkbook.Name と 記述してください。

【 ktInitPrgsWait : 構文/パラメータ内容 】

プログレスフォーム の [ 利用方法 ] と [ メッセージ ] を指定する初期化ルーチンです。

Call ktInitPrgsWait | ( [ Comment1 ], [ Comment2 ], [ Comment3 ], [ PrgsBar ],
 | [ CancelBtn ], [ MaxLoop ], [ CancelInterval ] )
Comment1 | -- | String 型 (省略可, 省略時： "しばらくお待ち下さい" )
Comment2 ～ 3 | -- | String 型 (省略可, 省略時： 空文字 ))
PrgsBar | -- | Boolean 型 (省略可, 省略時： True )
CancelBtn | -- | Boolean 型 (省略可, 省略時： True )
MaxLoop | -- | Long 型 (省略可, 省略時： 1 )
CancelInterval | -- | Long 型 (省略可, 省略時: 1 )
[ Comment1 ] ～ [ Comment3 ]
 | フォームに表示する メッセージ を指定します。 省略すると 「しばらくお待ち下さい」 になります。
[ PrgsBar ]
 | プログレスバー の 表示有無を指定します。 True or 省略 ： 表示する False ： 表示しない （メッセージ のみが表示されます）
[ CancelBtn ]
 | 中断 ボタン を 有効 にするか 否か を指定します。 True or 省略 ： 中断ボタンは有効 False ： 中断ボタンは無効
[ MaxLoop ]
 | [ PrgsBar = True or 省略 ] の場合に、進捗率 を計算する為の ループ予定回数 を指定します。 （例） For i = 1 To 200 ⇒ 200 回 For i = 500 To 100 Step -1 ⇒ 401 回 For i = 100 To 10000 Step 5 ⇒ 1981 回 ループ予定回数 = ABS( ( 終了 - 開始 ) / Step ) + 1 For Each で コレクション を扱う場合はCount プロパティ の値を指定します。
[ CancelInterval ]
 | [ CancelBtn = True or 省略 ] の場合に指定します。 中断ボタン を押せるように､ ＯＳへ制御を戻す (DoEvents) ループ間隔を指定します。 省略時は１ です（ 即ち、毎回）。 "毎回" にすると 処理時間 が長くなり過ぎますので､ループ回数との兼ね合いで 10 ( 10 回 に 1 回 ) とか、50 ( 50 回 に 1 回 ) などを指定してください。値は任意です。

【 ktDispPrgsWait : 構文/パラメータ内容 】

プログレスバー の [ 再描画 ] と [ 中断ボタンの取り込み ] を行なうルーチンです。

Call ktDispPrgsWait | ( CancelClick )
CancelClick | -- | Boolean 型 ( ByRef )
[ CancelClick ] ( ByRef )
 | 呼び元での 変数定義 が必要です。 [ CancelBtn = True or 省略 ] の場合に、ループ中に 中断ボタン が 押されているか否かが返されます。 True ： 中断ボタン が 押された False ： 〃 が 押されていない [ CancelBtn = False ] の場合は､毎回 False が返ります。

【 使 用 例 】

----- 標準モジュール -----
Public ～～～～ '分離したループ処理と共通に使う変数

Sub ループ処理の親ルーチン()
Call ktRunPrgsWait("LoopSub", "Module2", ThisWorkbook.Name)

End Sub

----- 標準モジュール： Module2 -----
Public Sub LoopSub(ByVal Dummy As Variant)
'マクロの実行ダイアログに表示されないようにダミーの引数をひとつ設ける(必須)
Dim i As Integer
Dim MsgResp As Integer
Dim CancelClick As Boolean '中断ボタンのOn/Off受け取り

Call ktInitPrgsWait("時間の掛かる処理を実行中です", _
"しばらくお待ちください", _
"『中断ボタン』で処理中断します", _
MaxLoop:=ループ回数, _
CancelInterval:=10)

For i = 1 To ループ回数
～～ ループ内の処理 ～～
：
：

Call ktDispPrgsWait(CancelClick) 'プログレスバーの更新
If (CancelClick = True) Then
MsgResp = MsgBox("中断ボタンが押されました" & _
vbCrLf & "中断しますか？", _
vbExclamation + vbYesNo + vbDefaultButton2)
If (MsgResp = vbYes) Then
Exit For
End If
End If
Next i
End Sub


[ プログレスバー 図解 ]

[ 戻る ]


【 §７ ＦＡＱ 】

Ｑ１ 文字化けしてるんですけど‥‥‥。

Ｑ２ 休日マップには 「ノーマル」 と 「圧縮」 がありますけど､どちらを使えば良いんですか？

Ｑ３ kt関数が使えません。

Ｑ４ 分析ツール 「WORKDAY 」 では 「祝日」 を渡してましたけど､kt関数では必要ないんですか？

Ｑ５ 「kt閉じるボタン」でExcelの閉じるボタンを無効化出来ない

Ｑ６ 基本的に 「土曜日」 は休業日なんですが､年に数日だけ出社日の場合があります。
休日マップでどうのように設定すればいいですか？

Ｑ７ 特定日の日付入力欄 に複数の日付を一度に入力する （2000/1/2, 3 という風に) ことは
出来ないのですか？

Ｑ８ ワークシート に記述した 「kt関数」 が 【#NAME? 】 になってしまった。

Ｑ９ カレンダー入力フォームの呼び出しを 『右クリック』 にしたい。

Ｑ１０ ｋｔＰｅｒｉｏｄＹＭＤ の計算方法のどれを使ったら良いんですか？

Ｑ１１ 暦作成で作ったカレンダーに色が付かないんですが？

Ｑ１２ 『条件付書式』 の条件式で ｋｔ関数 を記述すると エラー になります

Ｑ１３ 祝日法の改正に伴う注意事項

Ｑ１４ 『ktSound 』 による Wave 音が止まらない

Ｑ１５ 『kt関数メニュー 』 が消えてしまった

Ｑ１６ タスクバーに [ kt関数Addin.xla ] と一瞬表示される

Ｑ１７ エクセル終了時に [ kt関数Addin.xla ] の保存確認ウィンドウが表示される 【修正済】

Ｑ１８ CreateObject で呼び出した時に [ kt関数Addin.xla ] でエラーになる 【修正済】

Ｑ１９ Workbooks.Open の戻り値が [ kt関数Addin.xla ] を指してしまう

Ｑ２０ CreateObject で､アドイン登録済の [ kt関数Addin.xla ] が読み込まれない

Ｑ２１ Ver 2.60～2.72で､Excel97 の場合にアドイン登録時にエラーとなる。 【修正済】

Ｑ２２ ブック を別ドライブ/フォルダへ移動すると リンクエラー および [ #NAME? ] になる。

Ｑ２３ Ver 2.80 をExcel2002 で使うと実行時エラーになる。 【修正済】

Ｑ２４ kt関数メニューを実行しようとすると下記のエラーが出る。 【修正済】
「'kt関数Addin.xla' と同じ名前のファイルが既に開いています」

Ｑ２５ 『Ver 2.90 → Ver 3.00』 の変更と祝日法改正（昭和の日） に関する注意

Ｑ２６ 『Ver 3.00 → Ver 4.00』 の変更と祝日法改正（山の日） に関する注意

Ｑ２７ kt関数メニュー/カレンダーマーク描画 および ktCalShape / ktCalShape2 で、
「枠線のみ（塗り潰し無し）」 指定が 【塗り潰し】 になる。 【修正済】

Ｑ２８ グラフオブジェクト を選択した際に kt関数メニュー が消える。 【修正済】

Ｑ２９ 他から貰った 『kt関数アドインを使っているワークブック』 が リンクエラー および [ #NAME! ] になる。

Ｑ３０ [ 標準 ] 画面の右クリックメニューを変更できない。
右クリックメニューの変更を行なうと [ 改頁プレビュー ] 画面の方に反映される。 【修正済】

Ｑ３１ Excel 2013 で [ kt関数メニュー ] [ 右クリックメニュー ] の変更（追加・削除）が反映されない。 【修正済】

Ｑ３２ 『Ver 4.00 → Ver 5.00』 の変更と祝日法改正（天皇誕生日） に関する注意

Ｑ３３ kt関数を利用している ワークブック の リンク 変更手順 ( xla 版 から xlam 版へ変更 )

Ｑ３４ 『Ver 5.00 → Ver 5.10』 の変更と祝日法改正（体育の日の改名 ,東京五輪祝日移動(2020年)） に関する注意

Ｑ３５ kt関数Addin.xla/xlam を削除してもアドイン登録ダイアログのリストから消えない。または、
新バージョンに差し替えても旧バージョンのままでアップデートできない。

Ｑ３６ 『Ver 5.10 → Ver 5.20』 の変更と祝日法改正（即位関連休日） に関する注意

Ｑ３７ 新元号 [ 令和 ] に対応していますか？

Ｑ３８ 『Ver 5.31 → Ver 5.40』 の変更と祝日法改正（東京五輪祝日移動(2021年)） に関する注意

以降､ヘルプの改版の際に適宜追加していきます。


【 ＦＡＱ 回答 】

Ｑ１ 文字化けしてるんですけど‥‥‥。
Ａ１ 休日マップデータのことですね。休日マップデータ自体はサイズが大きいので 『圧縮』 してからセルに
書き込ませる事が出来るようにしています。バイナリーデータ が文字化けして表示されている訳では
ないので安心して下さい。

休日マップデータ 【 ノーマル 】 ４年間 ⇒ １４７４文字

休日マップデータ 【 圧 縮 】 ４年間 ⇒ ２５４文字

１１文字目以降が カレンダーデータ になっていますが､これを圧縮すると､ご覧のように英数字の羅列
になり 〔１４７４ ⇒ ２５４ 文字 （４年間）〕 まで小さくなります(圧縮後は [ A～Z , a～z , 0～9 , + / ] の
６４種類の文字で記録されます）。
尚､先頭の１０文字は作成日時などが記録されており､最初から圧縮されています。休日マップデータの
セルにカーソルを移してから 『 kt関数メニュー(休日Map情報) 』 をクリックすると､その情報が表示され
ます。

Ｑ２ 休日マップには 「ノーマル」 と 「圧縮」 がありますけど､どちらを使えば良いんですか？
Ａ２ 「ノーマル」 と 「圧縮」 のどちらを使っても同じ結果が得られます。
「圧縮」 を用意した理由は､ワークシート全体のコピーを行なう場合に【２５５文字を越えるデータは２５６
文字以降が欠落する】という制限条項に対処する為です。『４年間』 の場合は圧縮すると 『２５４文字』
になりますので､この制限条項をクリアします。ただし､「圧縮」 を渡すと内部でその都度【解凍処理】が
動く為､営業日計算などを連続して実行する場合などには 注意 が必要です。

Ｑ３ kt関数が使えません。
Ａ３ ワークシート上で利用する場合は 『 kt関数Addin 』 がアドイン登録されているだけでＯＫですが､
ＶＢＡから利用する場合は､ブックごとに 『 kt関数Addin 』 を 【参照設定】する必要があります。

Ｑ４ 分析ツール 「WORKDAY 」 では 「祝日」 を渡してましたけど､kt関数では必要ないんですか？
Ａ４ kt関数では 「現行の祝日法で制定されている祝日」 は全てアドイン側で自動認識できますので､
ユーザー側で用意する必要はありません。パラメータ 「 休日Map 」 に 【固定休日】 を指定する
場合は 『８文字目を"1"』とすると祝日/振替休日を休業日として処理します。

Ｑ５ 「kt閉じるボタン」 でExcel の閉じるボタンを無効化出来ない
Ａ５ UserForm も Excel も同じＡＰＩを使って閉じるボタンを無効化出来ます。しかしながら､閉じるボタンを
無効化するだけで 「終了手段を別に設ける」 ことをユーザーが忘れる可能性を考慮して､【安全】の為
に敢えてサポートしていません。どうしても Excel の 閉じるボタンを無効化したい方は､下記書籍などを
参考にして各自で ＡＰＩ を組んでください。
エーアイ出版 刊　大村あつし 著 「VBAユーザーのための、Win32APIプログラミングガイド」

Ｑ６ 基本的に 「土曜日」 は休業日なんですが､年に数日だけ出社日の場合があります。
休日マップでどうのように設定すればいいですか？
Ａ６ 「休日マップの作成」 で､先ず【全ての土曜日】を休日にした後､『特定日の日付』 に､その例外的に
出社日となる日付を入力し【休日解除】ボタンをクリックしてください。

Ｑ７ 特定日の日付入力欄に複数の日付を一度に入力する （2000/1/2 , 3 という風に) ことは
出来ないのですか？
Ａ７ 特定日の日付入力欄はダブルクリックすると､カレンダーフォーム が開くようになっています。入力欄が
空白の場合は【本日日付の”月”】で表示されますが､日付が入っていれば､その日付の【年月】で表示
されます。

カレンダーフォームで 「2000/1/2」 を入力して休日指定した後にそのまま （入力欄に 「2000/1/2」 と
表示されたまま） ダブルクリックすると､「2000年１月」 で表示され 「2000/1/2」 が休日表示のピンクに
なっていますから､続けて 「３日」 をクリックして日付を入力してください。

Ｑ８ ワークシートに記述した 「kt関数」 が 【#NAME? 】 になってしまった。
Ａ８ お使いの ワークブック には ＶＢＡ用に 『kt関数Addin.xla への参照設定』 が付いていませんでしたか？
そして、【#NAME? 】 が出る前に 『kt関数Addin.xla への参照設定』 を解除してませんか？
それならば、再び 「参照設定」 を付けてやれば元に戻ります。

（原 因）
「kt関数アドイン」 に限らず､アドイン登録されたユーザー定義の外部関数をワークシートに記述すると
『外部参照式』 になります。

〔 =kt祝日名取得 ("2000/5/5") 〕 という式を書き込むと､アドイン登録されたブックから､その名前を検索
して､
='C:\Program Files\Microsoft Office\Office\
Library\kt関数Addin.xla'!kt祝日名取得("2000/5/5")
という風に外部参照式が作成されます（外部参照部分の表示はされません）。

しかし､『kt関数Addin.xla への参照設定』 が有る状態で式を書き込むと､参照設定経由で名前が見つ
かる為に､外部参照式が作成されず､単に 〔 =kt祝日名取得("2000/5/5") 〕 としてセルに書き込まれ
ます。

この後で参照設定を解除すると､単に 〔 =kt祝日名取得("2000/5/5") 〕 と書き込まれた式は､外部
参照を持っていないので､書き込まれているブックから名前検索することになりますが､その名前の関
数が存在しないので 【#NAME? 】 が表示されます。

ワークシートに関数を記述する際は 『参照設定を一旦解除』 するようにすれば､このようなトラブルは
回避できます。

尚この理由で #NAME? になっているセルがひとつでもあると、元々正しくアドイン参照で書き込まれ
たフルパスを持つ同じ関数を使う式も、再計算が行なわれる際に 「参照設定経由の関数式」 の仲間
にされて #NAME? になってしまいます。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
参照設定を付けない状態でブックを使う場合は、「編集/置換/全て置換」 を使って以下のようにすれば
復旧できます。
=kt祝日名取得 ("2005/5/5")
となっているとすると、kt祝日名取得 を下記で置換します。
'C:\Program Files\Microsoft Office\Office\Library\kt関数Addin.xla'!kt祝日名取得
なお、上記は Windows98SE / Excel 2000 での パスです。
また、kt関数Addin.xla は既に アドイン読み込み されているので、置換した後でも、外部参照式は表示
されません。

こちらの ＦＡＱ （ Ｑ２２ , Ｑ２９ ） も参照してください。

Ｑ９ カレンダー入力フォーム の呼び出しを 『 右クリック 』 にしたい。
Ａ９ 「休日マップ作成」 「暦シート作成」 での呼び出しは 『 ダブルクリック 』 だけです。
『 ktCalDate 関数 』 をシートモジュールのマクロに記述する場合なら､利用するイベントプロシジャーを
『右クリック』 に変えればＯＫです。

全てのワークシートで利用する場合は 「 ThisWorkbook 」 モジュールに下記を記述
Private Sub Workbook_SheetBeforeRightClick _
(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
Dim MyDate As Date
If (Target.Column = 1) Then
If ktCalDate(MyDate, Target.Value ) Then
Target.Value = MyDate
End If
Cancel = True
End If
End Sub

あるワークシートだけで利用する場合は 「そのシート」 のモジュールに下記を記述
Private Sub WorkSheet_BeforeRightClick _
(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
Dim MyDate As Date
If (Target.Column = 1) Then
If ktCalDate(MyDate, Target.Value ) Then
Target.Value = MyDate
End If
Cancel = True
End If
End Sub

UserForm の場合､右クリック に対応するイベントプロシジャーはありません。 『 MouseDown 』 イベント
で【ボタン番号】を確認して対応できますが、何故か右クリックでは 『 MouseDown 』が ２ 回連続して発生
していますので､止めた方が良いです。

Ｑ１０ ktPeriodYMD の計算方法のどれを使ったら良いんですか？
Ａ１０ 私の方から 「これを使ってください」 「これが一番正しい」 という推薦は出来ません。
利用される方の職場の事務手続きで定められている計算方法に合ったものを使ってください。

日本での期間計算は、 『 特に定めがない場合は 民法 に従う 』 というのが基本です。
「民法に従う計算」 は "1a" です。 尚、Ver 4.00 から ktDATEDIF 関数も追加されています。

Ｑ１１ 暦作成で作ったカレンダーに色が付かないんですが？
Ａ１１ カレンダーを出力したブックのカラーパレットを 『カスタマイズ』 していませんか？
「ｋｔ暦作成」 が設定しようとしているカラーが出力先ブックのカラーパレットに存在しない場合は､
そのカラーを設定しないようにしています （参考 ： ktColorIndexGet ）。

Ｑ１２ 『条件付書式』 の条件式でkt関数を記述するとエラーになります
Ａ１２ Excel の仕様として、『条件付書式』 の条件式に アドイン関数などの､外部ブック に在る関数 は指定
できません。

kt祝日判定などを使ってセルに色を付ける等の効果を施す場合は､非表示のダミー列を用意して､
そこに条件式を記述し､『条件付書式』 ではダミー列の結果を参照するようにします。

Ｑ１３ 祝日法の改正に伴う注意事項
Ａ１３ 祝日の改正に伴い、既に作成済みのワークブックに対して下記の点に留意して下さい。

( a ) 改正された「祝日」以降の日付に対して「kt営業日算出/kt営業日数」等を適用している
データについては､祝日日付の変更により結果が変わってくる場合がありますので､
【再計算】する必要があります。

( b ) 『固定休日コード』 を使っている場合は､そのまま【再計算】させて下さい。

( c ) 『休日マップ』 を使っている場合は､『休日マップ作成』 フォームの【読込機能】で【マップデータ】を
「改正後の祝日法」 に適合した内容へ変換できます。ただし､この機能を利用するには､【カレンダー
出力】により出力された 『休日設定条件』 が必要です。

( d ) マクロで 「kt営業日算出/kt営業日数」 の結果を書き込んでいる場合は､そのマクロの再実行（もしくは
関連する部分だけを再計算させるマクロを作って実行する）が必要になります。

Ｑ１４ 『 ktSound 』 によるWave 音が止まらない
Ａ１４ 「非同期/連続再生」 で実行した場合は､『停止』 指示を出すまで延々と再生が続きます。開発中に
停止手段を用意する前に連続再生してしまった場合や､何らかの原因で停止指示を出す前にエクセル
がダウンしてしまった場合などに対処する為に､『 kt関数メニュー/バージョン』 画面に【再生停止ボタン】
を用意してあります。

Ｑ１５ 『 kt関数メニュー 』 が消えてしまった
Ａ１５ 他のエクセルフリーソフトでは､自分用に追加したメニューを削除するのに 「Reset 」 メソッドを使って
いるものがあります。Reset メソッドでは 『標準メニュー』 がインストール後の初期状態に戻りますので､
【kt関数メニュー 】も消えてしまいます。そのような場合は､下記のいずれかの方法で復元して下さい。

(1) 新規ブックを開き､ [ ツール ⇒ アドイン ] で 【kt関数Addin 】のチェック を外してＯＫし､一旦アド
イン解除します。その後､再びチェックを付けてアドイン登録すれば､メニューが戻ります。

(2) 新規ブックを開き､ＶＢＥで標準モジュールを挿入して､下記マクロ をコピペ します。
Sub メニュー復元()
Call kt関数Version
End Sub

ＶＢＥの [ ツール ⇒ 参照設定 ] で 【kt関数Addin 】 にチェックを付けてから､上記マクロを実行
すると､ 『 バージョンフォーム 』 が表示されます。【 コマンドバー ⇒ 標準メニューバー 】 と書い
てあるボタンをクリック すれば､メニューが戻ります。終わったら､使った新規ブックは破棄して下さい。
(補) Ver 4.00 より、メニューの 「コマンドバー」 指定が廃止されました（標準メニューバーのみ）為、
(2) の方法は利用できません。

Ｑ１６ タスクバーに [ kt関数Addin.xla ] と一瞬表示される
Ａ１６ Ver 2.60 から､関数貼付ダイアログにおいて､kt関数アドインの関数を 〔ユーザー定義〕 カテゴリから､
専用の【kt関数アドイン】カテゴリに移しました。
アドイン読み込み時に【kt関数アドイン】カテゴリを増設する処理の中で一時的に [ kt関数Addin.xla ]
のアドイン属性を解除している為､ タスクバーに [ kt関数Addin.xla ] と一瞬表示されます。利用に際し
支障の出るものではありませんので気にしないで下さい。

Ｑ１７ エクセル終了時に [ kt関数Addin.xla ] の保存確認ウィンドウが表示される
Ａ１７ Ver 2.60 において､この不具合がありましたが、【 Ver 2.61 】 にて修正しました。

【kt関数アドイン】カテゴリ増設の為に 『マクロシートでの名前定義』 を行なっています。元々､処理後
に [ Saved = True ] にて保存回避するよう処置してありましたが､動作環境によって再び [ False ]
状態になっていたようです。アドインブックが閉じられる前に再度 [ Saved = True ] にて処置するよう
にしました。この症状が出るケースの一例としては､エクセル起動中に
『画面のプロパティ / デザイン』 においてフォント等を変更
を行ない､その後エクセルを終了させると 「保存確認ウィンドウ」 が出ます。

Ｑ１８ CreateObject で呼び出した時に [ kt関数Addin.xla ] でエラーになる
Ａ１８ Ver 2.60 ～ 2.70 において､この不具合がありましたが、 【 Ver 2.72 】 にて修正しました。

[ kt関数Addin.xla ] への参照設定を持つブックを､ 『 CreateObject 』 で起動したエクセルの下で
オープンする場合に､関数カテゴリ の増設処理で利用している 『 Excel4Macro 』 が動作しないのが
原因です（エクセルの仕様によるものと思われます）。
エラーダイアログ を無視すると､そのまま正常に使えますが､終了時に [ kt関数Addin.xla ] の保存
確認 ウィンドウが表示されます。「アクセスからエクセルブックを操作する」 といった処理などが､この
ケース に該当します。

Ｑ１９ Workbooks.Open の戻り値が [ kt関数Addin.xla ] を指してしまう
Ａ１９ 下記のマクロで､ [ oWkbk ] が指し示すブックが [ kt関数Addin.xla ] になります。
Dim oWkbk As Workbook
'Book1.xls は kt関数Addin.xls への参照設定を持つ
Set oWkbk = Workbooks.Open(Filename:="C:\～\Book1.xls")
MsgBox oWkbk.Name '← [ kt関数Addin.xla ] が表示されます

Ver 2.50 までは､正しく [ Book1.xls ] が設定されていました。
Ver 2.60 から導入した【kt関数アドイン】カテゴリの増設処理で､一時的にアドイン属性を解除して
いる為､「参照設定」 経由で一緒に読み込まれる際に [ kt関数Addin.xla ] が [ Book1.xls ] の
前面に出てしまうのが原因です（Ｑ１６ 参照）。

以下のような マクロ に改める事で回避できます。
Dim oWkbk As Workbook
'Book1.xls は kt関数Addin.xls への参照設定を持つ
Workbooks.Open Filename:="C:\～\Book1.xls"
Set oWkbk = Workbooks("Book1.xls")

未だ [ kt関数Addin.xla ] が読み込まれていない状態で実行する場合に､ Book1.xls と一緒に
[ kt関数Addin.xla ] も読み込まれる為に起きる症状ですので､ 『アドイン登録』 などにより､既に
読み込み済みの状態ならば問題はありません。

Ｑ２０ CreateObjectで､アドイン登録済の[kt関数Addin.xla]が読み込まれない
Ａ２０ 『CreateObject 』 でエクセルを起動した場合にはアドインブックが読み込まれないという仕様がある
為に､「アクセスからエクセルブックを操作する」 というような処理においては注意が必要です。
--- サポート技術情報 ---
[XL] CreateObject を使用しているとアドインが読み込まれない

参照設定が付けてあるブックを読み込む場合ならば､ 「参照設定」 経由でアドインが読み込まれますが､
参照設定が付いていない （アドイン登録のみ､エクセルシート上での [ kt関数 ] 利用のみ） ブックを
『 CreateObject 』 で開く場合には､そのブックに先立ち下記のように [ kt関数Addin.xla ] も開いておく
必要があります。

Dim oApp As Excel.Application
Dim oWkbk As Excel.Workbook
Dim cstAddinPath As String

Set oApp = CreateObject("Excel.Application")
cstAddinPath = oApp.LibraryPath '[ C:\Program Files\Microsoft Office\Office ]

With oApp.Workbooks
'先に[kt関数Addin.xla]を読み込む
.Open FileName:=cstAddinPath & "\kt関数Addin.xla"
.Open FileName:="C:\～\Book1.xls"
End With
Set oWkbk = oApp.Workbooks("Book1.xls")
'oApp.Visible = True '←必要ならば
'oApp.UserControl = True '←必要ならば

Ｑ２１ Ver 2.60 ～ 2.72 で､Excel97 の場合にアドイン登録時にエラーとなる。
Ａ２１ 【 Ver 2.73 / 2.80 】 で修正しました。

--- 障害原因 ---
・ ktMsgBox / ktMsgBoxEX 関数の [ Buttons ] 引数の自動メンバ表示を行なうには､属性を
[ As vbMsgBoxStyle ] とする必要があるが､Excel 97では [ As vbMsgBoxStyle ] が コンパ
イルエラーになる為､[ As Long ] で代替する事になる。
・ このExcel 97 / Excel 2000 以降での属性の切り替えの為に､関数定義（Function文） を 『条件
付コンパイル』 で対応していた。
・ 関数貼付ダイアログでの カテゴリ/コメント定義を行なう 「MacroOptions メソッド」 実行時に､
この条件付コンパイルが巧く機能していないようで､Excel 97 の場合でも [ As vbMsgBoxStyle ]
の方を参照しているようで､エラーが発生する。

--- 対処 ---
カテゴリ/コメント定義を止める訳にはいかないので､Excel 2000以降での自動メンバ表示を諦める事
にして､条件付コンパイル部分を取り除いてエラー発生部分を無くします。したがって､今後は､ＶＢＥ
で直接 [ ktMsgBox/ktMsgBoxEX ] をパンチする際に､[ vbOKCancel , vbCritical 等 ] の表示は出て
来ません。
ウィザードを使えば､これらの定数も自動的に記述してくれるので支障は無いと考えます。

Ｑ２２ ブック を別ドライブ/フォルダへ移動すると [ #NAME? ] になる。
Ａ２２ アドインフォルダ を 「”アドインで保存”の際の既定フォルダ」である
[ C:\Windows\Application Data\Microsoft\Addins ] （Windows98SE , Excel2000 ）
にしている場合､アドイン利用ブック を別ドライブ/フォルダへ移した場合に [ #NAME? ] になります。
（エクセルの機能で外部参照式が自動的に移動先フォルダに合わせて変更される為）

このエラーは [ 編集 ⇒ リンクの設定 ⇒ リンク元の変更 ] を行なう事で解消できます。ただし､ブック
を移動させる度に[ リンク元変更 ] の操作が必要になります。

もうひとつのアドインフォルダである､ 『Application.LibraryPath 』で示される
[ C:\Program Files\Microsoft Office\Office\Library ] （Windows98SE , Excel2000 ）
の方にすると､アドイン利用ブックを､別ドライブ/フォルダへ移しても [ #NAME? ] にはなりません。

参考： AddinBox / Tips21: Excelのリンクの管理と格納（ワークブックの移動で起きるリンクエラーの仕組み）

こちらの ＦＡＱ （ Ｑ８ , Ｑ２９ ） も参照してください。

Ｑ２３ Ver 2.80 をExcel 2002 で使うと実行時エラーになる。
Ａ２３ 【 Ver 2.81 】 で修正しました。

--- 症　状 ---
アドイン登録時には問題ないが､その後でエクセルを起動した時に､実行時エラーが発生し､kt関数を
アドインしている限り､ブック操作が出来なくなる。

--- 障害原因 ---
Ver 2.80 から､ktMsgBox (Ver3.1x)用にフォントリストを書式メニューバーの Font-ComboBox から取得
していますが､ここにアクセスする為には Active な Worksheet が存在する必要があります。エクセル起
動時のアドイン読み込み時点では､Active な Worksheet が存在しない為､一時的に 「アドイン属性解除」
を行って対処しています。
Excel 97/2000では､これで問題なく取得できますが､Excel 2002においては､「アドイン属性解除」 を行
なっても Font-ComboBoxにアクセスできない為に実行時エラーになりました。
アドイン登録は､白紙ブックなり､何かブックが開かれている状態で行いますから､Active な Worksheet が
存在し､Font-ComboBoxへのアクセスが可能であり､その為にエラーにはなりません。

--- 対　処 ---
フォントリスト の取得を ＡＰＩ により､直接取得するように変更します。
ただし､Excel 97では使えない [ AddressOf ] 演算子が必要な為､条件付コンパイルによって､Excel 97では
従来通りに書式メニューバーより取得します。

Ｑ２４ kt関数メニューを実行しようとすると下記のエラーが出る。
「'kt関数Addin.xla'と同じ名前のファイルが既に開いています」
Ａ２４ 【 Ver 5.00 】 で対応済みです。
CommandBar による メニュー ( xla 版 ) を [ Temporary = True ] タイプに変更しました。
（ Ver 5.00 / xlam 版は リボンＵＩ になりました）

一端、アドイン解除を行なった後、再度アドイン登録を行なって、メニューを再作成させれば直ります。

kt関数アドインでは、メニューの作成を 「アドイン登録」 時に保存タイプで行なっています（エクセルを
終了させても残り、次回起動時にも使える）。メニューに登録されるマクロの実行情報にはフルパスが
含まれます。そのブックが未だ開かれていなければエクセルがマクロ実行の為に自動的に開きます。
当然、kt関数メニューには、kt関数Addin.xla のフルパス が含まれていますが、それは 「アドイン登録」
を行なった時点でのパスです。もし、その後に kt関数Addin.xla を別フォルダーへ移す(アドイン解除は
していない時に) と、メニューに登録されているパスと、起動中の kt関数Addin.xla のパスが異なる事
になります。そうすると、エクセルは先に説明したようにメニューに登録されたブックを開こうとしますが、
そのブック名もまた kt関数Addin.xla です。エクセルでは、パスが異なっても、同じブック名のブックは
同時には開けないという仕様があります。したがって件のエラーメッセージが表示される事となります。

この問題はメニューのパスを現在実行中のパスに直せば回避出来ますが、その為にはメニューを再作
成する必要があります。メニューを再作成するには、一端アドイン解除によりメニュー削除を行い、その
後再度アドイン登録する事によって対処できます。

Ｑ２５ Ver 2.90 ⇒ Ver 3.00 の変更と祝日法改正（昭和の日）に関する注意
Ａ２５ 2005/5/20 に「昭和の日」 改正祝日法が公布されました（2007/1/1 施行）。
祝日関連機能の 「昭和の日」 対応は Ver 3.00 にてサポート します。
直近で影響の出る（休日日数の増加）年は
2008年（５月６日[火曜] ） と 2009年（５月６日[水曜] ）
です。
その他の注意点については Ｑ１３ と同様です

Ｑ２６ Ver 3.00 ⇒ Ver 4.00 の変更と祝日法改正（山の日）に関する注意
Ａ２６ 2014/5/30 に「山の日」 改正祝日法が公布されました（2016/1/1 施行）。
祝日関連機能の 「山の日」 対応は Ver 4.00 にてサポート します。
その他の注意点については Ｑ１３ と同様です

Ｑ２７ kt関数メニュー/カレンダーマーク描画 および ktCalShape / ktCalShape2 で、
「枠線のみ（塗り潰し無し）」 指定が 【塗り潰し】 になる。
Ａ２７ 【 Ver 4.00 】 で対応済みです。

Excel 2007 以降で 上記の不具合がありました。

「枠線のみ （ 枠線内透過 = 塗り潰し無し）」 の指定は
Excel 2003 以前では、[ Shape_Object.Fill.Visible = False ] のみで ＯＫ でしたが、
Excel 2007 以降では、同時に [ Shape_Object.Fill.Transparency = True ] の指定が必要でした。

Ｑ２８ グラフオブジェクト を選択した際に kt関数メニュー が消える。
Ａ２８ 【 Ver 4.00 】 で対応済みです。

Excel 2007 以降での Excel の不具合に依るものです。
CommandBar オブジェクト で作成した メニュー は、Excel 2007 以降では アドインタブ に 収録されます。
その内、標準メニューバー ( "Worksheet Menu Bar" ) 内に作成された ユーザーメニューについては、
シート上のグラフオブジェクト を選択した際に 【 アドインタブ から消える 】 という エクセル の不具合が
あります。
[ KB2648925 ] https://support.microsoft.com/ja-jp/kb/2648925
この時、アドインタブに収録されている ユーザーメニュー が他に無ければ、アドインタブ自体も消えます。
[ ツール メニュー配下 ] など、標準メニューバー以外に作成した ユーザーメニュー であれば、この不具
合は起こりません。

Excel 2003 以前は 「標準メニューバー内」、Excel 2007 以降は 「ツール メニュー配下」 という方法で
対処しました。

Ｑ２９ 他から貰った 『kt関数アドインを使っているワークブック』 が リンクエラー および
[ #NAME! ] になる。
Ａ２９ Ver 4.00 では、下記の ２つのアドインブックを提供しています。
( a ) 97-2003 形式 の kt関数Addin.xla
( b ) 2007 形式 の kt関数Addin.xlam
機能は全く同じですが、Excel 2003 以前では ( b ) の アドインブック は使用できません。

その ワークブック を作成したＰＣの環境 と 貴方のＰＣの環境で、インストール してある アドイン に
( a ) と ( b ) の 違いが無いでしょうか？

( a ) の環境と ( b ) の環境の間で、kt関数を ワークシート 関数として使用している ワークブック を交換
すると リンクエラー になります。 （ 参照 ： §２ 登録と削除 / 3. kt関数アドインの登録 ）

どちらか 一方に 統一して インストール してください。 97-2003 形式の方 ( .xla ) であれば、Excel 2007
以降でも利用できますので、xla に統一した方が良いです。

こちらの ＦＡＱ （ Ｑ８ , Ｑ２２ ） も参照してください。

Ｑ３０ [ 標準 ] 画面の右クリックメニューを変更できない。
右クリックメニューの変更を行なうと [ 改頁プレビュー ] 画面の方に反映される。
Ａ３０ 【 Ver 4.00 】 で 対応済みです。
『標準・改頁プレビュー』 両方の右クリックメニューに kt関数コマンドを追加するようにしました。

Ver 3.00 までは、一部の稀な PC で、そのような症状を起こす場合がありました。
--- 原 因 ---
『標準・改頁プレビュー』 両方の 右クリックメニューの名前は "Cell" という 同じ名前であり、
通常であれば、[ 標準画面 ] 用 ⇒ [ 改頁プレビュー画面 ] 用の順でシステムに登録されてい
ます。

ところが、稀に、[ 改頁プレビュー画面 ] 用 ⇒ [ 標準画面 ] 用の順で登録されている ＰＣ が存在
します。

最初に見つかった方（通常は標準画面のメニュー） にのみ追加した場合、この稀な ＰＣ では 「標準
画面」 の右クリックメニューには追加されず、「改頁プレビュー画面」 の右クリックメニューに追加され
ます。

Ｑ３１ Excel 2013 で [ kt関数メニュー ] [ 右クリックメニュー ] の変更（追加・削除）が反映されない。
Ａ３１ 【 Ver 5.00 】 にて対応済みです。
メニュー作成方法を見直しました。これに伴い、アドイン登録手順も簡易になりました。

Excel 2013 から Excel ウィンドウ が SDI ( Single Document Interface ) に なった影響です。

メニュー変更を伴う
( a ) アドイン登録 ( kt関数メニューが 追加 されます )
( b ) アドイン解除 ( kt関数メニューが 削除 されます )
( c ) [ kt関数メニュー/バージョン情報 ] での 右クリック メニュー の変更
の操作は、
『新規ブック が １つのみ』 の状態
で行ない、その操作後には、
メニュー変更を Excel 全体に反映 させる為に 一旦 Excel を終了
してください。

Ｑ３２ Ver 4.00 ⇒ Ver 5.00 の変更と祝日法改正（天皇誕生日）に関する注意
Ａ３２ 2017/6/16 に 「天皇の退位等に関する皇室典範特例法」 が公布され、その中で「天皇誕生日」
の変更 ( 12/23 ⇒ 2/23 ) が盛り込まれています。

[ 2018年以前 : 12/23 , 2019年 : 天皇誕生日は無し , 2019年以降 : 2/23 ]

祝日関連機能の 「天皇誕生日」 対応は Ver 5.00 にてサポート します。
その他の注意点については Ｑ１３ と同様です

Ｑ３３ kt関数を利用している ワークブック の リンク 変更手順 ( xla 版 から xlam 版へ変更 )
Ａ３３ こちら を参照してください。

Ｑ３４ 『Ver 5.00 → Ver 5.10』 の変更と祝日法改正（体育の日の改名 ,東京五輪祝日移動(2020年)） に関する注意
Ａ３４ 2018/6/13 に 「体育の日の改名」 および 「東京五輪特措法による祝日移動」 が成立しました。 (2020/1/1 施行)
祝日関連機能での 上記の 改正対応は Ver 5.10 にてサポート します。
その他の注意点については Ｑ１３ と同様です

Ｑ３５ kt関数Addin.xla/xlam を削除してもアドイン登録ダイアログのリストから消えない。または、
新バージョンに差し替えても旧バージョンのままでアップデートできない。
Ａ３５ 以下のようなトラブルに出会った場合は、VirtualStore 内の Library フォルダに kt関数Addin.xla/xlam が
在るかを確認してください。在った場合は、そのアドインブックを削除してください。
(例) C:\Users\USER NAME \AppData\Local\VirtualStore
\Program Files (x86)\Microsoft Office\Office16\Library
--- トラブル例 ---
・ kt関数Addin.xla/xlam を Library フォルダから削除しても、アドイン登録ダイアログの リスト から削除され
ない（ リスト の kt関数Addin を選択しても、削除確認メッセーも表示されない）。
・ Library フォルダのkt関数Addin.xla/xlam を新バージョンに差し替えても、エクセルを起動すると旧バー
ジョンのアドインが起動している（メニュー/Version情報の表示も旧バージョン）。

Windows Vista から、Library フォルダは UAC (ユーザーアカウント制御) 管理下のフォルダとなっています。
システム権限の無いユーザーアカウントのまま (UAC を解除しないまま) で Library フォルダ内に ファイルを
保存すると、仮想化フォルダ (VirtualStore) へ飛ばされます。
以降、そのファイルはユーザー/各種アプリ からは正規の Library フォルダ内に在るように見えます（そのファ
イルの内容を書き換える操作をすると仮想化フォルダ内のファイルが更新されます）。
UAC を解除後に正規の Library フォルダに同名ファイルを新たに保存しても、アプリからは仮想化フォルダ内
のファイルの方が優先して見えますので差し替えられていないようにみえます。

Ｑ３６ 『Ver 5.10 → Ver 5.20』 の変更と祝日法改正（即位関連休日） に関する注意
Ａ３４ 2018/12/8 に 「即位の日 (2019/5/1) 」 および 「即位礼正殿の儀 (2019/10/22) 」 の臨時祝日法が
成立しました。 5/1 の祝日化に伴い、祝日に挟まれる 4/30 および 5/2 も 「国民の休日」 となります。
祝日関連機能での 上記の 改正対応は Ver 5.20 にてサポート します。
その他の注意点については Ｑ１３ と同様です

Ｑ３７ 新元号 「令和 」 に対応していますか？
Ａ３４ Ver 5.30 にて 新元号 [ 令和 ] に対応しました。
kt関数アドインが提供する関数/サブルーチン は、新元号「令和」対応になっていない環境でも
[日付] 引数に 「令和 日付文字列 (元年 表記を含む)」 を指定可能です

また、Excel の TEXT/DATEVALUE や VBA の Format / CDate / DateValue / IsDate の 代替関数として
[ 令和 ] 対応日付変換関数 ktEraFormat / ktEraCDate / ktEraIsDate が追加されました。

Ｑ３８ 『Ver 5.31 → Ver 5.40』 の変更と祝日法改正（東京五輪祝日移動(2021年)） に関する注意
Ａ３４ 2020/11/27 に 「東京五輪特措法による祝日移動(2021年)」 が成立しました。 (2021/1/1 施行)
祝日関連機能での 上記の 改正対応は Ver 5.40 にてサポート します。
その他の注意点については Ｑ１３ と同様です

以降､ヘルプの改版の際に適宜追加していきます。


【 §８－１ 使用条件 】

  • 『 kt関数 アドイン 』 は フリーウェア です。

  • 配布ファイルの内容を変更しないという条件で使用/再配布は自由です。
    再配布に当たっては､媒体費等の実費以上の金銭授受は固く禁じます。

  • 『 kt関数 アドイン 』 の （ＨＰ・ブログ・雑誌 等への） 無断転載はご遠慮願います。
    "転載" とは、アドインの配布ファイル、もしくは、配布ファイル内の個別ファイル そのものを、ＨＰ・ブログ・雑誌等の媒体上に載せる事などを指します。

    尚、AddinBox サイト内にある 配布ファイルへの リンク を掲載する事は自由です。

  • [ kt関数 アドイン ] を利用したフリーソフト等の配布に際してのお願い。
    kt関数 アドインを、業務等に使うブックで利用する為に、その利用ブックと一緒に配布する事(再配布)は構いません。ただし、フリーソフト等で利用する場合には、以下の理由で問題と考えますので、そのフリーソフトの配布ファイルに [ kt関数 アドイン ] を含める事はご遠慮ください。

    1. 完全な 『 不特定多数 』 への２次配布になる。
      通常の利用であれば、利用ブック作成者の周辺(社内など)に限られます。また、そのソフトの説明書の書き方によっては、『 kt関数 アドイン 』 の出典が不明になります。

    2. ＨＰ等での公開になる訳ですから「転載」の範疇になります。転載では、私の許諾が必要です。

    3. バグフィックス/改良等で、私のバージョンアップ管理から外れてしまう。
      私の方で幾ら修正を行なっても、その配布ファイル内にあるものは旧バージョンのまま取り残されます。

    4. 雑誌等への掲載依頼が届いた時に作者の許諾のみでは不可。
      そのフリーソフトが雑誌等に掲載（転載の範疇です）される場合を考えると、そのソフト作者の他に 「私の許諾」 も必要になります。

    特に、( c ) 項については利用者にまで迷惑を掛けてしまいます。したがって、kt関数 アドインの利用が必要な場合には、ReadMe.txt 等の使用説明書に
    「尚、このソフトを使用するには別途 [ kt関数 アドイン ] が必要です。
    下記のＨＰからダウンロードしてエクセルにアドイン登録して下さい。」
    http://addinbox.sakura.ne.jp/index.htm
    (旧サイト) http://www.h3.dion.ne.jp/~sakatsu/index.htm
    と記して、フリーソフト等の配布ファイルには含めないで下さい。

【 著作権・免責 】

『 kt関数 アドイン 』 の全ての著作権は 「 作者 ： 角田 桂一 」 が保持します。

尚､このソフトを使用したことで発生したいかなる損害についても、作者は一切責任を負わないものとします。

【 連絡先 】

『 角田 桂一 addinbox@h4.dion.ne.jp 』

『 ホームページ http://addinbox.sakura.ne.jp/index.htm 』
『 (旧サイト) http://www.h3.dion.ne.jp/~sakatsu/index.htm 』

質問・感想・要望・バグ報告などの連絡は下記掲示板へお願いします。
バージョンアップの際の参考にさせて頂きます。

『 足跡 ぼーど 掲示板 https://6532.teacup.com/addinbox/bbs 』

ただし､
『 特定ユーザー向けの限定バージョン依頼 』
『 期限を指定しての機能追加の要望 』
等にはお応えしかねますので､ご了承ください。


【 §８－２ 謝 辞 】

kt関数アドイン の作成にあたり､祝日に関する情報として下記の ホームページ の内容を参考にさせて頂きました。

・ 休日の変遷 『行政歴史研究会』
http://homepage1.nifty.com/gyouseinet/kyujitsu.htm

・ 春分日/秋分日はじめ、祝日・旧暦情報で参考にさせて頂きました。
『こよみのページ』
http://koyomi.vis.ne.jp/mainindex.htm

『おこよみ焼き』
http://www.ffortune.net/calen/index.htm

・ 「kt節気日付」 で二十四節気の略算式を利用させて頂きました。
『 Ishiyama's Home Page 天文関係/天文メモ』
http://i.gmobb.jp/ishiyama/index.htm ( Cache by Internet Archive )
http://i.gmobb.jp/ishiyama/waah/memo.htm#calender ( Cache by Internet Archive )

ここに､皆様にお礼申し上げます。<(_ _)>


【 §８－３ 更 新 履 歴 】

１．２００１年 ３月 ２日 Ver 1.00 （未公開）
２．２００１年 ５月 １０日 Ver 2.00
３．２００１年 ７月 １日 Ver 2.10
４．２００１年 １０月 １２日 Ver 2.20
５．２００１年 １２月 １日 Ver 2.30
６．２００２年 ３月 １２日 Ver 2.40
７．２００２年 ７月 １日 Ver 2.50
８．２００２年 ９月 ３０日 Ver 2.60
９．２００２年 １０月 ３１日 Ver 2.61
１０．２００２年 １１月 １０日 Ver 2.70
１１．２００３年 ６月 １８日 Ver 2.80
１２．２００３年 ６月 ２８日 Ver 2.81
１３．２００４年 ２月 ４日 Ver 2.90
１４．２００５年 ５月 ２２日 Ver 3.00
１５．２０１５年 ９月 ２３日 Ver 4.00
１６．２０１８年 ５月 ９日 Ver 5.00
１７．２０１８年 ６月２４日 Ver 5.10
１８．２０１８年１２月 ９日 Ver 5.20
１９．２０１９年 ４月１７日 Ver 5.30
２０．２０１９年 ５月１１日 Ver 5.31
２１．２０２０年１１月２８日 Ver 5.40

---- Ver 5.40 変更内容 ---
( 1 ) 各種関数/サブルーチンで下記の 祝日法改正 に対応しました。
・ 東京五輪特措法による祝日の移動 ( 2021年 施行 )
海の日 ： 7/19(3rd Mon) ⇒ 7/22
スポーツの日 : 10/11(2nd Mon) ⇒ 7/23
山の日 ： 8/11 ⇒ 8/8

( 2 ) kt祝日日付 関数の対象に「山の日」を追加しました。

( 3 ) ktPhoneNumber 関数で使用する 「番号翻訳テーブル」 を 2020/6/1 版に差替えました。

---- Ver 5.31 変更内容 ---
( 1 ) ktPhoneNumber 関数で使用する 「番号翻訳テーブル」 を 2019/5/7 版に差替えました。
[ 025-60x , 025-80x ] の局番が追加されました。

---- Ver 5.30 変更内容 ---
( 1 ) 新元号「令和」に対応しました。
kt関数アドインが提供する関数は、新元号「令和」対応になっていない環境でも
[日付] 引数に 「令和 日付文字列(元年 表記を含む)」を指定可能です。

( 2 ) 新元号「令和 」対応の 日付編集関数 ktEraFormat , 日付変換関数 ktEraCDate ,
日付検査関数 ktEraIsDate を追加しました。

( 3 ) 電話番号の 編集/検証ツール ktPhoneNumber 関数を追加しました。

---- Ver 5.20 変更内容 ---
( 1 ) 下記の 祝日改正に対応しました。
・ 2019年の徳仁親王の即位日(5/1) および
祝日に挟まれて「国民の休日」 となる 4/30 (平成天皇の退位日) ＆ 5/2 の ２ 休日
・ 2019年の 「即位の礼 正殿の儀 (10/22) 」

---- Ver 5.10 変更内容 ---
( 1 ) 各種関数/サブルーチンで下記の 祝日法改正 に対応しました。
・ 体育の日 ⇒ スポーツの日 改名 ( 2020年 施行 )
・ 東京五輪特措法による祝日の移動 ( 2020年 施行 )
海の日 ： 7/20(3rd Mon) ⇒ 7/23
スポーツの日 : 10/12(2nd Mon) ⇒ 7/24
山の日 ： 8/11 ⇒ 8/10

( 2 ) kt 関数アドインメニュー ( xlam 版 )
ウィンドウ幅を縮小した場合に、リボンも「ボタンのみ表示」で縮小対応するように、
<group>要素に autoScale 及び image 属性を追加しました。

( 3 ) xla 版用サポートツールの 「 リボンアタッチメント for AddinBox 」 を Ver 2.10 ( 縮小表示対応版 )
に差し替えました。

---- Ver 5.00 変更内容 ---
( 1 ) 「天皇誕生日」 の 祝日改正に対応しました。
休日マップの再作成 / 変更された祝日を跨ぐ営業日計算等の再計算 が必要になります( Q13 )。

( 2 ) メニュー 方式の変更
( a ) 右クリックメニュー
バージョン画面で個別に作成していたのを止め、「kt関数アドイン」 グループ として４ コマンド全てを
起動時に作成します。また、表示位置オプション (セル位置 or 画面中央) の指定も 右クリックメニュー
内に組み込みました。
これに伴い、バージョン画面 での 「右クリックメニュー作成」 機能は廃止となりました。

( b ) kt 関数アドインメニュー ( xlam 版 )
xlam 版では メニュー を CommandBar (アドイン タブ) から リボン インターフェース (AddinBox
メニュー タブ) へ移行します。なお、[AddinBox メニュー] タブは kt電話郵便アドイン ( xlam 版 )
と共用となります。

( c ) kt 関数アドインメニュー ( xla 版 )
xla 版での メニュー は従来通り CommandBar (アドイン タブ) ですが、 [ Temporary=True ] タイプ
に変更となります。
これにより、Excel 2013 以降の ＳＤＩ 環境において、アドインメニューを確実に反映される為に
Ver 4.00 で必要だった手順 が簡素化され、今後は、単純に 「アドイン登録後に エクセル再起動」
のみで済みます。

参照 ： Excel2013/2016 アドインブックによるCommandBar メニューとアドインタブ ( ５ 項 ＆ ６ 項 )

なお、リボンアタッチメント アドイン for AddinBox (Ver2.00) を使うことで、リボンインターフェース の メニュー
を利用することも可能です。

( 3 ) ktJR運賃期間
ＪＲ北海道新幹線に対応しました。
在来線での、ＪＲ北海道区間内のみ ＆ ＪＲ九州区間内のみが
「通常期のみ(繁忙期/閑散期なし)」になっていましたので、
それに対応しました。

( 4 ) ktMsgBox / ktMsgBoxEX
システム音源の処理方法を変更しました。
[ Windows\Media ] ディレクトリ 内の サウンドファイル を ファイル名で直接指定していたのを、
[ コントロールパネル/サウンド ] に設定されている音源を指定するようにしました。

( 5 ) ktSound
コントロールパネル の 「システム音源」 の定義から音種を指定できるようになりました。

( 6 ) Excel2016で UserForm の Width / Height を動的に設定すると以前の バージョン に比べて狭く
なる (7.5p) 症状に対処しました。 ( 参考画像 )
[ UserForm is shorter and narrower than in earlier versions of Excel ]
https://support.microsoft.com/en-us/help/3156159

( 7 ) xla 版用サポートツールの 「 リボンアタッチメント for AddinBox 」 を同梱しました。


[Color Name List]

Web で使用される 『色名』 の一覧です。

ウィザードツールの 文字色/背景色の設定欄を 【右クリック】 すると、
「色名 選択ダイアログ」 から下記の 『色名』 を指定できます。

ColorName List ( &H bb gg rr )
[ A ]
AliceBlue (&HFFF8F0) | AntiqueWhite (&HD7EBFA) | Aqua (&HFFFF00)
AquaMarine (&HD4FF7F) | Azure (&HFFFFF0) |
[ B ]
Beige (&HDCF5F5) | Bisque (&HC4E4FF) | Black (&H000000)
BlanchedAlmond (&HCDEBFF) | Blue (&HFF0000) | BlueViolet (&HE22B8A)
Brown (&H2A2AA5) | BurlyWood (&H87B8DE) |
[ C ]
CadetBlue (&HA09E5F) | Chartreuse (&H00FF7F) | Chocolate (&H1E69D2)
Coral (&H507FFF) | CornflowerBlue (&HED9564) | CornSilk (&HDCF8FF)
Crimson (&H3C14DC) | Cyan (&HFFFF00) |
[ D ]
DarkBlue (&H8B0000) | DarkCyan (&H8B8B00) | DarkGoldenRod (&H0B86B8)
DarkGray (&HA9A9A9) | DarkGreen (&H006400) | DarkKhaki (&H6BB7BD)
DarkMagenta (&H8B008B) | DarkOliveGreen (&H2F6B55) | DarkOrange (&H008CFF)
DarkOrchid (&HCC3299) | DarkRed (&H00008B) | DarkSalmon (&H7A96E9)
DarkSeaGreen (&H8FBC8F) | DarkSlateBlue (&H8B3D48) | DarkSlateGray (&H4F4F2F)
DarkTurquoise (&HD1CE00) | DarkViolet (&HD30094) | DeepPink (&H9314FF)
DeepSkyBlue (&HFFBF00) | DimGray (&H696969) | DodgerBlue (&HFF901E)
[ F ]
FireBrick (&H2222B2) | FloralWhite (&HF0FAFF) | ForestGreen (&H228B22)
Fuchsia (&HFF00FF) |  |
[ G ]
Gainsboro (&HDCDCDC) | GhostWhite (&HFFF8F8) | Gold (&H00D7FF)
GoldenRod (&H20A5DA) | Gray (&H808080) | Green (&H008000)
GreenYellow (&H2FFFAD) |  |
[ H ]
HoneyDew (&HF0FFF0) | HotPink (&HB469FF) |
[ I ]
IndianRed (&H5C5CCD) | Indigo (&H82004B) | Ivory (&HF0FFFF)
[ K ]
Khaki (&H8CE6F0) |  |
[ L ]
Lavender (&HFAE6E6) | LavenderBlush (&HF5F0FF) | LawnGreen (&H00FC7C)
LemonChiffon (&HCDFAFF) | LightBlue (&HE6D8AD) | LightCoral (&H8080F0)
LightCyan (&HFFFFE0) | LightGoldenRodYellow (&HD2FAFA) | LightGreen (&H90EE90)
LightGrey (&HD3D3D3) | LightPink (&HC1B6FF) | LightSalmon (&H7AA0FF)
LightSeaGreen (&HAAB220) | LightSkyBlue (&HFACE87) | LightSlateGray (&H998877)
LightSteelBlue (&HDEC4B0) | LightYellow (&HE0FFFF) | Lime (&H00FF00)
LimeGreen (&H32CD32) | Linen (&HE6F0FA) |
[ M ]
Magenta (&HFF00FF) | Maroon (&H000080) | MediumAquaMarine (&HAACD66)
MediumBlue (&HCD0000) | MediumOrchid (&HD355BA) | MediumPurple (&HDB7093)
MediumSeaGreen (&H71B33C) | MediumSlateBlue (&HEE687B) | MediumSpringGreen (&H9AFA00)
MediumTurquoise (&HCCD148) | MediumVioletRed (&H8515C7) | MidnightBlue (&H701919)
MintCream (&HFAFFF5) | MistyRose (&HE1E4FF) | Moccasin (&HB5E4FF)
[ N ]
NavajoWhite (&HADDEFF) | Navy (&H800000) |
[ O ]
OldLace (&HE6F5FD) | Olive (&H008080) | OliveDrab (&H238E6B)
Orange (&H00A5FF) | OrangeRed (&H0045FF) | Orchid (&HD670DA)
[ P ]
PaleGoldenRod (&HAAE8EE) | PaleGreen (&H98FB98) | PaleTurquoise (&HEEEEAF)
PaleVioletRed (&H9370DB) | PapayaWhip (&HD5EFFF) | PeachPuff (&HB9DAFF)
Peru (&H3F85CD) | Pink (&HCBC0FF) | Plum (&HDDA0DD)
PowderBlue (&HE6E0B0) | Purple (&H800080) |
[ R ]
Red (&H0000FF) | RosyBrown (&H8F8FBC) | RoyalBlue (&HE16941)
[ S ]
SaddleBrown (&H13458B) | Salmon (&H7280FA) | SandyBrown (&H60A4F4)
SeaGreen (&H578B2E) | SeaShell (&HEEF5FF) | Sienna (&H2D52A0)
Silver (&HC0C0C0) | SkyBlue (&HEBCE87) | SlateBlue (&HCD5A6A)
SlateGray (&H908070) | Snow (&HFAFAFF) | SpringGreen (&H7FFF00)
Steelblue (&HB48246) |  |
[ T ]
Tan (&H8CB4D2) | Teal (&H808000) | Thistle (&HD8BFD8)
Tomato (&H4763FF) | Turquoise (&HD0E040) |
[ V ]
Violet (&HEE82EE) |  |
[ W ]
Wheat (&HB3DEF5) | White (&HFFFFFF) | WhiteSmoke (&HF5F5F5)
[ Y ]
Yellow (&H00FFFF) | YellowGreen (&H32CD9A) |