[三流君] −−> [VBAで楽しく] −−> [バックナンバー一覧]
−−> No.079 SJIS--JISコードの文字列を作成したい

SJIS--JISコードの文字列を作成したい

メルマガ発行内容

<SJIS--JISコードの文字列を作成したい>

こんにちは、三流プログラマーKen3です。 今回は、 読者の人から、 Excelのセルに入っている漢字をJISコードの文字列にしたい と軽い質問を受けました。

/* * 1.仕様書、書いてますか? */

まずは、要求をまとめるんだっけ。 入りのデータは""などの文字列で、 結果を文字列でFFFFなどの16進数で返す。 Function SJIStoJIS(strMOTO as String) としますか。 なんて、ラフな仕様なんだ・・・ (こんなの仕様書じゃないよ、よくアンタの後輩は作ってたよねこんなんで(爆)) コード変換の仕様を渡さないで、プログラマーに調べながらヤレって? まぁまぁ、調べながらやりますから、黙っててください。

/* * 2.初期捜査、初動捜査 */

よくある話で、がんばって作ったら、標準関数で存在した?って話があります。 少し、Excelのワークシート関数を見てみよう。 おっ、JISって関数ある、これって? =JIS(A1) とやると、あっ、半角を全角にするんだぁ。 さらに続けて捜査すると、 =CODE 文字列の先頭文字に対応する ASCII または JIS コードを返します。 戻り値のコード番号は、作業中のコンピュータで使用されている文字セットに 対応しています これで、JISのコードが返るので、あとは16進数にすれば、 16進数にするのは、 DEC2HEX 10 進数を 16 進数に変換します。 DEC2HEX(数値,桁数)でできるのかぁ。 あれ、使えないよ、、何でだろ? ※あとでわかったのですが、分析ツール?をインストールしてないと、  使えないみたいです。 全てVBAでやろうとしないで、ワークシート関数を探すのも必要ですよ。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

/* * 3.VBAで作成するか */

当初の予定通り、VBAで作成します。 10進数を16進数に変換 は strHex = Hex(Dec) で変換できます。 が、JISコードの変換関数がVBAに見当たらない、、、オイオイ。 ヘルプでシフトJISをJISに直す関数をチェックすると、 えっ無いの?(探し方が悪いのか?それとも漢字コードなんて気にしないのか?) ここは、ネットで検索してみるか、 シフトJIS JISコード 変換表 ^^^^^^^^^^^^^^^^^^^^^^^^^^ この3つをキーワードにgoogleで検索する OSF 日本ベンダ協議会 (OSF/JVC) 推奨 日本語 EUC ・シフト JIS 間コード変換仕様とコード系実態調査 http://www.opengroup.or.jp/jvc/cde/sjis-euc.html 日経ソフトウエア JIS漢字コード http://software.nikkeibp.co.jp/software/special/jiscode/nc.html なんだか、よくわかんないよ(笑) オレは変換プログラムを書きたいんだってば、 *自分で変換の意味見て計算式ぐらい書けよ。  と読者の声が聞こえたところで、 初心者によるエンコーディングと文字セットメモ http://sanaki-web.hp.infoseek.co.jp/code/encode.htm を見ると、やっと変換の式が書いてある。 --- >S-JIS -> JIS >if(第一バイト <= 0x9F){ >第一バイト = 第一バイト - 0x71 >} >else{ >第一バイト = 第一バイト - 0xB1 >} >第一バイト = 2 * 第一バイト + 1 >if(第ニバイト > 0x7F){ >第ニバイト = 第ニバイト - 1 >} >if(第ニバイト >= 0x9E){ >第ニバイト = 第ニバイト - 0x7D >第一バイト = 第一バイト + 1 >} >else{ >第ニバイト = 第ニバイト - 0x1F >} ---- を元に作成してみる。 なんかぎこちないコードだけど、下記のように、自作しました。 'シフトJISコードの文字列を受け取り、JISコードを返す
Function SJIStoJIS(strSJISCODE As String) As String

    Dim hi As Long
    Dim lo As Long

    'シフトJISコードの上位バイトを hi、下位バイトを lo とします。
    hi = Val("&h" & Mid(strSJISCODE, 1, 2))
    lo = Val("&h" & Mid(strSJISCODE, 3, 2))

    'hi が 0x9f 以下の場合、 hi から 0x71 減じます。
    'そうでない場合、 hi から 0xB1 減じます。
    hi = hi - IIf(hi <= &H9F, &H71, &HB1)
    
    'hi に 2 を乗じて、さらに 1 を加えます。
    hi = hi * 2 + 1
    
    'lo が 0x7F より大きい場合、 lo から 1 減じます。
    If lo > &H7F Then lo = lo - 1
    
    'lo が 0x9E 以上の場合、lo から 0x7D 減じて、hi に 1 加えます。
    If lo >= &H9E Then
        lo = lo - &H7D
        hi = hi + 1
    Else 'そうでない場合、 lo から 0x1F 減じます。
        lo = lo - &H1F
    End If

    '結果を返します
    SJIStoJIS = Right("0" & Hex(hi), 2) & Right("0" & Hex(lo), 2)

