自分がAccessやそれに付属されているツールを使うのであればそれほど問題はないのですが、他人が自分の作ったツールを使うというのであれば話は変わってきます。
自分が作ったツールを自分が使うのであれば、そのツールの動作はだいたいわかっているので必要な時に必要ではないボタンを押してしまったり、おかしな処理をしてしまうといったことは少ないです。
けれども自分以外のユーザーが使うとなると、自分が意図した使い方とは全然違う操作をしてしまうものです。そういった時にエラーが出てそのエラーを修正して、正しい使い方を教えたりしなければいけません。
けれども、どんな操作をしようとしても最初からエラーが出ないような仕組みになっていれば、自分以外のユーザーに安心して使ってもらうことができるでしょう。
その方法のひとつとして、自分の備忘録として、「AccessVBAのNavigateToでナビゲーションウィンドウに特定オブジェクトだけ表示させる方法」を整理していきたいと思います。
AccessVBAのNavigateToでナビゲーションウィンドウに特定オブジェクトだけ表示させる方法を考えたきっかけ
Accessを使う場合、通常テーブルやクエリ、フォームやレポートを使うでしょう。あるいはモジュールやマクロを使う人もいるかもしれません。そういったオブジェクトの一覧が、Accessの画面の左側の「ナビゲーションウィンドウ」に一覧として表示されているかと思います。
ここは、場合によってはオプションから最初から表示させないようにも出来ます。けれども業務の内容によっては最初から表示させた方が都合が良い場合もあります。
表示させた方が良いといってもオブジェクトが非常に数が多い場合、例えば100個以上あって、そこから特定の複数のクエリをユーザーに実行させるとなった場合ミスが出る可能性があります。
例えば実行するクエリ自体を間違えたり、実行するクエリの順番を間違えたりといった具合です。
この原因として考えられるのは、表示されるオブジェクトが100個以上というように数が多すぎるので、ユーザーにとってどれを選択していいかわかりづらくなってしまうことです。
ある特定の時に、そもそも最初から実行するクエリだけが表示されていればミスも少なくなるはずです。そのような問題を回避するために調べたのが今回のAccessVBAのNavigateToを使ったコードです。
AccessVBAのNavigateToでナビゲーションウィンドウに特定オブジェクトだけ表示させるための前準備
AccessVBAのNavigateToでナビゲーションウィンドウに特定オブジェクトだけ表示させるための前準備として、まず以下の処理が必要になります。
例えば以下のように画面左側のナビゲーションウィンドウにいくつかオブジェクトがあったとします。まずナビゲーションウィンドウ上部にある▽を押すとプルダウンメニューが表示されます。

そこから「ユーザー設定」の部分をクリックすると下の画像のように「ユーザー設定のグループ1」という項目が表示されます。その状態から「これだけを表示させたい」という特定のオブジェクトをユーザー設定のグループ1の所にドラッグ&ドロップします。

するとドラッグ&ドロップしたオブジェクトがユーザー設定のグループ1の所に表示されるようになります。
次は「作成」タブから「マクロとコード」グループにある「マクロ」を選択、すると以下のような画像が表示されます。そこから画面右側の「アクション カタログ」の検索ボックスに「ナビ」と入れると目的の動作の項目を選択しやすくなります。

検索に「ナビ」と入れて表示された一覧から「移動先」をダブルクリックすると画面中央にマクロの動作を選択させるコンボボックスが2つ表示されます。
上側で「ユーザー設定」を選択、下側で「ユーザー設定のグループ1」を選択します。
その状態からリボンの右側にある「マクロをVisual Basicに変換」を押します。そこから表示されるのが、次の項目で説明するコードになります。
AccessVBAのNavigateToでナビゲーションウィンドウに特定オブジェクトだけ表示させるコード
ここまでの前準備から生成されたのが以下のコードになります。確認した環境はAccess2013です。処理の都合上、FunctionをSubに変更するというように若干の修正を加えてあります。
'------------------------------------------------------------ ' マクロ1 ' '------------------------------------------------------------ Sub マクロ1() On Error GoTo マクロ1_Err DoCmd.NavigateTo "ユーザー設定", "ユーザー設定のグループ 1" マクロ1_Exit: Exit Sub マクロ1_Err: MsgBox Error$ Resume マクロ1_Exit End Sub
上記のコードのポイントは
「DoCmd.NavigateTo “ユーザー設定”, “ユーザー設定のグループ 1″」
になります。
このコードの書式は、AccessのVBEからオブジェクトブラウザでNavigateToを調べてみると以下のように記述されています。
Sub NavigateTo([Category], [Group])
Access.DoCmd のメンバー
今回のコードで第一引数の[Category]に該当するのが「ユーザー設定」、第二引数の[Group]に該当するのが「ユーザー設定のグループ 1」になります。
以上のコードを実行すると以下のような形で表示されます。

