見出し画像

Access覚書き二 フォームやレポートの表示位置はどう決まる?

私は自分でAccessアプリを作るときにフォームやレポートをのプロパティ・ポップアップを「はい」にしてウィンドウ状にして表示しています。
理由は簡単でaccessの標準表示は全部重なって表示されるので把握しにくいし、作業するなら複数のウィンドウを並べたり自在に動かしたほうが作業性がいいと思うからです。
以下の話はフォーム、レポート、全てポップアップによるウィンドウ表示してることを前提にしています。

今回ポップアップするウィンドウの「位置」について、とても気になったのでまとめてみました。

Private Sub Form_Load()
Me.Move 0, 0
End Sub

いちばん簡単なのは、上記コードをフォームに入れて置くだけ。
フォームのロード時イベントでMoveメソッドを使うとフォームの表示位置を指定できます。Moveのパラメータは
Move (left、top、width、height)
となるので、位置と一緒に表示ウィンドウのサイズを指定することができます。
ここで指示された位置、サイズは、フォームのロード時に指示しているものなので、開かれたウィンドウの位置を変えたり、サイズ変更は自由にできます。
させたくない場合は、別のプロパティの設定が必要になりますね。

ちなみにここで使われるパラメータの単位は「twip」というちょっと変わった単位です。マイクロソフトのオリジナル単位twipが採用されるにはそれなりに理由があるのですが、1twipは0.0017638888888889cmのため大きなウィンドウを表示しようとすると結構とんでもない数値になります。

脱線しました。
ウィンドウ位置/サイズは上記のコードで解決するのですが、私の要望は実はちょっと違います。
「vbaのコードなんかでいちいち指示するなんて面倒くさいよ。現在作業しているサイズ/位置があるんだから、これを閉じるときに覚えておいて、次回開くときにその位置に開いてくれればいいよ。」
ってことです。

しかし、実際に作業しているとフォームやレポートのウィンドウサイズ、位置について、どのタイミングで保存されているのかは不明です。
サイズや位置を調整して閉じ、開くと前回のスタートと同じ位置サイズで開かれるということが何度もあって、大変イライラしていました。
「保存が必要なら」と思ってデザインビューに切り替えると、仕様上フルスクリーン化するので、位置/サイズについてはまっさらになってしまいます。

更には、フォームがフォームビューで表示されているときは上画像のように保存ボタンがグレーになっているので保存できないんですよね。
かなり諦め気分だったのです。しかし、フォームビューで表示されているフォームのタイトルバー上で右クリックした時のメニューになんと、「上書き保存」の項目があるじゃないですか!しかもグレーになってません。

「知らんかったんかい」と突っ込まれそうですが、「知らんかったのです。」
ここで保存を行うとウィンドウの位置/サイズを保存してくれ、このウィンドウを閉じ、再度開くと保存が行われた位置に開かれます。
ちなみに、Ctrl+Sによるショートカット保存も普通に使えました。
初歩的すぎて笑えますが、覚書きとしてここに残しておきたいと思います。

しかし、問題はこれで終わりません。
実は上記のルールが適用されないものがあります。それは、レポートの印刷プレビューのポップアップ表示です。

今回のデータベースにはユーザーが入れた文章にデータベースのデータを組み込んで、印刷するという機能を入れました。
ただ、テキストボックスのサイズの関係で、ユーザーが入力した文字列の長さによっては、印刷時文字の一部が切れる心配があります。
そこで、ユーザーが文字列を入力し、ボタンを押したら、該当レポートをプレビュー表示させ、入力直後からどのように印刷されるかを確認できるようにしました。

しかし、このときに表示されるプレビューは毎回同じ位置に、下が切れた状態で登場し、なおかつ表示が大きすぎるため、大変使いにくいのですが、なぜか前述の保存が全く効きません。
「プレビューは表示確認だから一定倍率で表示位置も保存しませんよ。」という設定になっているようだ。

表示位置については、印刷プレビュー表示では保存されないのが前提なのでは?と考え、一旦レポートビューにして保存するという方法で解決した。

しかし、ウィンドウの大きさについては内部設定のプレビュー表示倍率に従ってウィンドウサイズが自動調節されているようで、どうしても調整できなかった。そこでここだけは、レポートオープン時のコードに表示サイズを指示することで解決した。以下はレポートオープン用に設定したボタンクリック時のコード

Private Sub OpenPreview_Click()
Me.Requery
On Error Resume Next
DoCmd.Close acReport, "レポート名", acSaveNo
On Error GoTo 0
DoCmd.OpenReport "レポート名", acViewPreview
DoCmd.MoveSize , , 6000, 9000
End Sub

テキストボックスに入力した文字列がすぐレポート側に反映するように、まずリクエリを行っている。
3~5行目で一回レポートプレビューを閉じ
6.7行目でサイズを指定してレポートプレビューを開いている。

プレビューが表示している状態でもボタンを押すたびに文字列の更新が反映されるようにしたかったのだが、copilotとも長く議論結果、印刷プレビューには「repaint」などの再描画機能は無く、一度開かれた印刷プレビューは内容が維持されるということなので、仕方なく「一度閉じてまた開く」という手法で、印刷プレビューの再描画をしている。もっとスマートな方法をご存じの方は教えてほしい。
なお、4行目でレポートを閉じるコマンドを出しているが、レポートが開かれていない場合(初めて押した時、ユーザーがレポートを閉じた時)、エラーが出るので、エラーを無視するために3行目、5行目がある。

いかがでしたでしょうか?とても小さなtipでしょうが、ネット上にも情報が少なく、「出来ないけど、まいっか」で終わってしまいそうなポイントを突いてみました。

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