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)

拍手する

1 Comments

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

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

2014.11.11 00:09 | URL | #.SonoDYs [edit]

Leave a reply






Trackbacks

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