• ベストアンサー

ascW関数の結果がおかしい

こんにちは。以前こちらで以下の質問をさせてもらいました。 http://okwave.jp/qa2842004.html 同様の質問なのですが、msdnを見ると 「asc関数は-32768 ~ 32767の範囲の文字コードを表すInteger値を返し、AscW は、入力文字に対して Unicode コードポイントを返します。範囲は 0 ~ 65535です。」と書いてあります。 しかし私の環境でascW関数を実行すると、-32768 ~ 32767の範囲の値が返ってきてしまいます。 たとえば、"耀"の文字(32768番)を実行すると、 Dim a as Long a = ascW("耀") 結果は32768ではなく、-32768が返ってきてしまいますし、同様にascW("老")の結果は32769ではなくて、-32767です。 どなたか原因と解決方法をご教授願えませんでしょうか? 環境はWindowsXP(SP2)にExcel2002(SP3)、VB6.0です。 よろしくお願いします。

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

  • ベストアンサー
noname#246547
noname#246547
回答No.5

AscWが「-32768 ~ 32767の範囲の値」を返してきてしまう。 しかし、「0 ~ 65535」でほしいのであれば Dim a as Long a = ascW("耀") if a < 0 then a = a +65536 end if で、補正してあげればよいのではないのでしょうか。

dd44
質問者

お礼

ありがとうございます。 それが一番シンプルみたいですね。

その他の回答 (4)

  • dsuekichi
  • ベストアンサー率64% (171/265)
回答No.4

>​http://msdn2.microsoft.com/ja-jp/library/zew1e4wc(VS.80).aspx​ > これって、VB.netのヘルプなんでしょうか? そうですね。 バージョンが明記されている場合を除けば、 「msdn『2』.microsoft.com」のサイトは、「.NETFramework『2.0』」 つまりVB2005を対象としたヘルプです。 また、 ---------------------------------------- 名前空間 : Microsoft.VisualBasic アセンブリ : Visual Basic Runtime Library (Microsoft.VisualBasic.dll) ---------------------------------------- の様に「名前空間」や「アセンブリ」と言うのが書いてあれば、VB.NET以降ですね。 > 0 ~ 65535が欲しいのですが、何かスマートな方法は無いでしょうか。。 余りスマートじゃないですが・・・ a = CLng("&H" & Hex(AscW("耀"))) とか・・・ a = AscW("耀") And &HFFFF& とか・・・

dd44
質問者

お礼

なるほど、勉強になりました。バージョンがいろいろあると混乱しますね。 ありがとうございました。

回答No.3

こんな感じでどうでしょうか。 Private Sub CommandButton1_Click() Dim s As String Dim lngUniCode As Long s = "耀" lngUniCode = CLng(AscW(s)) And &HFFFF& MsgBox s & ":" & lngUniCode & ":" & Hex(lngUniCode) End Sub &HFFFF& の末尾の & は Long の型宣言文字です。 ちなみに、 http://msdn2.microsoft.com/ja-jp/library/zew1e4wc(VS.80).aspx​ は VB 2005 ( = .NET ) のリファレンスのようです。 http://msdn2.microsoft.com/ja-jp/library/2x7h1hfk(VS.80).aspx に「 Microsoft Visual Basic 2005 は~」と書かれていますね。

dd44
質問者

お礼

AscW(s)の結果が0未満だったら補正するだけでよさそうですね。 ありがとうございました。参考になりました。

  • dsuekichi
  • ベストアンサー率64% (171/265)
回答No.2

> Excel2002(SP3)、VB6.0です。 ってことですが・・・ > AscW は、入力文字に対して Unicode コードポイントを返します。範囲は 0 ~ 65535です。 これは、VB.NETのヘルプ(MSDNライブラリ)の記述ではありませんか? VB6やVBAでは > しかし私の環境でascW関数を実行すると、-32768 ~ 32767の範囲の値が返ってきてしまいます。 で正しいはずですが・・・

dd44
質問者

お礼

http://msdn2.microsoft.com/ja-jp/library/zew1e4wc(VS.80).aspx これって、VB.netのヘルプなんでしょうか? 0 ~ 65535が欲しいのですが、何かスマートな方法は無いでしょうか。。

noname#246547
noname#246547
回答No.1

Dim a as UInteger a=ascW("耀") ではだめですか?

dd44
質問者

お礼

ありがとう御座います。 VB6.0(っていうかExcel2002からVBAが使いたいだけなんですが)にはUInteger型は無いようですが。。 こういった符号無しの型VB.net(2002)以降みたいですね。

関連するQ&A