アプリ版:「スタンプのみでお礼する」機能のリリースについて

こんちには。VBA初心者です。

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

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

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

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

A 回答 (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
    • good
    • 1
この回答へのお礼

お礼が遅くなり大変申し訳ありません。
かゆい所に手が届く丁寧なご指導、どうもありがとうございました。

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

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

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

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

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

>★上書きOK 規定はNG

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

お礼日時:2010/12/31 20:55

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



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

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

このモジュールの冒頭か標準モジュールの冒頭に
Const adTypeText = 2
を追加してみましょう
    • good
    • 1
この回答へのお礼

お礼が遅くなり大変申し訳ありません。

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

とにかく教えていただいた方法で意図したとおりに動作しました。
ありがとうございました。助かりました。

お礼日時:2010/12/31 21:01

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A