あずきみるくのあずきはニガテ - for Engineer

ひよっこプログラマがやってみたことやハマっちゃったことなど、備忘録的な感じで書いていきます。

Access2013 困ったことと解決法

初めてAccessを触りました。
困ったことがいっぱいです。
困ったことと一緒に、解決方法もメモメモしておきます。

※ただし、環境とかいろいろのしがらみのため、画像はUPできません。
 ごめんなさいm(_ _)m


<環境>
Access 2013
Windows 8.1

※Access2013を使用していますが、納品先が2007のため、
 2013特有のものはなるべく使用しないように気をつけています。


1)開いたフォームのサイズを指定したい

 なんでか、微妙に左に寄っちゃったり、縦に長かったりしてたんですよ。
 (自分のせいですが)
 なので、最初っから指定することにしました。

1.1 コード内に以下を追加

Private Sub Form_Load()
    DoCmd.MoveSize Width:=11000, Height:=7500
End Sub

 これで、表示サイズを変更できます。簡単ですね♪
 見ての通り、横幅は「Width」、縦の長さは「Height」で指定します。
 なんぼにしたらいいかわからない場合は、トライ&エラーでお願いしますw


2)メインフォームを閉じたら、Access本体も終了させたい

2.1 コード内に以下を追加

Private Sub Form_Unload(Cancel As Integer)

  If MsgBox("システムを終了します", vbInformation + vbYesNo) = vbYes Then
    Application.Quit
  Else
    Cancel = True
    End If

End Sub

 これは、「Form_Unload」で書くのがミソだそうな。
 この「Application.Quit」を「終了ボタンを押したとき」の中に書いても
 いいみたいだけど、そうするとフォームの「×ボタン」で閉じると
 対応してくれないらしい。へぇ~。

 ちなみに、「終了」ボタンを作っている場合。
 終了ボタンのSub内でこの「Form_Unload」を呼んでしまうと、終了時の
 メッセージボックスが2回表示されるという、とってもめんどくさいことになります。

 なので、「終了」ボタンの中身は以下のように変更しとります。

Private Sub CMD_終了_Click()
    On Error Resume Next
    DoCmd.Close
End Sub

 ・・・閉めるだけ、ってやつでしょうか。。。
 最終的に「Form_Unload」が呼ばれるので、ここでは何もしません。

<参考>
■T'sWare Access Tips #014 〜メインフォームを閉じたらAccessも終了させる方法〜
FORM_CLOSE時に、終了していいかの確認をして、”いいえ”ならばフォームを閉じ無い方法 --Access Club 超初心者 FORUM--

 

 3)メインフォームだけを開きたい(Access画面は表示したくない)

 これが、正直一番ややこしかったかも。
 Access画面を表示してしまうことのデメリットは、ぼちぼちあります。
  
 ・使用者ががんばったらコードを書き換えられてしまう
 ・↑と同時に、テーブルの中身も書き換えられてしまう
  (設定内容とか書き換えられたら致命的?!
 ・なにより、ダサいw

 逆に、表示させるメリットはない。
 と、いうわけで、見せないように頑張る。

 Access2003くらいまでのバージョンなら「起動時の設定」でちょこちょこ
 チェックボックスを外すだけで実現できたそうですが、2007以降はそうも簡単に
 させてくれないらしい(結構需要はあるはずなんだけどな・・・)
 
 手順は下記のとおり。

3.1 初期表示させるフォームを選択する

 これは、読んで字のごとく、一番最初に表示させるフォームを選択するのです。
 まんまです。

 「ファイル」>「オプション」>「現在のデータベース」の中の
 「アプリケーションオプション」を変更します。

3.1.1 アプリケーションタイトル

 一番上に表示されるタイトルです。お好きにどうぞ。
 ちなみに、何も書いていないとデフォルトはフォーム名でした。
 ・・・ちょっと恥ずかしいねw

 アプリケーションアイコンは設定したかったらしたらいいと思います。
 あずきは今回はノータッチです。

3.1.2 フォームの表示

 ここに、初期表示で表示されるフォーム名を選択します。
 プルダウンになっていて、作成したフォームが既にずらっと出てくるので、
 その中から選びます。


 これで、初期表示させるフォームを設定できました。
 が、よく考えたら、この設定は一番最初にやりますね。
 (だって設定してなかったら最初にメインメニューとか開けないもんね)

3.2 ポップアップの設定

 この設定をしないと、起動時に「何も表示されない」という、
 世にも恐ろしいことが起こるようです。
 あずきは怖くてできません。
 が、後ほど、恐ろしいことが発生します。後で懺悔します。

 手順は簡単。

3.2.1 「ポップアップ」の値を「はい」に変更する

 プロパティの「その他」のタブを開くと、一番上にいます。
 「ポップアップ」の値を「はい」に変更するだけです。

 注)この設定は全フォームにしておいてください。
   でないと、別フォームに遷移した瞬間、何も表示されなくなります。

