カテゴリー名: [ADOによるデータベースの中身の把握]
mdbファイルの内容をxlsファイルにコピーする方法を取り上げます。
いわば Access→Excelの変換です。
Excelを起動することなく ADO, ADOX の機能によりコピーします。
なので、VBAマクロは取り上げません。VBScript, JScript を掲げます。
今回、一部ですが「クラス」を扱う形にしてみました。
今回の処理を箇条書きにすると次のとおり。
今回、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ファイルを生成する場合、Properties
や Indexes
を指定しても意味がありません。Excelがそれらに対応していないからです。
コピー処理の中心は、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へのコピーの場合、データ型がバイナリーデータのフィールドを対象外にする必要があります。
VBScript全体は、160行を超える長さになるので、部分ごとに分けて掲げます。
今回のテーマ「ADOによるAccess→Excelの変換」にかかわるのは、やはりプログラムのメイン部分です。それを下に掲げます。
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(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が受け付けないデータ型があるとおもいます。
ただ、ここはバイナリー型だけを対象外にする形にしました。
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によるデータベースの新規作成の各ページを参照して下さい。
長くなりますが、先の VBScript と同じ働きをする JScript を掲げます。
JScript では「クラス」を定義する構文がありませんが、function の定義で類似のことができます。キーワードは、クラスのオブジェクト本体を示す this です。
JScript のクラス設定については、たとえば WSH(JScript) - 基礎 - なにげにぷろぐらまーWiki というサイトが参考になります。
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);
〜 以上 〜