[[20180611133235]] 『CSVファイルのUTF-8形式出力方法と改行について』(たまご) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『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

.LineSeparator なんて気にせず、削除して、
>.WriteText strLine, adWriteLine

.WriteText strLine & vbCrLf

とする手も有りかな。
(kazuo) 2018/06/12(火) 19:56


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.