[三流君] −−>
[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でした。
フィードバック
VBA系の→[掲示板]←を覗く、質問を書き込む
評価・感想
ページフッター(リンクや広告など)
[三流君(TOP ken3.org へ戻る)]
-- [VBA系TOPへ]
---- [VBA系バックナンバー目次へ移動]
------ [VBAでIEを操作 CreateObject("InternetExplorer.application")]・・・実は当店一番人気、VBAでIEを操作するサンプルです
------ [VBAでOutlookの操作 CreateObject("Outlook.Application")]・・・Outlookを使い、メール関係の処理です
------ [Access から Excel 連携 CreateObject("Excel.Application")]・・・人気のAccessからExcelへデータ書き出しなどです
------ [AccessのUserForm/サブフォームを操作]・・・アクセスでフォームを使ったサンプルです
------ [Accessのレポートを操作]・・・レポートを操作してみました
------ [Access クエリー関係やその他関数]・・・あまりまとまってませんが、スポット的な単体関数の解説です
------ [Excel UserForm(ユーザーフォーム)を操作する]・・・エクセルでユーザーフォームを作成して入力などを行ってます
------ [ExcelからAccessを操作する]・・・ExcelからAccessのマクロを起動してみました、
------ [Excel関係 関数、その他]・・・その他Excel関係です
------ [VBAでテキストファイル(*.txt,*.html,*.csv)の操作]・・・テキストファイルを使ったサンプルです
------ [VBA 標準関数関係とその他解説]・・・その他、グダグタ解説してます
広告
-- [通販系の売れ筋広告へ] ←主に楽天やAmazonのランキングです
blog
-- [三流君の作業日記] ← 日々の作業を少々
-- [通販あしあと] ← 通販ページの足跡を一覧で羅列
情報を探す
情報を探すならGoogleかな?
↓Web全体、サポート情報(support.microsoft.com)や三流君VBA(ken3.org)から検索する
書籍の購入
Webだけじゃさすがに勉強しきれないので、プログラミング関係の書籍も読んでみては??
コンピュータ書籍の発送がハヤイ専門店
コンピュータの本・専門店
|
※種類が豊富で探し易いです。※在庫ありが48時間以内発送が急ぎで資料や書籍がほしい時、とても助かります。
お奨め本の目次を見るだけでも勉強になったり
|
amazon.co.jpでキーワード別チェック
下記、私が設定したキーワードですが、こんな感じで資料や書籍を探ってみては?
[VBA全体を把握する] -- やはり全体をさらっと見たいですよね。
[SQL関連でDB力UP] -- システムはデータベース設計が重要
[ADO接続を探る] -- VBAなのでADO接続を押さえておく
[Windows APIを探る] -- さらにAPIになて知ってれば強力だ!
[.NETを探る] -- と言っても時代は.NETに流れてるし
プログラミング以外でも知りたいことは多くって、
[人間関係] -- で、客先・上司、まわりに気を使い。
[プログラマーの自己啓発] -- プログラムだけじゃなくいろいろと向上したいよ
[コーチング・育成] -- 先輩になったら後輩(部下)の面倒をみてね。
そんなこんなでプログラマーっていろいろと大変なんだってば・・・