回答受付終了まであと6日

マクロVBAについて質問です。

Visual Basic | Excel98閲覧xmlns="http://www.w3.org/2000/svg">500

回答(3件)

「環境依存文字の定義」で検索すると色々な「定義」があって、例えば"丸囲みの数字 ①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳"を「環境依存文字」とするものがありますが、時代遅れです。 Shift_JISが情報交換用の文字コードの主流だった頃、Shift_JISと言ってもWindowsのShift_JISとmacのShift_JISは収録文字に差がありました。Shift_JISは本来JIS X 0201とJIS X 0208の文字集合を収録していますが、例えばWindowsのShift_JISはそれに加え、NEC特殊文字、IBM拡張文字、NEC選定IBM拡張文字が使用できます。丸数字はNEC特殊文字にある文字ですが、WindowsのShift_JISの➀のコードポイントはmacのShift_JISでは㈰が表示されます。厳密に区別する場合は、WindowsのShift_JISはCP(コードページ)932やWindows-31Jなど、macのShift_JISはMacJapaneseと呼びます。CP932とMacJapaneseの差異部分を長い間「環境依存文字」と呼んでいたのですが、Unicodeは➀は➀、㈰は㈰なのでShift_JISの「環境依存文字」は問題になりません。 問題になるのはUnicodeからレガシーな文字コードにデータを移す場合です。レガシーな文字コードにない文字は?に化けます。 この場合レガシーな文字コードが何かによってチェックする文字は異なります。日本語の文字コードは基本JIS X 0201とJIS X 0208の文字集合にある文字は使用できます。UnicodeからCP932にデータを移す場合は、ExcelVBAでのチェックは簡単です。 例えば、文字列変数 str1にCP932に無い文字が含まれているかは、 If str1 <> StrConv(StrConv(str1, vbFromUnicode), vbUnicode) Then で判定出来ます。StrConv関数のvbFromUnicodeはUnicode文字列からシステムロケールデフォルトの文字コードの文字列に変換します、VbUnicodeはシステムロケールデフォルトの文字コードからUnicode文字列に変換します。往復変換でCP932に無い文字は?になるので差異があるかどうかでチェックできます。 システムロケールデフォルトの文字コードはメモ帳ではANSIという名称になっています。システムロケールが日本語(日本)の場合は、CP932になります。

この回答はいかがでしたか? リアクションしてみよう

外部サイトがCP932ではない本当のShift_JISしか受け付けなかったり、EUC-JPを使っている場合は面倒です。EUC-JPの対応はちょっと無理なので、本当のShift_JISの場合を考えると、先のStrConv関数でチェックをした後にNEC特殊文字、NEC選定IBM拡張文字、IBM拡張文字の範囲の文字があるかどうかチェックをします。 また、"外部サイトへアップロードする"のに何かのアップローダーを使っているのなら、そのアップローダーがどのような変換テーブルを使っているか確認します。場合によっては全角チルダ、波ダッシュの問題が起こるかもしれません。 (CP932の全角チルダは、本当のShift_JISでは波ダッシュになります。アップローダーによっては全角チルダをShift_JISに転送するときに"?"に変換してしまいます。)

まずは以下の記事を読まれることをおすすめします。 https://excel-ubara.com/excelvba4/EXCEL_VBA_403.html

別回答者の引用記事は私も見つけてちょっと試しましたが、ちょっと問題(場合によってうまくいかない可能性)があります。