アプリ版:「スタンプのみでお礼する」機能のリリースについて

宜しくお願い致します。
タイトルどおりなのですが・・・配列宣言したものを一気に参照して合致する物があるかどうかをチェックする方法は無いでしょうか??
現在のコードは以下のようになっています。

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim no() As Integer = {11, 12, 13, 14, 15, 16, 17, 18, 19, 20}
Dim table() As Integer = {15800, 11980, 25980, 19800, 219800, 35600, 65800, 73260, 119800, 24780}
Dim a, b, c, i As Integer
a = Val(TextBox1.Text)
b = Val(TextBox2.Text)
P1:
For i = 0 To no.Length - 1
If no(i) = a Then
c = i
Exit For
Else
Do
MsgBox(Prompt:="規定値外です。", Title:="エラー")
a = Val(InputBox(Prompt:="商品番号を再入力")) '未入力の場合“0”を返す
If a = 0 Then
Exit Sub 'inputboxが未入力等の場合は終了
End If
GoTo P1 '“0”以外の数字が入力された場合は“P1”へ
TextBox1.Text = a 'テキストボックス1にも現在の“a”の値が反映されるように
Loop
End If

Next


Label4.Text = table(c)
Label5.Text = table(c) * b
End Sub

現状の場合for~next内にゴチャゴチャ分岐処理をさせるようになりnextにたどり着く前にforのところに戻す形になっているのでnoで宣言している中でも11だけにしか反応しない状態となっています。

どこかでnoで宣言している物を一気に参照して合致する物が無いかどうかを調べることができるようでしたら、このような状態にならないで済むのではないかと思っていますが、プログラミングを勉強し始めたばかりなのでいい方法に関して見当がつきません。

どなたか良きアドバイスをお願い致します。

A 回答 (5件)

あ…スミマセンANo.4ですが、言語は微妙に違いますがDictionaryの事は既に書かれてますね(汗)


.NETだと標準的にDictionaryクラスがあります。
VBSは分かりませんが、VB6あたりでもScripting機能を参照設定する事で
一応Dictionaryは使えますね。
    • good
    • 0

えーと、厳密に細かい内容は見てないですが…


.NET系だったら、いっそ配列使わないでDictionaryを使った方が楽な気がしますが
どうでしょう?(.NETの全バージョンで使えましたよね、確か)
パッと見、Key+Valueのデータっぽいですし、一発検索できますよ。
細かい事はヘルプでDictionaryを探して下さい。
    • good
    • 0

質問の意図など判りにくいが、


有る数(や文字列)が、ある集合(配列のカタチにあるとして)の中の要素にあるかどうか(要素の何番目に有るか)、一発で調べたいのだろうが、一発というのが(プログラムコード)表現上の問題で、そういうサブルーチンやメソッドなどを、探索アルゴリズムで作らないと出来ません。これが一発で出来れば、みんな苦労しない。そのために色々な構造が考えられている。
作るのは言語処理系作成者や自作でもよいわけだが、
高級言語レベルで出来るのはそろそろ現れている。
例えばVBScriptで
set myDic =Createobject("Scripting.Dictionary")
myDic.Add "黄色", "まくわ"
myDic.Add "赤", "スイカ"
myDic.Add "緑", "きゅうり"
myDic.Add "紫", "ナス"
x="緑"
If myDic.Exists(x) Then
MsgBox "このキーは存在します。"
Msgbox myDic.item(x)
Else
MsgBox "このキーは存在しません。"
End If
ーー
以上をメモ帳に貼り付け、例えば dic1.vbsというファイル名でデスクトップ保存する。
アイコンをクリックで実行される。
これは検索を簡単一発でスムーズに実行しているようだが、ウラでプログラムで相当な処理をしている。
言いたいことは判ってもらえたでしょうか。
他に#2のご回答で言われている、
http://homepage1.nifty.com/rucio/main/dotnet/Sam …
やJavaにも出来ているようです。
http://d.hatena.ne.jp/oda_susu/20080206/1202313189
    • good
    • 0

入力値があるかどうかチェックなら


VB2002以降なのであれば ・・・
Array.IndexOfでチェック可能なように思います

dim a,b,c as Integer
if Integer.TryParse( TextBox1.text, a ) then
  c = Array( no, a )
  if c == -1 then
    MsgBox "規定値ではありません"
    exit sub
  end if
  if Integer.TryParse( TextBox2.Text, b ) = false then
    MsgBox "整数値ではありません"
    exit sub
  end if
  label4.Text = table(c)
  label5.Text = table(c) * b
else
  MsgBox "整数値ではありません"
end if

といった具合で … 必要な箇所を適宜修正してください
    • good
    • 0

まず、前提を確認させてください。


これはどのバージョンのVisual Basicなのでしょうか?

次に、このコードでどんな動作を期待しているのでしょうか?
提示していただいたコードをコピーさせていただき動作を確認しましたが、1つでも条件に一致すると、終了するようになっています。
1回で終了するだけでなく、入力箇所と出力箇所から考えて、1つのデータにしか対応していないようです。

また、これは1回しかOKパターンが実施されないという点と関係があり、質問者さんもお気づきになっているようですが、For文を使う必要がなくなっています。
OKパターンではFor文を抜け出していますし、NGパターンでもSubを抜け出すか、GoTo文でFor文の頭に舞い戻っているので、繰り返しが発生しません。


とりあえず、2番目の『どんな動作を期待しているのか?』を教えていただければ、他の方からも何らかのアドバイスを出しやすくなると思います。
    • good
    • 0

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