
Office Space へようこそ。Office Space は、Microsoft® Office アプリケーションのスクリプト作成に関するヒントとテクニックを紹介するコラムです。毎週木曜日に新しいヒントを掲載します。過去のヒントについては、Office Space アーカイブを参照してください。Microsoft Office でのスクリプト作成について質問がある場合は、scripter@microsoft.com (英語のみ) までお送りください。すべての質問に回答することはできないかもしれませんが、可能な限り対応いたします。
ちょっとした秘密を打ち明けることに決めました。Scripting Guys は、皆さんとは違って、いつも調子が良いとは限りません。意気揚々と職場にやって来る日があるかと思うと、(実はほとんどの日がそうなのですが) そうでもない日もあります。Office Space 読者の皆さんは、Scripting Guys がその日調子が良いか悪いかをどのようにして見分ければよいのでしょうか。ヒントをお教えします。Scripting Guys が "以前のコラムの続編" を執筆するときは、決まって仕事を怠けています。新しい話題を考えようともしていません。
さて、このことが今週のコラムにどう関連しているでしょう。何も関係していないじゃないかって....。では説明しますと、今週は、Microsoft Access データベースに接続してデータを読み取る方法を紹介した以前のコラムの続編を執筆することにしました。今日は当然の話の流れから、Access データベースにレコードを追加する方法について紹介します。それから、とりあえず話を先に進めて、既存のレコードを変更する方法も紹介します。
正直に言いますと、今週のコラムに新しい話題を準備する努力が十分ではありませんでした。しかし、それを正当化するために断っておくと、データベースからデータを抽出できることが便利でも、そのデータベースにデータを追加できる便利さには及びません。そこで、仕事を必要最小限だけ怠けて、重要な話題を扱います。このコラムは、シリーズものの第 2 回目と考えてください。簡単な解決法を紹介するので心配する必要はありません。
少し怠けていることからわかるように、今回は Access データベースへの接続についての基本的な概念は再確認しません。接続の概念を思い出す必要がある場合、先週のコラム (英語) を参照してください。ここからが今日の本題です。既存のデータベースに新しいレコードを追加する方法を紹介します。
C:\Scripts フォルダに Inventory.mdb という Access データベースがあるとします。このデータベースには GeneralProperties というテーブルがあり、GeneralProperties テーブルには以下のフィールドがあります。
| • | ComputerName |
| • | Department |
| • | OperatingSystem |
| • | Owner |
このようなデータベースがなければ、サンプル スクリプトは機能しません。だからと言って、スクリプトが解説の役に立たないわけではありません。単に、スクリプトを実行して結果を得ることができないだけです。
その点を考えながら、データベースに新しいレコードを追加するスクリプトを見てみましょう。
On Error Resume Next
Const adOpenStatic = 3
Const adLockOptimistic = 3
Set objConnection = CreateObject("ADODB.Connection")
Set objRecordSet = CreateObject("ADODB.Recordset")
objConnection.Open _
"Provider = Microsoft.Jet.OLEDB.4.0; " & _
"Data Source = c:\scripts\inventory.mdb"
objRecordSet.Open "SELECT * FROM GeneralProperties" , _
objConnection, adOpenStatic, adLockOptimistic
objRecordSet.AddNew
objRecordSet("ComputerName") = "atl-ws-99"
objRecordSet("Department") = "Human Resources"
objRecordSet("OperatingSystem") = "Microsoft Windows XP Professional"
objRecordSet("Owner") = "Ken Myer"
objRecordSet.Update
objRecordSet.Close
objConnection.Close
注 : これ以外にも、データベースに新しいレコードを追加する方法はあります。たとえば、SQL がお好きな方は Insert Into クエリを使用できます。ここでは、簡単という理由だけで AddNew メソッドを使用しています。Insert Into クエリは、扱うフィールドの数が多い場合、値を変数に代入している場合、およびフィールドによってデータ型が異なる場合に、処理が煩雑になることがあります。今日は怠け精神なので、簡単な方法で進めます。 |
スクリプトの最初の部分は、データベース C:\Scripts\Inventory.mdb への接続です。既に断ったように詳しい説明は省略しますが、接続のために使用するコードを次に示します。
Const adOpenStatic = 3
Const adLockOptimistic = 3
Set objConnection = CreateObject("ADODB.Connection")
Set objRecordSet = CreateObject("ADODB.Recordset")
objConnection.Open _
"Provider = Microsoft.Jet.OLEDB.4.0; " & _
"Data Source = c:\scripts\inventory.mdb"
接続を確立した後は、Recordset オブジェクトの Open メソッドを使用して、GeneralProperties テーブルのすべてのレコードを取得する SQL クエリを実行します。その部分を次に示します。
objRecordSet.Open "SELECT * FROM GeneralProperties" , _
objConnection, adOpenStatic, adLockOptimistic
新しいレコードを追加するためのレコードセットを用意します。その処理は次のコード部分で行われます。
objRecordSet.AddNew
objRecordSet("ComputerName") = "atl-ws-99"
objRecordSet("Department") = "Human Resources"
objRecordSet("OperatingSystem") = "Microsoft Windows XP Professional"
objRecordSet("Owner") = "Ken Myer"
objRecordSet.Update
最初に AddNew メソッドを呼び出します。処理用の空のテンプレートが設定されますが、データベースには何も追加されません。現時点で、すべての作業はメモリ上のみで行われています。その下の数行のコードで、この新しいレコードの個々のフィールドに値を代入します。個々のフィールドとはつまり、テーブル GeneralProperties にあるフィールドです。たとえば、次のコードで ComputerName フィールドの値を atl-ws-99 に設定します。
objRecordSet("ComputerName") = "atl-ws-99"
ComputerName はテキスト フィールドであり、文字列値を代入することになっているので、代入する値 (atl-ws-99) は二重引用符で囲みます。数値型またはブール型 (true/false) のデータベース フィールドの場合、値を二重引用符で囲んではいけません。
objRecordSet("IsLaptop") = False
objRecordSet("NumberOfPrcoessors") = 2
皆さんはご存じでしたよね。
最後に Update メソッドを呼び出し、実際にデータベースに新しいレコードを書き込みます。
objRecordSet.Update
上の 1 行は忘れないでください。忘れてしまうと、"メモリ上の" レコードセットには新しいレコードが追加されますが、実際のデータベースは変更されません。
以上のとおり、Access データベースに新しいレコードを簡単に追加できました。では、既存のレコードの変更はどうでしょう。コンピュータ atl-ws-99 をデータベースに追加した直後、Ken Myer が Human Resources 部門から Finance 部門に異動になったとします。異動に伴い、このコンピュータの部門フィールドを更新する必要があります。どれほど難しい操作を行うのでしょうか。
リラックスしてください。何も難しいことはありません。繰り返しになりますが、データベースのレコードを更新する方法は 1 つではありません。しかし今は、"最も簡単に" レコードを更新できると思われる方法に注目します。レコードを検索し、適切なフィールドを更新し、Update メソッドを呼び出す方法です。つまり、次のプロセスそのものです。
On Error Resume Next
Const adOpenStatic = 3
Const adLockOptimistic = 3
Set objConnection = CreateObject("ADODB.Connection")
Set objRecordSet = CreateObject("ADODB.Recordset")
objConnection.Open _
"Provider = Microsoft.Jet.OLEDB.4.0; " & _
"Data Source = c:\scripts\inventory.mdb"
objRecordSet.Open "SELECT * FROM GeneralProperties" , _
objConnection, adOpenStatic, adLockOptimistic
strCriteria = "ComputerName = 'atl-ws-99'"
objRecordSet.Find strCriteria
objRecordset.Fields.Item("Department") = "Finance"
objRecordset.Update
objRecordSet.Close
objConnection.Close
既にお気付きでしょうが、このスクリプトの前半は新しいレコードを追加するスクリプトと同一です。データベースに接続し、GeneralProperties テーブルのすべてのレコードを格納したレコードセットを Open メソッドで取得します。次の部分までは、2 つのスクリプトに違いが見当たりません。
strCriteria = "ComputerName = 'atl-ws-99'"
この行では、変数 strCriteria に検索条件を代入しています。検索するのはコンピュータ名 atl-ws-99 のレコードです。お察しのようにそれを "FieldName = Value" の形式、つまり ComputerName = 'atl-ws-99' という検索条件にしています。
検索条件を指定した後で、Find メソッドを呼び出して、レコードセット内の該当レコードを検索します。
objRecordSet.Find strCriteria
その後、次の 2 行のコードを使用し、Department フィールドを更新して変更を保存します。
objRecordset.Fields.Item("Department") = "Finance"
objRecordset.Update
Department フィールドを参照するために、objRecordset.Fields.Item("Department") という少し変わった構文を使用していることに注目してください。あまり心配することはありません。こうすることになっているのです。良い見方をすれば、この構文は風変わりですが、少なくともデータベースから読み取るフィールドを参照するとき (先週の内容です) と同じです。
Update メソッドもお見逃しのないように。Update を呼び出さないと、データベースのレコードは変更されません。
説明したとおり、既存のレコードを変更する方法は他にもあります。それらについては、いずれ説明します。いつになるか、ですか。今後このコラムの新しい話題を用意するのが面倒になり、どの話題を持ち出すかを皆さんに感付かれたときと言っておきましょう。