Access 2019でSwitchboardItemsが動かない原因と対処法

スポンサーリンク
スポンサーリンク

1. Accessをバージョンアップしたらメニューが動かなくなった

旧バージョンのAccessで長年使用していたシステムをAccess 2019へ移行したところ、
これまで正常に動作していたメニュー画面が使えなくなったので見て欲しいという依頼がありました。

内容としては新バージョンに変更したら「コンパイル エラー:ユーザ定義型は定義されていません」
となってしまうということでした。

最初に購入したバージョンに入っていたテンプレートを使用したものが
新しいバージョンでは動作しなくなるのはよくあることです。
このメニューで使用されていたテンプレートは「Switchboard Items(スイッチボード項目)」というものを使用されていたようです。

2. AccessのSwitchboardItemsとは?

SwitchboardItemsとは

Accessには、メニュー画面を作成するための仕組みとして、
旧バージョンでは**Switchboard Manager(スイッチボード マネージャー)**が利用されていました。

Switchboardを利用すると、

メインメニューを作る
メニュー項目を追加する
フォームを開く
レポートを開く
別のメニューへ移動する

といった操作をまとめることができます。

Switchboard Itemsテーブル

Switchboardを使用するとSwitchboard Itemsテーブルが自動的に作成され、
メニュー情報をここで管理することができるようになります。

SwitchboardID 数値型 メニューのページ番号(「1」はメインメニュー)
ItemNumber 数値型 ボタンの配置順(「0」はそのページ全体のタイトルを定義)
ItemText 短いテキスト型 ボタンやタイトルに表示される文字列Command数値型実行する処理の識別番号(例: 2=フォームを開く、3=レポートを開く、5=アプリ終了)Argument 短いテキスト型 開く対象の「フォーム名」や「レポート名」

3. Switchboardを作成すると何が自動的に作られる?

Switchboard Itemsテーブルが自動的に作成されます。

Switchboard Itemsテーブルはメニューの情報が入っていてメニューを表示する際に
このテーブルを参照してメニューを構成します。

メニューフォーム自体がこんな感じです。

昔のAccessシステムは確かにこんな感じの作り多いなと思っていましたが
テンプレートで用意されていたんですね。
私は使ったことないのですが確かに使い勝手は良さそうに感じました。

自動的にフォームが作成されます。

ここからメニューの編集をするとSwitchboard Itemsテーブルの内容が更新されます。

4. Access 2019へ移行したら何が起きた?

メニューが起動しなくなったり、あるボタンを押下時にコンパイルエラーが発生するケースは多いです。
今回のケースでもメニューが起動しなくなったとのことでした。

Access2019というか旧AccessのMDBファイルをaccdbファイルに変換する際に
上手く行かない場合は、accdbファイルを新規作成して旧MDBファイルの内容をインポートして
取り込むことで解決することが多いです。

無事、起動するようになったもののメニューの編集ボタン押下時にエラーが発生していました。

5. エラーの原因を調査

メニュー起動時のVBAコードを追っていきました。

シフトキーを押しながらAccessを起動します。
そのあと、シフトキーを押しながらメニューフォームを押下します。

フォームのイベントを確認すると中にHandleButtonClickイベントがあります。

    
Private Function HandleButtonClick(intBtn As Integer)
' この関数は、メニュー項目のボタンがクリックされたときに呼ばれます。
' 変数 intBtn が、クリックされた項目を表します。
   Select Case rst![Command]
        
        ' メニュー用フォームの編集
        Case conCmdCustomizeSwitchboard
            ' メニュー用フォームが存在しなかった場合
            On Error Resume Next
            '#Application.Run "WZMAIN70.sbm_Entry"
            Application.Run "ACWZMAIN.sbm_Entry"
        
            If (Err <> 0) Then MsgBox "コマンドが存在しません。."
            On Error GoTo 0
            ' フォームの再表示
            Me.Filter = "[ItemNumber] = 0 AND [Argument] = '既定'"
            Me.Caption = Nz(Me![ItemText], "")
            FillOptions

        ' 他のコマンドの実行
        Case Else
            MsgBox "不明なコマンドです。"
    
    End Select

<修正箇所>
‘旧バージョン
Application.Run “WZMAIN70.sbm_Entry”

‘Access 2019
Application.Run “ACWZMAIN.sbm_Entry”

6. まとめ

Accessを旧バージョンから新しいバージョンへ移行する場合、
フォームやテーブルだけでなく、VBAやAccess独自の機能についても確認が必要です。

今回はSwitchboardItemsを利用したメニューでエラーが発生していましたが、
原因を調査し、VBAを修正することで正常に動作させることができました。

一点懸念点としては、テンプレート機能を使用しているからか
データ量にくらべかなり重たいファイルになっていました。
(修復や最適化しても変わらず)

コメント

タイトルとURLをコピーしました