拙著「商売繁盛!アクセスで販売顧客管理」の最新版執筆に伴い、Access2000〜2003対応の販売顧客管理データベースを「Access2007+Vista」対応に移行する作業を行いました。その作業で行ったこと・気付いたことなどについてレポートします。
- エラー定数の確認
VBAのプログラム実行時にエラーが発生した場合、そのエラー番号は「Err.Number」という記述で取得することができます。エラー処理においては、そのエラーに応じて後処理を分岐する場合もあります。たとえば、あらかじめ想定されているエラーが発生したらその行を無視して次のコードへ進ませるとか、想定外のエラーならその旨のメッセージを表示して強制的にプロシージャを抜けるとか、といったことを行うことがあります。
そのような場合には、Err.Numberの値と、あらかじめ想定しているエラー番号とを比較することで処理を分岐させることになるわけですが、問題は、そのエラー番号がOSあるいはAccessのバージョンによって変わることがまれにあるということです。以前の環境なら問題なく動いていたエラー処理がそれらの変更に伴って処理されなくなることがあります。
今回は、Access2003→Access2007、OSがXP→Vistaというようにダブルで環境が変わるため、念のためそれらのエラー定数が同じで通用するかどうかチェックをしておきました。
結果的には、このデータベースで使っているいくつかのエラー定数に関して言えば、従来のままで動作することが確認できました。
Public Const ERR_NOHASVALUE = 2427 '指定した式に値がないエラー
Public Const ERR_NOTOPENOBJECT = 2450 'オブジェクトが開いていないエラー
Public Const ERR_NOTEXISTFIELD = 2465 'フィールドが見つからないエラー
Public Const ERR_DOCMDCANCEL = 2501 'Docmdで実行がキャンセルされたエラー
Public Const ERR_TBLINDEXDOUBLE = 3022 'テーブルインデックスの重複エラー
Public Const ERR_ACCDBEXISTED = 3204 'ACCDBファイルが既に存在するエラー
Public Const ERR_TABLELOCKED = 3211 'テーブルが別プロセスでロックされているエラー
- 日付選択カレンダの表示プロパティ
Access2007では、日付などの入力するテキストボックスに「日付選択カレンダの表示」プロパティが追加されました。これに”日付”を設定しておくと、カレンダ画面をドロップダウン表示させるアイコンが勝手に表示され、その画面から日付を選択することができます。外観や動作的にはちょうどWindows顧問コントロールのDateTimePickerのような感じです。もちろんカレンダのフォーム作成やプログラミングは一切不要です。
今回の販売顧客管理データベースについては、従来は、日付のテキストボックスのすぐ右にボタンを配置し、それをクリックすると別フォームでカレンダコントロールを使った画面が表示され、そこで日付を選択できるようなインタフェースを取っていました。そこで今回の変換作業においても、Access2007でそのような機能が追加されていたのを知っていたので、まずはそれを利用しようと考えました。
ところが、.accdbの変換によって自動的にそのプロパティが有効に設定されているにも関わらず、まったく動作しません。2007環境で新規にテキストボックスを挿入しないとだめなのかとも思いましたが、いろいろ試行錯誤していくうちに、「定型入力プロパティが設定されていると日付選択カレンダは表示されない」ということが分かりました。
このデータベースの場合、「20080112」と入力するだけで日付入力できるようにしています。「/」が入力不要なわけです。それを可能にしているのが定型入力プロパティです。よって、その入力性を取るかカレンダの新しいインタフェースを取るか、という判断になるのですが、結局今回は従来通りの方式(別フォームでカレンダ表示)のまま行くことにしました。
- 読み込み時に並べ替えを適用プロパティ
フォームのプロパティとして、従来からあった「並べ替え」に加えて、Access2007では「読み込み時並べ替えを適用」というプロパティが追加されています。
従来のバージョンでも、ユーザーがフォーム上でマニュアル操作による並べ替えを行った場合、その並べ替え条件が「並べ替え」プロパティに自動的に保存されるようになっていました。しかし、次回フォームを起動したとき、並べ替え条件が設定されていても実際に並べ替えの処理が自動的に行われることはなく、フォーム読み込み時イベントなどのプログラムで「Me.OrderByOn = True」のようなコードを実行してやることが必要でした。
これに対してAccess2007では、「読み込み時並べ替えを適用」プロパティをプロパティシート上で”はい”に設定しておくことで、フォームを開いたときに自動的に「並べ替え」プロパティ値に準じた並べ替えが実行されます。
これは、ユーザーが行った操作を次回画面を開いたときに再現できるという意味では確かに便利かもしれませんが、オリジナルで並べ替えの機能などを実装している場合、それが必ず次回再現されてしまうという点で、予期せぬ初期画面となってしまうことがあります。せっかくフォームのレコードソースのクエリで並び順を厳密に設定しても、それが無視され、あくまでもフォーム上での並べ替え基準が適用されてしまうので、それも問題となることがあるかもしれません。
そのようなことから、.accdbに変換したあと(あるいは新規にフォームを作った場合も同じ)はそのプロパティが”はい”になっているので、すべて”いいえ”に設定変更することにしました。フォームの数が非常に多いので、「すべてのフォームを順番に開いてプロパティ値を変更したあとフォームを保存して閉じる」というプログラムを組んで、一気にプロパティ変更を行いました。
Dim dbs As Database
Dim ctn As Container
Dim doc As Document
Dim strFormName As String
Set dbs = CurrentDb
Set ctn = dbs.Containers!Forms
For Each doc In ctn.Documents
strFormName = doc.Name
DoCmd.OpenForm strFormName, acViewDesign
Forms(strFormName).OrderByOnLoad = False
DoCmd.Save acForm, strFormName
DoCmd.Close acForm, strFormName, acSaveNo
Next doc
- 読み込み時にフィルタを適用プロパティ
「読み込み時に並べ替えを適用プロパティ」と類似したものとして、Access2007ではフォームに「読み込み時にフィルタを適用」プロパティが追加されています。「フィルタ」プロパティに設定されている抽出条件を、フォームを開くとき自動的に適用するかどうかを設定するプロパティで、これもやはり従来はプロパティが設定されていてもプログラムで意図的に実行しなければ(Me.FilterOn = True)、抽出処理が行われることはありませんでした。
ただ不思議なことに、Access2003のMDBファイルを2007形式にコンバートした際、「読み込み時に並べ替えを適用」プロパティはすべて”はい”になっていたのですが、「読み込み時にフィルタを適用」プロパティは”はい”・”いいえ”まちまちの結果になっていました。はじめにいくつかのフォームをみたときは、「こちらのプロパティは”いいえ”に設定されるのだな」と思い込んでしまったのですが、あとから”はい”になっているフォームもあることに気が付きました。どのようなものが”はい”になるのかまでは分析していませんが、やはり従来とバージョンと同じ動作をさせるためには、すべて”いいえ”にしないといけません。よって、「読み込み時に並べ替えを適用」プロパティのときと同様に、プログラムを使ってすべてこの設定を変えます。プログラムのコードとしては、フォームオブジェクトに対して「FilterOnLoad = False」という命令を実行します。
- フォームフィルタの挙動
この販売顧客管理データベースはAccess2000の頃にはじめて作ったものですが、自分のその頃のプログラムの方法として、フォームにフィルタを掛ける際は「DoCmd.RunCommand acCmdApplyFilterSort」という命令を使っていました。ところが、この方法ではAccess2007ではうまく動きません。エラーにはなりませんが命令が完全に無視される状態になります。
そこで今回は、Access2002頃からもっぱら使っている方法、「フォームオブジェクト.FilterOn = True」というコードに書き換えて対処することにしました。
ちなみに、フィルタを解除する命令「DoCmd.RunCommand acCmdRemoveFilterSort」はAccess2007でも正常に動作します。
- データシートの代替えの色
Access2007では、テーブルやクエリ、フォームのデータシートビューにおいて、1行おきに交互に行全体の背景色を変えられるようになりました。これまでは条件付き書式などを駆使してなんとか実現していた機能です。
これを設定するのは簡単で、データシートビューが表示されている状態で、リボンの[ホーム]タブにある[フォント]の[代替の塗りつぶし/背景色]ボタンをクリックして任意の色を設定するだけです。
販売顧客管理では、どちらかというと表形式のフォームが多いので、それらにはこの機能は使えませんが、基本的にデータシートで表示するフォームについてはすべて適用してみました。
なお、プログラムからこれを設定変更することもできるはずですが、ちょっと面倒そうだったので、今回はマニュアルで操作して変更しました。何しろ画面を開いてボタンをひとつクリックするだけですので.....。ただし、フォームがポップアップ状態で開いているときはリボンを操作することはできません。フォームの「ポップアップ」プロパティが”はい”になっているフォームについては、いったんそれを”いいえ”に変更してからフォームを開き、代替えの色を設定したらいったん上書き保存、フォームをデザインビューに戻してから「ポップアップ」プロパティを”はい”に戻して再度保存、という手順を踏む必要があります。
- ボタンへの文字とピクチャの表示
従来より、コマンドボタンには文字列やピクチャを表示できました。しかしいずれか一方しか表示することができませんでした。Access2007では文字列とピクチャを同時に表示させることができるようになりました。
それにはまず、コマンドボタンの「ピクチャ」プロパティでピクチャを選択します。これは従来と同じ操作ですね。ちなみにピクチャビルダに用意されている画像はあいかわらず追加やイメージの進歩はないようです。XPやVista風のアイコンにして欲しいものですが。
次に、「ピクチャの標題の配置」を”ピクチャの標題なし”以外に設定します。”標準”を選ぶと、ピクチャ→文字列の順で画面に表示されます。それ以外に”上・下・左・右”でピクチャと文字列の位置関係を設定できます。
なお、今回の販売顧客管理の2007版データベースについては、画面の横幅目いっぱいにボタンが詰まっているフォームもあり、すべてにピクチャを追加するとはみ出てしまうことから、次の7種類のボタンだけを対象にこの設定変更を行いました(左がボタン名、右がピクチャビルダでのピクチャ名です)。
- [OK] → チェックマーク
- [キャンセル] → ウィンドウを閉じる
- 通常ウィンドウの[閉じる] → 出口
- ダイアログの[閉じる] → ウィンドウを閉じる
- [登録] → 保存
- [抽出実行] → フィルタの実行
- [抽出解除] → フィルタの解除
|