【Access】不真面目にシステム開発を考える4~メインメニュー作成~

メインメニュー作成

6月なのにエアコンつけようか迷っているJimです。どうも✋

 

今回は前回の続きのメインメニュー作成。

それから起動用ファイルとライブラリの作成。

これらの関係性を説明すっと、、、

全てのプログラムはサーバーに置きます。勿論、メインメニューも。

じゃあ、ユーザーはサーバーのメインメニューを開くのか?というと、そゆわけでもないし、ファイルを配るわけでもない。

同じファイルを使うということはクラッシュの可能性があるので、ユーザーには常に新しいファイルを使用してもらいます。

なので、自動で『各自のパソコンにフォルダを用意し、サーバーからメインメニューをコピーして開く』プログラムのショートカットを配ります。

全てのプログラムをサーバーに置くので、メインメニューにも『各自のパソコンにフォルダを用意しサブメニューをコピーして開く』というプログラムを書きます。

ちょっと待て、それだと『サブメニューからまたサブメニューを開くときにも同じことを書くのか?』となってしまうので、1つ共通のライブラリを作成しておくのです。

とりま、メインメニューとサブメニューを作りやす。

単純にタイトルとボタンを1つ作成したフォームを用意し、ファイルをコピペすればいいだけ。

 

メインメニューからサブメニューを開くライブラリは後で実装するが、予めファイルだけ作成しておく。

 

ただ単純にファイルを一つ作成してモジュールを2つ作成し名前を付けただけ。

これらのファイルはサーバのプログラム用フォルダに保管する。

今回は『C:\Accessシステム研究部\src』に保管し名前は下記のようにした。

ライブラリ  :A_001_Library.accdb

メインメニュー:A_002_メインメニュー.accdb

サブメニュー :A_003_システム研究部メニュー.accdb

 

起動用ファイル作成

次にメインメニューを起動するファイルを作成する。

サーバからコピーしたファイルを置く場所をCドライブに作成しペーストする。

プログラムを置くフォルダが無ければ作成し、そのフォルダ内にライブラリとメインメニューをペーストしオープンするプログラムを書く。

今回はbatファイルにします。別に何語でも構わない。例えばりんごでも。。。は?

if not exist C:\プログラム\Access mkdir C:\プログラム\Access
copy /Y C:\Accessシステム研究部\src\A_001_Library.accdb C:\プログラム\Access\A_001_Library.accdb
copy /Y C:\Accessシステム研究部\src\A_002_メインメニュー.accdb C:\プログラム\Access\A_002_メインメニュー.accdb
start "C:\Program Files\Microsoft Office\root\Office16\MSA_ESS.EXE" "C:\プログラム\Access\A_002_メインメニュー.accdb" /runtime
exit /B 0

『C:\プログラムフォルダ\Access』がなければフォルダを作成。

コピペ。

コピペ。。

ランタイムでオープン。。。

MSA_ESS.exeファイルの場所は会社で揃えろとしか言えない。

もしくは動的なプログラムを書くか。

まあ、実行しましょう。

ファイルがサーバからローカルにコピペされ。。。

 

ランタイムでメインメニューが開きました。

 

レジストリ設定ボタン?気になる?それは、、また今度。

 

ライブラリ作成

最後にライブラリを作成する。

毎回毎回、『フォルダが無ければ作成してコピーして・・・』なんて書いてられない。

起動用ファイルはできたのでメインメニューは起動用ファイルから、それより下位のサブメニュー達はライブラリで開く。

内容はbatファイルとほぼ同じ。

プログラムを置くフォルダが無ければ作成し、そのフォルダ内にライブラリと指定したファイルをコピペしオープンする。

気を付けたいのは、このライブラリはパブリックなもの。なので、下位のサブメニューを開発する時に名前が被らないようにしなければならない。

こういったことは、不真面目にコーディング規約を定めたほうがよい。

 

定数用のモジュールに定数を定義する。

今回はパスのみ。ファイルを置く場所はサーバもローカルも定位置なので定数にする。

Option Compare Database
Option Explicit

Public Const PF_PGM_COPY_DRECTORY As String = "C:\Accessシステム研究部\src\"
Public Const PF_PGM_PASTE_DRECTORY As String = "C:\プログラム\Access\"

 

共通メソッド用のモジュールに例のプログラムを仕込む。もっと汎用的なライブラリを作成してもいいが、今回は簡単なものを用意した。

ファイル名を指定して実行すると、サーバから指定ファイルをローカルにコピペして開く。

Option Compare Database
Option Explicit

'Accessをコピペしてファイルを開く
Public Sub PS_AccessOpen(ByVal fileName As String, Optional macroName As String = "")

    'ディレクトリの作成
    Call addDirectory

    '共通関数をコピペ
    Call copyAndPaste("A_001_Library.accdb")

    '指定ファイルのコピペ
    Call copyAndPaste(fileName)

    'ファイルを開く
    Call fileOpen(fileName)

End Sub


'ファイルを開く
Private Sub fileOpen(ByVal fileName As String)

    Shell "MSAccess.exe /runtime" & PF_PGM_PASTE_DRECTORY & fileName, vbMaximizedFocus

End Sub

'ファイルをコピペ
Private Sub copyAndPaste(ByVal name As String)

    Dim fileSystemObject As Object
    Set fileSystemObject = CreateObject("Scripting.FileSystemObject")

    fileSystemObject.CopyFile PF_PGM_COPY_DRECTORY & name, PF_PGM_PASTE_DRECTORY & name

    Set fileSystemObject = Nothing

End Sub

'ディレクトリの作成
Private Sub addDirectory()

    If Dir(PF_PGM_PASTE_DRECTORY, vbDirectory) <> "" Then Exit Sub

    '\でスプリット
    Dim dirSplit As Variant
    dirSplit = Split(PF_PGM_PASTE_DRECTORY, "\")

    'ディレクトリ格納用
    Dim dirStr As String
    dirStr = dirSplit(0)

    'フォルダが無ければ作成
    Dim i As Long

    For i = 1 To UBound(dirSplit)

        dirStr = dirStr & "\" & dirSplit(i)

        If Dir(dirStr, vbDirectory) = "" Then

            MkDir dirStr

        End If

    Next

End Sub

 

サーバのライブラリが更新出来たら、ローカルのライブラリも上書きするか起動用ファイルを実行し上書きする。

 

作成したライブラリを使用する

サーバにあるメインメニューを開いてVBEを開く。

ツール⇒参照設定。

 

参照設定。

 

ファイルの種類を『accdb』か『すべてのファイル』にしローカルのライブラリファイルを選択。

 

ライブラリのプログラム名が選択された状態になるのでOK。

 

サブメニューを開くボタンのイベントをイベントプロシージャに変更。

 

ライブラリに作成したメソッドにファイル名を渡すコードを書きます。

Private Sub c_btn_システム研究部_Click()

    Call ps_accessOpen("A_003_システム研究部メニュー.accdb", "")

End Sub    

 

起動用のファイルからメインメニューを開きサブメニューボタンをクリック。。。

 

ん?何か変なメッセージが出る。。。

 

 

ってことで、変なメッセージについては次回ということで。

したら、またね✋