ADODB.Streamを使用してUTF-8を出力

このQ&Aのポイント
  • VBA初心者がExcelのワークシートの値をUTF-8形式のテキスト(.csvで保存します)形式でエクスポートするためのコードを作成しましたが、.Type = adTypeTextの箇所でエラーが発生しています。
  • ADO関係の知識が不足しており、解決策が見つかりません。助言と解説を求めています。
  • Sub exportToCsvのコードでは、指定されたExcelブックとシートの最終行を取得し、ADODB.Streamを作成してUTF-8形式でテキストを書き込みます。しかし、エラーが発生してしまいます。
回答を見る
  • ベストアンサー

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

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

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答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

Kazu_creator
質問者

お礼

お礼が遅くなり大変申し訳ありません。 かゆい所に手が届く丁寧なご指導、どうもありがとうございました。 >★パラメータが無いのでエラーになる >★デフォルトオブジェクトは使用しない方がよい こういうところは、今回に限らず今後コードを書いていくうえでも役に立つと思います。 意外と入門書にこういうことが書かれていないので助かります。 >文字列 = シート.Cells(i, 1) >文字列 = Replace(文字列, vbLf, vbNewLine) 実は、UTF-8のCSVとして出力するのでセル内のカンマをHTMLのコードに変改したいのだが、出力元のシートのデータには手を加えずにやるにはどうすればいんだろうと悩んでました。 こういう風に、セル内のデータを一旦変数に入れてからReplaceすればいいですね。 わかってしまえば、今までこれをこれを思い付かなかったのが不思議なくらいですが、初心者ってこういうへんなところでつっかえるんです。またひとつ勉強になりました。 >★上書きOK 規定はNG これも知らなかったので、既に出力先にファイルがあるかどうか調べるエラー処理を入れてたんですが、上書きOKならそれも不要ですね。参考になります。

その他の回答 (1)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

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

Kazu_creator
質問者

お礼

お礼が遅くなり大変申し訳ありません。 以前ADODB.Streamを使用した時は、参照設定しなくても実行時に自動で参照にチェックが入ったのですが、今回は数値で「2」としないと動作しなかったようです。なんでこういう差が出るのか、初心者には理解不能です。 とにかく教えていただいた方法で意図したとおりに動作しました。 ありがとうございました。助かりました。

