MS Access Tips/Sample and VBA and Blog customize etc...

カレンダー形式のスケジュール管理フォーム作成 その4

タイトル画像

その3 までで、スケジュール管理フォームとしては最低限必要な機能、ユーザーインタフェイス(UI)は完成できたのですが、もう少し使いやすいようにUIを工夫してみましょう。

カレントの日付の移動は、コマンドボタンやラベルをクリックすることで可能なのですが、キーボードでの移動も可能にしておくと、ユーザーに優しいUIになります。

今回はこれを実装します。

難易度:

仕様

メインフォームにフォーカスがあるとき、キーボードで下記の操作ができるようにします。これは、 Windowsコモンコントロールの DTPicker コントロールの仕様に準じたものです。

キー 操作
翌日を選択します。
前日を選択します。
先週の同じ曜日を選択します。
次週の同じ曜日を選択します。
PageUp 先月の同じ日にちに移動します。
PageDown 来月の同じ日にちに移動します。
Ctrl + PageUp 前年の同じ日にちに移動します。
Ctrl + PageDown 翌年の同じ日にちに移動します。
Home 当月の1日を選択します。
End 当月の月末を選択します。

コード

フォーム上のどのコントロールにフォーカスがあるかに関係なくキーボードイベントを拾うには、フォームの「キーボードイベント取得」プロパティを「はい」にします。その上で、フォームの「キー入力時」または「キークリック時」にコードを記述します。今回のように Home、End、PageUp、PageDown、↑、↓、→、←、Tab などの移動キー を拾うには「キークリック時」を使います。

どのキーを押したかは KeyCode 引数、また、Shift, Ctrl, Alt の補助キーを押しているかどうかは Shift引数で取得できます。実験コードを記述して、実際に動作を確認してみましょう。

KeyCode = 0 としているのは、そのキーを押したときの本来の動作をキャンセルするためです。

上記の仕様を実現するために、フォームモジュールのコードは下記のようにしました。

キーボードイベントで日付移動するコードを簡略化するために、カレンダー設定関数 SetCalendar の仕様を前回から変更しました。引数に 選択する日付 を受け取るようにして、カレンダーの表示に関するコードをSetCalendar 内にすべて記述するようにしました。このおかげで、キーボードイベント内では、選択すべき日付を決定して、SetCalendar に渡せばいいだけになりました。また、MoveMonth や SetDate をシンプルにできました。

サンプルMDB が下記からダウンロードできます。
FrmCalenda4_07.zip (Access 2007-2010 形式 - 45kb)
FrmCalenda4.zip (Access 2002-2003 形式 - 59kb)
FrmCalenda4_2k.zip (Access 2000 形式 - 54kb)


拍手する

36 Comments

コルネ says..."If (Shift And acCtrlMask) > 0 Then"

お忙しいところ恐縮です。
79行目の記述の意味が良く解りません。
簡単に解説して頂けませんでしょうか?

私は
If Shift = acCtrlMask Then
もしくは
If Shift = 2 Then
Shiftキー・Altキーの同時押下も考慮するなら
If (Shift = 2 or Shift = 3 or Shift = 6 or Shift = 7) Then
のような記述をしていました。

2009.10.12 15:30 | URL | #/.OuxNPQ [edit]
hatena says..."ビット演算ですね。"

And演算子には、論理演算の機能と、、ビット演算 の機能があります。
ビット演算 は、二進数での、各桁毎に演算して結果を返します。

acShiftMask, acCtrlMask, acAltMask は
十進数ではそれぞれ 1, 2, 4 ですが、
二進数では、001, 010, 100 となります。

また、Shift引数は、例えば、
(1) Ctrlキーを押したときは 2、 二進数で 010
(2) Shift+Ctrl のときは、3、二進数では 011
(3) Shift+Ctrl+Alt では、7、二進数では 111
を返します。
つまり、Shiftキーを押すと一桁目が1、
Ctrlキーを押すと2桁目が1
Altキーを押すと3桁目が1
になります。

