Access: 2008年6月アーカイブ
以前に書いた記事「[WSH]VBSからAccessのアクションクエリを実行する方法 (ADO) 」では、アクセス側であらかじめ作っておいたアクションクエリをVBSから実行する方法を紹介しました。
VBSからアクションクエリを発行
今回は、VBSから直接SQLを発行してMDBファイルのデータを削除・更新・追加する方法を紹介します。Option Explicit
Dim cn
Dim rs
Set cn= CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
cn.Open "Driver={Microsoft Access Driver (*.mdb)}; DBQ=C:¥ファイル名.mdb;"
rs.Open "DELETE FROM Table1", cn
rs.Open "INSERT INTO Table1 ( ID, Field1 ) " & _
"SELECT Table2.ID, Table2.Field1 FROM Table2;", cn
rs.Open "UPDATE Table1 SET Field1 = 'abc' WHERE Field1 = 'xyz' ", cn
cn.Close
Set rs = Nothing
Set cn = Nothing
MsgBox "完了しますた。"
注意事項
SQL文の中にダブルクォーテーション(")が入っているとうまく動きません。
文字列を表現したい場合はシングルクォーテーション(')で囲みましょう。
また、Access上で動作するSQL文でも、VBSから発行するとエラーになることがあります。
その場合は、標準SQL文に近い形で記述するとたいてい動きます。
Excel VBAで、Writeステートメントを使ってCSV出力すると、日付が #2008-01-01# のような形式になってしまいます。
このCSVをAccessにインポートするのは大変です。
以下のような自作関数を使って変換しましょう。
Excel側でエクスポートする際に変換してもいいし、Access側でインポートした後にクエリで変換してもいいです。
Function sanitizeDate(str As Variant) As Variant
If Left(str, 2) = "#2" And Right(str, 1) = "#" And Len(str) = 12 Then
sanitizeDate = Mid(str, 2, 10)
Else
sanitizeDate = str
End If
End Function
使い方
Sub test()
MsgBox sanitizeDate("#2008-01-01#")
End Sub
実行結果: 2008-01-01
3桁の乱数のみで構成される簡易パスワードを、
Accessのクエリで発生させる方法です。
普通にrnd関数を使うと、同じような乱数系列が繰り返されてしまいうまく行きません。
(昨日出たのと同じ数字がまだ出てたりする)
Randomizeステートメントとかを駆使すると回避できるらしいですが、ヘルプを見てもよくわかりませんでした。
そこで、システム時刻をあらわすTime()関数と組み合わせたらとうまく行きました。
クエリのSQLビューで、以下のコードを書いて実行すればOK。
SELECT Right(CLng(Time()*10000000*Rnd()),3) AS 乱数;
なお、時刻のコンマ何秒という数字は、それ自体が乱数のようなものなので、Rnd関数を省いても一応動きます。
SELECT Right(CLng(Time()*10000000),3) AS 乱数;
これを乱数と呼べるのかはわかりませんが。(^^;