|
皆さん、こんばんは。
>
>例えば・・・
>
>メルマガ
>
>をVBAのMidを使って読み取ると
>
>$B%a%k%^%,
>
>なふうになってしまいます。
>
>これってシフトJISではないのかな・・・。
これは、JISコード(EBCDIC)ではないですか?
KIコードも入っていますね?
どっか探せばツールもあるんでしょうねえ・・・。
よって、JISコードをExcel上で表示できるようにすればよい
ということですか?
>$B%a%k%^%,
これは、推測ですが、HEXコードで表すと
&H1B, &H24, &H42, &H25, &H61, &H25, &H6B, &H25, &H5E, &H25, &H2C
このようになっているのではないですか?
どういうコードで読み込んでいるのかわかりませんが、
テキストファイルに上記のJISコードで書き込んだファイルを読み込んで
Excel上で表示可能にすることを考えます。
標準モジュールに
'================================================================
Sub 例()
On Error Resume Next
Dim flno As Long
Dim wb(1 To 13) As Byte
Dim ar As Variant
Dim idx As Long
Kill ThisWorkbook.Path & "\jiscode.txt"
flno = FreeFile()
Open ThisWorkbook.Path & "\jiscode.txt" For Binary As #flno
For Each ar In Array(&H1B, &H24, &H42, &H25, &H61, &H25, &H6B, &H25, &H5E, &H25, &H2C, &HD, &HA)
wb(idx + 1) = ar
idx = idx + 1
Next
Put #flno, , wb()
Close #flno
End Sub
上記のコードでJISコードで「メルマガ」とjiscode.txtに書き込みます。
バイナリエディタで上記のArray()の中のHexコードが正しく書き込まれているか
確認してみてください。
以下のコードで、
このjiscode.txtを読み込んでデータを加工して表示可能にします。
'====================================
Sub main()
Dim flno As Long
Dim jisdata As String
flno = FreeFile()
Open ThisWorkbook.Path & "\jiscode.txt" For Input As #flno
Line Input #flno, jisdata
Close #flno
MsgBox cnvjis(jisdata)
End Sub
'=======================================================================
Function cnvjis(mystr As String) As String
Const esc = 27
Const ki1 = "$"
Const ki2 = "B@"
Const ko1 = "("
Const ko2 = "BJ"
Dim idx As Long
Dim sv As Long
Dim ki_mode As Long
Dim e_mode As Long
For idx = 1 To Len(mystr)
If Asc(Mid(mystr, idx, 1)) = esc Then
e_mode = 1
ElseIf e_mode = 1 Then
If Mid(mystr, idx, 1) = ki1 Then
e_mode = 2
ElseIf Mid(mystr, idx, 1) = ko1 Then
e_mode = 3
Else
e_mode = 0
End If
ElseIf e_mode = 2 Then
If Mid(mystr, idx, 1) = Mid(ki2, 1, 1) Or Mid(mystr, idx, 1) = Mid(ki2, 2, 1) Then
e_mode = 0
ki_mode = 1
Else
e_mode = 0
End If
ElseIf e_mode = 3 Then
If Mid(mystr, idx, 1) = Mid(ko2, 1, 1) Or Mid(mystr, idx, 1) = Mid(ko2, 2, 1) Then
e_mode = 0
ki_mode = 0
Else
e_mode = 0
End If
ElseIf e_mode = 0 Then
If ki_mode = 0 Then
cnvjis = cnvjis & Mid(mystr, idx, 1)
ElseIf ki_mode = 1 Then
sv = Asc(Mid(mystr, idx, 1)) * 256
ki_mode = 2
ElseIf ki_mode = 2 Then
sv = sv + Asc(Mid(mystr, idx, 1))
cnvjis = cnvjis & Evaluate("char(" & sv & ")")
ki_mode = 1
End If
End If
Next idx
End Function
即興なのでバグがあるかもしれませんが
(何せこの手のコードは15年ぶりくらいですから)
これでうまくおいくようでしたら、このconvjisという関数を使って
実際のデータを試してみてください。
|
|