VBA技術解説
マクロでShift_JIS文字コードか判定する

ExcelマクロVBAの問題点と解決策、VBAの技術的解説
公開日:2019-06-01 最終更新日:2019-07-13

マクロでShift_JIS文字コードか判定する


環境依存文字・機種依存文字をチェックしたいという話は時々聞くことなのですが、
何をもってして判別するかという事が実はとても難しい問題になります、
①②もIMEでは[環境依存]と表示されますが、通常これが問題になる事はないでしょう。


そもそもコンピューターの中は2進数だけで表現されているもので、
コンピューターの文字とは、この2進数の数値とフォント(文字デザイン)を対応させたものです。

この数値が文字コードであり、文字との対応づけは様々存在し絶対的なものではありません。
ただし、近年は大分統一されてきており、実際には環境依存文字・機種依存文字を気にしなくても良くなってきています。

このページでは、
UnicodeにあってShift_JISにない文字かどうかを判定する方法です。
Shift_JISには、Unicodeに含まれている特殊な記号や難読漢字が含まれていません。
UnicodeをShift_JISに変換する方法としては、
一定の計算でも求められるかもしれませんが、ここでは文字が正しく表示されるかという観点になります。

想定としては、
UnicodeのテキストファイルをShift_JISのテキストファイルに変換するときと言ったところでしょうか。

ですが、
Windowsのメモ帳もUTF-8(BOMなし)をデフォルトにするらしいので、
このような必要性も今後はかなり減って来るのではないかと思います。
ちなみに、Windowsで単にUnicodeと書かれている場合はUTF-16になります。

文字コードについて

簡単に説明すると、

ASCIIコードは、数字、アルファベット、記号を1バイトで表現
JISコードは、ASCIIコードに日本語(全角)を追加した文字コード
Shift_JISは、半角はJISコードのまま、全角文字をJISコードからシフトした文字コード
Unicodeは、符号化文字集合で、文字コードの国際的な業界標準
UTF-8,UTF-16は、Unicodeを実装した符号化方式です。
BOMは、Unicodeで符号化したテキストの先頭に付与される数バイトのデータです。

文字コードの詳細を説明するのはとても大変です。
WEBを探したところ、詳しく分かりやすく説明しているページがありましたので紹介しておきます。
unicodeとは?文字コードとは?UTF-8とは?
詳しくいろいろなことが書かれているので参考になると思います。

UnicodeにあってShift_JISにない文字の具体例

VBE(VBAのエディター)にて

マクロ VBA 文字コード判定

このように、"?"と表示されてしまい入力できない文字になります。
エクセルはUnicodeに対応していますが、VBEはShift_JISになっているため、
Shift_JISにない文字は、文字化けしてしまい入力できません。

シート構成

マクロ VBA 文字コード判定

A列:判定する文字列
B列:B2=CODE(A2) ・・・ 文字列の先頭文字に対応するASCIIまたはJISコード
C列:C2=UNICODE(A2) ・・・ 文字列の最初の文字に対応するUnicode
D列:VBAのAsc関数 ・・・ 文字列の最初の文字に対応するShift_JISード
E列:配列関数での判定 ・・・ 後述
F列:VBAでの判定 ・・・ 後述

上図を見ていただくとお分かりいただけると思いますが、
CODE関数は、JISにない文字は63を返します。
JISとShift_JISの違い
コード体系が違うだけで、含まれる文字は同じになります。
JISコードでは、漢字コードとASCIIの重なりの判定が面倒であり、
この重なりを防ぐために作られたものがShift_JISになります。
シート関数では、Shift_JISを返す関数が存在しません。
以下のマクロVBAでは、この?(63)となる事を利用して判定しています。

配列数式での判定

E2セルに以下の数式を入れて、
=IF(
  SUMPRODUCT(
    IF(MID(A2,ROW(INDIRECT("1:"&LEN(A2))),1)="?",0,1),
    IF(CODE(MID(A2,ROW(INDIRECT("1:"&LEN(A2))),1))=63,1,0))
  =0,"Shift_JIS","環境依存")