And 演算は、両方とも 1 の場合のみ 1 が返ります。
1 And 1 → 1
1 And 0 → 0
0 And 1 → 0
0 And 0 → 0
これを二進数の各桁毎に行うのがビット演算です。

Shift And acCtrlMask は、

(1)の場合、

010
010
----
010

となります。

(2)の場合、

011
010
---
010

(3)の場合、

111
010
----
010

でどれも 0 より大きくなります。

逆に、Ctlr が押されていない組み合わせ、

Shiftのみ
001
010
---
000

Ctrlのみ
100
010
---
000

Shift+Alt
101
010
----
000

となって 0 になります。

なんかややこしい説明になりましたが、
WEBで「ビット演算」で検索するともっと詳しい解説が見つかると思います。

2009.10.12 16:39 | URL | #5uE6dEgY [edit]
コルネ says...""

理解出来ました。
Shiftキー・Altキーの同時押下状態も考慮した記述ですね。

早速の解説有難うございました。
感謝です。

2009.10.12 17:54 | URL | #- [edit]
koyama says..."実行時エラーの対処法"

いつも参考にさせていただいています
今回Access2007を使うことになりFrmCalenda4のフォントを拡大して、フォームビューに戻そうとした時に実行時エラーになりました。
「指定した式では参照されているT40393フィールドが見つかりません]というメッセージがでます。何とかこのエラーをなくしたいのですが対処法をご指導ください

2010.08.22 20:34 | URL | #- [edit]
hatena says..."Re:実行時エラーの対処法"

AC2007でテストしてみましたが、当方の所では問題なく動いてます。
フォントを拡大したとのことですが、具体的にどこのフォントをどのように拡大しましたか。
またエラーが出るコードは具体的にどこですか。


※非常に遅いレスですみません。見てくれているといいのですが。

2010.12.14 22:24 | URL | #5uE6dEgY [edit]
こん says..."質問"

カレンダーを予定表使用させていただきました。
追加で人の名前を数十名一日に予定を入れて漏れのない用にしたいのですが、
エクセルだと同じ名前を記入すると名前を白文字に変更したり
一日に何回か予定の入った人は回数を表示するなどしていたのですが
アクセスにもそのようなことできますk

2012.01.07 12:34 | URL | #nOdkmSi2 [edit]
hatena says..."re:質問"

できます。

まずは、データをどのようにテーブルに格納しているのか、
テーブル設計の説明からしてもらわないと、具体的な
アドバイスではできないですが。

テーブルはすでに出来ていて、データは入力されているのですか。

2012.01.07 20:31 | URL | #5uE6dEgY [edit]
こん says..."質問"

お返事ありがとうございます。
まだアクセスでは、作成していません。
hatenaさんのカレンダーを使用して
みたいと使わせていただいたのですが、フォームを開いて
デザインビューにするとエラーになってしまします。
「実行エラー2465」 「指定した式で参照されているT40916フィールドが見つかりません」とでます。
私はアクセス2000を使用中です。
VBAは全くの初心者です。
アクセスは、デザインビューに従って作成はある程度使用しています
まずは、ここをクリアーしないと前に進めない状態です。

2012.01.08 22:58 | URL | #CuX9Ksro [edit]
hatena says..."re:質問"

> hatenaさんのカレンダーを使用して
> みたいと使わせていただいたのですが、フォームを開いて
> デザインビューにするとエラーになってしまします。

フォームビューからデザインビューにするときにエラーになるのですか。

直接、データベースウィンドウからデザインビューが開くとどうなりますか。

また、エラーがでたときにOKを押したあと、
どのコードが反転表示されますか。

2012.01.08 23:27 | URL | #5uE6dEgY [edit]
こん says..."質問 エラー内容"

hatenaさんのカレンダー その4を使用しました。

VBA エラー内容は、

