次の方法で共有


VBAでBOMの有り/無しを判定したい

質問

2022年5月6日金曜日 0:29

表記のとおり、
テキストファイルの文字コードがUTF-8の時に
『UTF-8』なのか、『UTF-8(BOM付き)』なのかを判定したいです。

https://replication.hatenablog.com/entry/20080229/1204386249
に参考になるコードがあり、見よう見まねで
後記コードとしてみましたが

変数a,b,cともNullになってしまうらしく、
『UTF-8(BOM付き)』のファイルでもfalseが返ってきてしまいます。
どのようなコードにすればいいでしょうか?

Public Function isBom(filePath As String) As Boolean

 Dim Data

 isBom = False

 With CreateObject("ADODB.Stream")
  .Open
  .Type = 1
  .LoadFromFile filePath
  Data = .Read
  .Close
 End With

 Dim a: Hex (AscB(MidB(Data, 1, 1)))
 Dim b: Hex (AscB(MidB(Data, 2, 1)))
 Dim c: Hex (AscB(MidB(Data, 3, 1)))

 If (a = "FE" And b = "FF") Or _
   (a = "FF" And b = "FE") Then
   isBom = True   'UTF-16のBOMあり
 End If

 If a = "EF" And b = "BB" And c = "BF" Then
  isBom = True   'UTF-8のBOMあり
 End If

End Function

なお、環境は Windows10、Office2019です。

すべての返信 (2)

2022年5月6日金曜日 1:26 ✅回答済み

Dim a: Hex (AscB(MidB(Data, 1, 1)))
Dim b: Hex (AscB(MidB(Data, 2, 1)))
Dim c: Hex (AscB(MidB(Data, 3, 1)))

コロン(:)を使うのは、2行以上の内容を1行にまとめて書いてしまう方法です。
つまり

Dim a
Hex (AscB(MidB(Data, 1, 1)))
Dim b
Hex (AscB(MidB(Data, 2, 1)))
Dim c
Hex (AscB(MidB(Data, 3, 1)))

と同じ意味になります。
つまり上記のコードではHexの結果は変数a,b,cに代入されていないことになりNothingになります。

ですから、代入をするように修正する必要があります

Dim a
a = Hex(AscB(MidB(Data, 1, 1)))
Dim b
b = Hex(AscB(MidB(Data, 2, 1)))
Dim c
c = Hex(AscB(MidB(Data, 3, 1)))

あるいは1行にまとめたい場合なら

Dim a: a = Hex(AscB(MidB(Data, 1, 1)))
Dim b: b = Hex(AscB(MidB(Data, 2, 1)))
Dim c: c = Hex(AscB(MidB(Data, 3, 1)))

個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)


2022年5月6日金曜日 1:35

ありがとうございます。

期待通り動作しました。

今後もよろしくお願いいたします。