tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルSelect Caseの疑問
記事No16475
投稿日: 2019/02/07(Thu) 15:34
投稿者いまだにVB6
いつも利用させていただいています。
早速ですが、質問です。
現在、私はVB6初心者の方への講習を行っているんですが
そこで動作について説明ができなかったので投稿させていただきました。
環境としては、フォームにテキストボックスが1つと
コマンドボタンが1つの単純なプロジェクトで
コマンドボタンのクリックイベントに

Select Case テキストボックス名.Text
 Case 1 To 10
  MsgBox "Low"
 Case 11 To 20
  MsgBox "Mid"
 Case 21 To 30
  MsgBox "High"
End Select
と組んで、実行してテキストボックスに『3』と入力して
コマンドボタンを押すと、メッセージに『High』と表示されます。
VBでは、数字と文字では区別されないと記憶していますから
入力が『3』ならメッセージには『Low』と表示されるはずですよね?
それが『High』と表示されたのでなぜでしょうと質問されたのですが
私もわからず答えられませんでした。
どなたかご教授いただけると幸いです。よろしくお願いします。

[ツリー表示へ]
タイトルRe: Select Caseの疑問
記事No16476
投稿日: 2019/02/08(Fri) 12:12
投稿者魔界の仮面弁士
> VBでは、数字と文字では区別されないと記憶していますから

区別されないというよりは、暗黙の型変換が発生するようになっています。

とはいえ、「数字」と「数値」の違い、「文字」と「文字列」の違いは
きちんと認識されておいたほうが良いでしょう。


たとえば下記の場合において、"え" が「High」、"いいか" が「Mid」に
分岐されることが分かっていると、今回の件の理解を進めやすいと思います。

Select Case Text1.Text
 Case "い" To "いあ"
  MsgBox "Low"
 Case "いい" To "うあ"
  MsgBox "Mid"
 Case "うい" To "えあ"
  MsgBox "High"
End Selct



> 入力が『3』ならメッセージには『Low』と表示されるはずですよね?

提示のケースだと、Text プロパティが String 型ゆえに暗黙の型変換によって
 Case "1" To "10"
 Case "11" To "20"
 Case "21" To "30"
に相当する分岐として扱われます。
数値の比較ではなく、文字列の比較になっていることに注意してください。


そのため "3" では「High」と表示され、"115" なら「Mid」と表示されます。

また、全角 "2" が入力された場合には、
Option Compare Text 時には「Mid」となります。
Option Compare Binary 時には、該当なしです。(Case Else 相当)


もしも「数字」を『数値』として扱いたいのであれば、Select Case に渡す値を
CInt(Text1.Text) なり Val(Text1.Text) なりで数値化してあげる必要があります。
(入力された値によっては、CInt や Val が実行時エラーになりうる点にも注意)

[ツリー表示へ]
タイトルRe^2: Select Caseの疑問
記事No16477
投稿日: 2019/02/13(Wed) 16:39
投稿者いまだにVB6
魔界の仮面弁士 さん

ありがとうございます。返信が遅くなってしまって申し訳ありませんでした。

> > VBでは、数字と文字では区別されないと記憶していますから
>
> 区別されないというよりは、暗黙の型変換が発生するようになっています。
>
> とはいえ、「数字」と「数値」の違い、「文字」と「文字列」の違いは
> きちんと認識されておいたほうが良いでしょう。
>
>
> たとえば下記の場合において、"え" が「High」、"いいか" が「Mid」に
> 分岐されることが分かっていると、今回の件の理解を進めやすいと思います。
>
> Select Case Text1.Text
>  Case "い" To "いあ"
>   MsgBox "Low"
>  Case "いい" To "うあ"
>   MsgBox "Mid"
>  Case "うい" To "えあ"
>   MsgBox "High"
> End Selct
なるほど〜、そういうことだったんですね〜。
具体例を提示していただきわかりやすかったです。
これからは、数値を判定するときはきちんと数値に変換して
判定するようにします。ありがとうございました。

[ツリー表示へ]