End Function
使い方は、1文字単位でAsc関数でシフトJISコードを取り出し、 Hexで16進文字列にして渡します。
Sub test()

    Dim strMOJI As String
    Dim strWORK As String

    Dim n As Integer

    strMOJI = "仕様書"
    strWORK = ""
    For n = 1 To Len(strMOJI)  '普通は半角のチェックが無いとマズイよね
        strWORK = strWORK & SJIStoJIS(Hex(Asc(Mid(strMOJI, n, 1))))
    Next n

    MsgBox strWORK
    Debug.Print strWORK

End Sub
なんか、変換の嵐でわかりにくいけど、 "仕様書"を変換すると 3B45 4D4D 3D71 となります。 あとは、応用して使ってみてください。

/* * 4.終わりの挨拶 */

今回は、 シフトJISコードをJISにする方法でした。 でした。 なんか、標準関数でありそうなんだけどなぁ・・・ プログラム作りは簡単で面白いなぁと感じるような 解説/メールマガジンを書きたいと思ってます。 拾い読みして、 1つでも何かの参考となれば幸いです。 Excel/Access大好き、三流プログラマーKen3でした。


ページフッター

ここまで、読んでいただきどうもです。ここから下は、三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、

種類別のリンク や 広告など

気になったジャンル↓を選択してください。

人気記事(来場者が多いTOP3):
[VBAでIE,WebBrowserを操作]・・・VBAでIE,WebBrowserを操作する サンプルです
[Access から Excel 連携 CreateObject("Excel.Application")]・・・AccessからExcelを操作したりデータの書き出しなどです
[VBAでOutlookの操作 CreateObject("Outlook.Application" )]・・・VBAからOutlookを使い、メール関係を処理するサンプルです
↑上記3つみたいなCreateObjectで他のアプリケーションを操作するサンプルが人気です。

Excel関係:
[Excel UserFormを操作する]・・・エクセルでユーザーフォームを作成して入力などを行ってます
[ExcelからAccessを操作する]・・・ExcelからAccessのマクロを起動してみました、
[Excel関係 関数、その他]・・・その他Excel関係です

Access関係:
[Access UserForm/サブフォーム 操作]・・・アクセスでフォームを使ったサンプルです
[Access レポート操作]・・・レポートを操作してみました
[Access クエリーやその他関数]・・・あまりまとまってませんが、スポット的な単体関数の解説です

その他:VBAの共通関数やテキストファイルの操作など
[VBAでテキストファイル(TextFile)の操作]・・・普通のテキストファイルを使ったサンプルです
[VBA 標準関数関係とその他解説]・・・その他、グダグタ解説してます

開発時の操作: [F1を押してHELPを見る]/ [Debug.Print と イミディエイトウインドウ]/ [実行時エラーでデバッグ]/ [ウォッチ式とSTOP]/ [参照設定を行う]

仕様書(設計書?) XXXX書類: [基本設計書や要求仕様書]/ [テスト仕様書 テストデータ]/ [バグ票]/ [関数仕様書]/ [流れは 入力・処理・出力]

※↑文章の味付けが変わっていて、お口に合うかわかりませんが。。。
※※読んで、気分を悪くされたらスミマセン。

Blogとリンク:[三流君の作業日記]/ [VBAやASPのサンプルコード]/ 広告-[通販人気商品の足跡]



[三流君(TOP ken3.org へ戻る)] / [VBA系TOPへ] / [VBA系バックナンバー目次へ移動]