関連するQ&A

  • ADODB.Streamを使って新規にファイルを作

    ADODB.Streamを使って新規にファイルを作成することは可能ですか? --------------------------------------------- Sub test1() Dim n As Long n = FreeFile Open "C:\sample.html" For Output As #n Print #n, "テキスト" Close #n End Sub これで、新規にhtmlファイルを作れるのですが --------------------------------------------- Sub test2() Dim st As Object Dim Sample As String Set st = CreateObject("ADODB.Stream") オブジェクトに保存するデータの種類を文字列型に指定する st.Type = adTypeText 文字列型のオブジェクトの文字コードを指定する st.Charset = "UTF-8" st.Open 'オブジェクトのインスタンスを作成 st.WriteText Sample, adWriteLine 'ココでエラー オブジェクトの内容をファイルに保存 st.SaveToFile ("c:\sample.html"), adSaveCreateOverWrite オブジェクトを閉じる st.Close メモリからオブジェクトを削除する Set st = Nothing End Sub --------------------------------------------- この方式で新規にファイルを生成して保存することは可能ですか? 該当部分でエラーが発生します。

  • VBAでUTF-8文字を読込、Excelに出力する方法

    タイトルの通りです。 簡単なプログラムを作ってみました。 このような事は出来ないのでしょうか。 教えてください。 宜しくお願いします。 ☆サンプルプログラム☆    ↓ Sub test() Dim Stm As Object Dim sText As String Const adCRLF = -1 Const adReadAll = -1 Const adTypeText = 1 sText = "あああ" Set Stm = CreateObject("ADODB.Stream") Stm.Open Stm.Charset = "UTF-8" Stm.WriteText sText ActiveSheet.Range("A1").Value = Stm.ReadText() Stm.Close Set Stm = Nothing End Sub

  • VBA UTF-8形式で保存したい

    http://officetanaka.net/excel/vba/file/file11.htm UTF-8形式で保存する方法を参考サイトを見つけました。 Sub Sample1() Dim Target As String Target = "D:\Work\Sample.txt" With CreateObject("ADODB.Stream") .Charset = "UTF-8" .Open .WriteText "田中", 1 .SaveToFile Target, 2 .Close End With End Sub Target = "D:\Work\Sample.txt" といった書き込みのプログラムがあります。下のプログラムとタブってしまいます。 htmlFile = ActiveWorkbook.Path & "\Sample.html" 保存指定が2つあり、どちらかに記述してもパスが違いますとエラーメッセージがでます。 正しいUTF-8形式で保存する方法を教えて下さい。 Sub convertHTML()  Dim ws As Worksheet  Dim htmlFile As String  Dim i As Long  Dim LineData As String    Set ws = ThisWorkbook.Worksheets(1)  htmlFile = ActiveWorkbook.Path & "\Sample.html"  Open htmlFile For Output As #1    i = 1  Do While Not (ws.Cells(i, 1).Value = "" And ws.Cells(i, 2).Value = "" And ws.Cells(i, 3).Value = "")   LineData = "<div>" & ws.Cells(i, 1).Value & "</div>" & vbCrLf   LineData = LineData & "<p>" & ws.Cells(i, 2).Value & "</p>" & vbCrLf   LineData = LineData & "<span>" & ws.Cells(i, 3).Value & "</span>" & vbCrLf   Print #1, LineData   i = i + 1  Loop  Close #1  MsgBox htmlFile & "に書き出しました" End Sub

  • ワークシートをUTF-8のテキストファイルとしてエクスポートする方法

    ワークシートをUTF-8のテキストファイルとしてエクスポートする方法 こんにちは。VBA初心者です。 このサイトで質問しながら、以下のようなコードを書いてみました。 しかし最後の(3)の手順でS-JISになってしまうので、UTF-8で読み込んだ意味がなくなってしまいます。 このページ「http://msdn.microsoft.com/ja-jp/library/cc408235.aspx」を見て、ADODB.StreamのWriteTextを使えばいいのかなとも思いましたが、どうやら違うみたいです(というか使い方がよく理解できないです)。 読み込みから出力までUTF-8で行うにはどうしたらよいでしょうか。 どうかよろしくお願いします。 下記のコードの処理内容: 1)ADODB.Streamを使用してUTF-8のテキストを新規ワークシートにインポート(同時に「//」でコメントアウトされた行を削除 2)ダミー文字挿入()プロシージャで「@:TEXT_」で始まる行以下に2行連続して空行があった場合は、[dummy]という文字列を挿入 3)Openステートメントでテキストファイルを作成し、そこにWriteステートメントでワークシート内のテキストを書き込む Sub test() Dim mystream As Object Dim i As Long Dim tempText As String Dim myFileNo As Integer Const adTypetext As Long = 2 Const adReadLine As Long = -2 Set mystream = CreateObject("ADODB.Stream") With mystream .Type = adTypetext .Charset = "UTF-8" .Open .LoadFromFile ("D:\test\sample.txt") End With Worksheets.Add after:=Worksheets(Worksheets.Count) i = 1 Do Until mystream.EOS Cells(i, 1).Value = mystream.ReadText(adReadLine) If Cells(i, 1).Value Like "//*" Then Cells(i, 1).Delete End If i = i + 1 Loop mystream.Close Set mystream = Nothing Call ダミー文字挿入(i) myFileNo = FreeFile Open "D:\test\sample_02.txt" For Output As #myFileNo For i = 1 To i + 1 Write #myFileNo, Cells(i, 1).Value Next i Close #myFileNo End Sub ============================= Sub ダミー文字挿入(i As Long) Dim myCellUnit(2) As String For i = 1 To i If Cells(i, 1) Like "@:TEXT_*" Then myCellUnit(0) = Cells(i, 1).Value myCellUnit(1) = Cells(i + 1, 1).Value myCellUnit(2) = Cells(i + 2, 1).Value If myCellUnit(1) = "" And myCellUnit(2) = "" Then Cells(i + 1, 1) = "[dummy]" End If End If Next End Sub

  • .Charset = "UTF-8"

    新しいテキスト ドキュメント.txtの中身は、 test テスト なのですが、 その中身をVBAで取得したく、 Sub Sample() Dim strList As String Dim adoSt As New ADODB.Stream Dim WSH As Variant Set WSH = CreateObject("Wscript.Shell") With adoSt .Type = adTypeText .Charset = "UTF-8" .Open .LoadFromFile (WSH.SpecialFolders("Desktop") & "\新しいテキスト ドキュメント.txt") Do While Not (.EOS) strList = .ReadText(adReadLine) Debug.Print strList Loop .Close End With End Sub と言うコードを作ったのですが、 返り値が文字化けしてしまいます。 test ?e?X?g が返ってきます。 .Charset = "UTF-8"が原因なのかもしれませんが ネットからコピペしたコードを使っている為 どのように変えればいいのかわかりません。 ご教授よろしくお願いします。

  • 新規にメモ帳を起動して、「test」と入力したい

    新規にメモ帳を起動して、「test」と入力したいです。そして保存はしたくないです。 Sub Sample() Dim rc As Long rc = Shell("notepad.exe", vbNormalFocus) End Sub これだと、新規にメモ帳は起動できますが、書き込みができません。 Sub Sample2() Dim strList As String Dim adoSt As ADODB.Stream Set adoSt = CreateObject("ADODB.Stream") With adoSt .Type = adTypeText .Charset = "UTF-8" .Open End With adoSt.WriteText "test", adWriteLine adoSt.SaveToFile "c:\test.txt", adSaveCreateOverWrite adoSt.Close Set adoSt = Nothing End Sub これだとメモ帳を作成して書き込めますが、保存されてしまいます。 新規にメモ帳を起動→文字を書き込む までをvbaで行い、その後は×ボタンで消せる状態にしたいのですが、 どうすればいいか教えてください。

  • 文字コードを指定すると文字化けする理由は?

    HTMLのソースが入ったテキストデータをエクセルに書き出したいのですが 文字コードは何を指定すればいいのでしょうか? Sub Sample() Dim i As Long Dim j As Long Dim strList As String Dim strSplit() As String Dim adoSt As New ADODB.Stream i = 1 With adoSt .Type = adTypeText ' .Charset = "UTF-8" ' .Charset = "euc-jp" ' .Charset = "Shift_JIS" .Open .LoadFromFile ("C:\test.html") Workbooks.Add Do While Not (.EOS) strList = .ReadText(adReadLine) strSplit = Split(strList, ",") For j = LBound(strSplit) To UBound(strSplit) Cells(i, j + 1) = strSplit(j) Next i = i + 1 Loop .Close End With End Sub どの文字コードを指定してもエラーになります。 Cells(i, j + 1) = strSplit(j) の部分で、エラーになります。 実際のソースの文字コードはeuc-jpになっています。 なぜソースと同じ文字コードを指定してるのにエラーになるのでしょうか? .Charsetで 文字コードを何も指定しなければ、問題なくソースを書き出せます。

  • エクセルからCSVファイルに出力したい?

    エクセルのシートからマクロを使ってCSVファイルに出力したいです。 そこで調べたのですが、 http://oshiete1.goo.ne.jp/kotaeru.php3?q=2376607 こちらの質問で以下のようなコードが参考になりました。 Sub Macro1() Dim myBook As String myBook = ActiveWorkbook.FullName myBook = Left(myBook, Len(myBook) - 3) & "CSV" ActiveSheet.Copy ActiveWorkbook.SaveAs Filename:=myBook, FileFormat:=xlCSV ActiveWindow.Close False End Sub このコードではCSVのファイル名がエクセルシートのファイル名になってしまいます。 今回の質問ですが、CSVファイルを違う名前で保存するにはどのようにすればいいのでしょうか? (CSVファイルの名前は常にabc.csvで保存するものとします)

  • UTF-8のテキストファイルを開く方法

    UTF-8のテキストファイルを開く方法 こんにちは。VBA初心者です。 FSOを使ってテキストファイルを開いてみたのですが、S-JISで開かれるらしく、文字化けしてしまいました。 そこで、WEBで調べてみると「ADODB.Stream」というものを使用すると、「オブジェクト.Charset = "UTF-8"」のように文字コードを指定できることがわかりました。 しかし、テキストストリームというものがいまいち理解できていないので使い方がよくわかりません。 以下のようなコードを書いてみましたが、「実行時エラー'438' オブジェクトは、このプロパティまたはメソッドをサポートしていません。」となってしまいました。 どこが間違っているのか教えていただけないでしょうか。 ちなみに「Open」ステートメント(Open バス名 For モード As #ファイル番号)を使用してテキストを内部的に開いた場合はどうなるのでしょうか。もし、標準でS-JISだった場合は、UTF-8にする方法はあるのでしょうか。 どうかよろしくお願いします。 Sub UTF8を開く() Dim myADODB As Object Set myADODB = CreateObject("ADODB.Stream") Dim i As Integer Worksheets("sheet1").Activate i = 1 With myADODB .Charset = "UTF-8" .ReadLine ("D:\test\sample.txt") Do Until .AtEndOfStream = True Cells(i, 1).Value = myADODB i = i + 1 Loop .Close End With End Sub

  • 新規テキストファイルを作成して日付名で保存したい。

    すみません誰か、教えて下さい。 新規でテキストファイルを作成して、日付名で保存を しようとしたのですが、ファイル名が不正とのエラーが出ます。 どうすればいいか、教えて頂けませんでしょうか。 また、保存先の指定方法も分かりません。保存先の指定方法も あわせて教えて頂けませんでしょうか。 宜しくお願いします。 Sub 保存() Dim myFileNo As Integer Dim i As Long Dim myLastRow As Long Dim IMA As String IMA = Now & ".txt" Worksheets("内容").Activate myLastRow = Range("A1").CurrentRegion.Rows.Count myFileNo = FreeFile Open IMA For Output As myFileNo For i = 1 To myLastRow Write #myFileNo, Cells(i, 3) Next i Close #myFileNo End Sub

専門家に質問してみよう