3.3 標準モジュールの編集

 きっと、このAccessファイルの中で共通に使われるモジュールのことを
 指していると思ってます。(調査が足りなくてすみません、すみません。。。)

 標準モジュールのくせに、初めはいないようです。
 (ただ、あずきのはもともとあるものを流用して作成しているので、
  ほんとはあったらごめんなさい、ごめんなさい。。。)

3.3.1 標準モジュールの作成

 もし、もういらっしゃるのであれば追記でいけると思います。
 まだいらっしゃらない方のために。

 「コードビルダー(?っていうのですかね?コード書く画面です)」の
 左上あたりに、なんかツリー構造みたいな絵があります。
 一番上の太字になっているところを右クリックすると。。。
 「プロジェクト名(?↑)」>「挿入」>「標準モジュール」
 で作れます。

3.3.2 標準モジュールに追記

 以下のコードを記載(追記)します。

Option Compare Database
Option Explicit

' オープン時、Access自身の表示状態を設定するAPI 宣言
Public Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, _
    ByVal nCmdShow As Long) As Long
    
' ウィンドウの表示状態を設定する定数の宣言
Public Const SW_SHOWMINIMIZED = 2   ' ウィンドウをアクティブにして最小化
Public Const SW_MINIMIZE = 6        ' ウィンドウを最小化
Public Const SW_HIDE = 0            ' ウィンドウを非表示

 ここでは、書いてある通り、APIと定数を宣言しています。
 これからこいつを使います。

3.3 起動用コードの編集

 3.1にて設定した初期表示させるフォームのコードに、以下のコードを追記します。
 もうすでに「Form_Open」を設定している場合は中身を追記するだけでいいかも。

Private Sub Form_Open(Cancel As Integer)
    Dim rc As Long
    rc = ShowWindow(Application.hWndAccessApp, SW_SHOWMINIMIZED)
End Sub

 中身は3.3.2で作成したAPIの呼び出しです。
 「ShowWindow」の2つ目の引数を変えることで、動きを変更することができます。
 このコードでは
 「SW_SHOWMINIMIZED:ウィンドウをアクティブにして最小化」
 を設定しています。



 あれ?やりたいことってAccess画面を非表示にしたいんじゃなかったっけ?
 だったら、「SW_HIDE:ウィンドウを非表示」にしたほうがいいんじゃない?

 ・・・やめたほうがいいです。いや、絶対にしないでください。

 ここからあずきの懺悔です。
 ↑のような甘い考えのもと、勝手に「SW_HIDE」を設定しました。
 やっちゃダメ、って下に書いてあったにも関わらず、読み飛ばしました。
 本当に、、、後悔しました。ごめんなさい。。。。

 どうなったかというと。



 Accessを起動しました。
 一瞬、Access画面が表示された後・・・何もなくなりました。

 そして、、、落ちなくなりました。
 新しく開くこともできません。
 起動中のため、削除もできません。

 ・・・仕方なく、タスクマネージャから強制終了という手段を使いました。
 よくないです。

 なので、くれぐれも!設定は「SW_SHOWMINIMIZED」でお願いしますm(_ _)m

3.4 Accessを終了する処理

 上記のように、落とせない、というのは致命的なバグです。

 それを避けるためにも、画面上でちゃんとAccess本体も終了できるよう、
 終了の処理を記載しなければなりません。

 終了処理の内容は
 2)メインフォームを閉じたら、Access本体も終了させたい
 を参考にしていただけたら大丈夫なので、ここでは割愛させていただきます。


 これで、Accessを起動したら、フォームのみの表示ができます。


 ただ、今回あずきは無視しますが、ひとつ、問題があります。

 それは、普通にダブルクリックなら正しく動くのですが、
 「Shift」キーを押しながらダブルクリックすると、、、
 
 編集画面で開いてしまうのです。
 
 そりゃもう、テーブル触り放題、コード変え放題、デザインいじりたい放題です。
 なので、本来であれば「Shift」キーを無効にする設定が必要になろうかと思います。
 必要な場合は以下をご参照ください。

 Shift Keyの無効 - データベースウィンドウの非表示:SampleFile001

<参考>
Access #Et008 ≪Access画面を非表示にする方法、Win32 API≫


まだまだいろいろあった気もしますが、おいおい追記していきます。