総ありがとう数 累計4,285万(2014年10月26日現在)

毎月4,000万人が利用!Q&Aでみんなで助け合い!

-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(0-0)
  • ありがとう数0

その他の回答 (全1件)

  • 2010-12-01 02:36:58
  • 回答No.1
もしかして ADOに対しての参照設定をなされていないのではありませんか?

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

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

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

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

とにかく教えていただいた方法で意図したとおりに動作しました。
ありがとうございました。助かりました。
投稿日時 - 2010-12-31 21:01:42
通報する
  • 同意数0(0-0)
  • ありがとう数0
  • 回答数2
  • 気になる数0
  • ありがとう数3
  • ありがとう
  • なるほど、役に立ったなど
    感じた思いを「ありがとう」で
    伝えてください

関連するQ&A

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

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

あなたの悩みをみんなに解決してもらいましょう

  • 質問する
  • 知りたいこと、悩んでいることを
    投稿してみましょう
-PR-
-PR-
-PR-

特集

専門医・味村先生からのアドバイスは必見です!

関連するQ&A

-PR-

ピックアップ

  • easy daisy部屋探し・家選びのヒントがいっぱい!

-PR-
ページ先頭へ