- ベストアンサー
エクセルでメールヘッダーを解析したい(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ライブチャットポイントプレゼン と表示するように変換したいのですが,まったく歯が立ちません。 よろしくお願いします。
- みんなの回答 (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
その他の回答 (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
お礼
ありがとうございます。Express Edition にはコンパイルタブが無いみたいです(泣)
- redfox63
- ベストアンサー率71% (1325/1856)
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などを探してみましょう
お礼
回答ありがとうございます。ワークシート関数を使う発想がイイと思います。
あとは ADODB.Stream 使うか API で変換するか、ですね。
.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
お礼
ありがとうございます! Microsoft Visual Basic 2005 Express Edition で試してみました。 思い通り動きました。感動です。 これがエクセルなら・・・(泣) ずうずうしいとは思いますが,もう少し教えてください。 「私だったら、.NET で COM コンポーネントを作って VBA から呼びだすかなと思います」と書かれていますが,VBAから参照設定するDLLは,どうやって作ったらよいのでしょうか?
お礼
ありがとうございます。ズバリ解決した瞬間は,「うおー」と叫んでしまいました。本当にありがとうございます。