• 締切済み

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

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

  • プログラミングVisual Basicの質問です。

    任意の数字を入力し、Len関数とMid関数を使って2進数を10進数に変換するというプログラムを作っているのですが、うまくいきません。 コードは Dim a  As Integer Dim b  As Integer Dim i  As Integer a = Val(TextBox1.Text) For i = Len(a) To 1 Step -1 If Mid(a, Len(a), 1) = "1" Then b += 2 ^ (i - 1) End If Next Label3.Text = b    End Sub 上記のものが作ったコードです。 問題点の指摘をよろしくお願いします。

  • Excel VBA SetFocus

    環境:Excel 2002です UserForm1での質問です Flame5にTextBox14とTextBox15があります TextBox14とTextBox15のBeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)後 Flame2にあるTextBox1にSetFocusしたいのですがエラーが発生します 実行時エラー 2147467259(800004005) 異なるFlameにSetFocusする方法があるのでしょうか? Flame5の中でTextBox14及びTextBox15のSetFocusはできます TextBox14とのTextBox15のBeforeUpdateのプロシージャです Private Sub TextBox14_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean) If Len(Me.TextBox14.Text) <> 0 Then Dim a As Variant a = 100 - Val(Me.TextBox14.Text) Me.TextBox15.Text = a Dim i As Integer For i = 1 To 4 Me.Controls("TextBox" & i).Enabled = True Me.Controls("TextBox" & i).BackColor = &H80000005 '背景色(白色) Next i End If Me.TextBox1.SetFocus End Sub Private Sub TextBox15_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean) If Len(Me.TextBox15.Text) <> 0 Then Dim a As Variant a = 100 - Val(Me.TextBox15.Text) Me.TextBox14.Text = a Dim i As Integer For i = 1 To 4 Me.Controls("TextBox" & i).Enabled = True Me.Controls("TextBox" & i).BackColor = &H80000005 '背景色(白色) Next i End If UserForm1.TextBox1.SetFocus End Sub ご支援願います

  • VBのGUI 行列の和を求める

    VBのGUIです。 行列の足し算を行うプログラムをつくりたいです。 以下のプログラムはできたところまで作成しています。 □個の□行□列(□はテキストボックス)の所に例えばユーザーが3 3 3と入力したとします。 ボタン1を押すと3×3の3個個分のテキストボックスがでてきて、要素を打ち込めるようになります。 そしてユーザが要素を打ち込みます。次に要素が 1 2 1  2 1 2   2 1 2 2 1 2  1 2 1   1 2 1 1 2 1  2 1 2   1 2 1 というように入力されたとします。 ボタン2を押すと 3×3のテキストボックスが出てきて この3つの行列の和を足した 5 4 5 4 5 4 4 5 4というようにテキストボックスに表示されるようにしたいです。 3この3行3列の和だけでなく何個の何行何列の場合でもできるようにしたいです。 どのようなソースでこのプログラムはできるのでしょうか。 Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Me.Bounds = New Rectangle(10, 10, 1300, 800) Dim number As Integer Dim rows As Integer Dim columns As Integer If Not Integer.TryParse(TextBox3.Text, number) Then MessageBox.Show("数字で入力してください", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Error) Exit Sub End If If Not Integer.TryParse(TextBox1.Text, rows) Then MessageBox.Show("数字で入力してください", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Error) Exit Sub End If If Not Integer.TryParse(TextBox2.Text, columns) Then MessageBox.Show("数字で入力してください", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Error) Exit Sub End If For k = 1 To number For i = 1 To rows For j = 1 To columns Dim tb As TextBox = New TextBox() tb.Name = "R" & i.ToString() & "C" & j.ToString() & "No" & k.ToString() Me.Controls.Add(tb) tb.Top = (i - 1) * 30 + 80 tb.Left = (j - 1) * 60 + 70 * (columns * (k - 1)) + 10 tb.Width = 50 Next Next Next End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim number As Integer Dim rows As Integer Dim columns As Integer Dim r As Integer Dim n As Integer Dim m As Integer Dim sum As Double sum = 0 For n = 1 To columns For m = 1 To rows sum = 0 For r = 1 To number Next For i As Integer = 1 To rows For j As Integer = 1 To columns Dim tb As TextBox = New TextBox() tb.Name = "R" & i.ToString() & "C" & j.ToString() Me.Controls.Add(tb) tb.Top = (i - 1) * 30 + 80 tb.Left = (j - 1) * 60 + 10 tb.Width = 40 Next Next Next Next End Sub End Class

  • VB2005 図形

    VisualBasic2005で Dim n As Integer, m As Integer Dim i As Integer, j As Integer Const lenn = 1500, PAI = 3.14159 Dim th As Single, th1 As Single, th2 As Single Dim x1 As Integer, x2 As Integer Dim y1 As Integer, y2 As Integer n = Val(TextBox1.Text) m = Val(TextBox2.Text) If n < 2 Or m < 2 Then   Exit Sub End If For i = 0 To n - 1   For j = 1 To n - 1     th = j * (PAI / n)     th1 = i * (PAI / m) + th     th2 = i * (PAI / n) - th     x1 = Math.Cos(th1) * lenn + 2000     y1 = Math.Sin(th1) * lenn + 2000      x2 = Math.Cos(th2) * lenn + 2000      y2 = Math.Sin(th2) * lenn + 2000   Next Next の様なコードを使って 球をPictureBoxに書きたいのですが どこにどんなコードが足りないのでしょうか? 教えて下さい

  • VB添削

    このプログラムは 例えば3 3 4とテキストボックスに数字が打ち込まれると 3×3行列が4個分 のテキストボックスがでてきます。 ここに数字を打ち込んでいき、ボタン2を押すと3×3のテキスト トボックスが出てくると同時に足し算した結果が出てくるようにしたいです。 以下のプログラムはできたところまで作成しています。 どこを直せばよいのでしょうか。 Public Class Form1 Private number As Integer Private rows As Integer Private columns As Integer Private Sub Form11_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load For i As Integer = 1 To 3 AddHandler Me.Controls("TextBox" & i).TextChanged, AddressOf TextBox_TextChanged Next End Sub Private Sub TextBox_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) If System.Text.RegularExpressions.Regex.IsMatch(CType(sender, TextBox).Text, "[^0-9]") Then MessageBox.Show("数字で入力してください", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Error) With CType(sender, TextBox) .Text = .Text.Substring(0, .Text.Length - 1) .SelectionStart = .Text.Length End With End If Dim cnt1 As Integer Dim cnt2 As Integer Dim cnt3 As Integer If Integer.TryParse(TextBox1.Text, cnt1) And Integer.TryParse(TextBox2.Text, cnt2) And Integer.TryParse(TextBox3.Text, cnt3) Then For k = 1 To cnt3 For i = 1 To cnt1 For j = 1 To cnt2 Dim tb As TextBox = New TextBox() tb.Name = "tb" + i.ToString() Me.Controls.Add(tb) tb.Top = (i - 1) * 28 + 55 tb.Left = (j - 1) * 30 + 40 * (cnt2 * (k - 1)) + 10 tb.Width = 25 Next Next Next End If End Sub Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.Bounds = New Rectangle(10, 10, 1350, 800) Me.AutoScroll = True End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim sum As Double Dim cnt As Integer = 0 For i As Integer = 1 To rows For j As Integer = 1 To columns Dim tb As TextBox = New TextBox() cnt += 1 : If cnt > rows * columns Then cnt = 1 tb.Name = "tb" + cnt.ToString Me.Controls.Add(tb) tb.Top = (i - 1) * 30 + (80 + 40 * rows) tb.Left = (j - 1) * 60 + 10 tb.Width = 40 sum = 0 For k As Integer = 1 To number sum += Double.Parse(CType(Me.Controls("tb" + (cnt + (rows * columns * (k - 1))).ToString()), TextBox).Text) Next tb.Text = sum.ToString() Next Next End Sub Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged End Sub Private Sub TextBox2_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox2.TextChanged End Sub Private Sub TextBox3_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox3.TextChanged End Sub End Class

  • VBA

    ExcelのVBAについて質問です。 1000以下の任意の整数nを画面入力から読み込んで、1+2+3+4+・・・+nの合計値をセルA1に表示させたいのですが、1とnの和が足されてしまいます。 どこがおかしいのでしょうか? 指摘お願いします。 以下テキストです。 スペースなどは気にせずテキストの部分でご指摘お願いします Sub ()   Dim i As Integer Dim n As Integer n = Application.InputBox(Prompt:="1000以下の整数を入力してください", Type:=1) If n <= 1000 Then For i = 1 To n iResult = i + 1 Cells(1, 1) = iResult Next i End Sub よろしくおねがいします。

  • 文字の判定について質問です

    Visual Basicについての質問です。 私は、"Textbox1"に"gakuban"で宣言した文字を入力すると、"Textbox2"に"simei"で宣言した名前を表示させ、それ以外の文字が入力されたらメッセージボックスで"違います"が表示されるプログラムを作りたいと思い、下のようなプログラムを組みました。しかしこれだと、"Textbox1"に文字を1文字入力するたびに"違います"のメッセージボックスが表示されてしまいます。これを直したいのですが、どのようにプログラムを直せばいいのか分かりません。なので、この下のプログラムをどう直せばいいのか教えていただけないでしょうか? Public Class Form1 Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged Dim gakuban() As String = {"H05001", "H05002", "H05004", "H06007", "H05009"} Dim simei() = {"一郎", "次郎", "三郎", "四郎", "五郎"} Dim i As Integer i = (Array.IndexOf(gakuban, TextBox1.Text)) If i >= 0 Then TextBox2.Text = simei(i) Else MessageBox.Show("違います") End If End Sub End Class

  • asp.net 計算式について

    お世話になります FormView1内にあるテキストボックス内の計算をさせたいのですが FormView1のTEXTBOXが見当たらず困っています 環境visualstudio2005standard sql web VB 書籍を購入して下記を作成しました。通常なら下記で動作確認は出来ました。 Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Dim intnyuukin As Integer Dim intsiharai As Integer Dim intgoukei As Integer intnyuukin = Val(TextBox1.Text) intsiharai = Val(TextBox2.Text) intgoukei = intnyuukin - intsiharai TextBox3.Text = intgoukei End Sub で合計が計算されのですがFormView1内にあるばあいTextBox1、TextBox2が見当たらないみたいで 宣言させていませんと怒られます。 構成はMultiView1、View1にGridView選択で View2へ移動させてFormViewを表示させて頂いております。 分かる方宜しくお願い申し上げます

  • エラー時カーソルを戻したいのですが?

    エクセルVBAに入出荷(在庫管理)を作成しているのですが テキスト1に品番を入力して品番が無かった場合 テキスト1などを空白にしてテキスト1にカーソルを 戻したいのですが下記のように書き込むとテキスト2に カーソルが行ってしまいます。どこを直せばいいでしょうか? Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) Dim i As Integer If KeyCode = 13 Then For i = 4 To 400 If Sheets("倉庫在庫(記入用)").Cells(i, 1) = TextBox1 Then Label6 = Sheets("倉庫在庫(記入用)").Cells(i, 4) Label7 = Sheets("倉庫在庫(記入用)").Cells(i, 5) TextBox2.SetFocus Exit Sub End If Next i MsgBox "品番がありません!" TextBox1 = "" Label6 = "" Label7 = "" End If TextBox1.SetFocus End Sub

  • ユーザーフォームのTextBoxの操作について

    皆様、こんにちは。 いつもお世話になっております。 ユーザーフォームのテキストボックスに何も入力されていないと自動的に0が表示されるようにしたいですが、エラーが出てしまいます。 具体的に、 1テキストボックス 2テキストボックス ・・・ 合計テキストボックス があって、詳細が分からなくて合計のテキストボックスにのみ入力する時に、合計テキストボックスをクリックしたときにその他のボックスに0が表示されるように書きたいです。 Private Sub TextBox9_Enter() Dim i As Integer For i = 1 To 8 If TextBox(i).Text = "" Then TextBox(i).Text = "0" End If Next i End Sub のように考えましたが、間違っていますね。 教えていただければ幸いです。 どうぞよろしくお願いいたします。