[三流君] −−> [VBAで楽しく] −−> [バックナンバー一覧]
−−> No.095 Access97 カレンダーコントロールから日付選択

Access97 カレンダーコントロールから日付選択

メルマガ発行内容

<Access97 カレンダーコントロールから日付選択>

どうも、三流プログラマーのKen3です。 今回は、 カレンダーコントロールを使用して、 日付の選択と共通フォームの作成にチャレンジしてみたいと思います。 サンプルファイルは、 http://www.ken3.org/vba/lzh/vba095.lzh にdb97-095.mdb(Access97版)が保存されています。 何かの参考となれば、幸いです。

/* * 1.今回のキッカケ */

掲示板に下記の質問をもらいました。 --------------- >カレンダーコントロールを使用して、 >日付を入力することにしました。 >しかし、今日の日付をクリックしても入力できません。 --------------- そんな質問をいただいたので、 カレンダーコントロールを使ってみます。

/* * 2.カレンダーコントロールのイベントを探ってデータセット */

Access97の例ですが、 フォームの新規作成後、 挿入・ActiveXコントロール・カレンダーコントロール8.0を選択します。 ( ) おっ、それらしいのが表示されましたね。 プロパティを見ると、 イベントもあるし、いろいろと操作できそうですね。 おっ、それらしいのが表示されましたね。 プロパティを見ると、 イベントもあるし、いろいろと操作できそうですね。 ~~~~~~~~ なんて、言ってました。 一番簡単な利用方法は、 印刷指示画面なんて画面があった時、 日付の入力・表示エリアを作成 [txt印刷日]と名前を付けました、 カレンダーコントロールを配置 [OLE_Calendar]と名前付け その後、 [OLE_Calendar](カレンダーコントロール) の イベントで、 me!txt印刷日 = me!OLE_Calendar.Value と、入力用のテキストボックスへデータを代入でOKだろう ※考えが、甘かったんだけど(笑)
Private Sub OLE_Calendar_Updated(Code As Integer)
    Me!txt印刷日.Value = Me!OLE_Calendar.Value '更新時にテキストボックスへ代入
    MsgBox "aaa2"
End Sub
あれ、、クリックしてもイベントが発生しない・・・ウソでしょ(笑) http://www.microsoft.com/japan/developer/library/off2000/vbaac/acevtUpdated.htm >... Access 97 に組み込まれているカレンダー コントロールでは、Updated イベン >トをサポートしません。カレンダー コントロールを含むデータベースを >以前のバージョンの Access から Access 97 に変換する場合は、カレンダー ... だってさ、、、う〜ん。。。 これってインチキ?なぜプロパティに載っていないイベント、 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 下記のように、_AfterUpdateが書けるのさ、、、
Private Sub OLE_Calendar_AfterUpdate()
    Me!txt印刷日.Value = Me!OLE_Calendar.Value '更新時にテキストボックスへ代入
    MsgBox "なぜプロパティに載っていない_AfterUpdateが・・・"
End Sub
たいした発見じゃないけど、 コントロールのイベント一覧に載っていないけど、 参照 VBAの編集画面では、いつものイベント群が選択できた。 参照 これで、カレンダーコントロールをクリック後、 テキストボックスに無事代入できた。 今度は、テキストボックスの値を直接入力して変えた時、 上のカレンダーも変わらないとなんかねぇと思いますよね。 これは、いつものように、
Private Sub txt印刷日_AfterUpdate()
    'テキストボックスの更新後にカレンダーの値も変更したいので
    If IsDate(Me!txt印刷日) Then  '日付と認識できる?
        Me!OLE_Calendar.Value = Me!txt印刷日
    Else
        MsgBox "日付として認識できませんよ・・・"
    End If
End Sub
って感じで、テキストボックスが変更されたら、 その値をカレンダーにも代入。 これで、双方向の値のやり取りができました。 えっ、そんな手数をかけなくても、 コントロールソースを同一にしろって? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ギク、、、言われてみれば、、、

