• 締切済み

配列宣言したものを一気に参照して合致する物があるかどうかをチェックする方法は無いでしょうか??

宜しくお願い致します。 タイトルどおりなのですが・・・配列宣言したものを一気に参照して合致する物があるかどうかをチェックする方法は無いでしょうか?? 現在のコードは以下のようになっています。 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で宣言している物を一気に参照して合致する物が無いかどうかを調べることができるようでしたら、このような状態にならないで済むのではないかと思っていますが、プログラミングを勉強し始めたばかりなのでいい方法に関して見当がつきません。 どなたか良きアドバイスをお願い致します。

みんなの回答

回答No.5

あ…スミマセンANo.4ですが、言語は微妙に違いますがDictionaryの事は既に書かれてますね(汗) .NETだと標準的にDictionaryクラスがあります。 VBSは分かりませんが、VB6あたりでもScripting機能を参照設定する事で 一応Dictionaryは使えますね。

回答No.4

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

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.3

質問の意図など判りにくいが、 有る数(や文字列)が、ある集合(配列のカタチにあるとして)の中の要素にあるかどうか(要素の何番目に有るか)、一発で調べたいのだろうが、一発というのが(プログラムコード)表現上の問題で、そういうサブルーチンやメソッドなどを、探索アルゴリズムで作らないと出来ません。これが一発で出来れば、みんな苦労しない。そのために色々な構造が考えられている。 作るのは言語処理系作成者や自作でもよいわけだが、 高級言語レベルで出来るのはそろそろ現れている。 例えば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/Samples/Sample050SearchArray.htm やJavaにも出来ているようです。 http://d.hatena.ne.jp/oda_susu/20080206/1202313189

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

入力値があるかどうかチェックなら 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 といった具合で … 必要な箇所を適宜修正してください

  • Gab_km
  • ベストアンサー率40% (20/50)
回答No.1

まず、前提を確認させてください。 これはどのバージョンのVisual Basicなのでしょうか? 次に、このコードでどんな動作を期待しているのでしょうか? 提示していただいたコードをコピーさせていただき動作を確認しましたが、1つでも条件に一致すると、終了するようになっています。 1回で終了するだけでなく、入力箇所と出力箇所から考えて、1つのデータにしか対応していないようです。 また、これは1回しかOKパターンが実施されないという点と関係があり、質問者さんもお気づきになっているようですが、For文を使う必要がなくなっています。 OKパターンではFor文を抜け出していますし、NGパターンでもSubを抜け出すか、GoTo文でFor文の頭に舞い戻っているので、繰り返しが発生しません。 とりあえず、2番目の『どんな動作を期待しているのか?』を教えていただければ、他の方からも何らかのアドバイスを出しやすくなると思います。

関連するQ&A