プロが教える店舗&オフィスのセキュリティ対策術

こんにちは。以前こちらで以下の質問をさせてもらいました。
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です。
よろしくお願いします。

A 回答 (5件)

Dim a as UInteger


a=ascW("耀")
ではだめですか?
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/04/17 23:45

> Excel2002(SP3)、VB6.0です。


ってことですが・・・

> AscW は、入力文字に対して Unicode コードポイントを返します。範囲は 0 ~ 65535です。

これは、VB.NETのヘルプ(MSDNライブラリ)の記述ではありませんか?

VB6やVBAでは
> しかし私の環境でascW関数を実行すると、-32768 ~ 32767の範囲の値が返ってきてしまいます。

で正しいはずですが・・・
    • good
    • 0
この回答へのお礼

http://msdn2.microsoft.com/ja-jp/library/zew1e4w …
これって、VB.netのヘルプなんでしょうか?

0 ~ 65535が欲しいのですが、何かスマートな方法は無いでしょうか。。

お礼日時:2007/04/17 23:40

こんな感じでどうでしょうか。



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/zew1e4w …
は VB 2005 ( = .NET ) のリファレンスのようです。
http://msdn2.microsoft.com/ja-jp/library/2x7h1hf …
に「 Microsoft Visual Basic 2005 は~」と書かれていますね。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/04/18 09:46

>​

http://msdn2.microsoft.com/ja-jp/library/zew1e4w …
> これって、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&

とか・・・
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/04/18 09:37

AscWが「-32768 ~ 32767の範囲の値」を返してきてしまう。


しかし、「0 ~ 65535」でほしいのであれば

Dim a as Long
a = ascW("耀")
if a < 0 then
a = a +65536
end if

で、補正してあげればよいのではないのでしょうか。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/04/18 09:36

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!