/* * 3.日付選択の共通フォームをテストで作成してみた */

口直しのデザートじゃないけど、 カレンダーコントロールってコントロールなので、 フォームに配置します。 わけわかんないけど、それでいいんじゃないの? ですよね、言い方が悪かった。 えっと、画面上に表示したくない(日付のボタンが押されたら選択画面を起動) 開始日、終了日など複数のテキストボックスで選択を使いたい なんて用途があると勝手に思い込んで、 カレンダー選択フォームを作ってみます。 オレは使わないけど、勝手に作るなら作ったら? 冷たいなぁみんな(笑) チョット前、ダイアログフォームを使用して、 INPUT BOX もどきを作成しました。 No.91 Access ダイアログフォームって?何? acDialogとPublic変数を使用 http://www.ken3.org/backno/backno_vba19.html#91 ↑そのまんまなんだけど、ただ、カレンダーコントロールを使っただけ(笑) 関数仕様 Function INPUT_HIZUKE_Form() As String カレンダーコントロール付きのフォームを表示して、日付を選択させる。 選択されたらCDateで変換した日付文字列を返す。 キャンセルだったら""の空文字列を返します。 Option Compare Database Option Explicit Public INPUT_HIZUKE_RET As String 'グローバルにリターン値受取り用
Function INPUT_HIZUKE_Form() As String
    
    Dim stDocName As String
    Dim stLinkCriteria As String

    INPUT_HIZUKE_RET = "" 'リターン値を初期化
    
    'ダイアログモードでフォームを開く
    stDocName = "日付選択"
    DoCmd.OpenForm stDocName, , , stLinkCriteria, , acDialog
    
    'リターン値をセットして、関数を終わる
    'フォーム側でpublic変数にセットされていることを信じて(笑)
    INPUT_HIZUKE_Form = INPUT_HIZUKE_RET

End Function
と、モジュールに書いて、 フォーム側では、 カレンダーコントロール [OLE_Calendar] 決定ボタン [btn決定] 中止ボタン [btn中止] のコントロールを作成して、 イベントは、決定・中止の各ボタンが押されたら、 リターン値をPublic変数にセットして、フォームを閉じます
Private Sub btn決定_Click()
    'グローバル変数にリターン値をセット
    INPUT_HIZUKE_RET = CDate(Me!OLE_Calendar.Value)
    'フォームを閉じる
    DoCmd.Close
End Sub
Private Sub btn中止_Click()
    'グローバル変数にリターン値をセット
    INPUT_HIZUKE_RET = ""  'リターン値は中止なので空文字にする
    'フォームを閉じる
    DoCmd.Close
End Sub
なんかなぁ、工夫が無いよね。 使う方は、 日付範囲指定フォームで、 開始日 [txt開始日] [btn開始] 〜 終了日 [txt終了日] [btn終了] なんて感じの構成でテストプログラムを書くと、
Private Sub btn開始_Click()
    Dim strWORK As String
    strWORK = INPUT_HIZUKE_Form() '日付の入力フォームを起動
    If strWORK <> "" Then '入力されていたら
        Me!txt開始日 = strWORK  'フォームのリターン値をセット
    End If
End Sub
Private Sub btn終了_Click()
    Dim strWORK As String
    strWORK = INPUT_HIZUKE_Form() '日付の入力フォームを起動
    If strWORK <> "" Then '入力されていたら
        Me!txt終了日 = strWORK  'フォームのリターン値をセット
    End If
End Sub
って感じで、 strWORK = INPUT_HIZUKE_Form() '日付の入力フォームを起動 で日付選択フォームを起動、 リターン値を判断して選択されていたら自分のテキストボックスに代入 If strWORK <> "" Then '入力されていたら Me!txt終了日 = strWORK 'フォームのリターン値をセット End If と、 共通に使うことが出来ます。 日付の入力処理の隠し味として、使えそうなら使ってみてください。

