起動時のオプションを実行時ダイナミックに設定するお手本

図4-1-1 起動時のバイパスキーを有効/無効にするサンプルデータベース
このサンプルデータベースは、Access起動時(スタトアップ)のオプションを実行時ダイナミックに設定します。通常、Access起動時のオプションは、ツールメニューから起動時の設定をクリックして起動時の設定ダイアログを表示させて設定します。このダイアログからは、12種類のオプションを設定することができます。
・ アプリケーションのタイトル
・ アプリケーションのアイコン
・ メニューバー
・ 全てのメニューを表示
・ 既定のショートカットメニュー表示
・ 起動時に表示するフォーム/ページの指定
・ データベースウィンドウを表示
・ ステータスバーを表示
・ ショートカットメニューバー
・ 組み込みツールバーを使用
・ ツールバー/メニューを変更
・ シートカットキー
例えば、起動時に表示するフォーム/ページオプションに、フォームfrmMyAppを設定するとAccess起動時、自動的にfrmMyAppが表示されます。Accessのアプリを本番の環境で運用するときは、データベースの安全性/保全性を考えて、エンドユーザーが直接テーブルを開いてデータを書き替えないようにガードする必要があります。データベースをガードするには、起動時の設定ダイアログから、データベースウィンドウを表示しない、ショートカットキー(f11)を無効にする等のオプションを設定します。この場合、Accessが起動されてもデータベースウィンドウが表示されませんので、エンドユーザーが直接テーブルを開くことができなくなります。
ところが、Accessには逃げ道があって、シフトキーを押しながらデータベースをダブルクリックして起動すると、起動時のオプションがバイパスされてしまいます。このバイパスオプションは、本来開発者向けなの機能なのですがエンドユーザーが使用したときは、データベースを破壊する可能性があります。VBAを使用すれば、このバイパスキー(シフトキー)を無効にすることができます。図4-1-1に表示されているフォームのトグルボタンをクリックして、スタートアップ時のバイパスキーを無効にします。フォームを閉じるボタンをクリックして、Accessを終了させます。シフトキーを押しながら、データベース(CH4-1.mdb)をダブルクリックして起動します。起動時のバイパスキーが無効になっていますので、起動時のオプションが適用されてfrmChangePropertyが表示されます。次に、トグルボタンをクリックして、スタートアップ時のバイパスキーを有効にしてAccessを終了させます。データベースをダブルクリックして再起動すると、起動時のオプションがバイパスされてデータベースウィンドウが表示されます。

図4-1-2 起動時の設定ダイアログから、起動時のオプションを再設定して直接テーブルを開けないようにした例
サンプルデータベース(CH4-1.mdb)では、以下のノウハウを習得することができます。
◆ エンドユーザーがテーブルを直接開けないようにガードする方法
◆ 起動時のバイパスキーを無効にする方法
◆ 起動時のオプションを実行時、ダイナミックに再設定する方法
● 起動時のバイパスキーを有効/無効にするフォームを作成するには
1 Accessを起動して作業フォルダに、新規データベースCH4-1.mdbを作成します。
2 データベースウィンドウからフォーム
をクリックしたら新規作成ボタンをクリックします。フォームの新規作成ダイアログが表示されたら、一覧からデザインビューを選択してOKボタンをクリックします。
3 フォームのデザインビューが表示されたら、ツールボックスから、トグルボタンのアイコン
をクリックしてフォーム中央に作成します。トグルボタンのプロパティを表示させたら、コントロール名をtglAllowBypassKeyに書き替えます。既定値には、Trueを設定します。標題は、実行時ダイナミックに設定します。次に、ツールボックスからテキストボックスのアイコン
をクリックして、トグルボタンの右に作成します。テキストボックスのプロパティを表示させたら、コントロール名をcmdQuitに書き替えます。最後に、ツールボックスからラベルのアイコン
をクリックしてラベル1とラベル2を作成します。ラベルの標題は、表4-1-1のように設定します。
表4-1-1 コントロールのプロパティ
|
コントロールの種類 |
プロパティ |
値 |
|
トグルボタン |
名前 |
tglAllowBypassKey |
|
既定値 |
True |
|
|
標題 |
実行時設定 |
|
|
コマンドボタン |
名前 |
cmdQuit |
|
ピクチャ |
ビットマップ |
|
|
ピクチャタイプ |
埋め込み |
|
|
ラベル1 |
標題 |
Startup |
|
ラベル2 |
標題 |
トグルボタンをクリックしてスタートアップ時のバイパスキー(Shift Key)を有効/無効にすることができます。 無効に設定したときは、Shift Keyを押してMDBを開いてもスタートアッププロパティがバイパスされません。 |

