プロが教える店舗&オフィスのセキュリティ対策術

1.環境
Microsoft Windows7 64ビット
Microsoft Ofiice2013 Excel2013 32ビット

2.事象
テキストファイルに定義しているUNICODEを読むと文字化け(?)します。
メモ帳等のテキストファイル上はUNICODEを文字化けせずに目視で確認しています。
どうしたら文字化けせずに読めるのでしょうか?
どなたか詳しい方、ご教授願います。

3.テキストファイル(test.dat)


4.VBA
・参照設定([ツール(T)]バー-[参照設定(R)…])
レ Microsoft ActiveX Data Objects 2.8 Library

・ソース
※例どっちでも、文字化けします。
Dim a, b As String
例1)
With CreateObject("ADODB.Stream")
.Charset = "UTF-8"
.Type = adTypeText
.Open
.LoadFromFile "C:\test.dat"
a = .ReadText
.Close
End With

例2)
Open "C:\test.dat" For Input As #1
Do Until EOF(1)
Line Input #1, b
Loop
Close #1

質問者からの補足コメント

  • うーん・・・

    UTF-16LEに変更して実行後、下記のエラーが出ました。
    困っています。
    解消方法を願います。

    ■エラー詳細
    Err.Number:3001
    Err.Description:引数が間違った型、許容範囲外、または競合しています。

    No.1の回答に寄せられた補足コメントです。 補足日時:2016/09/16 11:43
  • どう思う?

    64ビット版の秀丸エディタで、開きました。
    次に[メニュー]バー-[ファイル]-[名前を付けて保存(A)…]
    名前を付けて保存画面
    エンコードの種類(C): [自動判定 - Unicode(UTF-8)] □BOMを付ける(※チェック無)

    No.2の回答に寄せられた補足コメントです。 補足日時:2016/09/16 14:26
  • どう思う?

    Unicode(UTF-8) BOMはグレー表示(BOM無)になっています。
    開いたファイルの内容は、秀丸できちんと表示されています。

    No.3の回答に寄せられた補足コメントです。 補足日時:2016/09/16 15:13
  • うーん・・・

    ソースの提供ありがとうございました。
    下記のようにして参照設定を変更してソース実行をしました。

    まだ、文字化け(?)をします。
    ちなみに試しに①は、文字化け(?)をせずにきちんと表示されました。
    また、Microsoft ActiveX Data Objects 2.8 Libraryに戻して、実行も文字化けしています。
    後、例1の実行も文字化けしています。

    ■参照設定の変更
    ・参照設定([ツール(T)]バー-[参照設定(R)…])
    レ Microsoft ActiveX Data Objects 6.1 Library

    No.5の回答に寄せられた補足コメントです。 補足日時:2016/09/16 16:20
  • うーん・・・

    皆さん、様々な情報ありがとうございます。
    秀丸で❶を改行付き、Unicode16(UTF-16) □BOMを付ける(※チェック有)で保存

    > この文字をexcelのシートに直接出力すれば、きちんと表示されます。
    結果は文字化けです。
    (◆◆の中に(?)v')が見れました。
    > ・読み込んだテキストがどんな文字列になっているか、1文字1文字ascWでコードを調べる
    -3でした。
    > Shift_JISに無い「黒地の丸数字」が変換できずに「文字化け」になっている、というものです。
    と自分も思います。
    書き忘れていたのですが、したい事はExcelVBAを通して別のテキストファイルに❶を出力させる事です。
    今の文字化け状態で別のテキストファイルにそのまま出力で、あるソフト変換にて正しく表示出来ればOKです。
    果たしてそのUnicodeを維持していればいいのですが…

    No.9の回答に寄せられた補足コメントです。 補足日時:2016/09/18 18:13
  • うれしい

    皆さんのアドバイスを元に色々、試しました。
    結果、NGです。
    発想を変えて、入力テキストファイルから出力テキストファイルではなく、シートのセルから出力テキストファイルに変更しました。
    結果、OKです。
    これは、セル自体にUnicodeを対応していると思っています。
    自分だけでは、解決出来ず、皆さんのアドバイズに感謝しています。
    ありがとうございました(__)。

      補足日時:2016/09/22 10:52

A 回答 (14件中11~14件)

> (◆◆の中に(?)v')が見れました。


UTF-16BEをUTF-8で読んでいるように見えます。
> -3でした。
既に文字化けしてU+FFFD Replacement Caracter「�」になっているようですね。
    • good
    • 0

No10です。


>秀丸で❶を改行付き、Unicode16(UTF-16) □BOMを付ける(※チェック有)で保存
上記を見落としていました。
入力ファイルはUTF-8ということのはずですが?
秀丸で❶を改行付き、UTF-8 □BOMを付ける(※チェック有)で保存して再テストしていただけませんか?
念の為、確認しますが、
入力ファイル UTF-8 BOM付き
出力ファイル UTF-8 BOM付き
があなたの望んでいる要件で間違いないでしょうか?
    • good
    • 0

#7の回答者です。



Excel VBAはあくまでも、Excel の中だけの話で、テキストファイルとして出力する場合は、それなりの加工でもするのでしょうか。
何か、前回の別のご質問者さんと同じようなストーリー展開です。

>書き忘れていたのですが、したい事はExcelVBAを通して別のテキストファイルに「❶」を出力させる事です。

Excelのシート上で、Unicode を表示させることなら話は分かるけれども、Excel VBAを媒体にして、単なる入出力だけでは、Excelを使う意味があるとは思えません。全体の中のひとつの問題でしたら、まだまだ、解決はしないはずです。しかし、もしそう状況な、あえてVBAなどは使わないで、&ペーストをしたほうが手っ取り早いし、コピーしてクリップボードまで入れるという、ブログラムにしてもよいと思います。

以下は、全自動化はできませんでしたが、オールラウンド対応です。UTF-8のBOMなしの判定が正しくできません。ほかは大丈夫だと思います。UTF-8のBOMなしは、確率で出すそうですから、コードが長すぎてしまいます。HTMLオブジェクトで文字の判定をさせています。しかし、初めからEncodeをキメウチするなら、数行で済むものです。

コードは、必要に応じて、オブジェクトの解放を加えてください。まあ、ご質問者さんは、こちらの書いているのは読まれていないようでしたら、それならそれで、スルーしても構いません。ひとまず、こちらは、自分自身の問題を解決したので、これで終わりです。


'//

Const MYPATH = "C:\Temp\Test1\"  'プロシージャの中でも構わない
Private Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)
Sub TextImport()
 Dim buf As String, arBuf
 Dim FileName As String
 Dim EncodeType As String
 Dim oHTML, oFile
 Dim i As Long
 Dim ret As VbMsgBoxResult
 Dim objStream As New ADODB.Stream '参照設定のこと
 FileName = MYPATH & "Sample.txt" 'ファイル名
 'エンコード判定
 With CreateObject("Scripting.FileSystemObject")
  Set oFile = .GetFile(FileName)
  Set oHTML = GetObject(oFile.Path, "HTMLfile")
  Sleep 1000
  EncodeType = oHTML.CharSet
 End With
 If EncodeType Like "shift_jis" Then
  ret = MsgBox(EncodeType & ": " & vbCrLf & _
  "目的のテキストファイルが、Shift-JISでない可能性があるなら、" & vbCrLf & _
  "これは、UTF-8 BOMなしファイルであるかもしれません。" & vbCrLf & _
  "UTF-8 で実行しますか?", vbYesNoCancel)
  If ret = vbYes Then
   EncodeType = "UTF-8"
  ElseIf ret = vbCancel Then
   Exit Sub
  End If
 End If

objStream.CharSet = EncodeType
objStream.Open
objStream.LoadFromFile FileName
buf = objStream.ReadText

arBuf = Split(buf, vbCrLf)
For i = 0 To UBound(arBuf)
 Cells(i + 1, 1).Value = arBuf(i)
Next i
End Sub
    • good
    • 0

できないときは、何か肝心なミスを見逃していることがあります。



>セル自体にUnicodeを対応していると思っています。
Excel 2003の頃から、対応はしているのですが、本格的な対応は、
Excel 2013 前後だと思います。新しい文字関数が増えましたからね。

>入力テキストファイルから出力テキストファイル
これは、ADODB.Stream で対応可能なはずです。

しかし、私の経験では、逆に、セルからの出力テキストの場合は、まったくやり方が違う方法を思いつきました。いずれにしても、私の範囲内では、UTF-8とUTF-16 は、共有しませんから、要注意だと思います。思わぬ失敗をしている時があります。

学ばれるのでしたから、以下のサイトがよいです。
NonSoft というサイトです。
http://nonsoft.la.coocan.jp/SoftSample/SampleMod …

私も、それなりに、この問題をそのサイトを中心に格闘した上でのことですが、ただ、こういう話は、どちらかというと、VB6系よりも次の世代の言語のプログラムに任せたほうが早いのです。さしずめ、PowerShellあたりでも対応可能なのですから、本当に、ばかばかしいと思うぐらいに簡単になってしまいました。

それと、ご存知かもしれませんが、有名なUnix系ツールのnkf32 あたりが、巨大ファイルの変換が思うに任せないようです。私の間違いかもしれませんが。それで、試しに、Notepad++ で、あっけなく変換してしまったので、本当に拍子抜けしてしまいました。
    • good
    • 0

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

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