• ベストアンサー

エクセルでメールヘッダーを解析したい(2)

エクセルVBAで ISO-2022-JP の16進表記  dim s1 as string  s1 = "1B24422422242424262428242A233123322333233423351B284A" という値を保持しています。 これを msgbox 関数 で  あいうえお12345 と表示するように変換したいのですが,うまくいきません。 また,UTF-8 の16進数表記  dim s2 as string  s2 = "41E383A9E382A4E38396E38381E383A3E38383E38388E3839DE382A4E383B3E38388E38397E383ACE382BCE383B3" という値を,同様に msgbox 関数 で  Aライブチャットポイントプレゼン と表示するように変換したいのですが,まったく歯が立ちません。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • hotosys
  • ベストアンサー率67% (97/143)
回答No.5

utf-8からならsystem.text.UTF8Encodingでdecodeできるみたいです。 Sub test() Dim s As String s = "41E383A9E382A4E38396E38381E383A3E38383E38388E3839DE382A4E383B3E38388E38397E383ACE382BCE383B3" MsgBox (CreateObject("System.Text.UTF8Encoding").GetString(hexStr2bytes(s))) End Sub とりあえずadodb.streamの場合。 Sub test1() Dim s As String s = "1B24422422242424262428242A233123322333233423351B284A" MsgBox decode2str(hexStr2bytes(s), "iso-2022-jp") End Sub Sub test2() Dim s As String s = "41E383A9E382A4E38396E38381E383A3E38383E38388E3839DE382A4E383B3E38388E38397E383ACE382BCE383B3" MsgBox decode2str(hexStr2bytes(s), "utf-8") End Sub 'Hex文字列をbyte配列へ Private Function hexStr2bytes(ByVal hexStr As String) As Byte() Dim dst As String Dim i As Integer For i = 1 To Len(hexStr) Step 2 dst = dst & ChrB("&H" + Mid(hexStr, i, 2)) Next hexStr2bytes = dst End Function 'byte配列をUNICODEに変換する Private Function decode2str(bytes() As Byte, codeset As String) As String With CreateObject("ADODB.Stream") .Open .Type = 1 'adTypeBinary .Write bytes .Position = 0 .Type = 2 'adTypeText .Charset = codeset decode2str = .ReadText() .Close End With End Function

QZE00555
質問者

お礼

ありがとうございます。ズバリ解決した瞬間は,「うおー」と叫んでしまいました。本当にありがとうございます。

その他の回答 (4)

noname#259269
noname#259269
回答No.4

No.1に対する返信です。 Express Edition だと少し手間が増えますし、動作環境には .NET Framework2.0 以上のインストールが必要です。COM としての登録も必要です。それでもこの道を歩むのでしたら(笑)、以下を参照してみてください。解説すると長くなるので最小限の事だけ書きます。 1.まず、新規のプロジェクトを作成。種類はクラスライブラリ。 2.クラスを後述のソースのように記述。 3.xxxxxとかyyyyyとかzzzzzzの部分は、GUIDGen.exe(※) というツールで作成して埋め込む(GUIDGen.exe は計3回実行、前後の"{""}"は不要)。 4.プロジェクトのプロパティからコンパイルタブを開き「COM相互運用機能の登録」にチェック。 5.ビルドすると、.dll と .tlb ファイルができる。 6.Excel VBA から .tlb ファイルを参照設定して利用。 尚、別端末で動作させる場合は、 出来た .dll と .tlb を配布すべき場所にコピー(例 c:\hoge下)し、RegAsm.exe(※) で登録が必要。(regsvr32は使わない。)  regasm.exe c:\hoge\hoge.dll /codebase  (警告が出るが無視) (※)ビルド端末のハードディスク内を検索してみつけてください。 ■■■■■実装例(VB.NET)■■■■■ Imports System.Runtime.InteropServices Imports System.Text <ComClass(ComClass1.ClassId, ComClass1.InterfaceId, ComClass1.EventsId)> _ Public Class Hoge Public Const ClassId As String = "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" Public Const InterfaceId As String = "yyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy" Public Const EventsId As String = "zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz" Public Sub New() MyBase.New() End Sub Public Function ConvertUTF8(ByVal hexText As String) As String Return System.Text.Encoding.UTF8.GetString(GetBytes(hexText)) End Function Private Function GetBytes(ByVal text As String) As Byte() Dim bs(text.Length \ 2) As Byte Dim count As Integer = 0 For i As Integer = 1 To text.Length Step 2 bs(count) = CByte("&H" + Strings.Mid(text, i, 2)) count += 1 Next Return bs End Function End Class ■■■■■利用例(VBA)■■■■■ Sub Test() Dim h As New ClassLibrary1.Hoge MsgBox h.ConvertUTF8("41E383A9E382A4E38396E38381E383A3E38383E38388E3839DE382A4E383B3E38388E38397E383ACE382BCE383B3") End Sub

QZE00555
質問者

お礼

ありがとうございます。Express Edition にはコンパイルタブが無いみたいです(泣)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

JISコードの変換はワークシートのセルを一時的に使えばできそうです Sub Jis2String()   dim s1 as String, ss as string, n as integer, b as Integer   s1 = "1B24422422242424262428242A233123322333233423351B284A"   s1 = Replace( s1, "1B2442", "") ' ESC$Bの削除   s1 = Replace( s1, "1B284A", "") ' ESC(Jの削除   b = 0   for n = 0 to len( s1 ) / 2     b = b * 256 + val( "&H" & mid(s1, n*2+1, 2 ) )     if n mod 2 = 1 then       ' ワークシート関数のCHAR使って コード->文字の変換をする       Sheets("Sheet1").Range("A1").Formula = "=CHAR(" & b & ")"       DoEvents       ss = ss & Sheets("Sheet1").Range("A1").Value       b = 0     end if   next   MsgBox ss End Sub といった具合です UTF-8に関しては Vectorなどで文字コード変換DLLなどを探してみましょう

QZE00555
質問者

お礼

回答ありがとうございます。ワークシート関数を使う発想がイイと思います。

noname#259269
noname#259269
回答No.2

あとは ADODB.Stream 使うか API で変換するか、ですね。

noname#259269
noname#259269
回答No.1

.NET 使えばさくっとできるんですけどねぇ。 私だったら、.NET で COM コンポーネントを作って VBA から呼びだすかなと思います。ご参考までに、.NET での実装を置いておきます。 Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim s1 As String s1 = "1B24422422242424262428242A233123322333233423351B284A" MsgBox(System.Text.Encoding.GetEncoding("ISO-2022-JP").GetString(GetBytes(s1))) End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim s2 As String s2 = "41E383A9E382A4E38396E38381E383A3E38383E38388E3839DE382A4E383B3E38388E38397E383ACE382BCE383B3" MsgBox(System.Text.Encoding.UTF8.GetString(GetBytes(s2))) End Sub Private Function GetBytes(ByVal text As String) As Byte() Dim bs(text.Length \ 2) As Byte Dim count As Integer = 0 For i As Integer = 1 To text.Length Step 2 bs(count) = CByte("&H" + Strings.Mid(text, i, 2)) count += 1 Next Return bs End Function End Class

QZE00555
質問者

お礼

ありがとうございます! Microsoft Visual Basic 2005 Express Edition で試してみました。 思い通り動きました。感動です。 これがエクセルなら・・・(泣) ずうずうしいとは思いますが,もう少し教えてください。 「私だったら、.NET で COM コンポーネントを作って VBA から呼びだすかなと思います」と書かれていますが,VBAから参照設定するDLLは,どうやって作ったらよいのでしょうか?

関連するQ&A