プロが教える店舗&オフィスのセキュリティ対策術

AccessVBAでCSVインポート時にゼロサプレスをせずに行いたいです。
現状は下記のソースでインポートしていますが数字のみが入っているテキスト項目でゼロサプレスが行われてしまいます。

DoCmd.TransferText acImportDelim, , [テーブル名], [ファイル名]

下記のものについては事情があって対処として厳しいです。
ゼロサプレスのみを止めるよい方法はないでしょうか。

■インポート定義を使用する
⇒50種類ほど列項目が異なるテーブルがあり、また時々フォーマット変更があるため事前に定義しておくことは難しい。

■表示フォーマットを指定する
⇒5桁項目に4桁のデータであったり3桁のデータである場合があるがそれらをそのまま保持したい。

■CSV作成時にダブルクオーテーションで囲む
⇒CSVの作成側に対応依頼はしたができないとの回答があった。

現状としてわかっていることとしては、値をダウブルクオーテーションで囲うことでゼロサプレスを回避できることはわかっているため、
Accessマクロの中でExcelを呼び出しダウブルクオーテーション付で保存できないかと考えていますがうまくいっていない状況です。

Access単独、Excelを使う方法などゼロサプレスを回避できる方法をご教示願います。

A 回答 (3件)

MS社のお節介?を止める手段は無いものと思います。


地道にフォーマットが変更になるたびに毎回インポートウィザードで
データ型の指定を行うか。
インポート定義の修正をVBAで行うか
http://www.ruriplus.com/msaccess/tch/tch_040.html
ファイルそのものをAccessで正常に読み込めるように
各カラムの修正を正規表現などを駆使して行うか・・・
ファイルの作成元に泣きつくか報酬をはずむか・・・
だと思います。
近道は無いんじゃないかな?
    • good
    • 0

そのCSVファイルが


0012,asd,234,2012/1/1
のように区切り記号の『,』が他では使われていない場合
"1,234"のような桁区切りが無いなら少しは簡単かもしれない。
ファイルを読み込んで、Split関数で各カラムに分けて配列に
格納します。
各配列の要素ごとにデータ型の推測をします。
Isdate、Isnumeric、後述のIsZeroを関数にして使い大きく分けます。
数値型のものはさらに桁数や小数点以下をみてInteger,Long,Doubleに分類
これを十行程度おこなってデータ型を決定して
そのデータ型を元にテーブルを作成してインポート処理。

0012,asd,234,2012/1/1
1234,asd,234,2012/1/1
のようなカラム中でゼロフィルでないものが含まれない場合は
(常にゼロフィルである場合)説明下手
もう少し単純に、IsZeroでFalseになった場合だけ、Replaceで
前後を""で括ったCSVファイルを別途出力してそれをTransfer・・
してやれば良いと考えます。
少しは参考になる・・・かな?

Sub isZero()
Dim oREG As Object
Dim arg As String
Dim argCol As Variant
Dim i As Integer

arg = "0012,asd,234,2012/1/1,0.12,,0"
argCol = Split(arg, ",")
Set oREG = CreateObject("vbscript.regexp")

With oREG
.Pattern = "^0+[0-9]"
.IgnoreCase = False
.Global = True
End With

For i = LBound(argCol) To UBound(argCol)
Debug.Print argCol(i), oREG.test(argCol(i))
Next
End Sub
    • good
    • 0

テーブルの列定義で、すべてテキスト型にしたらどうなりますか?



私だったら、CSVファイルをSEQに行単位で読み込んで、カンマで分解して列に格納します。

この回答への補足

テーブル定義ではテキスト型としていますがゼロサプレスされてしまう状態です。
また行単位読み込みですが、値にカンマやダブルクオーテーション、バックスラッシュが入っているため、
1文字単位での処理が必要となってしまいパフォーマンス面で厳しいです。
(200カラム程度で1万レコードを読み込むためVBAでロジックを作ることは極力避けたいです)

補足日時:2012/10/18 22:46
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています