Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


7709 / 13644 ツリー ←次へ | 前へ→

【37342】CSVファイルをUTF-8Nで作成したい みき 06/5/1(月) 11:11 質問[未読]
【37343】Re:CSVファイルをUTF-8Nで作成したい Blue 06/5/1(月) 11:42 回答[未読]
【37344】Re:CSVファイルをUTF-8Nで作成したい みき 06/5/1(月) 13:12 質問[未読]
【37347】Re:CSVファイルをUTF-8Nで作成したい Blue 06/5/1(月) 13:44 発言[未読]
【37354】Re:CSVファイルをUTF-8Nで作成したい みき 06/5/1(月) 16:03 回答[未読]
【37356】Re:CSVファイルをUTF-8Nで作成したい よろずや 06/5/1(月) 16:30 回答[未読]
【37359】Re:CSVファイルをUTF-8Nで作成したい Blue 06/5/1(月) 16:57 発言[未読]
【37361】Re:CSVファイルをUTF-8Nで作成したい みき 06/5/1(月) 17:05 お礼[未読]

【37342】CSVファイルをUTF-8Nで作成したい
質問  みき  - 06/5/1(月) 11:11 -

引用なし
パスワード
   VBA初心者のみきです。
A,B,C列にそれぞれ日本語、英語、中国語のテキスト・データを複数行含むシートをCSVファイルに出力するSubを作成しています。
中国語を含むので、文字コードUTF-8NでCSVファイルを作成したいのですがどのようにしたら良いかご教示お願いします。
以下のようなことは試みてみました。

  Open CSVFile_OUT For Output As #1
  Worksheets("sheet1").Select
  For I = 1 To Cells(Rows.Count, "A").End(xlUp).Row
    WtData = Empty
    For II = 1 To 3
     If InStr(1, Cells(I, II).Value, ",", vbTextCompare) > 0 Then
        WtData = WtData & "," & """" & Cells(I, II).Value & """"   ' カンマがある場合、”を前後に付加
      Else
        WtData = WtData & "," & Cells(I, II).Value
      End If      
    Next
    WtData = StrConv(WtData, vbUnicode)
    Print #1, Mid(WtData, 1)
  Next
  Close #1

ファイル作成後xyzzy editorで開くと@文字が一杯のファイルが作成されてしまいます。xyzzyがUnicodeファイルとして認識してくれないように想像しています。
どこかに根本的な理解不足と勘違いがあるように思います。
宜しくお願い致します。

上記コードは36962の質問に対するJakaさんのお答えを元に作成させて頂いたものです。

【37343】Re:CSVファイルをUTF-8Nで作成したい
回答  Blue  - 06/5/1(月) 11:42 -

引用なし
パスワード
   UTF-8NはBOMなしのUTF-8コードになります。

UTF-8コードのテキストはADODB.Streamオブジェクトを使えば出来ますので、
そこからバイナリモードでファイルを開いてでBOMを削除して再度保存すれば
UTF-8Nコードのテキストが出来ます。

例)
Const adTypeText = 2
Const adTypeBinary = 1
Const adSaveCreateOverWrite = 2 ' adSaveCreateNotExist = 1

Dim bytData() As Byte

With CreateObject("ADODB.Stream")
  .Open
  ' UTF-8に変換
  .Type = adTypeText
  .Charset = "UTF-8"
  .WriteText "ABC"
  .WriteText "あいうえお"
  
  ' 先頭のBOM取り
  .Position = 0
  .Type = adTypeBinary
  .Position = 3
  bytData = .Read
  .Close

  ' UTF-8Nコードのデータを保存
  .Open
  .Type = adTypeBinary
  .Write bytData
  .SaveToFile "任意のファイル名", adSaveCreateOverWrite
  .Close
End With

【37344】Re:CSVファイルをUTF-8Nで作成したい
質問  みき  - 06/5/1(月) 13:12 -

引用なし
パスワード
   ▼Blue さん:
早速のご教示ありがとうございます。
BOMの削除方法等素人には勉強になることが多く早速活用させて頂きます。

先程の質問の内容にもう一つ初歩の初歩の質問があります。
それは、頂いたサンプルに以下を追加しました。
.WriteText "あいうえお"
.WriteText "正常?束"  <--追加行
既に文字化けして見えます。
「正常?束」は、EXCELシート上では文字化けをしていない簡体字で、
ダブルコーテーションの間にコピー&ペーストをして追加行を作りました。
また、xyzzyで確認する為にBOMを削除しないようにして(.position=3を0)
実行しました。
しかし、xyzzy上で開いた結果、「正常?束」と?マークがでて文字化けの状態(期待した簡体字ではない)です。
どのようにしたら期待した簡体字を正しく見ることが出来るのでしょうか?

何か基本的な点を理解していないような気もして、
1)コピー&ペーストの時にコード変換がなされてしまっうのか?
2)出力するテキストに貼り付ける(wkText = Cells(n, m).Value)時に、
何か考慮しなけらばならないのか?
のような、中国語を扱うときに理解していなければならない点がありましたらご教示お願い致します。


