-PR-
Kazu_creator

こんちには。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
  • 回答数2
  • 気になる数0
  • Aみんなの回答(全2件)

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

    • 2010-12-01 09:43:38
    • 回答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
    お礼コメント
    お礼が遅くなり大変申し訳ありません。
    かゆい所に手が届く丁寧なご指導、どうもありがとうございました。

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

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

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

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

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

    >★上書きOK 規定はNG

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

    その他の回答 (全1件)

    • 2010-12-01 02:36:58
    • 回答No.1
    もしかして ADOに対しての参照設定をなされていないのではありませんか? 参照設定されていないと adTypeTextのような列挙型の定数は定義されていませんので 0になってしまいます ADODB.Stream.Type は 1 or 2 しか受け付けないので 0だとエラーになると思います このモジュールの冒頭か標準モジュールの冒頭に Const adTypeText = 2 を追加してみましょう ...続きを読む
    もしかして ADOに対しての参照設定をなされていないのではありませんか?

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

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

    このモジュールの冒頭か標準モジュールの冒頭に
    Const adTypeText = 2
    を追加してみましょう
    お礼コメント
    お礼が遅くなり大変申し訳ありません。

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

    とにかく教えていただいた方法で意図したとおりに動作しました。
    ありがとうございました。助かりました。
    投稿日時 - 2010-12-31 21:01:42
    • ありがとう数0
    • 回答数2
    • 気になる数0
    • ありがとう数3
    • ありがとう
    • なるほど、役に立ったなど
      感じた思いを「ありがとう」で
      伝えてください
    • 質問する
    • 知りたいこと、悩んでいることを
      投稿してみましょう
    こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
    このQ&Aにはまだコメントがありません。
    あなたの思ったこと、知っていることをここにコメントしてみましょう。

    関連するQ&A

    -PR-
    -PR-

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

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

    特集


    成功のポイントとは?M&Aで経営の不安を解決!

    -PR-

    ピックアップ

    -PR-
    ページ先頭へ