|
■No82434 (TTT さん) に返信 > 入力したアスキーコード2ケタが同じであればメッセージボックスを出したいのですが(例00)
『例00』という説明が曖昧なので、質問内容を再確認させてください。
もしもこれが "00" の書き間違いだとしたら、そのコードは Shift_JIS なら 30,30 UTF-16(LE) なら 30,00,30,00 UTF-8 なら 30,30 になります。上記は 16 進数表記なので、10進数で表せば Shift_JIS なら 48,48 UTF-16(LE) なら 48,0,48,0 UTF-8 なら 48,48 という並びです。
あるいは本当に、"00"という文字列だとしたら、そのコードは Shift_JIS なら 82,4F,82,4F UTF-16(LE) なら 10,FF,10,FF UTF-8 なら EF,BC,90,EF,BC,90 になります。10 進なら Shift_JIS なら 130,79,130,79 UTF-16(LE) なら 16,255,16,255 UTF-8 なら 239,188,144,239,188,144 という並びです。
> 現状はどっちかが当てはまっていれば出すというようになっております
意味がよくわかりませんが、たとえば Dim DATA As String に、2 桁の16進数が入っているという前提になっていて、その 1桁目と2桁目が 同じかどうかを調べる…という話なら、Asc 関数は不要だと思います。
たとえば、単純に If DATA(0) = DATA(1) Then MsgBox("どちらも" & DATA(0) & "です") End If のように書けそうですが、これで要件を満たせますか? (Option Compare Text の場合は話が変わってきますが、今回はそうではないでしょうし…)
> If (Asc(DATA) = "48" and "48") Then これは、「どちらも同じであれば出す」コードどころか、 「どっちかが当てはまっていれば出す」コードにもなっていないようです。
【問題点1】 Asc 関数の引数は「Char型」または「String型」である必要がありますが、 String 型であった場合、最初の一文字しか処理されない仕様です。
変数DATA が 2 文字以上の文字を含む String 型なのであれば、 1 文字目と 2 文字目をそれぞれ取り出し、それぞれの値を調べるようにしてみてください。
2 文字目を取り出す方法はいくつかありますが、VB.NET の場合は上記例のように DATA(0) で 1 文字目、DATA(1) で 2 文字目のようにして取り出せます。 (文字列の長さが足りない場合はエラーになります)
たとえば、「1文字目または2文字目のコードが 48 ならば」という処理ならば If Asc(DATA(0)) = 48 OrElse Asc(DATA(1)) = 48 Then などと書けます。他にもいろいろな書き方がありますが。
【問題点2】データ型があやふやです。
提示頂いた「If (Asc(DATA) = "48" and "48") Then」で使われている Asc 関数は、指定された文字列の先頭一文字を 整数値(Integer)値で返す関数です。 それなのに、右辺が 全角「48」という文字列(String)ではマズイです。
比較演算子の左辺と右辺が常に同じ型になるように意識してコーディングしましょう。 すなわち「Integer値 = String値」な比較ではなく、「Integer値 = Integer値」な比較となるように するべきであるということです。
【問題点3】 And 演算子が意味を成していません。
問題点2 が原因で、暗黙の型変換が行われてしまっています。 まず『Asc(DATA) = "48"』という「Integer値 = String値」な比較では、 暗黙の型変換により、Double 型同士の比較として解釈されることになります。 すわなち CDbl(Asc(DATA)) = CDbl("48") あるいは CDbl(Asc(DATA)) = 48.0 として処理されてしまうということです。
この = 演算子による比較結果は、True または False のいずれかとなります。
それを残りの部分と組み合わせると、変数 DATA の内容に応じて If (True And "48") Then If (False And "48") Then のいずれかとして解釈されます。
この時点で「Boolean値 And String 値」というおかしな演算になっているのですが、 この演算は、VBA では Long 型、VB.NET では Boolean 型として演算されます。そして 今回は VB.NET なので、And "48" の部分は And CBool("48") 相当 すなわち And True となります。
結果として、最後の「And "48"」の部分はあっても無くても同じ結果となります。 「If 何某 And True Then」の結果は「If 何某 Then」と同義ですから。
|