C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

VBを使用 条件分岐 アスキーコード

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■82434 / inTopicNo.1)  VBを使用 条件分岐 アスキーコード
  
□投稿者/ TTT (1回)-(2017/01/10(Tue) 17:14:42)

分類:[VB.NET/VB2005 以降] 

VBを使用してプログラムを作成しています。

入力したアスキーコード2ケタが同じであればメッセージボックスを出したいのですが(例00)
現状はどっちかが当てはまっていれば出すというようになっております
If (Asc(DATA) = "48" and "48") Then
MsgBox("どっちも0です")
End If

どう修正すれば良いのでしょうか??
アドバイス、説明サイトがあれば、ぜひ教えていただきたいです

引用返信 編集キー/
■82440 / inTopicNo.2)  Re[1]: VBを使用 条件分岐 アスキーコード
□投稿者/ 魔界の仮面弁士 (1039回)-(2017/01/10(Tue) 19:37:25)
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」と同義ですから。
引用返信 編集キー/
■82465 / inTopicNo.3)  Re[1]: VBを使用 条件分岐 アスキーコード
□投稿者/ 文字と (1回)-(2017/01/11(Wed) 12:24:43)
文字と さんの Web サイト
一般文字と同じように記入できない改行などの記述 も出来ようになります。 また、ExcelVBAでASCコードの使用方法を覚えれば





引用返信 編集キー/
■82474 / inTopicNo.4)  Re[2]: VBを使用 条件分岐 アスキーコード
□投稿者/ TTT (2回)-(2017/01/11(Wed) 13:18:32)
No82440 (魔界の仮面弁士 さん) に返信
> 『例00』という説明が曖昧なので、質問内容を再確認させてください。
 "0" "0" 10進 Shift_JIS 48,48です。

説明が不十分で、すいません。
外部の機器とPC接続してやりとりさせるプログラムを作成しようとしているのですが、機器からのレスポンスはアスキーコード2ケタもしくは3ケタで、該当する組み合わせの時はメッセージボックスを出したいのですが上手く出なかったので質問しました。
先程の解答を参考にプログラムを修正したらメッセージボックスは出せました。 最初のIFで1ケタ目を見て次のIFかcaseで2ケタ目をみるといった感じなのですが、考え方はあっているのでしょうか??
If Asc(mydata(0)) = 48 Then
Select Case (Asc(mydata(1)))
Case "48"
MsgBox("メッセージ")
Case "65"
MsgBox("メッセージ")
End Select
End If
アドバイス等よろしくお願いします。

引用返信 編集キー/
■82476 / inTopicNo.5)  Re[2]: VBを使用 条件分岐 アスキーコード
□投稿者/ TTT (3回)-(2017/01/11(Wed) 13:23:56)
No82465 (文字と さん) に返信
返信ありがとうございます。
まずは使用方法を覚えることから始めた方がいいですよね・・
ExcelVBAは、あまり使っていませんでした。 ASCコードですか 確認してみます。
引用返信 編集キー/
■82477 / inTopicNo.6)  Re[3]: VBを使用 条件分岐 アスキーコード
□投稿者/ 魔界の仮面弁士 (1044回)-(2017/01/11(Wed) 13:31:02)
No82474 (TTT さん) に返信
>>『例00』という説明が曖昧なので、質問内容を再確認させてください。
>  "0" "0" 10進 Shift_JIS 48,48です。

Dim mydata As String = "00" だというのであれば、
If mydata = "00" Then
 MsgBox("48-48のメッセージ")
ElseIf mydata = "0A" Then
 MsgBox("48-65のメッセージ")
End If

のようにも書けますし、Regex や Like を使うことも出来ますね。

文字列が ASCII 前提なら、System.Text.Encoding で As Byte() に変換すれば
数値列として処理することも出来るでしょう。



> 最初のIFで1ケタ目を見て次のIFかcaseで2ケタ目をみるといった感じなのですが、考え方はあっているのでしょうか??
mydata がどのように受け取られるのかにもよりますが、
考え方としては大きく外れてはいないかと思います。
調べるべき組み合わせが決まっているのなら、Dictionary 型を使うのも手ですね。
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