[[20231111061227]] 『テキストファイルがUTF-8かはVBAでチェックできま』(しらべ) ページの最後に飛ぶ

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

 

『テキストファイルが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 >


https://vbaexcel.slavesystems.com/vba/?p=1193
 を参考にしてください。
 私も昔、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.