次の方法で共有


Office Space: Microsoft Access で XML データをインポートおよびエクスポートする

Office Space

Office Space へようこそ。Office Space は、Microsoft® Office アプリケーションのスクリプト作成に関するヒントとテクニックを紹介するコラムです。毎週木曜日に新しいヒントを掲載します。過去のヒントについては、Office Space アーカイブを参照してください。Microsoft Office でのスクリプト作成について質問がある場合は、scripter@microsoft.com (英語のみ) までお送りください。すべての質問に回答することはできないかもしれませんが、可能な限り対応いたします。

Microsoft Access で XML データをインポートおよびエクスポートする

Office Space の連載を始めてから数か月が経ちますが、Microsoft Access と XML については取り上げたことがありません。特に理由はなく、単に、これらのトピックを取り上げる機会がなかっただけです。今週のコラムを執筆するにあたり、名案が浮かび、一石二鳥を狙うことにしました。

動物愛護団体による監視が厳しいので、別の名案が浮かびました。石で鳥を狙うことは止め、代わりに、Acess と XML の両方を取り上げたコラムを書くことにしました。

今週のコラムでは、Microsoft Access を使用して XML データをインポートおよびエクスポートする方法を紹介します。このようなコラムを執筆するにあたって、次のような疑問が生じました。Access を使用する場合に、なぜ XML データについて考慮する必要があるのでしょうか。また、逆に、XML を使用する場合に、なぜ Access で使用することを考慮する必要があるのでしょうか。どちらか一方の形式を採用して、その形式に統一して使用した方が効率的ではないでしょうか。

正直に言うと、これらの疑問について明確な答えを返すことはできません。ただし、現在は XML が主流となっています。特に Web ベースのアプリケーションは、XML データに依存しています。この事実を考慮すると、XML を無視するわけにはいかないのです。

一方、Access には、データの処理や分析に優れた機能が備わっています。グラフィカルなクエリ ビルダだけを取っても、Access は非常に価値のあるアプリケーションです。その結果、板挟みの状態が発生します。XML は至るところで使用されていますが、XML ファイルに格納されているデータを分析する優れたツールは多くは存在していません (この状況は変化しつつありますが、当面はこの状況が続くでしょう)。それとは対照的に、Access には優れたデータ分析ツールが備わっていますが、XML がデータ ストレージの業界標準になりつつあるのが現状です。このような状況で、スクリプト作成者は何ができるのでしょうか。

では、1 つご提案しましょう。XML と Access の両方を使用してはどうでしょうか。XML ファイルに格納したデータで処理したいものはありませんか。そのようなデータを、Access データベースにインポートしましょう。第三者が XML 形式で必要としている Access データベースのデータはありませんか。そのようなデータを XML ファイルにエクスポートしましょう。この処理が可能になれば、自分が所有しているデータだけでなく、他人が所有しているデータも利用できるようになります。一挙両得ですね。さらに、XML ファイルも入手することができます。

注 : これらのスクリプトを実行するには、Access のマクロのセキュリティ レベルを "低" に設定する必要があります。この設定を行わないと、スクリプトを実行するたびに警告メッセージが表示されます。

まず、既存の XML ファイルを Access データベースにインポートする方法を紹介しましょう。

Const acAppendData = 2

Set objAccess = CreateObject("Access.Application")
objAccess.OpenCurrentDatabase "C:\Scripts\Test.mdb"

objAccess.ImportXML "c:\scripts\test.xml", acAppendData

このスクリプトでは、XML ファイルに、データベース C:\Scripts\Test.mdb のテーブルを参照している外部要素タグ (Inventory) があることを想定しています (つまり、データベース内に Inventory という名前のテーブルが存在します)。この XML ファイルの先頭部分は、次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
    <Inventory>
        <ComputerName>atl-fs-01</ComputerName>

XML データを Inventory テーブルに追加するため、スクリプトでは、まず acAppendData という名前の定数を定義し、値を 2 に設定します。後で、この定数を使用して、データをインポートして、既存のテーブルに追加することをスクリプトに指示します。

読者の皆さんから、次のような質問が寄せられることは想定していました。もちろん他の方法を使用してデータをインポートすることもできます。たとえば、acStructureOnly という名前の定数を定義し、値を 0 に設定することもできます。この場合、Access では、XML ファイルのみを調査し、そのファイルの構造を模したテーブルを作成します。ただし、データはインポートされず、データベースには空のテーブルが作成されるだけです。

また、acStructureAndData という名前の定数を定義し、値を 1 に設定することもできます。この方法を使用すると、Access では、新しいテーブルが作成されるだけでなく、作成されたテーブルにデータがインポートされます。この方法が適切に機能するかどうかは、データの性質によって異なります。たとえば、Access によりテーブルが作成されると、既定では、各フィールドのデータ型はテキスト型に設定されます。この設定は、メモ型またはデータ型のフィールドに格納する必要があるデータがある場合は問題になります。どの方法を使用するかは、ファイルごとに判断する必要があります。