ファイルを開くと フォームが自動で表示され
左上のデザインビューを切り替えて 追加使用としたのですが
フォームビューに戻らない状態になります。


'カレンダー 日にち設定関数
Private Sub SetCalendar(aDate As Date)
Dim i As Integer, D As Date, m As Integer, n As Integer

If Not IsNull(Me.txtDate) Then
Me("T" & Me.txtDate - FirstDay).BackStyle = 0 '透明
End If

上記
Me("T" & Me.txtDate - FirstDay).BackStyle = 0 '透明 が「反転表示黄色」になります。

その3を使用しましたらエラーは出ませんでした。

これを使用させていただいて 追加していこうかと思っています。

2012.01.09 21:08 | URL | #nOdkmSi2 [edit]
hatena says..."re: 質問 エラー内容"

> 左上のデザインビューを切り替えて 追加使用としたのですが
> フォームビューに戻らない状態になります。


デザインビューに切り替えた後は、一端閉じてから、開いてください。

これは仕様です。

2012.01.12 10:37 | URL | #5uE6dEgY [edit]
光画部 says..."予定ID検索について"

予定を管理するフォームを探している時に、ここのサイトにたどり着きました。
早速ですが、状態はhatenaさんのカレンダーフォームをほぼそのまま使っています。
予定を表示する部分だけクエリーを作成し、それから作成したフォームを貼り付けています。
追加したい機能は、T_予定にあらかじめ日時以外の予定が入力されているので、カレンダーフォーム上で予定IDを検索して、日時の入力を行いたいのですが、うまくいきません。よろしくお願いします。

2012.07.28 07:54 | URL | #- [edit]
hatena says..."Re: 予定ID検索について"

> 早速ですが、状態はhatenaさんのカレンダーフォームをほぼそのまま使っています。
> 予定を表示する部分だけクエリーを作成し、それから作成したフォームを貼り付けています。
> 追加したい機能は、T_予定にあらかじめ日時以外の予定が入力されているので、カレンダーフォーム上で予定IDを検索して、日時の入力を行いたいのですが、うまくいきません。よろしくお願いします。

日時未定の予定を先に別フォームで入力してあるということでしょうか。

また、「カレンダーフォーム上で予定IDを検索して」とは、具体的にはどのようなインターフェイスを想定していますか。予定の日時をクリックすると、日時未定の一覧を別フォームで開いて、選択するというような感じでしょうか。

その辺りをもう少しご自身で検討して、具体的にやりたいことをご提示ください。

2012.07.30 20:17 | URL | #- [edit]
臨床工学技士の卵 says..."初めまして"

お忙しいところ申し訳ありません。
いつもhatenaさんのブログを拝見し、勉強しています。
 
現在、私は「医療機器の管理システムの構築」をテーマに卒業研究を行っておりまして、hatenaさんが作成した FrmCalenda4_07.zipを参考に使用させていただきたいと思いコメントをしました。
参考に使用させていただいてよろしいでしょうか?

2012.11.09 16:07 | URL | #krBkJhKw [edit]
hatena says..."re: 初めまして"

どうぞ、ご自由に、参考、使用してください。

2012.11.09 16:31 | URL | #5uE6dEgY [edit]
igachan says..."エラー2465"

hatenaさん、こんんいちは。はじめまして。大変参考にさせていただいております。当方、アクセスの2010で改良させていただいているのですがNo560の事態がデザインビューからフォームビューに切り替えるときに起きてしまいます。カレンダーの本日のところが白色になると思うのですが何の変化もありません。再びエラー表示がされてしまうので使えない状態でいます。お忙しいと思いますがご教授いただければと思います。

2014.03.13 16:39 | URL | #BsqUATt6 [edit]
hatena says..."re:エラー2465"

デザインビューで修正した場合は、いったん閉じてから、
フォームビューで開いてください。

開くときに初期化してますが、デザインビューからフォームビューにすると開くときイベントが発生しないので、初期化されないからです。