ちゃんと「ユーザー設定のグループ1」のグループにドラッグ&ドロップしたオブジェクトだけが表示されていますね。
ちなみに全てのオブジェクトを表示させたい場合は以下のコードになります。tswareというページのコードを参考にさせていただきました。
DoCmd.NavigateTo "acNavigationCategoryObjectType", ""
ここまで書いたコードを利用すれば、仮にオブジェクトが100個以上あったとしても実際に表示されるのは前準備でドラッグ&ドロップしたオブジェクトだけなので、ツールを利用するユーザーのミスも少なくなるのではないでしょうか。
「マクロをVisual Basicに変換」はExcelのマクロ記録に似ている
今回Accessの操作の中で「マクロをVisual Basicに変換」という方法を使いました。この「マクロをVisual Basicに変換」という方法はExcelでいうところの「マクロ記録」に似ている感じです。
この「マクロをVisual Basicに変換」の詳しい使い方は以下のサイトを参考にしていただくの良いかと思います。
【 Access VBA 】マクロからVBAへの変換方法-KENスクール
今回使ってみて気づいたんですが、この使い方は今まで勉強してきた
- 『VBAエキスパート公式テキスト Access VBA ベーシック』
- 『よくわかる Microsoft Access 2013 基礎』
- 『よくわかる Microsoft Access 2013 応用』
- 『ExcelVBAでAccessを操作するツボとコツがゼッタイにわかる本』
- 『Accessマクロ&VBAのプログラミングのツボとコツがゼッタイにわかる本』
といった本には確か載っていなかったので意外な感じがしました。
というのも、これって非常に便利な機能なんじゃないかと思ったからです。なぜなら、今回の自分のようにインターネットで目的のコードを調べてもなかなか見つからない場合があります。
そういった時に動作を選択していってコードに変換できる、というのは業務を自動化しようと考えている人間にとって非常に助かります。本来であればツール作成の方が重要なのに、そのためのコードを探す時間の方が長くなってしまっては色々と効率が悪いですからね。
Accessの「マクロをVisual Basicに変換」という機能はもっと評価されても良いんじゃないかと思いました。
まとめ
今回のコードを調べた理由は、もちろん自分以外のツールを利用するユーザーのミスが少なくなるようにという目的もあったのですが、インターネット上でNavigateToに関連するコードがなかなか見つからなかったという点もありました。
先にも書きましたが、AccessのVBEからオブジェクトブラウザでNavigateToを調べてみると以下のような書式が表示されます。
Sub NavigateTo([Category], [Group])
Access.DoCmd のメンバー
正直、「NavigateTo([Category], [Group])」だけではイマイチ使い方がわかりません。インターネットでこのコードの用法を調べてみると以下のような感じのコードしか見つけることができません。
DoCmd.NavigateTo “acNavigationCategoryObjectType”, “”
第一引数に「ObjectType」という文字列があるのでここに「acQuery」と入れて、第二引数に表示させたいクエリ名を入れればいいのかと思ったのですが、エラーが出てしまいます。
そこからいろいろと試行錯誤はしてみたのですが、どうしても上手くいきません。そこから別のコードややり方を模索していたところ見つけたのが今回のやり方になるというわけです。
自分としては、書式ではなく何らかのケースを想定した実際に使う場合のコード(引数にもう少し具体的に文字列が入ったコード)が知りたかったのでどうすれば良いか悩んでいました。
今回偶然ではありますが、Accessの「マクロをVisual Basicに変換」という機能から何とか目的のコードを見つけることができました。
Accessを知るには、やはりAccessにあるいろんな機能を使ってみないといけないなと思いました。





















コメント