解決済みの質問

質問No.6354651
困ってます
困ってます
お気に入り投稿に追加する (0人が追加しました)
回答数2
閲覧数6195
ADODB.Streamを使用してUTF-8を出力
こんちには。VBA初心者です。

Excelのワークシートの値をUTF-8形式のテキスト(.csvで保存します)形式でエクスポートするため、以下のようなコードを書いてみたのですが、「.Type = adTypeText」のところで、「実行時エラー 3001:引数が間違った型、許容範囲外、または競合しています。」のエラーになってしまいます。

ADO関係はほとんど知識がなく、「http://msdn.microsoft.com/ja-jp/library/cc408239.aspx」こういうところで調べても、よく理解できないことが多いので困っています。

どなたか助言をいただけないでしょうか。
(後学のために多少の解説もいただけると助かります)

Sub exportToCsv()

Dim myBook As String
Dim mySheet As String
Dim myLastRow As Long
Dim i As Integer

myBook = "sample.xlsm"
mySheet = "sample"

Workbooks(myBook).Worksheets(mySheet).Activate

myLastRow = Cells.SpecialCells(xlLastCell).Row

Set myStream = CreateObject("ADODB.Stream")

With myStream
.Type = adTypeText
.Charset = "UTF-8"
.Open
.WriteText
End With

For i = 1 To myLastRow
myStream.WriteText Cells(i, 1) & vbLf
Next i

myStream.SaveToFile "D:\sample.csv"
myStream.Close
Set myStream = Nothing

End Sub
投稿日時 - 2010-11-30 21:18:33

質問者が選んだベストアンサー

回答No.2
丁寧にやりましょう。

Dim myBook As String
Dim mySheet As String
Dim myLastRow As Long
Dim i As Integer
Dim シート As Worksheet
Dim 文字列 As String
Dim MyStream

myBook = "sample.xlsm"
mySheet = "sample"

'★デフォルトオブジェクトは使用しない方がよい
'Workbooks(myBook).Worksheets(mySheet).Activate
Set シート = Workbooks(myBook).Worksheets(mySheet)

myLastRow = シート.Cells.SpecialCells(xlLastCell).Row
Set MyStream = CreateObject("ADODB.Stream")

With MyStream
    .Type = 2
    .Charset = "UTF-8"
    .Open
    '.WriteText ★パラメータが無いのでエラーになる
End With
For i = 1 To myLastRow
    '★改行だけでなく、復帰+改行にする。Unix用なら改行のみ
    字列 = シート.Cells(i, 1)
    文字列 = Replace(文字列, vbLf, vbNewLine)
    MyStream.WriteText 文字列 & vbNewLine
Next i
MyStream.SaveToFile "D:\sample.csv", 2 '★上書きOK 規定はNG
MyStream.Close
Set MyStream = Nothing
投稿日時 - 2010-12-01 09:43:38
この回答を支持する
(現在0人が支持しています)
お礼
お礼が遅くなり大変申し訳ありません。
かゆい所に手が届く丁寧なご指導、どうもありがとうございました。

>★パラメータが無いのでエラーになる
>★デフォルトオブジェクトは使用しない方がよい

こういうところは、今回に限らず今後コードを書いていくうえでも役に立つと思います。
意外と入門書にこういうことが書かれていないので助かります。

>文字列 = シート.Cells(i, 1)
>文字列 = Replace(文字列, vbLf, vbNewLine)

実は、UTF-8のCSVとして出力するのでセル内のカンマをHTMLのコードに変改したいのだが、出力元のシートのデータには手を加えずにやるにはどうすればいんだろうと悩んでました。

こういう風に、セル内のデータを一旦変数に入れてからReplaceすればいいですね。
わかってしまえば、今までこれをこれを思い付かなかったのが不思議なくらいですが、初心者ってこういうへんなところでつっかえるんです。またひとつ勉強になりました。

>★上書きOK 規定はNG

これも知らなかったので、既に出力先にファイルがあるかどうか調べるエラー処理を入れてたんですが、上書きOKならそれも不要ですね。参考になります。
投稿日時 - 2010-12-31 20:55:28

ベストアンサー以外の回答 (1)

回答No.1
もしかして ADOに対しての参照設定をなされていないのではありませんか?

参照設定されていないと adTypeTextのような列挙型の定数は定義されていませんので 0になってしまいます

ADODB.Stream.Type は 1 or 2 しか受け付けないので 0だとエラーになると思います

このモジュールの冒頭か標準モジュールの冒頭に
Const adTypeText = 2
を追加してみましょう
投稿日時 - 2010-12-01 02:36:58
この回答を支持する
(現在0人が支持しています)
お礼
お礼が遅くなり大変申し訳ありません。

以前ADODB.Streamを使用した時は、参照設定しなくても実行時に自動で参照にチェックが入ったのですが、今回は数値で「2」としないと動作しなかったようです。なんでこういう差が出るのか、初心者には理解不能です。

とにかく教えていただいた方法で意図したとおりに動作しました。
ありがとうございました。助かりました。
投稿日時 - 2010-12-31 21:01:42
この質問は役に立ちましたか?
2人が「このQ&Aが役に立った」と投票しています
もっと聞いてみる

関連するQ&A

  • question

    ?????? ID&PASSってどうしたらつくれるの? ...

  • question

    ?Facebookって、登録も利用も退会も全部無料ですか? ...

  • question

    ?アンチって何ですか? Youtubeでなんかアンチコメントと一緒に動画というのがありました。 ...

  • question

    That or It?昨日英会話で以下のような会話をしました。 フィットネスクラブについての話です。 私:I u...

  • question

    ?つい最近から、おならがたくさん出る様になってきました。 前までは、そんな事なかったのですが最近...

  • question

    That? They? It?That? They? It?  2~3行文章を書いた後、 That's my true ...

この他の関連するQ&Aをキーワードで探す

別のキーワードで再検索する

関連するガイド記事

    回答募集中

    同じカテゴリの人気Q&Aランキング

    カテゴリ
    Visual Basic
    -PR-

    OKWaveのおすすめ情報

    特集

    このQ&Aの関連キーワード

    同じカテゴリの人気Q&Aランキング

    カテゴリ
    Visual Basic
    -PR-

    ピックアップ

    -PR-
    -PR-