[[20080901165251]] 『VBAで文字コードの置換』(sato) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『VBAで文字コードの置換』(sato)
 よそからCSVで送られてくるデータがあります。
 その中に一見、−(ハイフン)のように見えますが、別物のデータが混ざっています。
 =CODE( )で見ると 63 となりますが、 =CHAR(63)は ? になります。

 これを加工して別のCSVファイルで出力する必要があるんですが、
 このまま出力すると、−の部分が?になってしまいます。

 そこで出力前にVBAで一定の範囲のデータの中から CODE( ) が63の文字を検索し、
 CHAR(45)の文字に置換したいのですが、いい方法はありませんでしょうか。

 置換前の文字列 =CHAR(63)
 置換後の文字列 =CHAR(45)
 みたいなイメージですが、もちろん置換ではこんなことはできません。

 ちなみに − の文字は文字列の何文字目にあるかは決まっていませんし、
 また、ない場合もあります。
 - - - - - - - - - - 
 すみません、コードの数字が違っていたので訂正しました。


 これでどうでしょうか?

 Selection.Replace What:="~" & Chr(63), Replacement:=Chr(45)

 置換で、検索する文字列 ~?
         置換後の文字列 -     としているのと同じです。
 
(純丸)(o^-')b

 >よそからCSVで送られてくるデータがあります。

 これ、Unicodeで作成されたファイルではないですか?

 >その中に一見、−(ハイフン)のように見えますが、別物のデータが混ざっています。
 この−(ハイフン)のように見える文字が特定できないので同じような現象を再現することを考えます。

 新規ブックの標準モジュールに

 '==============================================================================
 Sub Unicodeで書き込み()
   With CreateObject("scripting.filesystemobject")
      With .CreateTextFile(ThisWorkbook.Path & "\sample.csv", , True)
         .writeline "AAAAA" & ChrW(&H2713) & "BBBBB"
         .Close
         End With
      End With
 End Sub

 として、一度このブックを適当なフォルダに保存した後
(必ず保存すること、仮にこのVBAを含んだブックをVBAbk.xlsとしましょう)に
 上記のコード「Unicodeで書き込み」を実行してみてください。
 VBAbk.xlsと同じフォルダ上にsample.cvsが作成されますから、
 Excelの「ファイル」---「開く」とクリックして、sample.csvを読み込んでください。

 尚、読み込み時に「テキストファイルウイザード」が起動されますが、
 完了をクリックしてください。

 セルA1に AAAAAレBBBBB (実際のレは、カタカナのレではなく、チェックボックス等に付くチェック)

 と表示されていませんか?このレは、Unicodeのみにある文字でJisコードにはありません。

 よって、セルA2に =CODE(MID(A1,6,1)) とするとおなじみの 63 が返りますが、
 実際のコードは、10003です(char(10003)では、表示されせんよ)。

 セルA2の数式は、削除した後、このsample.csvをsmp.csvという名前でcsvファイルとして
 保存してください。

 一旦、smp.csvを閉じた後、再度開いてみてください。今度は、セルA1には、

 AAAAA?BBBBB  と表示されませんか?

 satoさんの御質問の現象も対象文字が違うだけでこの現象と同じなのではないですか?

 同じ現象だとしたら、sample.csvとsmp.csvで変わったのは、?に変換されたレ点だけでなく、
 AAAAA やBBBBBもExcelからは、同じAであり、Bに見えますが、ファイル内のコードは、
 sample.csv とsmp.csvは、全ての文字が違います。
 (sample.csvはUnicodeで作成されたファイルであり、smp.csvは、Shift-JISで作成されたファイルです)

 バイナリエディタ(フリーでDL可能)で二つのファイルの中を覗いてみると、
 違いがはっきりします。

 この違いは承知されていて、それでも?を-に変換すればよいというなら、
 上記の例では、ExcelでCSVファイルとして保存したsmp.csvというファイルを開いて、
 純丸さんの手法で変換すればよいでしょう。

 もし、加工後もUnicodeとして保存したいなら、別の方法を考えなければなりませんよ!!

 ichinose@昨日から、気になってた質問なんだけど、福田が辞めるって言うから・・・


 codeのことまではまったく頭にありませんでした。 
 くわしいフォローをありがとうございます。
 勉強になりました。
 
(純丸)(o^-')b

 時間がかかりそうなので、とりあえず途中報告。
 >これ、Unicodeで作成されたファイルではないですか?

 恐らくそうだと思います。
 ある大きな会社のシステムで作ったデータを、「CSVファイルで渡します」といわれて
 もらったものです。 Unicode とかその辺りは詳しくは分かりませんが。

 純丸さんのコードは、相手からもらったデータを開いてエクセルに貼り付けて実行しても
 期待通りにはなりませんでした。

 しかし、ichinoseさんのアドバイスのとおり、相手からもらったファイルを開き、
 一度エクセルでCSVファイルとして保存したものをもう一度開き、
 純丸さんのコードを実行するとうまくいきそうです。

 そのへんをうまくマクロに組み込めば期待通りのことができそうです。
 お二方にはどうもありがとうございました。
 いずれ、また最終の報告をさせていただきます。
 (sato)


 上記の手順をマクロに組み込んで、うまくいきました。
 >この違いは承知されていて、それでも?を-に変換すればよいというなら
 もともと−以外はうまく変換されていたので、大丈夫だと思います。

 純丸さん、ichinoseさん、どうもありがとうございました。
 (sato)


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.