Ctrl+Shift+Enterで配列数式として入れます。
{=IF(・・・}と数式が{}で囲まれて配列数式として入ります。

Shift_JIS文字コードか判定するマクロVBA全コード

本題のマクロVBAでの判定です。

Sub SJIS判定()
  Dim i As Long
  For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
    Cells(i, 4).Value = Asc(Cells(i, 1).Value)
    If isSJIS(Cells(i, 1).Value) Then
      Cells(i, 6).Value = "Shift_JIS"
    Else
      Cells(i, 6).Value = "環境依存"
    End If
  Next
End Sub

Function isSJIS(ByVal argStr As String) As Boolean
  Dim sQuestion As String
  sQuestion = Chr(63) '?:文字リテラルでは誤解があるといけないので
  Dim i As Long
  For i = 1 To Len(argStr)
    If Mid(argStr, i, 1) <> sQuestion And _
      Asc(Mid(argStr, i, 1)) = Asc(sQuestion) Then
      isSJIS = False
      Exit Function
    End If
  Next
  isSJIS = True
End Function

VBAには、JISコードを返す関数が存在せず、
かつ、WorksheetfunctionにはCode関数が存在しません。

Asc関数は、文字列の先頭文字のShif_JISコードを返す関数です。
Shif_JISに無い文字の場合は、Asc関数の戻り値は?(63)となります。
ただし、
そもそも本当の?の文字は除外しなければなりませんので、
.Value <> "?"
これで判定しています。

上の例では1文字主体で少ない文字数しか実行していませんが、
Function isSJIS
これは、長い文字列にも対応した汎用版の関数にしています。

最後に

近年では、どの環境・機種でも、ほぼUnicodeに対応されているので、
環境依存文字・機種依存文字をあまり気にする必要はなくなってきています。
Windowsのメモ帳がデフォルトにするくらいですから。
そのくらいUnicodeが広く使われるようになってきています。
従って、
このVBAが実際に必要になる事があるのかどうかは、正直分からないところもありますが、
ひょっとして何かのときに役に立つことがあるかもしれないという事で記事にしておきました。



同じテーマ「マクロVBA技術解説」の記事

VBAでファイルを既定のアプリで開く方法

・実行テストメイン ・Shell関数 ・batファイル(コマンド プロンプト) ・WScript.Shell ・Shell.Application ・FollowHyperlink ・最後に
Excelアドインの作成と登録について
・Excelアドインについて ・アドインファイルのフォルダ ・アドインの作り方 ・アドインの登録と有効化 ・ ・アドインで保存するVBA ・アドインを登録するVBA ・アドインを有効化するVBA ・登録されているアドインを確認するVBA ・アドインマネージャーを表示するVBA ・アドイン配布時に自動登録するVBA ・個人用マクロブックについて
VBAでのタイマー処理(SetTimer,OnTime)
・Application.OnTime メソッド ・WindowsAPI:SetTimer関数 ・最後に
マクロでShift_JIS文字コードか判定する
Byte配列と文字コード関数について
・文字列をByte配列に入れる ・文字コードについて ・文字列をByte配列に入れて、文字列に戻す ・文字列をByte配列に入れて、自力で文字列に戻す ・文字列をSJISに変換してからByte配列にいれて、自力で文字列に戻す ・最後に
Applicationを省略できるApplicationのメソッド・プロパティ一覧
・Applicationを省略できるかどうかの確認 ・Applicationを省略できるApplicationのメソッド一覧 ・Applicationを省略できるApplicationのプロパティ一覧 ・最後に一言
PowerQueryの強力な機能をVBAから利用する方法
・説明に使用するデータ ・PowerQueryの操作方法 ・PowerQueryのマクロの記録 ・PowerQueryのVBA文法 ・PowerQueryの機能を利用したマクロVBA ・PowerQueryについて
ShapesとDrawingObjectsの相違点と使い方
・Shapes コレクション ・DrawingObjects コレクション ・ShapesとDrawingObjectsの相違点 ・DrawingObjectsの便利な使い道 ・最後に ・図形オートシェイプ(Shape)に関連する記事
新規挿入可能なシート名の判定
・シート名として使える文字列か判定 ・シートの存在確認:存在すればシートのオブジェクトを返す ・シートの挿入:存在すればシートのオブジェクトを返す
VBAにおける配列やコレクションの起点について
・配列の起点について ・コレクション ・Collectionオブジェクト ・その他:文字列関数 ・配列の起点の原則
VBAのマルチステートメント(複数のステートメントを同じ行に)
・VBAでのステートメントという用語について ・行継続(1ステートメントを複数の行に) ・VBAマルチステートメントの基本 ・VBAマルチステートメントの応用 ・マルチステートメントの最後に


新着記事NEW ・・・新着記事一覧を見る

VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
累計を求める数式あれこれ|エクセル関数応用(2024-01-22)
複数の文字列を検索して置換するSUBSTITUTE|エクセル入門(2024-01-03)
いくつかの数式の計算中にリソース不足になりました。|エクセル雑感(2023-12-28)
VBAでクリップボードへ文字列を送信・取得する3つの方法|VBA技術解説(2023-12-07)
難しい数式とは何か?|エクセル雑感(2023-12-07)
スピらない スピル数式 スピらせる|エクセル雑感(2023-12-06)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.変数宣言のDimとデータ型|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.並べ替え(Sort)|VBA入門
8.条件分岐(IF)|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.マクロとは?VBAとは?VBAでできること|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