[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『テキストファイルがUTF-8かはVBAでチェックできますか?』(しらべ)
テキストファイルをEXCELに読み込んで処理する事が時々あります。
たまに文字化けするのでなぜかなと思っていたのですが
FileSystemObject では UTF-16 と Shift_JIS のファイルしか扱えずに
UTF-8 のファイルを読み込むと文字化けすると言う事実を近頃知りました。
調べたADODB.Streamを利用して「UTF-8からShift-JISに変換」のコードを見つけたので
これを利用しようと思っています。
質問ですがターゲットのテキストファイルがUTF-8かはVBAでチェックできますか?
たとえば、ターゲットのテキストファイル「"C:\Users\test\test.txt」だと仮定した場合の
チェック方法を教えてください。
< 使用 Excel:Excel2021、使用 OS:Windows10 >
を参考にしてください。 私も昔、ADODB.Streamの _autodetect_all が役立たずと知って残念に思ったことはあります。 簡単なコードは無いと思いますが、上記サイトで紹介されているものにトライされたらいかがですか?
# 大量の文字コード不明のテキストを相手にしたことがないので、 # (文字コードを表示してくれる)テキストエディターで開いて文字コードを確認するのが簡単だと思っています。
(xyz) 2023/11/11(土) 06:34:58
参考のURLを見てみましたが
Functionの羅列でどのように利用するのか
能力不足で私には理解できませんでした。
よろしければ
ターゲットのテキストファイル「"C:\Users\test\test.txt」だと仮定した場合の
サンプルコードを教えていただけませんか ?
ターゲットファイルのコードは何んであるか判明したい。
(しらべ) 2023/11/11(土) 07:55:38
(1) すべてのコードをそもまま標準モジュールにコピーペイストします。
(2) 最後にある Public Function getLines(filePath As String) As String() に以下のように2行を追加します。
' (前略)
'取得したバイト配列を使用して文字コードの判定を行う Dim charSet As String charSet = JudgeCode(bytCode)
MsgBox charSet '■■追加 '''' Debug.Print charSet '■■追加
Set obj = CreateObject("ADODB.Stream") obj.charSet = charSet
’(後略) (3) そのうえで、以下のように利用します。 Sub test() Dim f As String, s As Variant
f = "C:\Users\test\test.txt"
'fを読み込んで、行ごとの配列を返します。(途中で文字コードを表示します) s = getLines(f)
'sheet1のA1セル以下に読み込みます。 Worksheets("Sheet1").Range("A1").Resize(UBound(s) + 1, 1) = Application.Transpose(s) End Sub
読み込む必要がなければ、最後の一行をコメントにして、配列 s を使わなければいいだけです。 私は提示されたコードの保証はできません。あくまで参考です。
(xyz) 2023/11/11(土) 08:40:33
コードを考えてみましたが
getLine(f)の戻り値が上手くキープできていないので
If getLines(f) = "UTF-8" Then では上手く処理できずにエラーになります。
戻り値をどのようにコードに反映すればいいですか
Sub test()
Dim f As String Dim s As Variant
f = "C:\Users\test\test.txt"
If getLines(f) = "UTF-8" Then Utf8ToSjis (f) 'Convert Utf-8 to Shift_Jis MsgBox "コンバート完了" End If
End Sub (しらべ) 2023/11/11(土) 09:44:02
Sub test()
Dim fm As String Dim s As Variant
fm = "C:\Users\test\test.txt"
'fを読み込んで、行ごとの配列を返します。(途中で文字コードを表示します) Dim obj As Object Set obj = CreateObject("ADODB.Stream")
'まずは判定のためにバイナリモードで取得する Dim bytCode() As Byte With obj .Open .Type = 1 .LoadFromFile (fm) bytCode = .Read .Close End With
'取得したバイト配列を使用して文字コードの判定を行う Dim charSet As String charSet = JudgeCode(bytCode)
'MsgBox charSet '■■追加
If charSet = "UTF-8" Then Call Utf8ToSjis(C:\Users\test\test.txt","C:\Users\test\test_sjis.txt") MsgBox "コンバート完了" End If
End Sub (しらべ) 2023/11/11(土) 10:55:59
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.