2014.03.13 17:10 | URL | #5uE6dEgY [edit]
igachan says..."コマンドボタンの配置"

こんにちは。F_carender内にコマンドボタンを配置して別のフォームを開こうとしているのですがバグってしまうのですがどうしたらよろしいでしょうか?

2014.03.27 08:46 | URL | #- [edit]
hatena says..."re:コマンドボタンの配置"

コマンドボタンのどのイベントに、どのようなマクロまたイベントプロシージャを割り当てたのでしょうか。

また、「バグってしまう」とは、どのような症状がでるのでしょうか。

デザインビューで変更した場合は、一旦閉じて保存してから、開いてますか。

2014.03.27 09:50 | URL | #5uE6dEgY [edit]
igachan says...""

お忙しいところ申し訳ありません。割り当てたマクロは「フォームを開く」でフォーム名を指定しているだけのものです。また「バグってしまう」というのは、上書きをするときにフォームが開いていると上書きできません。閉じてよろしいですか?と表示され、「はい」をクリックするとVBA画面が出て560行目が黄色表示され配置したコマンドボタンのないものが上書きされています。ちなみに「その3」でコマンドボタン等を配置したものを作って「その4」のVBAに書き換えるとボタンのマクロ等は有効なのですが矢印キーは動作しなかったです。お手数をおかけいたしますがよろしくお願いします。

2014.03.29 07:27 | URL | #- [edit]
hatena says..."情報不足"

再度確認しますが、デザインビュー上でコマンドボタンを配置した後、上書き保存して、閉じてから、開いてますか。

それでもエラーが出るという時は、下記の情報を補足してもらえますか。

> 上書きをするときにフォームが開いていると上書きできません。

主語がないので、状況が伝わりません。

何を上書きするのか、
どのフォームが開いている時なのか、
明確に分かるように説明してください。

> 560行目が黄色表示され

どこの560行目なのでしょうか。

そのコードの前後をコピーして貼り付けてもらえますか。

2014.03.29 09:06 | URL | #5uE6dEgY [edit]
igachan says..."お騒がせいたしました"

hatenaさん、お騒がせいたしました。ひとつずつ確認をしながらコマンドボタンを配置したらちゃんとフォームを開くことができました。お騒がせいたしました。

2014.04.01 11:17 | URL | #- [edit]
igachan says..."定期イベントの自動入力"

その3でお尋ねした定期イベントの入力の件ですが条件は同じで下記の構文ですと

Sub 毎年の行事_QueryShow()
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim qry As QueryDef
Dim MySQL As String

Set db = CurrentDb()

MySQL = "SELCT *, DateSerial(" & Forms![F_日誌]![年] & ",月,日) AS 今年の日時 "
MySQL = MySQL & "FROM 毎年の行事 "
MySQL = MySQL & "WHERE 月 = " & Forms![F_日誌]![月]

Set rs = db.OpenRecordset(MySQL)

Do Until rs.EOF
Debug.Print rs!行事名 & " : & rs!今年の日時"
rs.MoveNext
Loop

rs.Close: Set rs = Nothing
db.Close: Set db = Nothing

End Sub

「実行時エラー'3078'
入力テーブルまたはクエリ'SELECT*,DateSerial(2014,月,日)AS今年の日付 FROM 毎年の行事 WHERE 月='4'が見つかりませんでした。そのテーブルやクエリが存在していること、または名前が正しいことを確認してください。」

と表示されSet rs = db.OpenRecordset(MySQL)の部分が黄色表示されます。

フォームからの年号は読み込んでますし、テーブルの名前も「毎年の行事」であっていますし、フィールド「月」「日」も数値型で作ってあるのですが・・・何故、月、日を返してくれないのでしょうか?全くわからないのですが。

2014.04.21 08:24 | URL | #- [edit]
hatena says..."re:定期イベントの自動入力"

> MySQL = "SELCT *, DateSerial(" & Forms![F_日誌]![年] & ",月,日) AS 今年の日時 "

