5.9 エクスポート、エクスポート
 他のMDBファイルから自分の中にフォームやレポートやモジュールなど何らかのオブジェクトを取り込みたいとき、または逆に自分が持っているフォームやレポートやモジュールなどを他のMDBへ送り込みたいときの方法です。アクセスオブジェクトのDoCmd.TransferDatabaseというメソッドを使います。

 それにしてもこのメソッド、差分を配布するときなんて超便利な気がしますが…誤った使い方をすると、とんでもないことになりますのでご注意を(汗)
DoCmd.TransferDatabase
 DoCmd.TransferDatabaseメソッドの使い方です。こんな順序でパラメタを指定します。

アクセスオブジェクト.DoCmd.TransferDatabase (1) ,"Microsoft Access" ,(2) ,(3) ,(4) ,(5)
 ※Microsoft Accessという指定は、MDBファイルを!という意味

 まずインポートする場合ですが、左から(1)インポートを指定、(2)インポート元MDBファイルのフルパス、(3)インポートするオブジェクトのタイプ、(4)インポート元(相手側)のオブジェクトの名前、(5)インポート先(自分側)でのオブジェクトの名前を指定します。インポート時に自分側に同じ名前のオブジェクトがあると、名前の後ろに1、2、3…などが付き(自分側では)新たなオブジェクトとして作成されます。

 次にエクスポートする場合ですが、左から(1)エクスポートを指定、(2)エクスポート先MDBファイルのフルパス、(3)エクスポートするオブジェクトのタイプ、(4)がエクスポート元(自分側)でのオブジェクトの名前、(5)エクスポート先(相手側)でのオブジェクトの名前を指定しますエクスポート時に相手側に同じ名前のオブジェクトがあると、そのオブジェクトは上書きされます。

 これらを踏まえた上で、定数などで決まり切った内容を指定する部分は2ヶ所。まず、(2)のインポートやエクスポートの指定は、次の内容を指定します。

acImport インポートするときの指定
acExport エクスポートするときの指定
 ※他にもありますが省略しました

 それと、(3)のインポートまたはエクスポートするオブジェクトのタイプには、以下のようなものがあります。

acTable テーブル
acQuery クエリー
acForm フォーム
acReport レポート
acMacro マクロ
acModule モジュール
 ※他にもありますが省略しました
使用例
 DoCmd.TransferDatabaseメソッドの使い方です。例では、c:\happyというフォルダに入っている全てのMDBファイルの共通関数というモジュールを、エクスポートを使って新しいモジュール(c:\happy\temp\island.mdbの中にある)に置き換える処理(A)をしています。早い話が、自動バージョンアップです。

 また、置き換える前には、インポート機能を使い前のバージョンのモジュールをc:\happy\temp\island.mdbの中へバックアップする処理(@)も行います。

こっちがメイン(実行する方)。ファイル名はTransferMain.wsfで作成
<job id="AccessJob">

<!-- Accessのライブラリを宣言(Accessの定数を使うため) -->
<reference guid="4AFFC9A0-5F99-101B-AF4E-00AA003F0F07"></reference>

<script language="VBScript" src="./Transfer.vbs"></script>
<script language="VBScript">

    '主となる処理は509.vbsにあるので呼び出します
    Call prcMain

</script>

</job>

 こっちの処理で行っているBフォルダ内にあるファイルを検索するについては、3.2 フォルダの中を探るとの合わせ技です。詳しいことは、そちらを参照してください。

 ちなみに、Accessを終了する方法は5.11 Accessを終了するを見てくださいね。

こっちは実際の処理を行う方。ファイル名はTransfer.vbsで作成
Option Explicit

Dim objAccess

Sub prcMain()

    Dim objApl
    Dim objFolder
    Dim objFolderItems
    Dim objItem
    Dim i

    'シェルアプリケーションオブジェクトを作成します
    Set objApl = WScript.CreateObject("Shell.Application")

    'Accessオブジェクトを作成します
    Set objAccess = CreateObject("Access.Application")

    'Access画面を表示します
    objAccess.Visible = True

    '元となるMDBファイルを開きます
    objAccess.OpenCurrentDatabase("c:\happy\temp\island.mdb")

    '探りを入れたいフォルダのオブジェクトを作成します
    Set objFolder = objApl.NameSpace("C:\happy")

    'フォルダオブジェクトから、入っているファイルやフォルダの全情報を取得します
    Set objFolderItems = objFolder.Items()

    'Bフォルダ内にあるファイルを検索する。何個入っていたかは、Countで参照
    For i=0 To objFolderItems.Count-1

        'ファイルやフォルダの情報を1コ取り出します
        Set objItem = objFolderItems.Item(i)

        '取り出した物がファイルのとき
        If objItem.IsFolder = False Then

           'mdbファイルならモジュールの入れ替え処理へ
           if Right(objItem.Name,3)="mdb" Then
              Call prcTransferDatabase (objItem.Path)
           End If

        End If

    Next

    'MDBファイルを閉じます
    objAccess.CloseCurrentDatabase

    Set objItem = Nothing
    Set objFolderItems = Nothing
    Set objFolder = Nothing
    Set objApl = Nothing
    Set objAccess = Nothing

End Sub

Sub prcTransferDatabase(strMDBPath)

   '@インポートで置き換え前のモジュール(業務関数)のバックアップを取ります
   objAccess.DoCmd.TransferDatabase acImport _
                                   ,"Microsoft Access" _
                                   ,strMDBPath _
                                   ,acModule _
                                   ,"共通関数" _
                                   ,"共通関数"

   'Aエクスポートでモジュール(業務関数)を置き換えます
   objAccess.DoCmd.TransferDatabase acExport _
                                   ,"Microsoft Access" _
                                   ,strMDBPath _
                                   ,acModule _
                                   ,"共通関数" _
                                   ,"共通関数"

End Sub
 ※例では、Accessの画面をわざと表示しています
Copyright(C) 1999-2006 結城圭介。 All rights reserved