- ベストアンサー
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です。 よろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
AscWが「-32768 ~ 32767の範囲の値」を返してきてしまう。 しかし、「0 ~ 65535」でほしいのであれば Dim a as Long a = ascW("耀") if a < 0 then a = a +65536 end if で、補正してあげればよいのではないのでしょうか。
その他の回答 (4)
- dsuekichi
- ベストアンサー率64% (171/265)
>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& とか・・・
お礼
なるほど、勉強になりました。バージョンがいろいろあると混乱しますね。 ありがとうございました。
- tsukasa-12r
- ベストアンサー率65% (358/549)
こんな感じでどうでしょうか。 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 は~」と書かれていますね。
お礼
AscW(s)の結果が0未満だったら補正するだけでよさそうですね。 ありがとうございました。参考になりました。
- dsuekichi
- ベストアンサー率64% (171/265)
> Excel2002(SP3)、VB6.0です。 ってことですが・・・ > AscW は、入力文字に対して Unicode コードポイントを返します。範囲は 0 ~ 65535です。 これは、VB.NETのヘルプ(MSDNライブラリ)の記述ではありませんか? VB6やVBAでは > しかし私の環境でascW関数を実行すると、-32768 ~ 32767の範囲の値が返ってきてしまいます。 で正しいはずですが・・・
お礼
http://msdn2.microsoft.com/ja-jp/library/zew1e4wc(VS.80).aspx これって、VB.netのヘルプなんでしょうか? 0 ~ 65535が欲しいのですが、何かスマートな方法は無いでしょうか。。
Dim a as UInteger a=ascW("耀") ではだめですか?
お礼
ありがとう御座います。 VB6.0(っていうかExcel2002からVBAが使いたいだけなんですが)にはUInteger型は無いようですが。。 こういった符号無しの型VB.net(2002)以降みたいですね。
お礼
ありがとうございます。 それが一番シンプルみたいですね。