この行の")"(閉じ括弧)が全角ですので、半角にしてください。

2014.04.21 09:58 | URL | #5uE6dEgY [edit]
igachan says..."re:re:定期イベントの自動入力"

何度もすみません。やってみました。

エラー表示は同じで Set rs = db.OpenRecordset(MySQL)

Do Until rs.EOF
Debug.Print rs!行事名 & " : & rs!今年の日時"
rs.MoveNext
Loop

rs.Close: Set rs = Nothing
db.Close: Set db = Nothing

Set rs = db.OpenRecordset(MySQL) 

の部分が黄色くなってしまいます。
他の部分の半角記号は等はチェックしました。





> > MySQL = "SELCT *, DateSerial(" & Forms![F_日誌]![年] & ",月,日) AS 今年の日時 "
>
> この行の")"(閉じ括弧)が全角ですので、半角にしてください。
>

2014.04.21 16:30 | URL | #- [edit]
hatena says..."掲示板へ移動"

下記の私が運営している掲示板で質問しなおしてください。

そこで、症状のでるデータベースファイルをアップロードしてください。

hatena の Microsoft Access 掲示板
http://hatena-access.progoo.com/bbs/


症状が再現できる最低限のオブジェクトのみ残したものをアップしてください。

2014.04.22 01:40 | URL | #5uE6dEgY [edit]
いがちゃん says..."別のテーブルのデータも表示したい"

hatenaさん、こんにちは。いつも拝見させていただいております。早速ですが、このカレンダーに旧暦と六曜を表示させようと思い新しく「T_六曜」というテーブルを作成しました。(フィールドは日付・旧暦・六曜です。)フォームにはラベルK1からK42を作成して、その中に表示して六曜を表示し、サブフォームに旧暦を表示しようと思い作成したのですがカレンダーのラベルK1からK42には六曜は表示されたのですがサブフォームがうまく連動されません。どのようにしたら良いのかご教授いただければ大変助かります。よろしくお願いします。ちなみに書き換えたモノは下記の通りです。

SetSchedule()を改良して

Public Sub SetKoyomi()
Dim i As Integer, rs As DAO.Recordset
For i = 1 To 42
Me("K" & i).Caption = ""
Next
Set rs = CurrentDb.OpenRecordset( _
"SELECT 日付, 六曜 FROM T_六曜 WHERE " & _
"日付>#" & FirstDay & "# AND 日付<=#" & FirstDay + 42 & "#", _
dbOpenForwardOnly, dbReadOnly)
Do Until rs.EOF
With Me("K" & rs!日付 - FirstDay)
.Caption = .Caption & rs!六曜 & vbCrLf & vbCrLf
End With
rs.MoveNext
Loop
rs.Close: Set rs = Nothing
End Sub

2015.02.04 15:01 | URL | #- [edit]
いがちゃん says..."ありがとうございました。"

hatenaさん、お返事が遅くなってしまいすみませんでした。早速やってみました。無事に連動して動くようになりました。ありがとうございました。

2015.02.15 22:56 | URL | #- [edit]
いがちゃん says..."私のだけでしょうか?"

hatenaさん、いつもお世話になります。毎回、丁寧に回答頂きありがとうございます。1つお尋ねしたいのですが一番最初にzipファイルをダウンロードしてファイルを解凍し、開いた時にカレンダー部分の所で当日以外のところが当日と同じように白くなっているのですがどうしたらよいですか?アクセスの2010を使っています。私のだけなのでしょうか?構文等一切手をつけていないのですが・・・よろしくお願い致します。

2015.02.21 22:19 | URL | #- [edit]
hatena says..."re:私のだけでしょうか?"

> 1つお尋ねしたいのですが一番最初にzipファイルをダウンロードしてファイルを解凍し、開いた時にカレンダー部分の所で当日以外のところが当日と同じように白くなっているのですがどうしたらよいですか?

