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

このQ&Aのポイント
  • VBA初心者がワークシートをUTF-8のテキストファイルとしてエクスポートする方法を知りたい。
  • 現在のコードではS-JISになってしまうため、UTF-8で読み込んだ意味がなくなってしまう。
  • ADODB.StreamのWriteTextを使ってもうまくいかない。どうしたらUTF-8で行えるか知りたい。
回答を見る
  • ベストアンサー

ワークシートを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

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

  • ベストアンサー
  • crossgate
  • ベストアンサー率65% (78/119)
回答No.1

「Call ダミー文字挿入(i)」と最初の「End Sub」の間を完全にこれに差し替える感じで。 ---------------------------------------------------------------------- Dim val As Variant Dim bytData() As Byte For i = 1 To i + 1 val = val & Cells(i, 1).Value & vbLf Next i Set mystream = CreateObject("ADODB.Stream") mystream.Type = adTypetext mystream.Charset = "UTF-8" mystream.Open mystream.WriteText val 'BOM取り mystream.Position = 0 mystream.Type = adTypeBinary 'mystream.Position = 3 bytData = mystream.Read mystream.Close '再オープン mystream.Open mystream.Type = adTypeBinary mystream.Write bytData '書き込み mystream.SaveToFile "D:\test\sample_02.txt", adSaveCreateOverWrite mystream.Close Set mystream = Nothing

Kazu_creator
質問者

お礼

お礼が遅くなり大変申し訳ありません。 お陰さまで、ADO関係の技術も何とか(少しずつ)使えるようになってきました。 ありがとうございました。

