LoginSignup
3
1

More than 5 years have passed since last update.

Windows 7 64Bitにおいて、VBScript のみでMS Officeが入っていない状態でMDBファイルを作り操作する

Last updated at Posted at 2018-04-29

たぶんWindows8- 10も可能

インストール

ドライバは複数紹介されているので、システムが許す限り最新のものをインストールする。
特にMDAC(Text-Driver系)
2007 Office system ドライバ: データ接続コンポーネント
Office2010のDB Engine
AccessDatabaseEngine_X64.exe

C:¥WINDOWS¥SysWOW64¥odbcad32.exe起動

64bit OSでADODBテキストドライバを使う
Microsoft Text Driverと Microsoft Access Driverを構成する
しかしこれは32bitだが気にしない
VBScriptはどうせ32bit強制起動のため、以下のような影響を受けないのです。
カテゴリー>64ビット版Windows環境に、32ビット版/64ビット版双方のMicrosoft Access ODBCドライバを共存させる方法

設定

フォルダ

c:\hoge\

VBscriptファイル名

NewMDB作成Tbl作成ANSICSVからTBLへ読レポありトラあり.vbs
重要:必ずCSVファイルと同じフォルダにおいてください

MDBファイル名

アクセスのファイル形式はmdb、ファイル名はnew.mdbです。ファイルの位置は上記フォルダです。
重要:このファイルはvbsを起動するたび削除して作成されます。

CSVファイル名

c:\hoge\database.csv
とこのVBSがあり、このフォルダにnew.mdb を作成し、T_Masterというテーブルを作成する

database.csvの項目名とデータ型

項目名 データ型
col1 Long
Col2 Text(10)
Col3 Currency
Col4 Datetime

database.csvの中身

qiita.comでは斜めになっていますが、col2は通貨型なので円マークで入っています。(なお、何が通貨型かは厳密に言うとWindowsの国というか文化というかLocaleとで決まります。)

col1,col2,col3,col4
1,a,\1000,2018/4/9
2,b,\2000,2018/4/28
3,c,\3000,2018/5/12`
4,c,\3000,2018/5/12
5,c,\3000,2018/5/12
6,c,\6000,2018/5/12

Point

32bit強制起動

CMD.Exe で'%SystemRoot%\SysWow64\cscript.exe //Nologo "C:\hoge\NewMDB作成Tbl作成ANSICSVからTBLへ読レポありトラあり.vbs"とするか下記のように32Bit強制します。ここがポイントです。そのままだと動かないのです。

大体whitire.com/vbs/`のTipsを使う

http://www.whitire.com/vbs/tips0140.html
大体tipsの140くらいからです。
これらは実は32Bit強制すると、64bitでも動きます。
しかし現在これらのTipsは32bit強制を知らないと使えません。
またサイトでも使われているので、便宜上MDACを入れましたが、本記事ではProviderはできる限りJetに置き換えます。今後はMDACに移行する予定とのことですが、Jetが強力で安定しているためです。

レポートは必須

タイトルの設定を見てください。
mdbファイルはオフィスがないので直接は読めないのです。
このため、テキスト出力はTipsにもありましたが、テーブルに作成できるとしても必要です。
でないとSQLの結果が分からないからです。


Option Explicit
'32bit 強制起動
'http://scripting.cocolog-nifty.com/blog/2011/02/wsh6432bit-b32d.html

If InStr(LCase(WScript.FullName),"system32") Then 
If CreateObject("Scripting.FileSystemObject").FileExists(Replace(LCase(WScript.FullName),"system32","syswow64")) Then
  CreateObject("WScript.Shell").Run """" & Replace(LCase(WScript.FullName),"system32","syswow64") & """ """ & WScript.ScriptFullName & """"
  WScript.Quit
End If
End If
'%SystemRoot%\SysWow64\cscript.exe //Nologo "C:\hoge\NewMDB作成Tbl作成ANSICSVからTBLへ読レポありトラあり.vbs"
'定数宣言
Const INPUTFILENAME = "database.csv"
Const adOpenDynamic =2 
const adOpenKeyset = 1
const adLockOptimistic = 3
'変数宣言
Dim i
Dim objADO
Dim objRS
Dim strID
Dim strPath
Dim objCN
Dim objDAO
Dim objaRs
Dim sSQL
Dim cat,ib,aRs
'初期値
i = 0
strID = 1

If IncludeAdoDefine() = True Then
    WScript.Echo "定義ファイルを読み込みました。"
End If
'既存のmdbがあれば削除
With CreateObject("Scripting.FileSystemObject")
If .FileExists("C:\hoge\new.mdb") Then .DeleteFile "C:\hoge\new.mdb"
End With
'mdbの作成 Via https://blogs.yahoo.co.jp/lockin_break/37662072.html
Set cat = CreateObject("ADOX.Catalog")
cat.Create "Provider='Microsoft.Jet.OLEDB.4.0';Data Source='C:\hoge\new.mdb'"

