[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『CSVファイルのUTF-8形式出力方法と改行について』(たまご)
いつも参考にさせてもらっています、VBA初心者です。
エラー内容でどうしても分からなく、投稿です。
やりたい事は、1ファイル2シートのEXCELファイルを
CSV(UTF-8)で出力しようとしています。
色々参考に下記のように記述したのですが、
エラー3001で止まります。
「3001:引数が間違った型、許容範囲外、または競合しています。」
ここまで来ると手に負えなく、ご助力お願いできませんでしょうか?
Sub sampleCSV_utf8()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets(1)
Dim csvFile As String
csvFile = ActiveWorkbook.Path & "\testdata_utf8.csv"
'ADODB.Streamオブジェクトを生成
Dim adoSt As Object
Set adoSt = CreateObject("ADODB.Stream")
Dim strLine As String
Dim i As Long, j As Long
i = 1
With adoSt
.Charset = "UTF-8" .LineSeparator = CRLF ←←←ここでエラー1 .Open
Do While ws.Cells(i, 1).Value <> ""
strLine = ""
j = 1 Do While ws.Cells(i, j + 1).Value <> ""
strLine = strLine & ws.Cells(i, j).Value & "," j = j + 1
Loop
strLine = strLine & ws.Cells(i, j).Value
.WriteText strLine, adWriteLine
i = i + 1
Loop
.SaveToFile csvFile, adSaveCreateOverWrit ←←←ここでエラー2 .Close
End With
End Sub
やったこと
・(原因が分からず)「エラー1」を削除する。(デフォルトCRLFだったと認識)
・再実行
・エラー解消したように見え、次の「エラー2」が出力。
エラー2の箇所は上書き指定だったため、「,」以降削除とともに
作成済みファイルを削除
これでファイルはできましたが、改行がやはりされていません。
同じく2回目やろうとしたらやはり「エラー2」で上書き指定がないので
既存ファイルを削除してだとOK
データとしては
No. パターン テスト内容 結果
1 A リカバリー OK
2 C 結合 NG
のようなEXCELデータがCSV(UTF-8)で書き出せれれば
助かります。
理論が分からずの質問で申し訳ないのですが、
ご助力宜しくお願いします。
説明不足あれば、補足します。
< 使用 Excel:Excel2010、使用 OS:Windows7 >
Option Explicitが設定されていなくてCRLFがヌルになっているので 「3001:引数が間違った型、許容範囲外、または競合しています。」 のエラーになっているのでは? 下記のページによるとCRLFは-1のようだが。
http://www.koikikukan.com/archives/2014/04/03-013333.php
(ねむねむ) 2018/06/12(火) 16:23
.LineSeparator = CRLF ←←←ここでエラー1
.SaveToFile csvFile, adSaveCreateOverWrit ←←←ここでエラー2
CRLF は adCrLf が正しい。ただし、
adCrLf, adSaveCreateOverWrit というのは定義済み定数で、
ADOライブラリーに参照設定しておく必要があります。下記のようにしてください。
Visual Basic Editor のメニューから[ツール]→[参照設定]を選び,
[参照可能なライブラリファイル]の中から
"Microsoft ActiveX Data Objects x.x Library" にチェックを入れます。
参照設定した場合は、
Dim adoSt As Object
Set adoSt = CreateObject("ADODB.Stream")
は、
Dim adoSt As ADODB.Stream
Set adoSt = New ADODB.Stream
と書き換えます。
参照設定せずに、現状のままで、行くときは、
adCrLf は -1
adSaveCreateOverWrit は 2
というように数値で指定します。
あと、Option Explicit(変数宣言強制)を記述しておけば、CRLF の部分で
コンパイルエラーが出るので、まちがいとすぐわかります。
(hatena) 2018/06/12(火) 16:32
adSaveCreateOverWrit は正しくは adSaveCreateOverWrite のようだ。 あと、adWriteLineは1で。 (ねむねむ) 2018/06/12(火) 16:39
とする手も有りかな。
(kazuo) 2018/06/12(火) 19:56
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.