<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 |
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 |
ここまで、読んでいただきどうもです。ここから下は、三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、
気になったジャンル↓を選択してください。 人気記事(来場者が多いTOP3): Excel関係: Access関係: その他:VBAの共通関数やテキストファイルの操作など 開発時の操作: [F1を押してHELPを見る]/ [Debug.Print と イミディエイトウインドウ]/ [実行時エラーでデバッグ]/ [ウォッチ式とSTOP]/ [参照設定を行う] 仕様書(設計書?) XXXX書類: [基本設計書や要求仕様書]/ [テスト仕様書 テストデータ]/ [バグ票]/ [関数仕様書]/ [流れは 入力・処理・出力] ※↑文章の味付けが変わっていて、お口に合うかわかりませんが。。。 |
Blogとリンク:[三流君の作業日記]/
[VBAやASPのサンプルコード]/
広告-[通販人気商品の足跡]