'/// 作成したDBにT_Masterという名前のテーブルを作る テーブル作成クエリ(アクションクエリ)
Set objCN = CreateObject("ADODB.Connection")
objCn.Open "Provider='Microsoft.Jet.OLEDB.4.0';Data Source='C:\hoge\new.mdb'"
'//// Tableの作成 名前はtest
        sSQL = "CREATE TABLE T_Master(Col1 Long,Col2 Char(10),Col3 Currency,Col4 DateTime);"
        objCN.Execute sSQL  , , adExecuteNoRecords
        objCN.Close
'スクリプトファイルが実行している場所のパスを取得
strPath = Left(WScript.ScriptFullName,InStrRev(WScript.ScriptFullName,"\"))

'ADOを使いCSVファイルを扱う準備
Set objADO = CreateObject("ADODB.Connection")
Set objCN = CreateObject("ADODB.Connection")
Set objDAO =CreateObject("DAO.DBEngine.36") 
Set objaRS = CreateObject("ADODB.RecordSet")
Set aRS =   CreateObject("ADODB.RecordSet")
objADO.Open "Driver={Microsoft Text Driver (*.txt; *.csv)};DBQ=" &  _
            strPath & ";ReadOnly=1"

'SQLを実行して、対象データをCSVファイルから抽出してファイルに出力
sSQL = "SELECT * FROM C:\hoge\database#csv;"
Set objaRS = objADO.Execute(sSQL)


Do While Not objaRS.EOF

 call WriteLog(objaRS("col1").Value & "," & _
                objaRS("col2").Value & "," & _ 
                objaRS("col3").Value & "," & _ 
                objaRS("col4").Value  ,  1)
    i = i + 1
    objaRS.MoveNext
Loop
objaRs.MoveFirst

objCn.Open "Provider='Microsoft.Jet.OLEDB.4.0';Data Source='C:\hoge\new.mdb'"
objCN.BeginTrans '[[トランザクション処理を行う]](http://www.whitire.com/vbs/tips0151.html)
aRS.Open "SELECT * FROM T_master;",objCN,1,3

Wscript.Echo aRS.Fields(0).name & "," & aRS.Fields(1).name

Do While Not objaRS.EOF
On Error Resume Next
aRs.AddNew
for ib=0 to aRs.Fields.Count-1
aRS.Fields("col" & ib + 1).value =objaRS.Fields(ib).value
Next
aRs.Update
If err.number <> 0 Then WScript.Echo "Err!" : objCn.RoolBackTrans:Exit Do 'ERR RISE then Exit Do Loop
objaRS.MoveNext
Loop
if objars.eof=true And err.number = 0 then objCN.CommitTrans

'オブジェクトのクローズ&破棄
objaRS.Close
Set objaRs = Nothing
objADO.Close
Set objADO = Nothing

'処理終了メッセージ
WScript.Echo "処理が終了しました。"
'処理終了
WScript.Quit

'結果出力処理
Sub WriteLog(strMsg,blnFLG)
    Const LOGFILENAME = "Report.log"
    Dim objFSO
    Dim objFile
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    If blnFLG = 0 Then
        'ログファイルが存在する場合は削除
        If objFSO.FileExists(strPath & LOGFILENAME) = True Then
            objFSO.DeleteFile strPath & LOGFILENAME
        End If
        'ログファイルを作成
        objFSO.CreateTextFile "C:\hoge\" & LOGFILENAME
    End If
    '追記で開く

    If objFSO.FileExists("C:\hoge\" & LOGFILENAME)=False Then objFSO.CreateTextFile "C:\hoge\" & LOGFILENAME
    Set objFile = objFSO.OpenTextFile("C:\hoge\" & LOGFILENAME, 8)
    'メッセージを書き込み
    objFile.WriteLine strMsg
    'オブジェクトの破棄
    Set objFile = Nothing
    Set objFSO = Nothing
End Sub

Function IncludeAdoDefine()
'[定数ファイルを(adovbs.inc)を読み込む](http://www.whitire.com/vbs/tips0138.html)
    Dim blnRetCode      ' 戻り値
    Dim objFSO          ' FileSystemObject
    Dim strIncFile      ' 定数定義ファイル
    Dim objIncFile      ' 定数定義ファイル
    Dim strReadLine     ' ファイル読み込みバッファ

    On Error Resume Next
    blnRetCode = True

    Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
    If Err.Number = 0 Then
        strIncFile = "C:\Program Files\Common Files\System\ado\adovbs.inc"
        Set objIncFile = objFSO.OpenTextFile(strIncFile)
        If Err.Number = 0 Then
            Do While objIncFile.AtEndOfStream <> True
                strReadLine = Trim(objIncFile.ReadLine)
                ' コメント行などで無かったら読み込む
                If Left(strReadLine, 1) <> "'" And _
                    strReadLine <> "" And _
                    strReadLine <> "<%" And _
                    strReadLine <> "%>" _
                Then
                    ExecuteGlobal strReadLine
                End If
            Loop
            objIncFile.Close()
        Else
            WScript.Echo "エラー:" & Err.Description
            blnRetCode = False
        End If
    Else
        WScript.Echo "エラー:" & Err.Description
        blnRetCode = False
    End If

    Set objIncFile = Nothing
    Set objFSO = Nothing
    IncludeAdoDefine = blnRetCode
End Function
3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1