ADOによるAccess→Excelの変換

カテゴリー名: [ADOによるデータベースの中身の把握

2016/11/23

 mdbファイルの内容をxlsファイルにコピーする方法を取り上げます。
いわば Access→Excelの変換です。

 Excelを起動することなく ADO, ADOX の機能によりコピーします。

 なので、VBAマクロは取り上げません。VBScript, JScript を掲げます。

 今回、一部ですが「クラス」を扱う形にしてみました。

    


《このページの目次》


    

1. 概要

 今回の処理を箇条書きにすると次のとおり。

    

(1) ADOXによるテーブルの定義

 今回、Excelの側でテーブルを定義するとき、SQL命令文は使いません。
ADOX の仕組みを利用します。

 ADOXでは、CAT.Tables によってTableオブジェクトを扱うことができます。

 また、Table.Columns でFieldの情報を扱えます。

 Fieldの情報には Column.Name (名前)、Column.Type (種類:データ型)などがあります。

 mdbファイルも xlsファイルも、そうした構造は同じです。なので、同じプロパティ同士でその値を代入してやればテーブルを定義できます。

 mdbに合わせて、xlsの側でTableを定義するプログラム(一部分)を掲げます。

 VBScriptプログラムの形で示します。MdbCAT, XlsCAT は既に定義済みとします。

For Each MdbTbl In MdbCAT.Tables  ' テーブルを一つずつたどる
    If (MdbTbl.Type = "TABLE") Or (MdbTbl.Type = "VIEW") Then
        Set XlsTbl = CreateObject("ADOX.Table")  ' 新TableObjectを生成
        XlsTbl.Name = MdbTbl.Name
        For Each MdbCol In MdbCAT.Tables.Columns  ' フィールドと一つずつ
            Set XlsCol = CreateObject("ADOX.Column")  ' 新FieldObjectを生成
            XlsCol.Name = MdbCol.Name
            XlsCol.Type = MdbCol.Type
            XlsCol.DefinedSize = MdbCol.DefinedSize
            XlsCol.Precision = MdbCol.Precision
            XlsCol.NumericScale = MdbCol.NumericScale
            XlsTbl.Columns.Append XlsCol  ' 一つのFieldObjectをTableに追加
        Next
        XlsCAT.Tables.Append XlsTbl  ' 一つのTableの定義を追加
Next

    

 上のプログラムの要点は下のとおりです。

 Tableオブジェクト(MdbTbl, XlsTbl)は ADOX.Table という型であり、
Fieldオブジェクト(MdbCol, XlsCol)は ADOX.Column という型です。

 XlsTbl.Columns.Append XlsCol によって一つのFieldをTableに追加し、
それをFieldの個数分 XlsTblに追加します。

 そして、XlsCAT.Tables.Append XlsTbl によって一つのTableをデータベースに追加します。これをTableの個数分だけ行います。

    

 実は、上のプログラムだと、mdbとxlsとでFieldの順番が違ってしまいます。
Table.Columns が定義どおりのFieldの順番を保持していないためです。

 なので、この点は工夫が必要ですが、テーブルの定義に関するエッセンスは上のプログラムのとおりです。

    

 上記プログラムでは Column.Properties を扱っていません。
Table.Indexes にも触れていません。

 そのため、SQL表記でいうと default (デフォルト値)、not null (空欄禁止)、primary key (主キー)、unique (重複禁止)を取り上げない形になっています。

 実は、ADOXでExcelファイルを生成する場合、PropertiesIndexes を指定しても意味がありません。Excelがそれらに対応していないからです。

目次に戻る


    

(2) レコードのコピー

 コピー処理の中心は、mdbのレコードを一つずつ読み取って、xlsの方に同じものを書き込んでいく作業です。読み取るレコードがなくなったら終了です。

 レコードは、読み取りや書き込みの処理を始める前にオープンする必要があります。

 といったことを踏まえて、レコード処理の主要な部分を掲げます。VBScriptです。

    

For Each MdbTbl In MdbCAT.Tables  ' テーブルを一つずつたどる
    If (MdbTbl.Type = "TABLE") Or (MdbTbl.Type = "VIEW") Then
        TblName = "[" & MdbTbl.Name & "]"
            [Excel側のテーブルの定義とその追加 省略]
    Set MdbRS = CreateObject("ADODB.Recordset")
        MdbRS.Open TblName, MdbCN, 0, 1, 2
    Set XlsRS = CreateObject("ADODB.Recordset")
        XlsRS.Open TblName, XlsCN, 0, 2, 2
    Do Until MdbRS.EOF  ' mdbのレコードが終端になるまで繰り返す
        XlsRS.AddNew  ' xls側・レコード追加のモードに入る
        For i = 0 To (MdbRS.Fields.Count-1)
            XlsRS.Fields(i).Value = MdbRS.Fields(i).Value
        Next
        XlsRS.Update  ' xls側・一つのレコードを追加書き込み
        MdbRS.MoveNext  ' mdb側・次のレコードへ
    Loop
    MdbRS.Close
    XlsRS.Close
    End If
Next

    

 レコードをオープンするとき、テーブル名が必要になります。

 このテーブル名は、元々のものを使うのでなく [TableA] のように角かっこでくくったものを使います。

 Northwind.mdb には 1997年 商品区分別売上高 のようなスペースを含むテーブル名があります(「年」の後に半角スペース)。

 こうしたテーブル名は、角かっこでくくらずにそのままをレコードのオープンに用いると、エラーが発生します。

    

 レコードを最初から最後までなぞる操作のプログラムパターンは、下のとおりです。

Do Until RS.EOF  ' 最後に行き着くまで繰り返す
    ………… (何か処理を書き込む)
    RS.MoveNext  ' 次のレコードへ
Loop

 RS.EOF は、レコードが終端にたどり着くと True を返します。

 上のプログラムパターンは、これが True になるまで反復するという意味です。つまり False である間は処理が繰り返されます。

    

 Excelファイルでは、Accessデータベースのバイナリーデータを受け付けないようです。Northwind.mdb には商品の画像データなどが入っていますが、ADO, ADOX によってそれらをExcel側に書き込むことはできません。

 先のレコード処理のプログラム例は、全レコードをコピーする形になっています。

 ですが、Excelへのコピーの場合、データ型がバイナリーデータのフィールドを対象外にする必要があります。

目次に戻る


    

2. OLEを利用したVBScript

 VBScript全体は、160行を超える長さになるので、部分ごとに分けて掲げます。

 今回のテーマ「ADOによるAccess→Excelの変換」にかかわるのは、やはりプログラムのメイン部分です。それを下に掲げます。

△ vovTBL04.vbs メイン部分

 1' ADOによるAccess→Excelの変換
 2Option Explicit
 3Dim FSO, DbName, DbPath, BookName, BookPath
 4Dim Mdb, Xls, MdbTbl, XlsTbl, TblName, FldNames
 5Dim MdbRS, XlsRS, MdbCol, XlsCol, i
 6
 7Set FSO = CreateObject("Scripting.FileSystemObject")
 8DbName = InputBox("Accessファイルの名前: ", _
 9    "Access→Excel", "TestDB.mdb")
10If DbName = "" Then WScript.Quit
11DbPath = FSO.GetAbsolutePathName(DbName)
12If FSO.FileExists(DbPath) = False Then
13    MsgBox "ファイルがみつかりません: " & DbPath
14    WScript.Quit
15End If
16Set Mdb = New DbAdo
17Mdb.Open DbPath
18
19BookName = "Book1.xls"
20BookPath = FSO.GetAbsolutePathName(BookName)
21If FSO.FileExists(BookPath) Then FSO.DeleteFile(BookPath)
22Set Xls = New DbAdo
23Xls.Open BookPath
24
25For Each MdbTbl In Mdb.CAT.Tables  ' テーブルを一つずつたどる
26    If (MdbTbl.Type = "TABLE") Or (MdbTbl.Type = "VIEW") Then
27        TblName = "[" & MdbTbl.Name & "]"
28        FldNames = FieldNamesNotBin(Mdb.CN, TblName)
29        Set XlsTbl = CreateObject("ADOX.Table")  ' 新Tableオブジェクト
30        XlsTbl.Name = MdbTbl.Name  ' テーブル名をコピー
31        For i = 0 To UBound(FldNames)  ' フィールドを一つずつ
32            Set MdbCol = MdbTbl.Columns(FldNames(i))
33            Set XlsCol = CreateObject("ADOX.Column")  ' 新Fieldオブジェクト
34            XlsCol.Name = MdbCol.Name
35            XlsCol.Type = MdbCol.Type
36            XlsCol.DefinedSize = MdbCol.DefinedSize
37            XlsCol.Precision = MdbCol.Precision
38            XlsCol.NumericScale = MdbCol.NumericScale
39            XlsCol.ParentCatalog = Xls.CAT  ' 念のため
40            XlsTbl.Columns.Append XlsCol  ' Field定義をTableに追加
41        Next
42        Xls.CAT.Tables.Append XlsTbl  ' ここでTableの定義が完了
43    Set MdbRS = CreateObject("ADODB.Recordset")
44        MdbRS.Open TblName, Mdb.CN, 0, 1, 2
45        Set XlsRS = CreateObject("ADODB.Recordset")
46        XlsRS.Open TblName, Xls.CN, 0, 2, 2
47        Do Until MdbRS.EOF  ' mdbのレコードをxlsにコピー
48            XlsRS.AddNew
49            For i = 0 To UBound(FldNames)
50                XlsRS.Fields(FldNames(i)).Value = _
51                    MdbRS.Fields(FldNames(i)).Value
52            Next
53            XlsRS.Update
54            MdbRS.MoveNext
55        Loop
56        MdbRS.Close
57        XlsRS.Close
58    End If
59Next
60Xls.Close
61Mdb.Close
62ExcelAutoFit BookPath

    

 Excel側のテーブルの定義、それから、レコードのコピーについては既に述べたとおりです。

 今回は mdb, xls の二つのデータベースファイルを取り扱います。

 どちらも処理のうえで CN(接続用オブジェクト)と CAT(カタログオブジェクト)が必要になります。

 それらを MdbCN, XlsCN, MdbCAT, XlsCAT などとして管理してもいいのですが、
簡単なデータベース用のクラス DbAdo を設けて管理するやり方を採ってみました。

 そうしておけば Mdb = New DbAdo および Xls = New DbAdio として、
Mdb.CN, Mdb.CAT, Xls.CN, Xls.CAT と記述できるようになります。

 DbAdo クラスについては後述。

    

 関数 FieldNamesNotBin は、指定のテーブルのフィールド名一覧を得るためのものです。

 データ型がバイナリー型のものは一覧から除きます。Excel側がバイナリー型を受け付けないのでそうしています。

 最後の ExcelAutoFit BookPath という関数は、新たに作成したxlsファイルに関してセル幅を調整するものです。Excelを起動して行います。関数の中身は省略。

 セル幅を調整しないと、Book1.xls を開いたとき、中身がちゃんと表示されないセルが結構あります。

 セル幅の調整は、ADO, ADOX では行えないので、Excelを起動して行います。

 最後までExcelなしでやりたいところですが、残念。

目次に戻る


    

△ FieldNamesNotBin: バイナリー型以外のフィールド名一覧

 関数 FieldNamesNotBin(CN, TblName) は、バイナリー型以外のフィールド名を返します。

 その戻り値(フィールド名一覧)は、テーブルを定義したときのフィールドの順番どおりになっています。

 1Function FieldNamesNotBin(CN, TblName)  ' フィールド名の取得
 2    Dim RS, FldNames, FldCount, ValStr, i
 3    Set RS = CreateObject("ADODB.Recordset")
 4    RS.Open TblName, CN, 0, 1, 2
 5    Set FldNames = CreateObject("System.Collections.ArrayList")
 6    FldCount = RS.Fields.Count
 7    For i = 0 To (FldCount-1)
 8        ValStr = "@" & CStr(RS.Fields(i).Type) & "@"
 9        If InStr("@128@204@205@", ValStr) = 0 Then  ' バイナリではない
10            FldNames.Add RS.Fields(i).Name
11        End If
12    Next
13    RS.Close
14    FieldNamesNotBin = FldNames.ToArray()
15End Function

    

 関数は、CN, TblName に関連づけられたレコードをオープンし、そこからフィールド名を得ます。そのため、フィールドの順番が適切なものになります。

 FldNames(System.Collections.ArrayList型)は、配列用のオブジェクトです。
VBScriptの配列に比べて、配列のサイズが動的に変化する場合に扱いやすいです。

 といっても、関数の戻り値は、FldNames.ToArray() として VBScriptの配列の形にしています。その方が vovTBL04.vbs のメイン部分で扱いやすいので。

    

 バイナリー型を除く処理は、バイナリー型の Field.Type が 128, 204, 205 であることを利用しています。

 数値である Type を文字に変換して、それが “@128@204@205@” に含まれているかどうかを確認します。

 配列に「ある要素」が含まれているかどうかを簡単にチェックできればいいのですが、そのためのメソッドがなさそうなのでこうした手段を採りました。

 ちゃんと確認していませんが、バイナリー型以外でもExcelが受け付けないデータ型があるとおもいます。

 ただ、ここはバイナリー型だけを対象外にする形にしました。

目次に戻る


    

△ Class DbAdo

 CN(接続用オブジェクト)と CAT(カタログオブジェクト)を一体的に取り扱う目的で DbAdo というクラスを設定しました。

 VBScript のクラスについては、たとえば VBSのクラスオブジェクト - FSWikiLite というサイトが参考になります。

 以下、vovTBL04.vbs のクラス定義部分です。

 1Class DbAdo
 2    Public DbPath
 3    Public ConnStr
 4    Public CN
 5    Public CAT
 6
 7    Private Sub Class_Initialize
 8        DbPath = ""
 9        ConnStr = ""
10        Set CN = Nothing
11        Set CAT = Nothing
12    End Sub
13
14    Private Sub Class_Terminate
15        Call Close()
16    End Sub
17
18    Public Sub Open(ByVal DbName)  ' DataBase open
19        Dim ShellObj, FSO, DriverStr, ExtName
20        Set ShellObj = CreateObject("Wscript.Shell")
21        If ShellObj.Environment("Process").Item( _
22                "PROCESSOR_ARCHITECTURE") = "x86" Then  ' 32bit版の場合
23            DriverStr = "Provider=Microsoft.Jet.OLEDB.4.0;"
24        Else  ' 64bit版の場合
25            DriverStr = "Provider=Microsoft.ACE.OLEDB.12.0;"
26        End If
27        Set ShellObj = Nothing
28        Set FSO = CreateObject("Scripting.FileSystemObject")
29        DbPath = FSO.GetAbsolutePathName(DbName)
30        ExtName = LCase(FSO.GetExtensionName(DbPath))
31        Select Case ExtName
32        Case "mdb"
33            ConnStr = DriverStr & "Data Source=" & DbPath & ";"
34        Case "xls"
35            ConnStr = DriverStr & "Data Source=" & DbPath & ";" & _
36                "Extended Properties=""Excel 8.0;HDR=Yes;"""
37        Case "accdb"
38            ConnStr = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
39                "Data Source=" & DbPath & ";"
40        Case "xlsx"
41            ConnStr = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
42                "Data Source=" & DbPath & ";" & _
43                "Extended Properties=""Excel 12.0 XML;HDR=Yes;"""
44        Case Else
45            ConnStr = ""
46        End Select
47        If ConnStr = "" Then
48            Set CN = Nothing
49            Set CAT = Nothing
50            Exit Sub
51        End If
52        If (FSO.FileExists(DbPath) = False) And ((ExtName = "mdb") Or _
53            (ExtName = "accdb")) Then
54            Set CAT = CreateObject("ADOX.Catalog")
55            Set CN = CAT.Create(ConnStr)  ' データベース新規作成
56        Else
57            Set CN = CreateObject("ADODB.Connection")
58            CN.Open ConnStr
59            Set CAT = CreateObject("ADOX.Catalog")
60            CAT.ActiveConnection = CN
61        End If
62        Set FSO = Nothing
63    End Sub
64
65    Public Sub Close()
66        If Not CN Is Nothing Then CN.Close
67        DbPath = ""
68        ConnStr = ""
69        Set CN = Nothing
70        Set CAT = Nothing
71    End Sub
72End Class

    

 クラスのメンバー変数は DbPath(データベースファイルのフルパス), ConnStr(接続用文字列), CN(接続用オブジェクト), CAT(カタログオブジェクト)ですが、プログラムのメイン部分で参照しているのは CN, CAT です。

 クラスのメソッドは、コンストラクタ(Class_Initialize)とデストラクタ(Sub Class_Terminate)を除くと Open, Close です。中心となるのは Open です。

 Openメソッドによって、Access(accdb, mdb)と Excel(xls, xlsx)を開くことができます。

 既にデータベースファイルが存在する場合と、新規に作成する場合の両法に対応します。

 このクラスを利用するときは次のようにします。

Set Mdb = New DbAdo
Mdb.Open "test.mdb"

 Openの引数は、フルパスでもいいですし、単なるファイル名でもかまいません。内部でフルパスに変換します。

 データベースをオープンする手順については、ADOによるデータベースの新規作成の各ページを参照して下さい。

目次に戻る


    

3. JScript

 長くなりますが、先の VBScript と同じ働きをする JScript を掲げます。

 JScript では「クラス」を定義する構文がありませんが、function の定義で類似のことができます。キーワードは、クラスのオブジェクト本体を示す this です。

 JScript のクラス設定については、たとえば WSH(JScript) - 基礎 - なにげにぷろぐらまーWiki というサイトが参考になります。

△ vovTBL04.js

  1// ADOによるAccess→Excelの変換
  2var fso, dbName, dbPath, bookName, bookPath;
  3var mdb, xls, mdbTbl, xlsTbl, tblName, fldNames;
  4var mdbRs, xlsRs, mdbCol, xlsCol, i, k;
  5
  6fso = WScript.CreateObject("Scripting.FileSystemObject");
  7dbName = InputBox("Accessファイルの名前: ",
  8    "Access→Excel", "TestDB.mdb");
  9if (dbName == "")  WScript.Quit();
 10dbPath = fso.GetAbsolutePathName(dbName);
 11if (fso.FileExists(dbPath) == false) {
 12    var shellObj = WScript.CreateObject("WScript.Shell");
 13    WScript.Echo("ファイルがみつかりません: " + dbPath);
 14    while (shellObj.AppActivate("Windows Script Host") != true) {
 15        WScript.Sleep(100);
 16    }
 17    WScript.Quit();
 18}
 19mdb = new DbAdo(dbPath);
 20
 21bookName = "Book1.xls";
 22bookPath = fso.GetAbsolutePathName(bookName);
 23if (fso.FileExists(bookPath))  fso.DeleteFile(bookPath);
 24xls = new DbAdo(bookPath);
 25
 26for (k=0; k<mdb.cat.Tables.Count; k++) {  // テーブルを一つずつたどる
 27    mdbTbl = mdb.cat.Tables(k);
 28    if (mdbTbl.Type == "TABLE" || mdbTbl.Type == "VIEW") {
 29        tblName = "[" + mdbTbl.Name + "]";
 30        fldNames = FieldNamesNotBin(mdb.cn, tblName);
 31        xlsTbl = WScript.CreateObject("ADOX.Table");
 32        xlsTbl.Name = mdbTbl.Name
 33        for (i=0; i<fldNames.length; i++) {  // フィールドを一つずつ
 34            mdbCol = mdbTbl.Columns(fldNames[i]);
 35            xlsCol = WScript.CreateObject("ADOX.Column");
 36            xlsCol.Name = mdbCol.Name;
 37            xlsCol.Type = mdbCol.Type;
 38            xlsCol.DefinedSize = mdbCol.DefinedSize;
 39            xlsCol.Precision = mdbCol.Precision;
 40            xlsCol.NumericScale = mdbCol.NumericScale;
 41            xlsCol.ParentCatalog = xls.cat;  // 念のため
 42            xlsTbl.Columns.Append(xlsCol);  // Field定義をTableに追加
 43        }
 44        xls.cat.Tables.Append(xlsTbl);  // ここでTableの定義が完了
 45        mdbRs = WScript.CreateObject("ADODB.Recordset");
 46        mdbRs.Open(tblName, mdb.cn, 0, 1, 2);
 47        xlsRs = WScript.CreateObject("ADODB.Recordset");
 48        xlsRs.Open(tblName, xls.cn, 0, 2, 2);
 49        while (mdbRs.EOF == false) {
 50            xlsRs.AddNew();
 51            for (i=0; i<fldNames.length; i++) {
 52                xlsRs.Fields(fldNames[i]).Value =
 53                    mdbRs.Fields(fldNames[i]).Value;
 54            }
 55            xlsRs.Update();
 56            mdbRs.MoveNext();
 57        }
 58        mdbRs.Close();
 59        xlsRs.Close();
 60    }
 61}
 62xls.close();
 63mdb.close();
 64ExcelAutoFit(bookPath);
 65
 66// ----------------
 67
 68function FieldNamesNotBin(cn, tblName) {
 69    var rs, fldNames, fldCount, valStr, i;
 70    rs = WScript.CreateObject("ADODB.Recordset");
 71    rs.Open(tblName, cn, 0, 1, 2);
 72    fldNames = [];
 73    fldCount = rs.Fields.Count;
 74    for (i=0; i<fldCount; i++) {
 75        valStr = "@" + rs.Fields(i).Type + "@";
 76        if ("@128@204@205@".indexOf(valStr) == -1) {  // バイナリではない
 77            fldNames.push(rs.Fields(i).Name);
 78        }
 79    }
 80    rs.Close();
 81    return fldNames;
 82}
 83
 84// ----------------
 85
 86function DbAdo(dbName) {
 87    this.dbPath = "";
 88    this.connStr = "";
 89    this.cn = null;
 90    this.cat = null;
 91    this.open = DbAdo_open;
 92    this.close = DbAdo_close;
 93    this.open(dbName);
 94}
 95
 96// ----------------
 97
 98function DbAdo_open(dbName) {
 99    var shellObj, driverStr, fso, extName;
100    shellObj = WScript.CreateObject("Wscript.Shell");
101    if (shellObj.Environment("Process").Item(
102            "PROCESSOR_ARCHITECTURE") == "x86") {  // 32bit版の場合
103        driverStr = "Provider=Microsoft.Jet.OLEDB.4.0;";
104    } else {  // 64bit版の場合
105        driverStr = "Provider=Microsoft.ACE.OLEDB.12.0;";
106    }
107    fso = WScript.CreateObject("Scripting.FileSystemObject");
108    this.dbPath = fso.GetAbsolutePathName(dbName);
109    this.connStr = "";
110    extName = fso.GetExtensionName(this.dbPath).toLowerCase();
111    switch (extName) {
112    case "mdb":
113        this.connStr = driverStr + "Data Source=" + this.dbPath + ";";
114        break;
115    case "xls":
116        this.connStr = driverStr + "Data Source=" + this.dbPath + ";" +
117            "Extended Properties=\"Excel 8.0;HDR=Yes;\"";
118        break;
119    case "accdb":
120        this.connStr = "Provider=Microsoft.ACE.OLEDB.12.0;" +
121            "Data Source=" + this.dbPath + ";";
122        break;
123    case "xlsx":
124        this.connStr = "Provider=Microsoft.ACE.OLEDB.12.0;" +
125            "Data Source=" + this.dbPath + ";" +
126            "Extended Properties=\"Excel 12.0 XML;HDR=Yes;\"";
127        break;
128    }
129    if (this.connStr == "") {
130        this.cn = null;
131        this.cat = null;
132        return;
133    }
134    if (fso.FileExists(this.dbPath) == false && (extName == "mdb" ||
135        extName == "accdb")) {
136        this.cat = WScript.CreateObject("ADOX.Catalog");
137        this.cn = this.cat.Create(this.connStr);  // データベース新規作成
138    } else {
139        this.cn = WScript.CreateObject("ADODB.Connection");
140        this.cn.Open(this.connStr);
141        this.cat = WScript.CreateObject("ADOX.Catalog");
142        this.cat.ActiveConnection = this.cn;
143    }
144}
145
146// ----------------
147
148function DbAdo_close() {
149    if (this.cn != null)  this.cn.Close();
150    this.dbPath = "";
151    this.connStr = "";
152    this.cn = null;
153    this.cat = null;
154}
155
156// ----------------
157
158function InputBox(prmpt, ttl, dflt) {
159    var sh = WScript.CreateObject("WScript.Shell");
160    var tmpFile = sh.Environment("Process").item("TEMP") + "\\MyTest.vbs";
161    var fso = WScript.CreateObject("Scripting.FileSystemObject");
162    var cmdStr = "Set FSO = CreateObject(\"Scripting.FileSystemObject\")\n" +
163        "dbName = InputBox(\"" + prmpt + "\", _\n" +
164        "\"" + ttl + "\", \"" + dflt + "\")\n" +
165        "FSO.GetStandardStream(1).Write dbName\n";
166    var fObj = fso.OpenTextFile(tmpFile, 2, true);
167    fObj.Write(cmdStr);
168    fObj.Close();
169    execObj = sh.Exec("CScript.exe /Nologo " + tmpFile);
170    while (execObj.Status == 0) {  // コマンド実行の終了を待つ
171        WScript.Sleep(100);  // 0.1秒待機
172    }
173    var resStr = execObj.StdOut.ReadLine();
174    fso.DeleteFile(tmpFile);
175    return resStr;
176}
177
178// ----------------
179
180function ExcelAutoFit(bookPath) {  // 全シートのセル幅を調整
181    var ExlApp, wb, ws, i, j;
182    ExlApp = WScript.CreateObject("Excel.Application");  // Excelの起動
183    ExlApp.Visible = true;  // Excelを見える状態に
184    wb = ExlApp.Workbooks.Open(bookPath);
185    for (i=1; i<=wb.Worksheets.Count; i++) {
186        ws = wb.Worksheets(i);
187        ws.UsedRange.Columns.AutoFit();
188    }
189    wb.Save;  // ワークブックの上書き保存
190    ExlApp.Quit();
191}

    

 JScript ではクラスのコンストラクタに当たるのが関数 DbAdo(dbName) です。

 VBScript の場合はコンストラクタに引数を渡すことができませんが、JScript では可能です。

 そこで、コンストラクタにデータベース名(ファイル名)を渡してオープンできるようにしました。

 VBScript では下の2行で書くところですが、

Set Mdb = New DbAdo
Mdb.Open DbPath

 JScript では次の1行で書けるようにしました。

mdb = new DbAdo(dbPath);

〜 以上 〜