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

オリジナルのレコード移動ボタンを作成する

フォームビューの移動ボタンで、AC2003以前では右三角マーク、左三角マークを押している間は連続移動していたのですが、AC2007 になってから、1回のクリックで1レコードしか移動できなくなりました。使い勝手が悪いのでないとかならないでしょうか。

AC2007では、他にも、マウスホイールでレコード移動できなくなったりとか、改悪と思える仕様変更が多々あります。リボンも使い勝手が悪いし・・・・ブツブツ・・・おっと、話がそれた。

AC2003 以前のバージョンでもフォーム下部の標準の移動ボタンでは小さいのでもっと大きくしたいとか、の要望もあるかもしれません。

そんな場合は、オリジナルの移動ボタンを作ってしまいましょう。

FrmNavigationButtons.png

難易度:

構想

実は、簡単にできます。ウィザードをオンにしておいてコマンドボタンをフォームに配置すると、コマンドボタンウィザードが開きますが、その中の「レコードの移動」に「前のレコードに移動」「次のレコードに移動」というのがあります。それらを選択すれば簡単にできてしまいます。

また、コマンドボタンには「自動繰り返し」プロパティというのがあり、これを「はい」にするとボタンを押している間は設定したイベントプロシージャやマクロを繰り返し実行します。

これで大きなボタンで簡単に連続移動できるかというと、そうはいきません。無情にもヘルプに下記の記載があります。

コマンド ボタンに付属するコードによって現在のレコードが移動した場合は、"AutoRepeat/自動繰り返し" プロパティに効力はありません。

連続移動できなくては当初の目的が達成できません。

しかし、自分のフォームをレコード移動した場合「自動繰り返し」が無効になるのであって、実は、別のフォームをレコード移動させる場合は繰り返し実行できるのです。例えばポップアップウィンドウにボタンを配置すればいいと考えられます。

しかし、GotoRecordメソッドではフォームがアクティブでないとダメなので、フォーカスを移動させると、その時点でやはり「自動繰り返し」は無効になってしまいます。が、下記で紹介したRecordsetプロパティを利用する方法ならアクティブでないフォームもレコード移動できます。

フォームに独自の検索機能を実装する

ボタンを配置するのは、ポップアップウィンドウでもいいのですが、一体感がないので、サブフォームを埋め込んでそこにボタンを配置することにします。境界線を透明にすればサブフォームとは分かりません。

サンプル作成

まずは新規フォームを作成して、そこにウィザードで「前のレコードに移動」「次のレコードに移動」ボタンをそれぞれ作成します。名前は、cmdPrevious、cmdNext とします。ウィザードで作成するのは、標準の移動ボタンと同じマークの画像が付いてくるのでそれをそのまま利用するためです。

ウィザードで自動生成されたイベントプロシージャのコードは削除して下記のよう記述し直します。

「自動繰り返し」は「はい」にしておきます。

また、フォームの「レコードセレクタ」「移動ボタン」は「いいえ」にします。名前は、F_NavigationButtons とします。

後はレコード移動させたいフォームをデザインビューで開き、F_NavigationButtons をそのフォーム上にドラッグ&ドロップするだけです。コードは親フォームに依存しないようになってますので、F_NavigationButtonsフォームを一つ作成しておけば、あとはドラッグ&ドロップするだけで簡単にオリジナルの移動ボタンを設置できます。

あと、必要ならば「先頭レコードに移動」「最後のレコードに移動」「新規レコードに移動」もウィザードで作成しコードを下記のように変更してもいいですね。

レコード番号表示ボックス

標準の移動ボタンにあるレコード番号表示ボックスも作成してみましょう。

F_NavigationButtons のフォームモジュールに下記の関数を記述します。

レコード位置を表示するだけなら最初の3行だけでいいのですが、標準の移動ボタンのように「使用可能」を状況により変化させるためのコードが複雑になりました。

この関数を各ボタンのコードの最後で呼び出してもいいのですが、それだと、このボタン以外の方法、キーボード操作などで移動したときに同期しなくなるので、メインフォームのレコード移動時イベントから呼び出すようにします。そのために、外部からも呼び出せるように Public宣言してます。

メインフォームのレコード移動時イベントでは、下記のように記述します。

2010/03/04 追記:エラーで出る場合があるので上記のコードを修正しました。

いままでの説明を見てもよく分からない、あるいは、上記のものを作成するのは面倒だという方は、下記のサンプルをダウンロードして F_NavigationButtons フォームをインポートして利用することも出来ます。その後、利用したいフォーム上にサブフォームとして配置するだけです。ただし、上記のレコード移動時のコードだけは記述してください。

2011/01/09 追記:帳票フォームの場合、フォームヘッダーかフッターにサブフォームとして配置してください。ただし、ドロップするときメッセージが出て、「既定のビュー」が「単票フォーム」に変更されますが、配置後、手動で「帳票フォーム」に変更すればOKです。

サンプルには、レコード位置表示ボックスを省略したシンプルなバージョンも収録しています。こちらのフォーム名は、F_NavigationButtons_S となってます。

サンプルMDB が下記からダウンロードできます。
FrmNavigationButtons_07.zip (Access 2007 形式 - 62kb)
FrmNavigationButtons.zip (Access 2002-2003 形式 - 48kb)
FrmNavigationButtons_2k.zip (Access 2000 形式 - 46kb)

拍手する

1 Comments

takatkr says..."recordの移動"

他の人がつくったVBAのコードをみるのは、私のような独学AccessManには大変勉強になります。さて、私も2003から2010に変えざるを得なくなり、2000や2003で作ったものが2010ではrecord selectorを押し続けても反応がなく『何じゃこりゃ!!』でした。各種formに合わせて、jumpするListBoxを付け加えるなどで対応してきました。しかし、最近偶然にみつけました、PageUP,PageDownのキーがその役割をします。Excel2010もそうですが何がどこに行ったか分からず、仕事に大迷惑でした。大分慣れてきましたが。 見た目や操作性は変わらずに、中身が進歩して、結果処理が早くなる。これが本当のPC作業の進化だとおもいます。

2014.03.28 14:12 | URL | #- [edit]

Leave a reply






Trackbacks

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