ACCESSアプリを複数のPCから使う場合の更新ツール (ACCESS2007、2010)

ACCESSアプリを複数のPCから使う場合の更新ツール (ACCESS2007、2010)


私の場合は、ACCESSを使うそれぞれのPCにインストールしておき、テーブルはどこかのPCにテーブルだけのACCESSを置いておいて、各PCからリンクテーブルを使ってつないでいます。

このような使い方の場合、欠点としては、まずACCESSのバージョンを統一しなくてはなりません。
会社のPCなんて、7もあればXPもあり、ACCESSだって2003、2007、2010、2013と、そのPCのOSとかOfficeのバージョンによって多種多様に並んでいます。

たとえACCESS2010でアプリを開発したとしても、どのPCでも、どのACCESSのバージョンでも使えるようにしたいなんてこれは無理です。
ACCESSとは同一バージョンをインストール(RunTimeも含めて)してあるPCにのみ起動できます。(もちろん下位互換ではありますが・・・)

もちろん、サーバーにACCESSを置いておき、起動する時はクライアントからショートカットでサーバーから呼び出すという方法もあります。
でもこの手は悪くはないのでしょうが何か安定しない気がして使っていません。

クライアント側ではACCESSをインストールしておかなくてはならなのはもちろんですが、アプリにそのほかに必要とされる参照設定のためのファイル関係やそのバージョンもアプリに合わせておかなくてはなりません。

またサーバーにSharePointというものをインストールしてアプリをサーバーに入れておけば、環境さえ合えばどこのクライアントでもアプリが起動できる、という手もありますが、Windows Serverという専用OSをインストールしてあるマシンを設置しなくてはなりません。

そんなこんなで、通常使っている7のマシンにアプリを入れておき、他でも使いたいACCESSをインストールしてあるマシン側で、起動時にアプリが最新かどうかを判断して通常使っているマシンの方が最新なら自動的にコピーしてから、アプリを起動する、というスクリプトを作りました。

言語は、Windows Script Hostというもので記述されています。
これは、Windowsマシン(95以上)ならどのマシンでも標準でOSの一機能としてインストールされていますので、特別にインストールプログラムをダウンロードするとかいう必要はありません。
xxxx.vbs というファイルをダブルクリックすれば、いきなり動いてします。

面倒といえば、基準となるACCESSアプリを改訂したら、別途、Version.txtというテキストファイルの一行目にアプリの改訂バージョンを書き換えなくてはなりません。
この数値と、別PCのバージョンテキストで基準側が大きい数値なら、基準側からアプリをコピーして起動する、ということを実行します。

(あまりうまい説明でなくてすみません。)


・・・という訳で最新バージョンコピーツールです。
以下のスクリプトをメモ帳にコピペして、XX処理.vbs とかで保存して下さい。
これのショーカットをデスクトップに置きます。

XX処理.vbsをメモ帳で開いて、
① 基準となるACCESSアプリが置いてあるフォルダ名を記述、
② ACCESSアプリ名を記述(xxxx.accdbとか)、
③ ACCESSアプリ名の改訂バージョン値が記載されているテキストファイル名、
④ その他関係するファイル名
を書き換えて保存します。
あと、基準アプリがあるフォルダ内のファイル一式をまとめてこちらにコピーしておきます。

これでショートカットをダブクリすれば、基準アプリが改訂されると勝手ににコピーして最新版となります。
別にACCESSアプリでなくても何にでも応用が利くので必要に応じてVBSは修正して下さい。

なお、実行する前に一通りバックアップすることをおすすめします。
(何かトラブルが起きても責任もてません、自分への備忘録的な記録ですので・・・)


フォントノ関係で、円マーク(¥)は「バックスラシュ」で表記されているかもしれません。
メモ帳に貼り付けると日本語表記となります。


'****************************************************************************
'■ACCESS をメイン端末(サーバー)からバージョン管理テキストを参照して最新版を自動的にダウンロードするVBS
'****************************************************************************

'****************************************************************************
'VBS 開発メモ
'Option Explicit                       '変数に対して明示的な宣言を強制する

'MsgBox と同じ働きをする
'WScript.Echo "こんにちは", "ありがとう", "こんばんは", "さよなら"
'各メッセージの間に半角空白が入る
'****************************************************************************


'****************************************************************************
'元本(サーバー)ファイル名の定義
'****************************************************************************
'---------------------------------------------
'元本のフォルダとファイル名の定義
'ここで個別の定義を行う、これ以降なはい
'---------------------------------------------
'元本のaccdbが置いてあるフォルダ
strBaseFolder = \\192.168.1.1\disk1\ACCESSアプリ