ヒント : 安全策として、まずデータベースのテーブルを作成してから、データを追加することをお勧めします。これを行う 1 つの方法としては、XML ファイルから構造をインポートし、Access で新しいテーブルを開いて、フィールドの型を必要に応じて変更する方法があります。この手順を踏むと、テーブルに問題なくデータを追加することができます。

定数を定義した後、Access.Application オブジェクトのインスタンスを作成し、OpenCurrentDatabase メソッドを呼び出して、ファイル C:\Scripts\Test.mdb を開きます。

Set objAccess = CreateObject("Access.Application")
objAccess.OpenCurrentDatabase "C:\Scripts\Test.mdb"

ここでは、ImportXML メソッドを呼び出して、インポートする XML ファイルへのパス (C:\Scripts\Test.xml) とインポートの種類 (定数 acAppendData により指定) という 2 つのパラメータを渡します。

objAccess.ImportXML "c:\scripts\test.xml", acAppendData

必要な処理は、これですべてです。XML ファイルのサイズにもよりますが、数秒後には、データは Microsoft Access にインポートされます。Access にインポートされたデータは、好きなように処理できます。このデータを、再度 XML ファイルにエクスポートすることもできます。

Access テーブルを XML ファイルの形式にする必要はありませんか。このような処理も、問題なくできます。

Const acExportTable = 0

Set objAccess = CreateObject("Access.Application")
objAccess.OpenCurrentDatabase "C:\Scripts\Test.mdb"

objAccess.ExportXML acExportTable,"Inventory","c:\scripts\test.xml"

ここでも、まず、定数を定義します。acExportTable という名前の定数を定義し、値を 0 に設定します。では、なぜ、この定数を使用するのでしょうか。その理由は簡単です。テーブルに格納されているすべてのデータをエクスポートしたいからです。また、クエリ、レポート、関数、または他の Access の要素からデータをエクスポートすることもできます。その場合は、次の表に示した定数 (および値) を使用できます。

定数

acExportForm

2

acExportFunction

10

acExportQuery

1

acExportReport

3

acExportServerView

7

acExportStoredProcedure

9

acExportTable

0

定数を定義した後、Access.Application オブジェクトのインスタンスを作成し、データベースを開いて、ExportXML メソッドを呼び出します。

objAccess.ExportXML acExportTable,"Inventory","c:\scripts\test.xml"

このサンプル スクリプトでは、メソッドの呼び出しに、次の 3 つのパラメータを含めました。

  • acExportTable: テーブルからデータをエクスポートしていることを示す定数。

  • Inventory: エクスポートするテーブルの名前。

  • C:\Scripts\Test.xml: 作成する XML ファイルのパス。既定では、既存のファイルは Access により上書きされます。

必要な作業は、これですべてです。データをエクスポートするときにスキーマ情報のみを別のファイルにエクスポートするなど、他にも使用できるオプションはありますが、今週のコラムでは取り上げないことにします。詳細については、MSDN の Microsoft Access 用の「VBA Language Reference」(英語) を参照してください。

このコラムでは Access についてほとんど説明していないので、Access が Word や Excel とは動作が若干ことなることをお知らせしておいた方がよいでしょう。たとえば、既にお気付きかもしれませんが、Visible プロパティを True に設定していません。この設定を行わなかった主な理由は、このサンプル スクリプトで使用した XML ファイルのサイズは小さくて、Access が画面上に完全に表示される前にデータのインポートが完了したためです。ただし、Access を表示して、おもしろい部分を見ることは簡単です。Access.Application を作成した後に、次のコード行を追加してみてください。

objAccess.Visible = True

また、Quit メソッドを一度も呼び出していないことにもお気付きかもしれません。非表示の Microsoft Access のコピーが、コンピュータ上で無法に動き続けているとでもいうのでしょうか。いいえ、そうではありません。既に述べたように、Access の動作は、Word や Excel とは若干異なります。スクリプトから Access を起動すると、アプリケーションは実行され、指示どおりの処理が行われますが、スクリプトの終了と同時にアプリケーションも自動的に終了されます。つまり、Quit メソッドを呼び出す必要はありません。Access は、特に要求しなくても自動的に終了します。これは、ある Scripting Guy が、毎日午後 4:00 ちょうどに行っていることです。

場合によっては、午後 4:00 より少し前のこともあります。けれども、野球のシーズン中のみです。

わかりました、白状します。野球がオフシーズンのときにもあります。

スクリプトから Access を起動した場合にも、XML ファイルからデータをインポートするなどの処理を行った後、Access を画面に表示させたままにしておきたいことがあると思います。このような場合は、UserControl プロパティを True に設定する次のコード行を追加する必要があります。

objAccess.UserControl = True

このコード行により、Access は、スクリプトからではなく、ユーザーによって [スタート] メニューなどから起動されたと錯覚します。その結果、Access は、スクリプトが終了しても、画面上に表示されたままになります。

ただし、スクリプトを使用しても、この Scripting Guy を午後 4:00 以降も引き止めておくことはできませんので、ご注意ください。