>UTF-8NはBOMなしのUTF-8コードになります。
>
>UTF-8コードのテキストはADODB.Streamオブジェクトを使えば出来ますので、
>そこからバイナリモードでファイルを開いてでBOMを削除して再度保存すれば
>UTF-8Nコードのテキストが出来ます。
>
>例)
>Const adTypeText = 2
>Const adTypeBinary = 1
>Const adSaveCreateOverWrite = 2 ' adSaveCreateNotExist = 1
>
>Dim bytData() As Byte
>
>With CreateObject("ADODB.Stream")
>  .Open
>  ' UTF-8に変換
>  .Type = adTypeText
>  .Charset = "UTF-8"
>  .WriteText "ABC"
>  .WriteText "あいうえお"
>  
>  ' 先頭のBOM取り
>  .Position = 0
>  .Type = adTypeBinary
>  .Position = 3
>  bytData = .Read
>  .Close
>
>  ' UTF-8Nコードのデータを保存
>  .Open
>  .Type = adTypeBinary
>  .Write bytData
>  .SaveToFile "任意のファイル名", adSaveCreateOverWrite
>  .Close
>End With

【37347】Re:CSVファイルをUTF-8Nで作成したい
発言  Blue  - 06/5/1(月) 13:44 -

引用なし
パスワード
   うーん。フォント(?)が関係しているのかも。
中国語の文字をExcelで表示したことないからわかりませんけど、
Excel上ではなにか、表示するのに上手いこと出来ているのかも。

ちなみに、VBAでのString型はUTF-16で表しているのでそこらへんどうなる
のかよくわかりません。

いちおう、テキストエディタではなく、バイナリエディタで開いてみて、
(中国語の)文字コードがあっているか確認してみてはどうでしょうか?

【37354】Re:CSVファイルをUTF-8Nで作成したい
回答  みき  - 06/5/1(月) 16:03 -

引用なし
パスワード
   ▼Blue さん:
早速、バイナリエディタをダウンロードして確認してみました。
「正常?束」に関しては、?の部分だけ1バイトのX'3F'に変わってしまっています。ただし、それ以外の3漢字はJIS第一水準漢字の文字コード表のUTF-8コードに合致しています。
何か手掛かりになるような事がありましたらご教示下さいませ。

>うーん。フォント(?)が関係しているのかも。
>中国語の文字をExcelで表示したことないからわかりませんけど、
>Excel上ではなにか、表示するのに上手いこと出来ているのかも。
>
>ちなみに、VBAでのString型はUTF-16で表しているのでそこらへんどうなる
>のかよくわかりません。
>
>いちおう、テキストエディタではなく、バイナリエディタで開いてみて、
>(中国語の)文字コードがあっているか確認してみてはどうでしょうか?

【37356】Re:CSVファイルをUTF-8Nで作成したい
回答  よろずや  - 06/5/1(月) 16:30 -

引用なし
パスワード
   ▼みき さん:
>▼Blue さん:
>早速、バイナリエディタをダウンロードして確認してみました。
>「正常?束」に関しては、?の部分だけ1バイトのX'3F'に変わってしまっています。ただし、それ以外の3漢字はJIS第一水準漢字の文字コード表のUTF-8コードに合致しています。
>何か手掛かりになるような事がありましたらご教示下さいませ。

VBE(エディタ)はUnicodeに対応してないようですので、Unicode文字列を直接
書いても駄目なようですね。
ChrW関数を使って文字コードを書くしかなさそう。

【37359】Re:CSVファイルをUTF-8Nで作成したい
発言  Blue  - 06/5/1(月) 16:57 -

引用なし
パスワード
   あれ?VBEに直書きしているんですか?
てっきりExcelのセルから取得しているものかとおもいました。

【37361】Re:CSVファイルをUTF-8Nで作成したい
お礼  みき  - 06/5/1(月) 17:05 -

引用なし
パスワード
   ▼よろずや さん:
よろずやさん、Blueさん
ご指導ありがとうございます。
お陰様で解決しました。

VBA Editorにコピー&ペーストなどせずに直接Range("C01").valueでセットしたら
文字化けせずに出てくるようになりました。

.WriteText Range("C01").Value

手抜きをせずに行えば、お二人の時間を浪費させずに解決したものをと反省しています。
本当に助かりました。お二人に、感謝・感謝です。

>▼みき さん:
>>▼Blue さん:
>>早速、バイナリエディタをダウンロードして確認してみました。
>>「正常?束」に関しては、?の部分だけ1バイトのX'3F'に変わってしまっています。ただし、それ以外の3漢字はJIS第一水準漢字の文字コード表のUTF-8コードに合致しています。
>>何か手掛かりになるような事がありましたらご教示下さいませ。
>
>VBE(エディタ)はUnicodeに対応してないようですので、Unicode文字列を直接
>書いても駄目なようですね。
>ChrW関数を使って文字コードを書くしかなさそう。

7709 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free