• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VBA ASC関数で変換できない文字の説明)

VBA ASC関数で変換できない文字の説明

このQ&Aのポイント
  • Vista+Excel2003の環境で、ASC関数を使用して文字を変換すると、「?」のアスキーコードである3Fになる現象についての説明です。
  • Vista環境で作ったデータをXPで使用する際に文字化けをチェックするため、ASC関数を使用して文字を変換しています。
  • 質問者は、変換できない文字のアスキーコードが3Fになる理由が分からず困っており、その違いについて詳しく説明してもらいたいとのことです。

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4901/10362)
回答No.4

>遅くなりましたが最終的に理解した内容を記載させていただきます。 かなり違っています。 >・VBAのASC関数はSJISのコードを返す。 間違ってはいませんが、WindowsなのでCP932ですね。 CP932 = Shift_JIS(=SJIS) + Windows独自文字(○囲み数字とか、ローマ数字とか、一部の拡張漢字) >・ただし対象の文字がSJISであってもCP932の範囲でなければならない。 CP932の方が文字が多いです。 >・CP932の範囲でない場合、ASC関数は3F(「?」)のコードを返す。 これは合ってる。 >・VistaはUnicodeが標準となっている。 CP932とUnicodeが標準というのは、XPもVistaも同じです。 >・追加文字もSJISのコードが振られているが、CP932に含まれていない為、結果的に3Fのコードを返している。 JIS第三水準の文字はShift_JISにもCP932にも含まれていない。 (一部の文字はWindows独自拡張文字としてCP932にある) Shift_JISにある漢字はJIS第一水準と第二水準だけです。 なお、Shift_JISの空きエリアに第三水準・第四水準の文字などを詰め込んだShift_JIS-2004というのもあるようですが。

その他の回答 (3)

  • nda23
  • ベストアンサー率54% (777/1416)
回答No.3

既に回答が出ている通り、ANSIに変換できない文字は"?"として 表示されます。こういう文字が含まれているかどうかを調べる 目的ならば、WideCharToMultiByteというAPIが使えます。 Declare Sub RtlMoveMemory Lib "KERNEL32" _   (ByRef 転送先アドレス As Long, _    ByVal 転送元アドレス As Long, _    ByVal バイト数 As Long) Declare Function WideCharToMultiByte Lib "KERNEL32" _   (ByVal コードページ As Long, _    ByVal フラグ As Long, _    ByVal ワイド文字列 As Long, _    ByVal ワイド文字列長 As Long, _    ByVal マルチ文字列 As Long, _    ByVal マルチ文字列長 As Long, _    ByVal 変換不能文字 As String, _    ByRef 変換不能有無 As Long) As Long Function 検査(ByVal 文字列 As String) As Boolean Dim アドレス As Long Dim フラグ As Long RtlMoveMemory アドレス, VarPtr(文字列), 4 WideCharToMultiByte 0, &H400, アドレス, _             Len(文字列), 0, 0, "〓", フラグ 検査 = CBool(フラグ) End Function 関数「検査」は与えられた文字列中にANSI変換不可能な文字を 検出するとTrue、検出しなければFalseを返します。

  • notnot
  • ベストアンサー率47% (4901/10362)
回答No.2

JISの第三水準の文字ですね。「?」←出るかな?駄目かも。 面区点番号が、1-14-3。Unicodeだと、U+3402 >ASC関数を通すとなぜ3Fになるのか理由が分からない ASC関数で?になるのは、CP932(WindowsのシフトJIS)の範囲では存在しないから。 ASCW関数を使うと、Unicode番号に変換できると思います。 >Vista環境で作ったデータをXPでも使用するのですがその際化けてしまう文字 XPでもUnicode文字は使えるので、Unicocdeをサポートしたフォントを使えば化けないと思いますよ。

VBA-ONLY
質問者

お礼

みなさまありがとうございました。 遅くなりましたが最終的に理解した内容を記載させていただきます。 ・VBAのASC関数はSJISのコードを返す。 ・ただし対象の文字がSJISであってもCP932の範囲でなければならない。 ・CP932の範囲でない場合、ASC関数は3F(「?」)のコードを返す。 ・VistaはUnicodeが標準となっている。 ・追加文字もSJISのコードが振られているが、CP932に含まれていない為、結果的に3Fのコードを返している。 ということで理解することにしました。 本当にありがとうございました。

VBA-ONLY
質問者

補足

ありがとうございます。 日中ネットにつながるPCが無く返信できませんでした。 他の皆さまからもいただいた情報をもとに自分なりに説明を作ったのですが、持ち帰るのを忘れてしまいました。 明日には改めて報告させていただきます。 >ASC関数で?になるのは、CP932(WindowsのシフトJIS)の範囲では存在しないから。 この一文は非常にありがたかったです。 変換できない文字もS-JISのコードが割り振られているので当初はどうしてなのかと思っていました。 >XPでもUnicode文字は使えるので、Unicocdeをサポートしたフォントを使えば化けないと思いますよ。 これで作ったデータを後でOracleに入れるという目的もありましてチェックする必要がありました。

noname#111181
noname#111181
回答No.1

それは「喜」の異体字で、外字です。

関連するQ&A