strAccdbName = "Seisa2003.mdb"                                                  '元本のACCESSのaccdb名
strVersionName = "Version.txt"                                                  '元本のVersionテキストのファイル名
strFileName1 = "comlib2003.mda"                                                 'その他ダウンロードするファイル名1
strFileName2 = ""                                                               'その他ダウンロードするファイル名2
strFileName3 = ""                                                               'その他ダウンロードするファイル名3
strFileName4 = ""                                                               'その他ダウンロードするファイル名4
strFileName5 = ""                                                               'その他ダウンロードするファイル名5
strFileName6 = ""                                                               'その他ダウンロードするファイル名6
'---------------------------------------------
'ファイルシステムオブジェクトの定義
'---------------------------------------------
Set Fs = WScript.CreateObject("Scripting.FileSystemObject")
'---------------------------------------------
'元本フォルダの\チェック
'---------------------------------------------
If Right(strBaseFolder, 1) <> "\" Then
    strBaseFolder = strBaseFolder & "\"
End If
'---------------------------------------------
'元本ファイルのフルパス名
'---------------------------------------------
strBaseAccdb = strBaseFolder &  strAccdbName                                    'ACCESSファイル
strBaseVersion = strBaseFolder & strVersionName                                 'バージョンファイル

'その他ダウンロードするファイル
strBaseFile1 = strBaseFolder & strFileName1                                     'ファイル名1
strBaseFile2 = strBaseFolder & strFileName2                                     'ファイル名2
strBaseFile3 = strBaseFolder & strFileName3                                     'ファイル名3
strBaseFile4 = strBaseFolder & strFileName4                                     'ファイル名4
strBaseFile5 = strBaseFolder & strFileName5                                     'ファイル名5
strBaseFile6 = strBaseFolder & strFileName6                                     'ファイル名6

'****************************************************************************
'起動(クライアント)ファイル名の定義
'****************************************************************************
'---------------------------------------------
'起動パスを取り込む
'---------------------------------------------
strMyFullPath = Wscript.ScriptFullName
'---------------------------------------------
'起動フォルダ名を取り出す、末尾\付き
'---------------------------------------------
strMyFolder = Replace(strMyFullPath, WScript.ScriptName, "")
'---------------------------------------------
'起動フォルダとファイル名の定義
'---------------------------------------------
strMyAccdb = strMyFolder & strAccdbName                                         'ACCESSのaccdb名、フルパス
strMyVersion = strMyFolder & strVersionName                                     '起動Versionファイル名、フルパス

'その他アップロードするファイル
strMyFile1 = strMyFolder & strFileName1                                         'ファイル名1
strMyFile2 = strMyFolder & strFileName2                                         'ファイル名2
strMyFile3 = strMyFolder & strFileName3                                         'ファイル名3
strMyFile4 = strMyFolder & strFileName4                                         'ファイル名4
strMyFile5 = strMyFolder & strFileName5                                         'ファイル名5
strMyFile6 = strMyFolder & strFileName6                                         'ファイル名6
'****************************************************************************
'元本(サーバー)ファイルと起動(クライアント)ファイルの存在確認
'****************************************************************************
'---------------------------------------------
'元本ACCESSファイルの存在チェック
'---------------------------------------------
If Fs.FileExists(strBaseAccdb) = False Then
    MsgBox "元本ACCESSファイルが存在しません、現在のACCESSを起動します!" & strBaseAccdb
    Call SubAccdbRun(strMyAccdb)
End If
'---------------------------------------------
'元本バージョンファイルの存在チェック
'---------------------------------------------
If Fs.FileExists(strBaseVersion) = False Then
    MsgBox "元本バージョンファイルが存在しません、現在のACCESSを起動します!" & strBaseVersion
    Call SubAccdbRun(strMyAccdb)
End If
'---------------------------------------------
'元本バージョンファイルのバージョン値を読みだす
'---------------------------------------------
Set Otf1 = Fs.OpenTextFile(strBaseVersion, 1)                                   '1:ForReading読み取りモードで開く

'0件確認
If Otf1.AtEndOfStream Then
    MsgBox "元本バージョンファイルの中身がありません、現在のACCESSを起動します!"
    Call SubAccdbRun(strMyAccdb)
End If

'1行目を読む
strLine = Otf1.ReadLine                                                         '1行読み込む、1行目にバージョン
strBaseVer = Trim(strLine)                                                      '元本バージョン番号
Otf1.Close
'---------------------------------------------
'起動バージョンファイルの存在チェック
'---------------------------------------------
If Fs.FileExists(strMyVersion)  = False Then
    MsgBox "起動バージョンファイルが存在しません、現在のACCESSを起動します!" & strMyVersion
    Call SubAccdbRun(strMyAccdb)