図4-1-3 フォームにトグルボタン、コマンドボタン、ラベル1,2を作成した例
4 メニューからコードのアイコン
をクリックして、フォームモジュールを表示させます。 CH4-1.mdbを開いてfrmChangePropertyのフォームモジュールをコピーして貼り付けます。フォームモジュールのソースコードは、リスト4-1-1を参照してください。また、CH4-1.mdbのモジュールからbasChangeProperty, basMyLibもインポートしておいてください。フォームをfrmChangePropertyの名称で保存します。
5 フォームfrmChangePropertyをビューモードで開いたら、トグルボタンをクリックして“スタートアップ時のバイパスキー(無効)”にします。フォームを閉じるボタンをクリックして、Access を終了します。起動時のバイパスキー(シフトキー)を押しながら、データベースCH4-1.mdbをダブルクリックします。起動時のバイパスキーが無効に設定されているため、起動時のオプションが適用されてfrmChangePropertyが表示されます。スタートアップ時のバイパスキーを有効にしたときは、シフトキーを押してデータベースをダブルクリックすると、起動時のオプションがバイパスされてデータベースウィンドウが表示されます。
6 起動時のバイパスキーオプションが正常に動作することを確認したら、Accessを終了させます。
Sub cmdQuit_Click()イベントの処理
このイベントは、フォームを閉じるコマンドボタンをクリックしたときに実行されます。このイベントでは、DoCmdのQuitメソッドでAccessのアプリを終了します。
Sub Form_Open()イベントの処理
このイベントは、フォームが開かれたときに実行されます。このイベントでは、起動時のオプションAllowBypassKeyの値を取得して、トグルボタンの標題に表示します。db.Properties("AllowBypassKey")では、AllowBypassKeyの値(True/False)を取得して、トグルボタンに設定します。データベースにAllowBypassKeyプロパティが登録されていないときはエラーが発生して、Err_Form_Openに制御が渡ります。エラー処理ルーチンでは、Select Case…End Selectでエラーコードを調べて、プロパティ未登録のエラーならエラーを無視して処理を続行します。その他のエラーが発生したときは、エラーメッセージを表示して終了します。
Sub tglAllowBaypassKey_AfterUpdate()イベントの処理
このイベントは、トグルボタンをクリックしたときに実行されます。このイベントでは、ChangeProperty_FS()関数でAllowBypassKeyのプロパティを書き替えます。この関数は、basChangePropertyモジュールに登録されていますので参照してください。ChangeProperty_FS()関数には、プロパティ名、プロパティのデータ型、プロパティの値を引数として指定します。
・ strPropertyName – プロパティ名を指定します(例:AppTitle, AppIcon,…)
・ intPropertyType - プロパティのデータ型を指定します(例:dbText, dbBoolean,…)
・ varPropertyValue – プロパティの値を指定します
例えば、AllowByPassKeyのプロパティを”True”に設定するには
ChangeProperty_FS(“AllowBypassKey”, dbBoolean, True)
のように指定します。また、アプリケーションのタイトル(AppTitle)プロパティを設定するには、
ChangeProperty_FS(“AppTitle”, dbText, “My App Title”)
のように指定します。
プロパティを変更したら、トグルボタンのCaption(標題)に、AllowBypassKeyの値を表示して終了します。トグルボタンの標題には、“スタートアップ時のバイパスキー(有効/無効)”のように表示されます。
リスト4-1-1 frmChangePropertyのフォームモジュール
|
Option Compare Database Option Explicit Private Sub cmdQuit_Click() DoCmd.Quit End Sub Private Sub Form_Open(Cancel As Integer) Dim db As DAO.Database
Call SetAppTitle_FS("Change Property (C) " _ & Year(Date) & " by Akio Kasai")
On Error GoTo Err_Form_Open Set db = CurrentDb Me.tglAllowBaypassKey = db.Properties("AllowBypassKey")
Exit_Form_Open: Me.tglAllowBaypassKey.Caption = "スタートアップ時のバイパスキー(" _ & IIf(Me.tglAllowBaypassKey, "有効", "無効") & ")" Exit Sub
Err_Form_Open: Select Case Err.Number Case 3265 Err.Clear Case Else MsgBox Err.Description, vbInformation, Err.Number Resume Exit_Form_Open End Select
End Sub Private Sub tglAllowBaypassKey_AfterUpdate() With Me If ChangeProperty_FS("AllowBypassKey", _ dbBoolean, _ .tglAllowBaypassKey) = True Then .cmdQuit.SetFocus .tglAllowBaypassKey.Caption = "スタートアップ時のバイパスキー(" _ & IIf(.tglAllowBaypassKey, "有効", "無効") & ")" End If End With End Sub |
リスト4-1-2 basChangePropertyモジュールのChangeProperty_FS()関数
|
Public Function ChangeProperty_FS( _ strPropertyName As String, _ intPropertyType As DAO.DataTypeEnum, _ varPropertyValue As Variant) _ As Boolean On Error GoTo ChangeProperty_FS_Err Const conPropNotFoundError = 3265 Dim db As DAO.Database Dim prp As DAO.Property Set db = CurrentDb db.Properties.Delete strPropertyName Set prp = db.CreateProperty( _ strPropertyName, _ intPropertyType, _ varPropertyValue, _ True) db.Properties.Append prp ChangeProperty_FS = True ChangeProperty_FS_Exit: Set prp = Nothing Set db = Nothing Exit Function ChangeProperty_FS_Err: Select Case Err.Number Case conPropNotFoundError Err.Clear Resume Next Case Else MsgBox Err.Description, vbInformation, Err.Number Resume ChangeProperty_FS_Exit End Select
End Function |
Tip
|
関数の引数の定義にEnumを使用すると便利: ChangeProperty_FS()関数の引数2のデータ型に、DAO.DataTypeEnumを指定すると関数の引数を入力するとき、定数の候補が一覧に表示されます。 Public Function ChangeProperty_FS( _ strPropertyName As String, _ intPropertyType As DAO.DataTypeEnum, _ varPropertyValue As Variant) _ As Boolean
図4-1-4 ChangeProperty_FS()関数の引数2の候補が一覧に表示される |
|
AllowBypassKeyプロパティ使用上の留意点: 本番で稼動しているデータベースのAllowBypassKeyプロパティをFalseに設定すると、シフトキーを押してデータベースをダブルクリックしても起動時のオプションがバイパスされません。つまり、データベースをメンテできない状態になります。 開発者が、データベースをメンテするためには、本番用と開発用の2個のデータベースを用意すると便利です。開発用は、*.MDBの形式、本番用は、*.MDEの形式で作成して高速化します。また、メインフォーム(起動時のオプションで指定したフォーム)のOnLoadイベントにAllowBypassKeyプロパティを設定するコードを追加します。 ChangeProperty_FS()関数の引数3には、AllowBypassKeyプロパティの値(True/False)を指定します。Right(CurrentProject.FullName, 3) = "mdb"では、カレントデータベースの拡張子(mdb/mde)を調べてmdbなら”True”、mdeなら”False”を返します。これにより、本番のmdeは自動的に起動時のバイパスキーが無効となり、データベースがガードされます。開発用は、起動時のバイパスキーが有効ですからメンテ可能です。尚、開発用のmdbをメンテするときは、本番のmdeから全てのテーブルをインポートしてデータを同期させます。 fOK = ChangeProperty_FS("AllowBypassKey", dbBoolean, _ Right(CurrentProject.FullName, 3) = "mdb") |
ChangeProperty_FS()関数では、AllowBypassKeyオプションの他に、表1-15-2に示すオプションのプロパティを変更することができます。
表4-1-2 起動時に設定可能なオプションの一覧
|
オプション名 |
値(注) |
内容 |
|
AppTitle |
文字列 |
アプリケーションのタイトル |
|
AppIcon |
文字列 |
アプリケーションのアイコン(パス名) |
|
StartupMenuBar |
文字列 |
デフォルトのメニューバー |
|
AllowFullMenus |
True/False |
組み込み済みのメニューバー表示 |
|
AllowShortcutMenus |
True/False |
組み込み済みのショートカットメニュー表示 |
|
StartupForm |
文字列 |
アプリ起動時に表示するフォーム/データページ |
|
StartupShowDBWindow |
True/False |
データベースウィンドウを表示 |
|
StartupShowStatusBar |
True/False |
ステータスバーの表示 |
|
StartupShortcutMenuBar |
文字列 |
ショートカットメニューバーを全てのフォーム/レポートで使用 |
|
AllowBuiltInToolbars |
True/False |
組み込み済みのツールバーを表示 |
|
AllowToolbarChanges |
True/False |
ツールバーの変更を許可 |
|
AllowBypassKey |
True/False |
シフトキーを押してデータベースを開いたとき、起動時のオプションをバイパス
ChangeProperty_FS(“AllowBypassKey”,dbBoolean,True) |
|
AllowBreakIntoCode |
True/False |
CTRL+BREAKキーを押したときに実行中のコードを中断する |
注)プロパティの値が文字列のとき、ChangeProperty_FS()関数の引数2には、dbTextを指定します。また、プロパティの値がTrue/Falseのときは、dbBooleanを指定します。
例1:ChangeProperty_FS(“AppTitle”, dbText, ”My
App Title”)
例2:ChangeProperty_FS(“AllowBypassKey”,
dbBoolean, True)
ChangeProperty_FS()関数では、Access 2000の起動時のオプションを変更することができますが、ApplicationのSetOptionメソッドを使用するとAccess のグローバルオプションを実行時に変更することができます。(一般に、Access
のグローバルオプションは、Accessのツールメニューからオプションをクリックして、オプションのダイアログから設定します。)
表4-1-3 Access のグローバルオプションの一部
|
オプション名1 |
値 |
内容 |
|
Refresh
Interval (sec) |
数値 (0-32766) |
再表示の間隔(秒) |
|
Number of
Update Retries |
数値 (0-10) |
レコードがロックされているときの再試行回数(.mdbのみ有効) |
|
ODBC
Refresh Interval (sec) |
数値 (1-32766) |
ODBCの再表示間隔(秒) |
|
Update
Retry Interval (msec) |
数値 (1-1000) |
レコードがロックされているときの再試行間隔(ミリ秒) |
|
Default
Open Mode for Databases |
数値 0=共有 1=排他 |
既定のデータベースを開くモード(.mdbのみ有効) |
|
Default
Record Locking |
数値 0=ロックしない 1=全てのレコード 2=編集中のレコード |
既定のレコードロックの種類(.mdbのみ有効) Application.SetOption
"Default Record Locking",2 |
|
Use Row
Level Locking |
True/False |
レコード単位でロック(.mdbのみ有効) |
例えば、既定のレコードロックの種類を“2=編集中のレコード”に変更するには
Application.SetOption "Default Record Locking",2
のように記述します。オプションを取得するには、
Debug.Print Application.GetOption("Default Record Locking")
のようにGetOptionメソッドを使用します。