関連するQ&A

  • 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

  • (VBA )UTF-8(bom無)でテキスト書き出

    (VBA )UTF-8(bomu無し)でテキストファイルに書き出す 下記記マクロを使ってテキストファイルに書き出すとShift-JISになるようです。  下記コードを修正するとどのようになりますか ? ------------------------------------------------------------------ 'Chapterシートをテキストファイルへ書き出す Open "C:\Users\NOBU\Desktop\chap_Output.txt" For Output As #1 EndLow = WS2.Cells(Rows.Count, "A").End(xlUp).Row For I = 1 To EndLow Print #1, WS2.Cells(I, "A").Value Next Close #1 ------------------------------------------------------------------ 途中結果です。 UTF-8(BOM有)での書き出す方法はネットで探して  下記コードでうまく書き出し出来たのですが(BOM無し)の方法が良く分かりません。 以下が参考になりそうですが、修正の参考になりませんか ? http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_110_065.html ------------------------------------------------------------------------ 'ADODB.Streamオブジェクトを生成 Set ado = CreateObject("ADODB.Stream") 'ADODB.Streamで扱う文字コードを設定する ado.Charset = "UTF-8" 'ADODB.Streamを開く ado.Open '開いたADODB.Streamに内容を保管する 'adWriteLineは改行する時に入れる For I = 1 To EndLow ado.WriteText WS2.Cells(I, "A").Value, adWriteLine Next 'ADODB.Streamに保管されている内容をファイルに保存する ado.SaveToFile "C:\Users\Nubo\Desktop\chap_Output.txt", 2 'ADODB.Streamを閉じる ado.Close '終わったのが分かるようにメッセージを出す MsgBox "完了!" Set ado = Nothing End Sub

  • インデックスが有効範囲に出ないと出る

    下記のようなVBAを書きました。しかしインデックスが有効範囲にないとメッセージがでるのですが、どこがまちがっているでしょうか?? Sub macro1() Dim i As Long Dim r As Long Worksheets("フェアリスト ").Select Worksheets("csv").Range("A:C").ClearContents For i = 2 To 50 Step 5 If Worksheets("フェアリスト").Cells(11, i + 1) <> "" Then r = Worksheets("フェアリスト").Cells(65536, i + 1).End(xlUp).Row Worksheets("フェアリスト").Range(Cells(11, i), Cells(r, i + 3)).Copy _ Destination:=Worksheets("csv").Range("B65536").End(xlUp).Offset(1) Worksheets("csv").Range("A65536").End(xlUp).Offset(1).Resize(r - 3, 1).Value = Worksheets("フェアリスト").Cells(8, i).Value End If Next i Worksheets("csv").Range("A1:C1").Delete shift:=xlShiftUp End Sub

  • Excelのワークシートでのコンボボックスについて

    Excelのワークシートでコンボボックスを設定する方法を教えてください。 「フォームコントロール」と「ActiveXコントロール」の違いがわかりません。 添付の画像の通りコンボボックスに西暦を入力(別シートに入力済みの値を表示するように設定)してあるのですが、ファイルを保存しているにも関わらず、再度ファイルを開くとコンボボックスの中のリストは空欄になってしまいます。 今は「ActiveXコントロール」のコンボボックスで設定しています。 コードは以下のように設定してみたのですが、設定内容や設定箇所が違うのでしょうか? ////////////////////////////////////////////////////// Private Sub ComboBox1_DropButtonClick() Dim sh As Worksheet Set sh = Worksheets("マクロ") Dim i As Integer Dim lastRow As Integer lastRow = sh.Cells(Rows.Count, 1).End(xlUp).Row With ComboBox1 For i = 2 To lastRow If ComboBox1 = "" Then .AddItem sh.Cells(i, 1).Value End If Next i End With End Sub ////////////////////////////////////////////////////// コンボボックスのリストの内容が消えてしまうので、 コードの内容は同じで以下のところにもコードを書いてみました。 ////////////////////////////////////////////////////// Private Sub Worksheet_Activate() Dim sh As Worksheet Set sh = Worksheets("マクロ") Dim i As Integer Dim lastRow As Integer lastRow = sh.Cells(Rows.Count, 1).End(xlUp).Row With ComboBox1 For i = 2 To lastRow If ComboBox1 = "" Then .AddItem sh.Cells(i, 1).Value End If Next i End With End Sub ////////////////////////////////////////////////////// なんだかもう、訳がわからずぐちゃぐちゃです。 コンボボックスの中に値が入っていると、実行ボタンをクリックしたときは正常にやりたい結果を出すことが実現できます。 ファイルを閉じた後に再度開いてもコンボボックスの中に値があるようにするにはどうしたらよいのか、ド素人の私にご教授いただきたくお願いいたします。

  • Excel VBA; 複数のループ処理

    ↓のようなコードがあります。 Dim i As Long, MaxRow1 As Long, MaxRow2 As Long MaxRow1 = Worksheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row MaxRow2 = Worksheets("Sheet2").Cells(Rows.Count, 1).End(xlUp).Row For i = 1 To MaxRow1 Worksheets("Sheet1").Cells(i, 1).Value = i . Next i For i = 1 To MaxRow2 Worksheets("Sheet2").Cells(i, 1).Value = i . Next i これらを最大行の多いシートに合わせて、パフォーマンスを良くしたいと思います。 同様の処理をシート1、シート2で実施しているので纏めて記述したいです。 シート1、シート2に対する処理をサブルーチンにする方法しかありませんか? どなたかお願いします。 If MaxRow1 >= MaxRow2 Then For i = 1 To MaxRow1 Else For i = 1 To MaxRow2 End If Worksheets("Sheet1").Cells(i, 1).Value = i Worksheets("Sheet2").Cells(i, 1).Value = i . Next i

  • 新規にメモ帳を起動して、「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で行い、その後は×ボタンで消せる状態にしたいのですが、 どうすればいいか教えてください。

  • 特定の文字以外を入力すると別シートに表記する方法

    Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) Dim StrRow As Long Dim TgtCol As Long Dim MaxRow As Long Dim ChgRow As Long Dim PutSh1 As Worksheet Dim PutSh2 As Worksheet Dim PutSh3 As Worksheet Dim PutCol As Long Dim PutRow As Long Dim ChgRng1 As Range Dim ChgRng2 As Range Dim ChgRng3 As Range StrRow = 5 MaxRow = 35 If Target.Count > 1 Then Exit Sub If Target.Value = "" Then Exit Sub Set PutSh1 = ThisWorkbook.Sheets("Sheet2") Set PutSh2 = ThisWorkbook.Sheets("Sheet3") Set PutSh3 = ThisWorkbook.Sheets("Sheet4") With ThisWorkbook.Sheets("Sheet1") Set ChgRng1 = Range(.Cells(StrRow, 3), .Cells(MaxRow, 3)) 'C列 Set ChgRng2 = Range(.Cells(StrRow, 5), .Cells(MaxRow, 5)) 'E列 Set ChgRng3 = Range(.Cells(StrRow, 7), .Cells(MaxRow, 7)) 'G列 End With ChgRow = Target.Row If Not Intersect(Target, ChgRng1) Is Nothing Then Target.Offset(0, -1).Value = Target.Offset(0, -1).Value + 1 DataPut PutSh1, ChgRow, Target.Value End If If Not Intersect(Target, ChgRng2) Is Nothing Then Target.Offset(0, -1).Value = Target.Offset(0, -1).Value + 1 DataPut PutSh2, ChgRow, Target.Value End If If Not Intersect(Target, ChgRng3) Is Nothing Then Target.Offset(0, -1).Value = Target.Offset(0, -1).Value + 1 DataPut PutSh3, ChgRow, Target.Value End If End Sub 以前質問させて頂いた内容で追加の質問です。 Sheet1の指定したセルに「ー(ハイフン)」の文字がある時は、Sheet2〜4に転送(表記)しない方法を追加する場合はどの様にすれば宜しいでしょうか?

  • エラー Nextに対するForがありませんについて

    VBAに慣れていないのですが、下記のマクロを組んでみました。 実行すると、コンパイルエラー Nextに対するForがありませんと出てしまいました。 原因が良く解らないので解る方いらっしゃいましたら教えてください。 それと、もっと良い書き方などありましたらアドバイスを下さい。 よろしくお願いします。 Sub レポート作成2each() Dim ReportMaxRow As Long '上方向に最終行を検索し行番号を格納 Dim AddWsName As String 'シート名格納 Dim Ws As Worksheet 'オブジェクト格納 Dim i As Long '繰り返しのカウントを格納 Dim flag As Boolean '真偽 ReportMaxRow = Worksheets("レポート元").Cells(Rows.Count, 1).End(xlUp).Row For i = 2 To ReportMaxRow If Cells(i, "N").Value <> "" Then If Cells(i, "O").Value <> "" Then AddWsName = Cells(i, "K").Value For Each Ws In Worksheets If Ws = AddWsName Then flag = True Next Ws   ←ここでエラーになります。 If flag = True Then Worksheets("レポート元").Cells(i, 1).EntireRow.Copy _ Destination:=Worksheets(AddWsName).Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) Else Worksheets.Add ActiveWorksheet.Name = AddWsName Worksheets("レポート元").Cells(i, 1).EntireRow.Copy _ Destination:=Worksheets(AddWsName).Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) End If MsgBox i + "行目の発注数の入力がませんでした。" & vbNewLine & "処理を中断します, _ vbOKOnly + vbExclamation, "お知らせ" End If Else MsgBox i + "行目の発注数の入力がませんでした。" & vbNewLine & "処理を中断します", _ vbOKOnly + vbExclamation, "お知らせ" End If Next i 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

  • 【Excel VBA】データ貼り付けの開始位置について

    Excel2003を使用しています。 先日、こちらでアドバイスをいただきながら、下記のようなマクロを作りました。内容はあるセルの値と同じ名前のシートへデータをコピーするというものです。 Sheet1に貼り付け元のデータが表形式であり、必要なデータのみ該当のシートへコピーします。マクロ実行後は、別の新しいデータをSheet1へコピペして、またマクロを実行するのですが、その際、データの貼り付け開始位置を前回マクロを実行して貼り付けられたデータから2行空けたいのですが、可能でしょうか? ________________________________________________________________________________________________________________________________ Sub test3() Dim n As Long Dim i As Long Dim j As Long  Worksheets("Sheet1").Activate   For n = 4 To Cells(Rows.Count, 2).End(xlUp).Row    If Cells(n, 3).Value <> "" Then     With Worksheets(CStr(Cells(n, 3).Value))       i = .Cells(Rows.Count, 3).End(xlUp).Row + 1       Cells(n, 2).Copy .Cells(i, 2)       Cells(n, 7).Resize(, 2).Copy .Cells(i, 4)       Cells(n, 11).Copy .Cells(i, 3)     End With    End If    If Cells(n, 13).Value <> "" Then     With Worksheets(CStr(Cells(n, 13).Value))       j = .Cells(Rows.Count, 3).End(xlUp).Row + 1       Cells(n, 12).Copy .Cells(j, 2)       Cells(n, 17).Copy .Cells(j, 4)       Cells(n, 18).Copy .Cells(j, 6)       Cells(n, 11).Copy .Cells(j, 3)     End With    End If   Next n End Sub

専門家に質問してみよう