- 締切済み
vbscripでaccdb→xlsxの対応について
Windows Server2008R2上で cscript D:\aaaa.vbs で実行しているvbscriptにてサーバーの所定のフォルダに AccessD/B、EXCELブックを作成しています。 尚、Windows Server2008R2上にはOffice2013はインストールしておりません。 Microsoft.ACE.OLEDB12.0を再配布でインストールしています。 サーバー側で作成したAccessD/B EXCELブックを Office2013をインストールしてあるクライアントPCにて vbscriptにて作成したEXCELブック内の ・文字列の頭の空白 ・シート名 についてお伺いしたいのでよろしくお願いします。 -------------------------------------------------------------------- vbscriptの内容は以下のとおりです。 TEST.accdb内のTABLE1の全レコードをxlsx形式のEXCELブックに出力するために Set cnn = cat.ActiveConnection ・ Query = "select * into [Excel 12.0 Xml;DATABASE=TEST.accdb].[シート名] from [TABLE1]" cnn.Execute Query で実行しているのですが( Microsoft.ACE.OLEDB12.0 ) ■TABLE1のフィールドの内容は ○A12B95 (○は空白の意味です) なのですがEXCELには A12B95 と、文字列の頭の空白がカットされて出力されてしまいます。 ■シート名に()などの記号が含まれているとEXCELブック表示すると 「xxxx.xlsxの一部に問題が見つかりました。可能な限り内容を回復しますか・・・・・・・・・」 のメッセージが表示され、EXCELブックを開くと修復されますがシート名の記号が記号によっては 文字化けします。 以前は Access2003、Excel2003だったので( Microsoft.JET.OLEDB.4.0 ) TEST.mdb内のTABLE1の全レコードをxls形式のEXCELブックに出力しており Query = "select * into [Excel 8.0;DATABASE=TEST.mdb].[シート名] from [TABLE1]" cnn.Execute Query で正常に'○A12B95と出力できていました。 接頭辞「'」付きで また、シート名に()などの記号が含まれていても正常にシート名が作成され EXCELブック(xls)を開くことができました。 accdb形式のAccessD/BのテーブルをExcelのxls形式とxlsx形式に出力する場合とでは 文字列頭の空白処理やシート名の扱いが異なるのでしょうか。 ■試しに以下の処理をしてみましたが (1)accdb形式のAccessD/BのテーブルをAccess自体のメニューでエクスポートしてみましたが 文字列頭の空白は xls形式では・・・・'○A12B95 接頭辞「'」あり、空白○あり xlsx形式では・・・・A12B95 接頭辞「'」なし、空白○なし となってしまいます。 (2)EXCEL2013の詳細設定のLotus1-2-3形式のキー操作チェックボックスをオンにして(1)の エクスポートしてみましたが xlsx形式では・・・・'A12B95 「接頭辞「'」は付くものの、空白○なし となってしまいます。 (3)TEST.accdb内のTABLE1のレコードセットを作成し、テキスト項目には「'」を付けて 1レコード毎EXCELブック(xlsx)に行挿入( Addnew~Update )してみましたが EXCELブック(xlsx)を開きテキスト項目の内容を確認しましたところ '○A12B95 接頭辞「'」あり、空白○ありとなるものの Lenで文字数を確認すると 「'」を含めた文字数(8)になってしまいます。EXCELでは接頭辞「'」は文字扱いしないはずなのですが。 何故かテキスト項目のセルをクリックした後、再度Lenで文字数を確認すると文字数(7)になります。 ■ ○A12B95 はオーダー番号なので番号体系を変えることはできません。○の部分は空白以外もあります。 また、レコード件数も65,000件超のためxlsx形式でないと対処できません。 vbscriptで accdb形式のAccessD/B内のテーブルをxlsx形式のExcelに出力した場合に 文字列の頭の空白がなくならないよう、またシート名に記号()等を使っても 正常にEXCLEブックが開ける方法がございましたらご教示下さいますでしょうか。 できれば1件1件読み込んで処理する以外の方法が望ましいです。 レコード件数が多く以前その処理だと数十分~小一時間かかっていたので 上記方法select * into [Excel・・・に変更し数分で処理できるようになりましたので。 無理な場合は1件1件読み込んで処理する場合は上記(3)が改善できる方法があればと思います
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- NotFound404
- ベストアンサー率70% (288/408)
AccessからオートメーションでExcelを操作してはダメですか? 日本郵便の、Ken_all.csv をAccessにインポート(12万件)、 3レコードごとに適当なフィールドの値の先頭に半角スペース付与、 これで試したところ(Office2010)半角スペースは残りました。 下記(ローカル環境)では数秒でした。 Sub vv() Dim xl As Object Dim rs As DAO.Recordset Dim t As Single t = Timer Set xl = CreateObject("excel.application") Set rs = CurrentDb.OpenRecordset("select * from ken_all", dbOpenSnapshot) xl.workbooks.Add xl.workbooks(1).sheets.Add xl.workbooks(1).sheets(xl.sheets.Count).Name = "sheet(1)" xl.sheets("sheet(1)").range("A1").copyfromrecordset rs xl.workbooks(1).saveas "E:\tt.xlsx" xl.workbooks(1).Close xl.Quit Set xl = Nothing rs.Close: Set rs = Nothing Debug.Print Timer - t Beep End Sub ↑手抜きコードですが検証用という事で・・・。
お礼
残念ながら現時点ではACCESSからVBAでexcel.applicationでExcelブックに出力することは考えておりません。 この機能はサーバーで処理していますが、作成するAccess、Excelブックはいろいろあるのと、利用者は複数(数十人単位)のため同時使用もありexcel.applicationを使用すると複数のEXCELブックが立ち上がりWorkブックのACTIVE制御に難があります。ローカルで1人だけならexcel.applicationでも可能ですが。 Access/Excelインストール不要とし、VBSCRIPTで (1)DBエンジン接続 (2)CSVファイル読み込み (3)Access(accdb)創生→Access(テーブル)作成→CSVファイル→Access(テーブル)書き込み (4)Access(テーブル)→Excelブック創生 の一連の処理を全ておこなっています。 Excelの接頭辞「'」、文字列の頭の空白処理の扱いが Accessメニューで単純にエクスポートしただけなのに結果が異なること Access(mdb)→Excel(xls) と Access(accdb)→Excel(xlsx) の結果が異なること自体問題だと思います。 何故異なるのかを先ず知りたいです。もし異なるのであれば単純に何らかの設定変更だけで回避できるのでしょうか。 また JET.OLEDB.4.0 ACE.OLEDB.12.0を使用した外部プログラムからの処理では Excelの接頭辞「'」、文字列の頭の空白処理、シート名に記号を含む では扱いが異なる問題は解決しないのでしょうか。