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
No.14ベストアンサー
- 回答日時:
できないときは、何か肝心なミスを見逃していることがあります。
>セル自体にUnicodeを対応していると思っています。
Excel 2003の頃から、対応はしているのですが、本格的な対応は、
Excel 2013 前後だと思います。新しい文字関数が増えましたからね。
>入力テキストファイルから出力テキストファイル
これは、ADODB.Stream で対応可能なはずです。
しかし、私の経験では、逆に、セルからの出力テキストの場合は、まったくやり方が違う方法を思いつきました。いずれにしても、私の範囲内では、UTF-8とUTF-16 は、共有しませんから、要注意だと思います。思わぬ失敗をしている時があります。
学ばれるのでしたから、以下のサイトがよいです。
NonSoft というサイトです。
http://nonsoft.la.coocan.jp/SoftSample/SampleMod …
私も、それなりに、この問題をそのサイトを中心に格闘した上でのことですが、ただ、こういう話は、どちらかというと、VB6系よりも次の世代の言語のプログラムに任せたほうが早いのです。さしずめ、PowerShellあたりでも対応可能なのですから、本当に、ばかばかしいと思うぐらいに簡単になってしまいました。
それと、ご存知かもしれませんが、有名なUnix系ツールのnkf32 あたりが、巨大ファイルの変換が思うに任せないようです。私の間違いかもしれませんが。それで、試しに、Notepad++ で、あっけなく変換してしまったので、本当に拍子抜けしてしまいました。
No.13
- 回答日時:
#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
No.12
- 回答日時:
No10です。
>秀丸で❶を改行付き、Unicode16(UTF-16) □BOMを付ける(※チェック有)で保存
上記を見落としていました。
入力ファイルはUTF-8ということのはずですが?
秀丸で❶を改行付き、UTF-8 □BOMを付ける(※チェック有)で保存して再テストしていただけませんか?
念の為、確認しますが、
入力ファイル UTF-8 BOM付き
出力ファイル UTF-8 BOM付き
があなたの望んでいる要件で間違いないでしょうか?
No.11
- 回答日時:
> (◆◆の中に(?)v')が見れました。
UTF-16BEをUTF-8で読んでいるように見えます。
> -3でした。
既に文字化けしてU+FFFD Replacement Caracter「�」になっているようですね。
No.10
- 回答日時:
No9です。
>結果は文字化けです。
>(◆◆の中に(?)v')が見れました。
うーむ・・・。こちらではきちんと表示されます。
>書き忘れていたのですが、したい事はExcelVBAを通して別のテキストファイルに❶を出力させる事です。
>今の文字化け状態で別のテキストファイルにそのまま出力で、あるソフト変換にて正しく表示出来ればOKです。
以下に示すのが、
入力ファイル:UTF-8(BOM付き)
出力ファイル:UTF-8(BOM付き)
の仕様で、1行単位で入力ファイルを読み込み、1行単位で出力するプログラムです。
これで、入力ファイルと出力ファイルが全く同じであれば、あなたが必要とする要件は満たせると思います。
以下のようになります。
------------------------------------------------------
Option Explicit
Public Sub Macro2()
Call myCopyFile("D:\goo\excel\goo11.txt", "D:\goo\excel\goo11_out.txt")
End Sub
'参照設定でMicrosoft ActiveX Data Objects x.x Library(最新版) にチェックをしておくこと
Public Sub myCopyFile(ByVal infile As String, ByVal outFile As String)
'読み込み用オブジェクト作成
'ファイルを読み込むための変数
Dim line As String
Dim lineNo As Long
'オブジェクトを作成
Dim txt As Object
Set txt = CreateObject("ADODB.Stream")
'オブジェクトに保存するデータの種類を文字列型に指定する
txt.Type = adTypeText
'文字列型のオブジェクトの文字コードを指定する
txt.Charset = "UTF-8"
'オブジェクトのインスタンスを作成
txt.Open
'書き込み用オブジェクト作成
Dim txt2 As Object
Set txt2 = CreateObject("ADODB.Stream")
'オブジェクトに保存するデータの種類を文字列型に指定する
txt2.Type = adTypeText
'文字列型のオブジェクトの文字コードを指定する
txt2.Charset = "UTF-8"
'オブジェクトのインスタンスを作成
txt2.Open
'ファイルからデータを読み込む
txt.LoadFromFile (infile)
lineNo& = 0
'最終行までループする
Do While Not txt.EOS
lineNo = lineNo + 1
'1行を読み取る
line = txt.ReadText(adReadLine)
'1行を書き込み用オブジェクトへ書き込み
txt2.WriteText line, adWriteLine
Loop
'書き込みオブジェクトの内容をファイルに保存
txt2.SaveToFile (outFile), adSaveCreateOverWrite
'オブジェクトを閉じる
txt2.Close
txt.Close
'メモリからオブジェクトを削除する
Set txt2 = Nothing
Set txt = Nothing
MsgBox ("lineNo=" & lineNo&)
End Sub
-----------------------------------------------
入力ファイルと出力ファイルがバイナリレベルで同じであることを
コマンドプロンプトで
fc /b 入力ファイル 出力ファイル
上記コマンドで確認済みです。
テストデータ(goo11.txt)は、下記の2行です。
--------------------
❶
①
--------------------
もし、出力ファイルがBOM無であることを望まれる場合は、ファイルの先頭3バイトを削除する必要があるため、
更に別の処理が必要になります。その場合は、その旨、補足ください。とりあえずは、上記のプログラムで
ファイルが正常にコピーできることを確認していただけますでしょうか。
No.9
- 回答日時:
No6です。
すみません。❶の文字が文字化けのように?で表示され、①はきちんと表示されるということですね。
この理由は、No8の方が言われているとおり、❶はUNICODEにあるが、SHIFT-JISにはないために発生しています。
文字化けが発生しているように見えるのは、メッセージボックス、とかテキストボックスのテキストは、SHIFT-JISで表示しているためです。
VBAは内部の文字をUNICODE16(LE)で保持していますので、内部では文字化けは発生していません。
メッセージボックス、とかテキストボックスに表示したときのみ、?が表示されます。
この文字をexcelのシートに直接出力すれば、きちんと表示されます。
以下のコードを試してください。
---------------------------------------------------
Option Explicit
Public Sub Macro1()
Call myReadFile("D:\goo\excel\goo11.txt")
End Sub
'参照設定でMicrosoft ActiveX Data Objects x.x Library(最新版) にチェックをしておくこと
Public Sub myReadFile(ByVal infile As String)
'読み込み用オブジェクト作成
'ファイルを読み込むための変数
Dim line As String
Dim lineNo As Long
'オブジェクトを作成
Dim txt As Object
Set txt = CreateObject("ADODB.Stream")
'オブジェクトに保存するデータの種類を文字列型に指定する
txt.Type = adTypeText
'文字列型のオブジェクトの文字コードを指定する
txt.Charset = "UTF-8"
'オブジェクトのインスタンスを作成
txt.Open
'ファイルからデータを読み込む
txt.LoadFromFile (infile)
lineNo = 0
'最終行までループする
Do While Not txt.EOS
lineNo = lineNo + 1
'1行を読み取る
line = txt.ReadText(adReadLine)
ThisWorkbook.ActiveSheet.Cells(lineNo, 1).Value = line
Loop
txt.Close
'メモリからオブジェクトを削除する
Set txt = Nothing
MsgBox ("lineNo=" & lineNo)
End Sub
--------------------------------------------------------------------
該当シートのA列の各行に読み込んだ内容が格納され、きちんと表示されます。
No.8
- 回答日時:
小手先だけでやろうとしても、無理が出るものです。
具体的に、どんな化け方しているか、調査しましょう。
「文字化けしている」ということを、どうやって確認しましたか?
質問にあるコードには、ファイルの読み込みしかありません。
これをセルに代入したり、MsgBox等で表示したり、ファイルに書き込んだりしたときに、始めて「文字化けしている」と認識できるはずです。
・ ❶ は文字化けする
・ ① は文字化けしない
だと、考えられるのは、 出力までの間に、どこかで「Shift_JIS(正確にはCP932)」を経由していて、Shift_JISに無い「黒地の丸数字」が変換できずに「文字化け」になっている、というものです。
まず、入力が期待通りなのかを調べましょう
・入力ファイルをバイナリエディタで開いて、どんなバイト列になっているか調べる
・それが想像通りか調べる。
・読み込んだテキストがどんな文字列になっているか、1文字1文字ascWでコードを調べる
No.7
- 回答日時:
アップロードしたつもりでしたが、載っていませんので、ちょっと試してみてください。
[参照設定、Microsoft ActiveX Data Objects 2.8 Library]以下は、LE BE も、両方とも通ります。
UTF-8 は、.Charset = "UTF-8" にしてみてくたざい。
'//
Sub Test1()
Dim iStream As New ADODB.Stream
Const MYPATH = "C:\Temp\Test1\"
With iStream
.Open
.Type = 2
.Charset = "UNICODE"
.LoadFromFile MYPATH & "UTF-16LE_09016.txt"
End With
Dim oStream As New ADODB.Stream
With oStream
.Open
.Type = 2
.Charset = "SHIFT-JIS"
iStream.CopyTo oStream
.SaveToFile MYPATH & "JIS0916_test.txt", 2
iStream.Close
End With
Set iStream = Nothing
oStream.Close
Set oStream = Nothing
End Sub
No.6
- 回答日時:
No5です。
>まだ、文字化け(?)をします。
>ちなみに試しに①は、文字化け(?)をせずにきちんと表示されました。
文字化けを起こすのはデータが原因の可能性がかなり高いです。
文字化けを起こすテキストファイル(test.dat)は、何行程度のデータでしょうか?
私が提供したソースで文字化けを起こすのは、何行目でしょうか。
もし、その行が特定できれば、その行(またはその部分)だけを提示していただければ、こちらでも
参照できるので、何とかなるかも知れません。
以下の何れかの方法が取れれば、進展が望めますが、そうでない場合は、(申し訳ありませんが)
他の回答者(例えば過去に同じような問題に遭遇し、解決したことがある人)の回答を待つ以外に方法はないかと思います。
(1)文字化けを起こすデータをそのファイルのまま公開する。
(2)文字化けを起こす箇所を特定し、その箇所を公開する。
No.5
- 回答日時:
No4です。
あなたの例1のソースをこちらで実行してみました。(適当なUTF-8のテキストファイルを作成し、それを読み込み)
きちんと読み込めています。
こちらの環境は
Windows7 64Bit
Excel2007
Microsoft ActiveX Data Objects 2.8 Library
で、確認しました。
プログラムは正しいように思えます。
データに問題があるように思えますが、もし、(セキュリティ上)可能なら、そのデータを
外部から参照できるようにしていただければ、更に進展があるかもしれません。
もし、それができない場合は、
簡単なUTF-8のファイルを作成し、例1のプログラムでそれを読み込んで確認されてはいかがでしょうか。
そうすれば、すくなくとも、プログラムは正しいということの検証は可能かと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/15 15:48
- Excel(エクセル) マクロでテキストファイルを読み込んだ際の最終セルにデータと改行が含まれる問題の改善方法 2 2022/03/25 16:50
- Ruby パイソンでテキストファイルが読み込めない 1 2022/11/14 16:42
- その他(ソフトウェア) powershell で出力したテキストファイルをvim で開くと文字化け 2 2023/01/11 21:39
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/15 15:12
- C言語・C++・C# VisualStudioのソースコードで漢字を使いたい 4 2022/05/21 10:16
- Visual Basic(VBA) VBAでエクセルをtxtに変換するとエクセルでカンマを含む文字数字がtxtでは「""」付にならないよ 1 2022/08/27 12:17
- Excel(エクセル) 文字化け。メモ帳でUTF-8に変換後、エクセルへ貼り付けたいです。 3 2022/08/14 07:21
このQ&Aを見た人はこんなQ&Aも見ています
-
好きな人を振り向かせるためにしたこと
大好きな人と会話のきっかけを少しでも作りたい、意識してもらいたい…! 振り向かせるためにどんなことをしたことがありますか?
-
ちょっと先の未来クイズ第6問
2025年1月2日と1月3日に行われる、第101回箱根駅伝(東京箱根間往復大学駅伝競走)で、上位3位に入賞するチームはどこでしょう?
-
【お題】逆襲の桃太郎
【大喜利】桃太郎が1回鬼退治に失敗したところから始まる新作昔話「リベンジオブ桃太郎」にはこんなシーンがある
-
【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
「出身中学と出身高校が混ざったような校舎にいる夢を見る」「まぶたがピクピクしてるので鏡で確認しようとしたらピクピクが止まってしまう」など、 これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
-
14歳の自分に衝撃の事実を告げてください
タイムマシンで14歳の自分のところに現れた未来のあなた。 衝撃的な事実を告げて自分に驚かせるとしたら何を告げますか?
-
VBAにて読み込みが出来ない環境依存文字 ㉖ の文字コードを教えて下さい。
Excel(エクセル)
-
UNICODE文字が含まれているかのチェック
Visual Basic(VBA)
-
VBA:ユーザーフォームのマルチページに色を付けたい。
Word(ワード)
-
-
4
VBA、フォルダのパスに環境文字 ㉑ があり、VBAが機能しません。
Android
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・【選手権お題その3】この画像で一言【大喜利】
- ・【お題】逆襲の桃太郎
- ・自分独自の健康法はある?
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・ちょっと先の未来クイズ第6問
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
.txtではなく.logの方が良いの...
-
COPYコマンドで結合すると余計...
-
バッチ処理でファイルの中身を...
-
ファイルの最後に文字列挿入
-
VBAでワークシートを引数として...
-
psqlでエラーログをとりたい
-
コマンドプロンプトでファイル...
-
多数のサブディレクトリ内のフ...
-
バッチファイル 複数ファイル...
-
★★★PowerShellのpatternについ...
-
ファイル内容の修正、行削除に...
-
accessでSQL文を使ってcsvファ...
-
コマンドプロンプトで指定した...
-
forfilesで検索したファイルを...
-
ファイルを処理中に次の処理に...
-
ファイル名の一部をbatで変更し...
-
エクセルの各セルの内容をそれ...
-
【C++】 ファイルの名前を変更...
-
OpenCVの正解生成のcreatesamples
-
実行時にコモンダイアログのフ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッチ処理でファイルの中身を...
-
.txtではなく.logの方が良いの...
-
多数のサブディレクトリ内のフ...
-
VBAでワークシートを引数として...
-
ファイルの最後に文字列挿入
-
COPYコマンドで結合すると余計...
-
拡張子を元に戻す
-
バッチファイル 複数ファイル...
-
forfilesで検索したファイルを...
-
エクセルの各セルの内容をそれ...
-
txtとはWordでなんですか?
-
バッチファイルで文字列削除に...
-
psqlでエラーログをとりたい
-
renameコマンドについて
-
ファイル内容の修正、行削除に...
-
3つ以上のテキストファイルをコ...
-
UWSCでテキストファイルを開い...
-
バッチファイルからVBAに引数を...
-
コマンドプロンプトで指定した...
-
MS-DOSのバッチファイルの中で...
おすすめ情報
UTF-16LEに変更して実行後、下記のエラーが出ました。
困っています。
解消方法を願います。
■エラー詳細
Err.Number:3001
Err.Description:引数が間違った型、許容範囲外、または競合しています。
64ビット版の秀丸エディタで、開きました。
次に[メニュー]バー-[ファイル]-[名前を付けて保存(A)…]
名前を付けて保存画面
エンコードの種類(C): [自動判定 - Unicode(UTF-8)] □BOMを付ける(※チェック無)
Unicode(UTF-8) BOMはグレー表示(BOM無)になっています。
開いたファイルの内容は、秀丸できちんと表示されています。
ソースの提供ありがとうございました。
下記のようにして参照設定を変更してソース実行をしました。
まだ、文字化け(?)をします。
ちなみに試しに①は、文字化け(?)をせずにきちんと表示されました。
また、Microsoft ActiveX Data Objects 2.8 Libraryに戻して、実行も文字化けしています。
後、例1の実行も文字化けしています。
■参照設定の変更
・参照設定([ツール(T)]バー-[参照設定(R)…])
レ Microsoft ActiveX Data Objects 6.1 Library
皆さん、様々な情報ありがとうございます。
秀丸で❶を改行付き、Unicode16(UTF-16) □BOMを付ける(※チェック有)で保存
> この文字をexcelのシートに直接出力すれば、きちんと表示されます。
結果は文字化けです。
(◆◆の中に(?)v')が見れました。
> ・読み込んだテキストがどんな文字列になっているか、1文字1文字ascWでコードを調べる
-3でした。
> Shift_JISに無い「黒地の丸数字」が変換できずに「文字化け」になっている、というものです。
と自分も思います。
書き忘れていたのですが、したい事はExcelVBAを通して別のテキストファイルに❶を出力させる事です。
今の文字化け状態で別のテキストファイルにそのまま出力で、あるソフト変換にて正しく表示出来ればOKです。
果たしてそのUnicodeを維持していればいいのですが…
皆さんのアドバイスを元に色々、試しました。
結果、NGです。
発想を変えて、入力テキストファイルから出力テキストファイルではなく、シートのセルから出力テキストファイルに変更しました。
結果、OKです。
これは、セル自体にUnicodeを対応していると思っています。
自分だけでは、解決出来ず、皆さんのアドバイズに感謝しています。
ありがとうございました(__)。