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

帳票フォームでガントチャート(マウスドラッグで範囲指定)

以前の記事でマウスドラッグで範囲指定するのは紹介しました。これは非連結フォームでしたが、今回は帳票フォームで実現する方法を紹介します。当然、連結フォームになります。

帳票フォームでガントチャートタイトル

難易度:

フォームの仕様

一般的な出退勤管理(勤怠管理)を例にしてサンプルを作成します。

テーブルは下記の2つです。

T_社員
フィールドデータ型サイズ等
社員CD数値型主キー
氏名テキスト型
T_出退勤
フィールドデータ型サイズ等
出退勤IDオートナンバー型主キー
社員CD数値型長整数型
日付日付/時刻型
出社時刻日付/時刻型
退社時刻日付/時刻型

T_出退勤 より帳票フォームを作成して、そこにガントチャートを表示します。
フォームヘッダーにコンボボックスを配置して日付を入力するとその日付のデータがあれば表示されます。
新規入力では、その日付が規定値として使用されます。

日付コンボボックスの設定
プロパティ設定値
値集合ソースSELECT DISTINCT T 出退勤.日付 FROM T 出退勤 ORDER BY T 出退勤.日付 DESC;
規定値 [cb日付].[ItemData](0)
名前cb日付

日付の規定値を設定するために、フォームヘッダーにテキストボックスを配置します。

プロパティ設定値
コントロールソース日付
規定値=[cb日付]
可視いいえ

フォームの読み込み時と、コンボボックスの更新後処理でフォームを再クエリします。

以上で、準備完了です。

複数のテキストボックスを配置してガントチャート表示

帳票フォームでマウスドラッグで値を指定するのは下記で実現していますので、この応用でできそうです。

フォームでiTuensのようなレート表示 - hatena chips

テキストボックスの上に透明のコマンドボタンを配置して、その MouseDownイベント、MouseMoveイベントでレコードソースのフィールドに値を代入するという考え方です。

24時間を30分単位に分けて48個テキストボックスを配置してそれをグラフ表示とします。
条件付き書式を使って背景色を変更する方法では、重すぎて使い物になりません。
そこで、カレント行の背景色の変更 その3でも使ったブロック文字(Webdingsフォントにある)を表示させる方法を使用します。

テキストボックスのコントロールソースに式を設定するとやはり重くなる(すぐに反映されない)ので、レコードソースのクエリに48個分の演算フィールドを作成してそこに式を設定します。