End If

'0件確認
Set Otf2 = Fs.OpenTextFile(strMyVersion, 1)                                     '1:ForReading読み取りモードで開く
If Otf2.AtEndOfStream Then
    MsgBox "起動バージョンファイルの中身がありません、現在のACCESSを起動します!"
    Call SubAccdbRun(strMyAccdb)
End If

'1行目を読む
strLine = Otf2.ReadLine                                                         '1行読み込む、1行目にバージョン
strMyVer = Trim(strLine)                                                        '起動バージョン番号
Otf2.Close
'---------------------------------------------
'元本バージョンと起動バージョンの比較
'---------------------------------------------
If strBaseVer > strMyVer Then
'ファイルコピー
    MsgBox "☆☆ 最新ACCESSを転送します ☆☆"

    'コピー命令、コピー元,コピー先
    Fs.CopyFile strBaseVersion, strMyVersion                                    'ACCESSファイルコピー
    Fs.CopyFile strBaseAccdb, strMyAccdb                                        'バージョンファイルコピー

    'その他ファイルがあればコピー
    Call subFileSend(strFileName1, strBaseFile1, strMyFile1)
    Call subFileSend(strFileName2, strBaseFile2, strMyFile2)
    Call subFileSend(strFileName3, strBaseFile3, strMyFile3)
    Call subFileSend(strFileName4, strBaseFile4, strMyFile4)
    Call subFileSend(strFileName5, strBaseFile5, strMyFile5)
    Call subFileSend(strFileName6, strBaseFile6, strMyFile6)
Else
    'MsgBox "◆◆ 既存の新ACCESSを起動します ◆◆"
End If
'---------------------------------------------
'コピー後のACCESSを起動
'---------------------------------------------
Call SubAccdbRun(strMyAccdb)


'****************************************************************************
'その他ファイルの指定がありが存在すればコピー
'****************************************************************************
Sub subFileSend(strFileName, strBaseFile, strMyFile)

    If Len(Trim(strFileName)) > 0 then
        If Fs.FileExists(strBaseFile) = True Then
            Fs.CopyFile strBaseFile, strMyFile
        End If
    End If

End Sub


'****************************************************************************
'起動ACCESSが存在すれば起動し、VBSを閉じる
'****************************************************************************
Sub subAccdbRun(strMyAccdb)

    '起動ACCESSファイルの存在チェック
    If Fs.FileExists(strMyAccdb) Then

       'Shellオブジェクト定義
       Set WSHShell = WScript.CreateObject("WScript.Shell")
       intErrCode = WSHShell.Run(strMyAccdb, 1, False)                          'False=Shell待機しない
    Else
       MsgBox "★★ 起動ACCDBが存在しない!!! ★★"
    End If

    Wscript.Quit(0)                                                             'VBS終了

End Sub


音(wav)を鳴らす方法 (Windows API)

音(wav)を鳴らす方法


音を鳴らす方法にはいくつかあるのですが、いろいろやってみて、一番早くなる方法です。
MediaPlayer をいちいち起動させると、誤動作したり、一呼吸しないと鳴らなかったりで、
不満が残るのですが、WindowsAPIで記述すると、さっとすんなり鳴ります。

WindowsAPIの定義を、フォームのモジュールに最初に記述します。
音源のパス名は変数にしてWindowsAPIの直後に記述してみました。

以下サンプルです。見本にして下さい。



Option Compare Database
Option Explicit


