こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

-広告-

締切り済みの質問

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)が改善できる方法があればと思います

投稿日時 - 2015-05-27 14:38:32

QNo.8983173

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

-広告-
-広告-

回答(1)

ANo.1

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
↑手抜きコードですが検証用という事で・・・。

投稿日時 - 2015-05-27 20:06:00

お礼

残念ながら現時点では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の接頭辞「'」、文字列の頭の空白処理、シート名に記号を含む
では扱いが異なる問題は解決しないのでしょうか。

投稿日時 - 2015-05-28 14:30:32

-広告-
-広告-

あなたにオススメの質問

-広告-
-広告-