/* * 4.カレンダーコントロールのバージョン */

Access97のマシーン、死んだと思ったら起動したので、 Access97でサンプル作りました。 挿入・ActiveXコントロール・カレンダーコントロール8.0を選択します。 ( ) と、 カレンダーコントロール挿入したけど、 これって、どのマシーンにも入っているの? ギク、、私のもう1つのマシーンWindows XP,Access2002だと、 カレンダーコントロールは10.0だぁ・・・ ( ) テストで、Access2002で、今回のdb97-095.mdbを開いてみます。 ※変換してみます。 あれ、、、そのまま変換できた・・・動いてるよ・・・ 予定では、変換エラーの説明をするつもりが・・・逆になぜ?って感じだけど。 カレンダーコントロール8.0 から カレンダーコントロール10.0 はなんとか、無事でした。 でも、97で動作したコントロールが動作しない、 新しいのに変更するなど、移植問題で苦労されている話をよく聞きます。 そういった意味でも、特殊なコントロールを使用するときは、 将来のバージョンアップを含め、注意が必要です。 サンプルファイルは、 http://www.ken3.org/vba/lzh/vba095.lzh にdb97-095.mdb(Access97版)が保存されています。 Access2000,Access2002をお持ちの人は、 変換して動作させてみてください、動くかなぁ・・・

/* * 5.終わりの挨拶 */

今回は、カレンダーコントロールを使って、 カレンダー選択フォームもどきを作ってみました。 拾い読みして、 1つでも何かの参考となれば幸いです。 Excel/Access大好き、三流プログラマーKen3でした。


ページフッター

ここまで、読んでいただきどうもです。ここから下は、三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、

種類別のリンク や 広告など

気になったジャンル↓を選択してください。

人気記事(来場者が多いTOP3):
[VBAでIE,WebBrowserを操作]・・・VBAでIE,WebBrowserを操作する サンプルです
[Access から Excel 連携 CreateObject("Excel.Application")]・・・AccessからExcelを操作したりデータの書き出しなどです
[VBAでOutlookの操作 CreateObject("Outlook.Application" )]・・・VBAからOutlookを使い、メール関係を処理するサンプルです
↑上記3つみたいなCreateObjectで他のアプリケーションを操作するサンプルが人気です。

Excel関係:
[Excel UserFormを操作する]・・・エクセルでユーザーフォームを作成して入力などを行ってます
[ExcelからAccessを操作する]・・・ExcelからAccessのマクロを起動してみました、
[Excel関係 関数、その他]・・・その他Excel関係です

Access関係:
[Access UserForm/サブフォーム 操作]・・・アクセスでフォームを使ったサンプルです
[Access レポート操作]・・・レポートを操作してみました
[Access クエリーやその他関数]・・・あまりまとまってませんが、スポット的な単体関数の解説です

その他:VBAの共通関数やテキストファイルの操作など
[VBAでテキストファイル(TextFile)の操作]・・・普通のテキストファイルを使ったサンプルです
[VBA 標準関数関係とその他解説]・・・その他、グダグタ解説してます

開発時の操作: [F1を押してHELPを見る]/ [Debug.Print と イミディエイトウインドウ]/ [実行時エラーでデバッグ]/ [ウォッチ式とSTOP]/ [参照設定を行う]

仕様書(設計書?) XXXX書類: [基本設計書や要求仕様書]/ [テスト仕様書 テストデータ]/ [バグ票]/ [関数仕様書]/ [流れは 入力・処理・出力]

※↑文章の味付けが変わっていて、お口に合うかわかりませんが。。。
※※読んで、気分を悪くされたらスミマセン。

Blogとリンク:[三流君の作業日記]/ [VBAやASPのサンプルコード]/ 広告-[通販人気商品の足跡]



[三流君(TOP ken3.org へ戻る)] / [VBA系TOPへ] / [VBA系バックナンバー目次へ移動]