
エクセルVBAで ISO-2022-JP の16進表記
dim s1 as string
s1 = "1B24422422242424262428242A233123322333233423351B284A"
という値を保持しています。
これを msgbox 関数 で
あいうえお12345
と表示するように変換したいのですが,うまくいきません。
また,UTF-8 の16進数表記
dim s2 as string
s2 = "41E383A9E382A4E38396E38381E383A3E38383E38388E3839DE382A4E383B3E38388E38397E383ACE382BCE383B3"
という値を,同様に msgbox 関数 で
Aライブチャットポイントプレゼン
と表示するように変換したいのですが,まったく歯が立ちません。
よろしくお願いします。
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
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
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などを探してみましょう
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
ありがとうございます!
Microsoft Visual Basic 2005 Express Edition で試してみました。
思い通り動きました。感動です。
これがエクセルなら・・・(泣)
ずうずうしいとは思いますが,もう少し教えてください。
「私だったら、.NET で COM コンポーネントを作って VBA から呼びだすかなと思います」と書かれていますが,VBAから参照設定するDLLは,どうやって作ったらよいのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- スポーツサイクル 自転車のタイヤサイズのえらびかた 3 2023/06/17 21:45
- Excel(エクセル) [スライサー]に関して、 1 2022/05/24 21:07
- 船舶・クルーズ Windows10のエクスプローラにて。 1 2022/10/10 20:11
- Windows 10 プロファイルエラーについて 2 2022/12/16 09:31
- 電気・ガス・水道 ソーラーパネル初心者です 1 2023/01/01 13:46
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- Photoshop(フォトショップ) 写真に日付を入れるのがそんなに大変か 9 2023/07/22 14:38
- 英語 提示文のif節の用法について(senario if節) 6 2023/07/31 10:18
- Amazon 同じAmazonなのに同じ製品の値段が違うのはなぜ!? 5 2022/04/04 00:52
- 洋画 「トラ・トラ・トラ!」の字幕 3 2022/10/17 01:15
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
10進数を2進数
-
数値を文字型に変換する時の書...
-
c# 暗黙/明示的型変換の許容範囲
-
C#で文字列を数値に変換する方法
-
VBAで1e-3を入力する方法
-
基本情報技術者検定の平成13...
-
Fortranの変数
-
日付を変換したい
-
TextBox内の改行
-
データセットの違いにつきまして
-
.netでコンボボックスの設定方法
-
フィールドの分割
-
SQLSERVERからデータを取得する...
-
DBへのinsert文作成方法
-
指定のフィールド内に選択され...
-
VBScriptでCSVファイルを読み出...
-
外部ファイルから一部分を書き...
-
通常使うプリンタを変更したい
-
【VB.NET】Excelの最終行までの...
-
Dir関数で読み取り順を操作でき...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB6.0の「vbFromUnicode」はVB....
-
VB.NETで1→A、2→B、26→Z、27→AA...
-
16進をASCIIコードに変換する...
-
WORD型をCString型に変換する方法
-
10進数を2進数
-
C#で文字列を数値に変換する方法
-
16進コード文字列を文字列に変換
-
VC++ std::stringからLPCWSTRに...
-
【C++/CLI】int型からString型...
-
Boolean型変数の値を反転する方法
-
型変換について (C++ Builder5)
-
文字型を日付/時刻型に変換する...
-
textbox.textやlabel.captionの...
-
ASPでVBのFormat関数のような機...
-
VB6.0 String型→Long型変換方法...
-
Excelの数字(文字列)合計につい...
-
2進数から10進数へ変換
-
vb6の桁数指定
-
n進数の値を10進数の値に変換す...
-
数字→漢数字変換
おすすめ情報