見出し画像

Access覚書き三 「割と使えないな」と感じたaccdeファイル

まー、もしかしたらベテランの方には「なに言ってのこいつー」と思われてしまうかもしれませんが、個人的に感じたことなので書いてみたいと思います。
その前にアクセスにおけるaccdeファイルについて簡単に解説しておいたほうがいいでしょう。

アクセスでが普通にデータベースを作成して作られるのが拡張子「.accdb」というファイルです。
私のように古い時代からアクセスを使ってきた人にとっては「.mdb」じゃないのか?って言う人もいるかも知れませんが、これは古いファイル形式です。現在、アクセスでデータベースを作るならaccdbファイルがポピュラーだし、わざわざmdbでつくる人もいないと思うのでここでは、mdbの話は割愛したいと思います。
アクセスで作成するもう一つのファイル形式が、「.accde」ファイルです。
これは普通に作成されたaccdbファイルを変換する形で作成されます。実際には、
ファイル-名前を付けて保存-ACCDEの作成と進みます。
作成に失敗する場合がありますが、ほとんどの場合はVBAにエラーが有るのが原因なので、Microsoft Visual Basic for Applicationsのメニュー
デバッグ-「プロジェク名」のコンパイル
を実行してエラーの部分をしっかり潰してしまえば成功するはずです。

「変換される」と書きましたが、windowsでは拡張子の違いも違うファイルとして認識されるので
プロジェクト.accdb
を名前を付けて保存-accdeの作成
プロジェクト.accde
として、同じフォルダに保存してもそれぞれ違うファイルとして存在することができるし、元のaccdbファイルが無くなったりすることはないので、気軽に作成し、上書き保存することも全く問題ありません。
とにかく気軽に作ることが出来ます。

では、そうして作られたaccdeファイルが元のaccdbファイルととどのような違いがあるのか?が重要なポイントです。
accdeファイルを作成する最大の目的は、「編集の禁止」です。
編集が禁止になるとフォームやレポートを変更ができなくなって、誰かがレイアウトを変えてしまうこともなくなるし、VBAの内容を見れなくなるのでプログラム上起きている計算やギミックがどういうvbaで書かれているのかバレず、編集されることもありません。
ただし、テーブルの編集などは出来ませんが、レコードを追加したり編集したりすることは可能です。
なので、フォーム、レポート、など、インターフェースをいじらせること無く、データベースの中身の編集は可能なため、第三者ユーザーにファイルを渡しても、プログラムを壊されること無くデータベース操作は可能なので理想的なファイル形式と言えるかもしれません

アクセスで作られたデータベースアプリは、常に開発した人が使うわけではありません。私のように誰かのためにアプリを作成する場合、むしろ作成者は全く関与しないまま、いろんな人が操作することになるので、フォームやレポートのレイアウト、各種ボタンのギミックがいじられなくなるのは大変嬉しいことなので、できれば人に渡すときにはaccdeに変換して渡したいな、と思うところです。、、、しかし、

実は私は人に渡す時もaccdeに変換することはしません。
理由は、私の技術が未熟だからなのかもしれませんがaccdeに変換すると困るケースが結構あるからなんです。

実は私が過去に作って複数の方々に使ってもらっているデータベースのほとんどは、事務用にデータを保存するだけが目的ではなくて、印刷物、送り状、請求書のようなものをプリントアウトする機能を含んでいます。

プリンターは最も開発環境と使用環境の違いの影響を受ける点です。
私のコンピュータには接続されていない様々なプリンターに、それが手元にない環境でプログラムしプリントアウトしなければなりません。
そこで私が良く使っているのが以下のようなコードです。

Public Sub PrintReport(reportName As String)
    
    PrintCopies = Me!busuu
    DoCmd.OpenReport reportName, acViewPreview, , "[ID] = " & PrintID, acHidden
    DoCmd.PrintOut , , , , PrintCopies
    DoCmd.Close acReport, reportName
    DoCmd.Close acForm, Me.name
    
End Sub
Private Sub レポート1設定ボタン名_Click()
Call PrintReport("レポート名")
End Sub

このコードを実行するとレポートが印刷プレビューで開かれ、さらにページ設定ダイアログが開かれます。ダイアログを操作してページの設定を終えると印刷プレビューも閉じられます。
また上のコードをパブリックコード、下のコードを実行コードにすることで、レポート名だけを書き換えながらコードを使い回すと簡単に複数のレポート設定が出来ます。

非常にシンプルで短いコードですが、このコードを印刷物の種類。つまりレポートの数だけ用意すれば、自分のPCに接続されていない見たことのないプリンタにも狙いの印刷物を出力させることが出来ます。
アクセスのレポートにおける「ページ設定」ダイアログは大変に優れていて、
どのプリンタの、どの用紙を、どの給紙口から給紙して、こういう設定で印刷せよ。という設定をレポートごとに記憶しておくことが出来ます。そのため、一度設定するだけで、あとはプリントボタンを押すだけで、狙ったプリンタ、狙った用紙、狙った給紙口、から狙った印刷設定で印刷可能です。
その都度、プリンタを選んだり、設定をし直す必要が一切ありません。
パソコンが苦手な人に操作させるのにもたいへん向いています。

しかし、実は、これがaccdeで機能しなくなるのです。
ページ設定で行われるプリンタ、用紙等の設定は直接目には見えませんが、どうやらレポート単位で保存されているようです。
そのため、accdeのレポートの設定は変えられないという規制に引っかかるようです。一見変えられるように、設定の作業はできるのですが、その変更は保存されず、そのファイルがaccdbだった時代に最後に行われた設定がそのまま保存され続けます。

前回紹介したフォームなどウィンドウの位置の記憶も同じでした。accdbの最後に行われた位置の保存が、内部的に保存されておりその設定は変えることが出来ない作りのため、フォームの位置/サイズは自在に動かすことが出来ますが、再度開いたときには毎回同じところに登場します。
もし、accdeファイルで誰かに納入することが前提なっているのであれば、ウィンドウは明示的に位置を固定して作成したほうが良さそうです。
ウインドウがどこに登場するか?は操作/効率上結構重要な要素ですからね。

もしこれらのハードルが越えられる、気にならない。というのであればaccdeも悪くないファイル形式だとは思いますが私には使えません。

このハードルを超える最短距離は、ウィンドウの位置、プリンターの設定などを全てテーブルに書き出すことだと思われます。
個別のフォーム、レポートなどの設定は保存されませんが、レコードに書き出したり、レコードの編集はできるという点を利用するのです。

ちなみに、ウィンドウの位置をテーブルに書き出す手法は、一度挑戦しましたが挫折しました。アクセスはウィンドウの位置を吸い上げるとピクセル数で、返ってきて、ウインドウ位置を指定する際はtwipになるためです。単位変換をするのですが、この際にまたハードルが、、、
しかし、accdbファイルで保存すること前提にするならフォームをクローズする際に設定を保存するコードを一つ書くだけでクローズ時の位置で次回オープンすることが可能です。

ページ設定をレコードに書き出す手法はまだ挑戦したことがありません。
どなたかパワーユーザーの方ぜひ教えて下さい。
また、私が書いた問題点を回避できるよ、という情報がありましたら、ぜひよろしくお願いします。
その情報を手に入れたら、この記事を引っ込めることになると思います。

この記事が気に入ったらサポートをしてみませんか?