レポートをデザインビューで開くと、背景が白のラベルがありますので、それを選択して、書式の「背景スタイル」を「透明」に変更してください。

私の修正忘れです。

2015.02.22 00:04 | URL | #5uE6dEgY [edit]
いがちゃん says..."re:re:私のだけでしょうか?"

お返事ありがとうございます。直りました。

2015.02.22 00:27 | URL | #- [edit]
いがちゃん says..."グーグルカレンダーとの同期"

hatenaさん、こんばんは。とても便利に使用させてもらっております。使用しているうちにだんだんと欲が出てきまして、グーグルカレンダーを使って、外出先で携帯からも確認したり追加したり出来ないものかと思い、いろいろなサイトを探してみました。1カ所だけエクセルのVBAの構文が載っておりましてhatenaさんらしい方の返事でアクセスでも流用可能というようなことが書かれていたのですが、そのサイトの構文をそのまま転記しても構文自体に赤文字の部分が多くエラーになってしまい使えませんでした。グーグルカレンダーとのVBAを使ってのやりとりは出来ないものでしょうか?

2015.03.02 23:51 | URL | #- [edit]
hatena says..."re:グーグルカレンダーとの同期"

> 1カ所だけエクセルのVBAの構文が載っておりましてhatenaさんらしい方の返事でアクセスでも流用可能というようなことが書かれていたのですが、そのサイトの構文をそのまま転記しても構文自体に赤文字の部分が多くエラーになってしまい使えませんでした。グーグルカレンダーとのVBAを使ってのやりとりは出来ないものでしょうか?

グーグルカレンダーに関して回答した記憶があいまいなんですが、どこのサイトですか。URLをはってくれませんか。

Excelで動くならAccessでもたいてい流用は可能だと思います。

2015.03.03 00:08 | URL | #5uE6dEgY [edit]
いがちゃん says..."グーグルカレンダーとの同期"

早速のご返事ありがとうございます。マイクロソフトのURLでした。ちなみにhttps://social.msdn.microsoft.com/Forums/ja-JP/f81416a1-5c40-4da7-81b5-6abc77dd449a?forum=vbajp です。
 その中にあった
https://github.com/honda0510/Google-Calendar-Library-for-VBAをつかってみたのですが
2つのファイルとも Attribute から始まる部分が文字が赤くなってしまい使えません。どのようにしたら良いのでしょうか?

2015.03.03 10:00 | URL | #- [edit]
hatena says..."re:グーグルカレンダーとの同期"

URL先のコードはインポート用のものですので、まずはテキストエディターにコピーして保存してからVBAウィンドウからインポートすることになります。
README.txt に書いてあるように文字コードを指定して保存する必要があります。

で、当方のAccessでやってみたのですが、コンパイルはできたのですが、エラーが出てGoogle Calendarにログイン出ません。

調べてみるとがこれで使っている Google Calendar API v2 はレポートが去年で終わったようです。
下記を参照してください。

「計画書」について/Excel vbaでGoogle OAuth2を使用する | 0.1up Project
http://c1upp.com/site_making/2281/

この方は、最新版の Google Calendar API v3 を使用してVBAで実装したようですが、そのものは公開していません。ただ、ヒントはいろいろ出してくれていますので、スキルと時間があれば実装できると思います。

現在、当方には申し訳ないですが時間がありません。

2015.03.04 23:40 | URL | #5uE6dEgY [edit]
miya says...""

カレンダーの基本部分を使用さしてもらいます
Private Function SetDate(i As Integer)

Private Function MoveMonth(n As Integer)

FirstDay = DateSerial(Me.年, Me.月, 1)
FirstDay = FirstDay - Weekday(FirstDay)
追加しました

2016.10.07 21:07 | URL | #- [edit]

Leave a reply






Trackbacks

trackback URL
http://hatenachips.blog34.fc2.com/tb.php/190-d2b39eb8
該当の記事は見つかりませんでした。