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

#たぶんWindows8- 10も可能
#インストール
ドライバは複数紹介されているので、システムが許す限り最新のものをインストールする。
特にMDAC(Text-Driver系)
[2007 Office system ドライバ: データ接続コンポーネント ](https://www.microsoft.com/ja-jp/download/details.aspx?id=23734)
[Office2010のDB Engine](http://www.microsoft.com/ja-jp/download/details.aspx?id=13255)
の`AccessDatabaseEngine_X64.exe`

## `C:¥WINDOWS¥SysWOW64¥odbcad32.exe`起動
[64bit OSでADODBテキストドライバを使う ](http://my-business-adversaria.blogspot.jp/2012/08/64bit-osadodb.html)
Microsoft Text Driverと Microsoft Access Driverを構成する
しかしこれは32bitだが気にしない
VBScriptはどうせ32bit強制起動のため、以下のような影響を受けないのです。
[カテゴリー>64ビット版Windows環境に、32ビット版/64ビット版双方のMicrosoft Access ODBCドライバを共存させる方法](http://www.unirita.co.jp/data-utilization/data-linkage/20140819.html)
## 設定
### フォルダ
`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とで決まります。）

```text
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の結果が分からないからです。

```vb

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
```