'**************************************************************************
'WAV音を鳴らすためのAPI定義
'**************************************************************************
Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" _
(ByVal lpstrCommand As String, ByVal lpstrReturnString As String, _
ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long

'音源のフルパス名変数定義
Dim sstrOKSound         As String                           '成功音
Dim sstrErrSound        As String                           'エラ-音
Dim slngReturn          As Long                     '音を鳴らした時の戻り値


'**************************************************************************
'フォームの読み込み時
'**************************************************************************
Private Sub Form_Load()

    '音の設定
    sstrOKSound = "C:\wav\OKSound.wav"                   '読み込み成功時の音源 フルパス
    sstrErrSound = "C:\wav\ErrorSound.wav"               '読み込みエラー時の音源 フルパス

End Sub


'**************************************************************************
'テキストに入力があった時
'**************************************************************************
Private Sub txtCode_AfterUpdate()
'    ・
'    ・
'    ・
'    ・
      if txtCode.Value = "OK" thne
            slngReturn = mciSendString("Play " & sstrOKSound, "", 0, 0)     '成功音
      else
            slngReturn = mciSendString("Play " & sstrErrSound, "", 0, 0)      'エラー音
      End if

End Sub



フォームを開いてから閉じて戻った時の処理

フォームを開いてから閉じて戻った時の処理

なんか話がややこしいみたいに伝わるので、処理を順に追って説明します。

(1) フォーム(親)のコマンドボタンを押すと、フォーム(子)が開くようにします。

(2) フォーム(子)が閉じられるとフォーム(親)に戻ります。

(3) フォーム(親)のボタンを押した時のコード
        DoCmd.OpenForm "frmWK", acNormal, "", "", , acNormal

(4) フォーム(親)のボタンが押されると、フォーム(子)が開き、その次の命令にそのまま行きます
        MsgBox "点まで届け"

◇◆ ここで、(4)のMsgBoxはフォーム(子)が閉じられるまで待つことはできないか??

◇◆ できます・・・
        DoCmd.OpenForm "frmWK", acNormal, "", "", ,
acDialog


        何のことはないのですが、これだけです。
       
        (3) のフォーム(子)を開く命令で、acDialogにすることにより、ここで一旦止まってしまいます。
       

リンク先のテーブルをリンク先でコピーする

リンク先のテーブルをリンク先でコピーする


ACCESSでは、プログラム用accdb と テーブル用accdbに分けて使用していることがあります。
そこで、DoCmd.TransferDatabase を使ってリンクテーブルのコピーを行うと、コピー先のテーブルは、自accdbで作られ、しかも、リンクされたテーブルが出来上がってしまいます。

この目的でいい、というのならそはそれでいいのですが・・・
今回は、リンク先のaccdb に、リンクしてあるテーブルの複製を作る方法です。

① リンク先のaccdbを起動する
② DoCmd.TransferDatabaseを使って、リンク先のaccdbでコピーを実行する

・・・という手順で処理します。

以下は、サンプルプログラム。

**************************************************************************
Private Sub コマンド_Click()

   
    'DoCmd.TransferDatabase コマンドは自分にしかインポートできないので
    'リンク先を起動してそこでコマンドを実行してテーブルをコピーする
   
    '------------------------------------
    'リンク先accdbのパスを取得
    '------------------------------------
    Dim dbDB            As DAO.Database                     'このaccdb
    Dim tdfSet          As DAO.TableDef                     'テーブル名
    Dim strLinkDB       As String                           'テーブルのリンク先accdb
   
    'テーブルの定義
    Set dbDB = CurrentDb
    Set tdfSet = dbDB.TableDefs("tblGOLD")
   
    'リンク先DBのパスを取得
    strLinkDB = Mid(tdfSet.Connect, 11)
   
    Set tdfSet = Nothing
    Set dbDB = Nothing
 

    '------------------------------------
    'リンク先のaccdbを起動してテーブルをコピー
    '------------------------------------
    Dim appAccess       As Access.Application
    Set appAccess = CreateObject("Access.Application")

    'テーブルコピー実行
    With appAccess
        .OpenCurrentDatabase strLinkDB

        .DoCmd.TransferDatabase acImport, "Microsoft Access", _
        strLinkDB, acTable, "tblGOLD", "tblGOLD2011"

             '左がコピー元テーブル名、右がコピー先テーブル名
        .Quit
    End With

    Set appAccess = Nothing

End Sub

『カレント プロシージャ』『カレント モジュール』『カレント プロジェクト』の違い

『カレント プロシージャ』『カレント モジュール』『カレント プロジェクト』の違い

標準モジュールにぱたぱたとVBAを打ち込んでいて、検索画面を出していると、対象として
○カレント プロシージャ
○カレント モジュール
○カレント プロジェクト

の3つが選択できるようになっています。

では、この3つの違いはなんでしょうか。
検索してみて判りました。

モジュール


























○カレント プロシージャ
Function ~ End Function の間、
もしくは、Sub ~  End Sub までの間
赤い丸の部分

○カレント モジュール
ひとつのモジュールの中にいくつか Function があれば、
そのモジュール中を通して検索
緑の丸の部分

○カレント プロジェクト  
いくつかの モジュールをまたいで検索
青い丸の部分

◆検索ならいいのですが、置き換えをしようとして、
カレント プロシージャのつもりがカレント モジュールでやってしまうと取り返しがつかない時があります。

置き換えは十分に確認してから実行しましょう。





livedoor プロフィール
タグクラウド
QRコード
QRコード
  • ライブドアブログ