T1: IIf(#00:30:00# Between [出社時刻] And [退社時刻],'g','')

T2: IIf(#01:00:00# Between [出社時刻] And [退社時刻],'g','')

T3: IIf(#01:30:00# Between [出社時刻] And [退社時刻],'g','')

と順に作成していきます。最後のフィールドは、

T48: IIf(#1899/12/31# Between [出社時刻] And [退社時刻],'g','')

となります。(#1899/12/31# は「24時」という意味です。日付/時刻型では #24:00:00# という表示はできません。)

この48個のフィールドをフォーム上にテキストボックスとしてならべて配置します。プロパティでフォントを下記のように設定します。

プロパティ設定値
フォントWebdings
サイズ72

テキストボックスのプロパティ設定

ヘッダーにラベルで時刻を表示、詳細に直線コントロールで縦罫線を表示します。
(この辺の細かいレイアウト等はサンプルで確認ください。)

この48個のテキストボックスを覆うようにコマンドボタンを配置して下記のようにプロパティを設定します。

プロパティ設定値
透明はい
名前cmd1
マウスボタンクリック時[イベント プロシージャ]
マウスボタン解放時[イベント プロシージャ]
マウスボタン移動時

フォームモジュールは下記のようになります。

これで下図のようにガントチャート表示できて、マウスドラッグで範囲指定できます。

複数テキストボックスガントチャート表示

ただ、グラフを続けて表示することができませんでした。あと、ドラッグ時にちょっとちらつきます。

一つのテキストボックスにテキストとしてグラフ表示

フィールドが48で、テキストボックスを48も配置するのはちょっと手間です。もう少しシンプルにできないかなと検討してみました。一つのテキストポックスにスペース文字とブロック文字を組み合わせたテキストでバー表示するという方法です。

最初、Webdingsフォントのブロック文字を使ってやってみたのですが、スペース文字とブロック文字の幅が合わなくて断念。

いろいろ探してみて、ユニコード文字に「ブロック要素」というグループがあり、それが使えそうです。MS ゴシックなどの等幅フォントにすれば、スペース文字との幅もあいそうです。

ユニコード文字のブロック要素

Unicode の 2587 を使います。16進数なので10進数に変換すると 9607 なので式では ChrW(9607)で取得できます。
レコードソースのクエリに下記の演算フィールドを作成します。

式1: IIf(IsNull([出社時刻]+[退社時刻]),"",Space(DateDiff("n",#00:00:00#,[出社時刻])\15) & String(DateDiff("n",[出社時刻],[退社時刻])\15,ChrW(9607)))

今回は一つの式ですみますので、15分単位にしてあります。

24×4の96文字で24時間分になります。とりあえず詳細セクションにテキストボックスを配置して、96文字表示させてそれが表示されるようにテキストボックスの幅を合わせます。コントロールソースは、「式1」にします。

このテキストボックスの上に透明のコマンドボタンを重ねて配置します。コマンドボタンの設定は上記と同じです。

デザイン画面

フォームのモジュールは下記のようになります。

これでグラフがつながって表示できて、ドラッグしてもちらつきはほとんど目立ちません。

帳票フォームガントチャートアニメ

これなら実務に使えそうです。
ただし、テキストなので、幅と高さはフォントサイズに依存します。幅はそのままで高さを高くしたいという場合は、テキストボックスを2つ縦に重ねるなどの工夫が必要です。

チェックポイント

下記の点は覚えておくと他にもいろいろ応用できそうです。

  • フォームのコントロールに式を設定するより、レコードソースのクエリの演算フィールドに式を設定した方が、VBAから演算対象のフィールドを変更したときにちらつきがすくない。さらにコントロールソースの式だとマウスドラッグ中は反映されない。(これはちょっと意外な結果ですね。)
  • ユニコード文字の「ブロック要素」を使うと、テキストボックスをグラフ代わりに使うことができる。
  • マウスドラッグなどのマウス操作を処理に利用したい場合は、透明コマンドボタンを覆うように配置してそこのマウス関連イベントに記述すればいい。

サンプルファイルが下記からダウンロードできます。
FrmGanttChartContinuousForms_07.zip (Access 2007-2010 形式 - 60kb)
FrmGanttChartContinuousForms.zip (Access 2002-2003 形式 - 52kb)
FrmGanttChartContinuousForms_2k.zip (Access 2000 形式 - 52kb)

14 Comments

JUN says..."素晴らしいです。"

いつもブログ拝見してます。Accessでこんなことができるんだという
アイディアがとても素晴らしく歓心させられます。
もし御時間ありましたら、リクエストとして休憩時間も考慮したバー
(1レコードで複数のバー:8:00~12:00 13:00~17:00)も引ける
サンプルをご教授下さい。
これからも応援しています。

2014.11.11 00:09 | URL | #.SonoDYs [edit]
のんほい says..."むむ"

驚きました。
この仕組みをサブに使って入力作業が楽になるスケジュール法を
検討したいと思ってます。ありがとうございます。

2018.03.04 13:45 | URL | #aIcUnOeo [edit]
igaguri says..."月ごとの予約表にしたいのですが"

 hatenaさん、こんばんは。いつも参考にさせていただいております。
このガントチャートを使って予約表をつくりたいと考えています。具体的には現在のフォームを日毎から月毎にして、社員別を日毎にして、1日10件程度の予約を各予約毎に色を別にする。といった感じ ですが可能でしょうか?

2018.04.28 20:08 | URL | #- [edit]
hatena says..."re:月ごとの予約表にしたいのですが"

> 具体的には現在のフォームを日毎から月毎にして、社員別を日毎にして、1日10件程度の予約を各予約毎に色を別にする。といった感じ ですが可能でしょうか?

月毎、社員別 にする場合、フォームヘッダーに月選択コンボボックス、社員選択コンボボックスを配置して、フォームのレコードソースをそれを条件に絞り込むようにすればいいでしょう。

予約毎に色を別にするのは、条件付き書式を使うことになりますね。
ただ、重くなる可能性もありますので、実用になるかどうかは実際に作ってみないとわかりません。
重くなるようなら、非連結フォームにすることになりそうです。

2018.05.01 00:22 | URL | #5uE6dEgY [edit]
igaguri says...""

お返事遅くなりました。ありがとうございます。改良してみます。

2018.05.05 16:33 | URL | #- [edit]
doi says..."ガントチャートaccess2007,2013ではチャートにずれ発生"

ガントチャートaccess2007,2013ではチャートにずれ発生解決策ありませんか?

2018.05.29 14:15 | URL | #- [edit]
hatena says..."re:ガントチャートaccess2007,2013ではチャートにずれ発生"

> ガントチャートaccess2007,2013ではチャートにずれ発生解決策ありませんか?

当方の環境、Win10 Access2010 または、Access2016 でこのページのサンプルでずれは発生しません。具体的にどのようなずれが発生しますか。

2018.05.29 19:51 | URL | #ofj98f56 [edit]
doi says..."access2007,2013ではチャートにずれに関して"

早速の回答ありがとうございます。当方のスペックはos win10 home 64bit ノートパソコン accessはoffice365 2016mso32bit、同ファイルを開いたとき8:00~12:00と入力すれば表示は7:15~10:45と表示される。
又同ファイルをos win10 home 64bit でMicrosoft Office Access 2007で開くと問題ありません。以上よろしくお願いいたします。

2018.05.30 09:17 | URL | #- [edit]
hatena says..."re:access2007,2013ではチャートにずれに関して"

サンプルファイルには、
「F_出退勤」と「F_出退勤1」の2つありますが、ズレが発生するのは、どちらのフォームでしょうか。

2018.05.30 15:56 | URL | #ofj98f56 [edit]
doi says...""

何回もお手数をかけすみません。F_出退勤1です。自分のPC環境の問題でしょうか?他のPCでは無いようです。よって自分もPCをもう一度チェックしてみます。

2018.05.31 08:02 | URL | #- [edit]
hatena says..."re:ずれ"

チャート表示用のテキストボックスのフォント名、フォントサイズは、
MS ゴシック 11 になってますか。

2018.05.31 14:01 | URL | #ofj98f56 [edit]
DOI says..."チャート表示用のテキストボックスのフォントサイズ"

チャート用フォントサイズは9です。それを12に変更したところ正常に時間とチャートが合致しました。ダウンロードした時点では各サイズ(cmd1:9,式1:
11)共にゴシック、すべてを12に変更で合致。
今後とも参考に活用したいと思います。ありがとうございました。

2018.06.01 06:17 | URL | #- [edit]
hatena says..."Re: チャート表示用のテキストボックスのフォントサイズ"

> チャート用フォントサイズは9です。それを12に変更したところ正常に時間とチャートが合致しました。ダウンロードした時点では各サイズ(cmd1:9,式1:
> 11)共にゴシック、すべてを12に変更で合致。

フォントサイズを変更したら、チャートの長さも変わってきますので、それにあわせて、直線コントロールの位置も変更してください。

2018.06.01 12:55 | URL | #- [edit]
DOI says...""

ご指導ありがとうございました。今後ともよろしくお願いいたします。

2018.06.02 09:14 | URL | #- [edit]

Leave a reply






Trackbacks

trackback URL
https://hatenachips.blog.fc2.com/tb.php/431-d7f3236a
該当の記事は見つかりませんでした。