[三流君] −−> [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でした。

フィードバック

VBA系の→[掲示板]←を覗く、質問を書き込む

評価・感想

No.079を読んだ満足度(評価)は?
5満足(参考になった)
4まぁまぁ(一部参考になった)
3普通(どちらとも言えない)
2なんかなぁ(期待と違った)
1不満(読んで損した気分)
作者に感想・質問を送る場合は下記に気軽に書いてください
あなたのお名前(ニックネーム) さん

作者からの返信は、 不用 E-mail で受信したい
*質問・感想はメルマガで紹介する場合があります

ページフッター(リンクや広告など)


[三流君(TOP ken3.org へ戻る)]
-- [VBA系TOPへ]
---- [VBA系バックナンバー目次へ移動]
------ [VBAでIEを操作 CreateObject("InternetExplorer.application")]・・・実は当店一番人気、VBAでIEを操作するサンプルです
------ [VBAでOutlookの操作 CreateObject("Outlook.Application")]・・・Outlookを使い、メール関係の処理です
------ [Access から Excel 連携 CreateObject("Excel.Application")]・・・人気のAccessからExcelへデータ書き出しなどです
------ [AccessのUserForm/サブフォームを操作]・・・アクセスでフォームを使ったサンプルです
------ [Accessのレポートを操作]・・・レポートを操作してみました
------ [Access クエリー関係やその他関数]・・・あまりまとまってませんが、スポット的な単体関数の解説です
------ [Excel UserForm(ユーザーフォーム)を操作する]・・・エクセルでユーザーフォームを作成して入力などを行ってます
------ [ExcelからAccessを操作する]・・・ExcelからAccessのマクロを起動してみました、
------ [Excel関係 関数、その他]・・・その他Excel関係です
------ [VBAでテキストファイル(*.txt,*.html,*.csv)の操作]・・・テキストファイルを使ったサンプルです
------ [VBA 標準関数関係とその他解説]・・・その他、グダグタ解説してます


広告
-- [通販系の売れ筋広告へ] ←主に楽天やAmazonのランキングです
blog
-- [三流君の作業日記] ← 日々の作業を少々
-- [通販あしあと] ← 通販ページの足跡を一覧で羅列

情報を探す

情報を探すならGoogleかな?

↓Web全体、サポート情報(support.microsoft.com)や三流君VBA(ken3.org)から検索する
Google
Web www.ken3.org
www.microsoft.com support.microsoft.com

あとは、項目別にMSでお勉強かな?
◆ マイクロソフト サイトの歩き方
◇ How-To インデックス
◇ FAQ インデックス
◇ スキルレベル別おすすめコンテンツ
◇ テクノロジ マップ
◇ テーマ別技術資料一覧

書籍の購入

Webだけじゃさすがに勉強しきれないので、プログラミング関係の書籍も読んでみては??

コンピュータ書籍の発送がハヤイ専門店

コンピュータの本・専門店
種類が豊富で探し易いです。※在庫ありが48時間以内発送が急ぎで資料や書籍がほしい時、とても助かります。
お奨め本の目次を見るだけでも勉強になったり

amazon.co.jpでキーワード別チェック

下記、私が設定したキーワードですが、こんな感じで資料や書籍を探ってみては?
[VBA全体を把握する] -- やはり全体をさらっと見たいですよね。
[SQL関連でDB力UP] -- システムはデータベース設計が重要
[ADO接続を探る] -- VBAなのでADO接続を押さえておく
[Windows APIを探る] -- さらにAPIになて知ってれば強力だ!
[.NETを探る] -- と言っても時代は.NETに流れてるし
プログラミング以外でも知りたいことは多くって、
[人間関係] -- で、客先・上司、まわりに気を使い。
[プログラマーの自己啓発] -- プログラムだけじゃなくいろいろと向上したいよ
[コーチング・育成] -- 先輩になったら後輩(部下)の面倒をみてね。
そんなこんなでプログラマーっていろいろと大変なんだってば・・・