dポイントプレゼントキャンペーン実施中!

エクセルVBAで ISO-2022-JP の16進表記
 dim s1 as string
 s1 = "1B24422422242424262428242A233123322333233423351B284A"
という値を保持しています。
これを msgbox 関数 で
 あいうえお12345
と表示するように変換したいのですが,うまくいきません。

また,UTF-8 の16進数表記
 dim s2 as string
 s2 = "41E383A9E382A4E38396E38381E383A3E38383E38388E3839DE382A4E383B3E38388E38397E383ACE382BCE383B3"
という値を,同様に msgbox 関数 で
 Aライブチャットポイントプレゼン
と表示するように変換したいのですが,まったく歯が立ちません。

よろしくお願いします。

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
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/08/19 09:14

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
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/08/19 09:49

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などを探してみましょう
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/08/19 09:45

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

    • good
    • 0

.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
    • good
    • 0
この回答へのお礼

ありがとうございます!
Microsoft Visual Basic 2005 Express Edition で試してみました。
思い通り動きました。感動です。
これがエクセルなら・・・(泣)

ずうずうしいとは思いますが,もう少し教えてください。
「私だったら、.NET で COM コンポーネントを作って VBA から呼びだすかなと思います」と書かれていますが,VBAから参照設定するDLLは,どうやって作ったらよいのでしょうか?

お礼日時:2008/08/18 16:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!