vb配列の再検索について

このQ&Aのポイント
  • vbで配列を検索し、見つかった場合に行と位置を表示する方法について質問です。
  • 現在は一回目の検索はできますが、ボタンを押すたびに再検索する方法や表示を切り替える方法についてアドバイスをお願いします。
  • また、vbでの配列操作に関しても教えていただけると助かります。
回答を見る
  • ベストアンサー

vb 配列の再検索について

こんばんは、 vbで悩んでいます。  配列の検索で、みつかったら、行と位置を出力する でた結果の次の行から 再検索する ということをしたいのですが。 一回目の検索はできるのですが、ボタンをおしたら つづいて 検索できるようにしたいのです。 できたら、アドバイス等おねがいいたいします。 Dim i,r,j As Integer Dim a1() As String Dim a2 As String a2 = Text.Text For j = LBound(a1) To UBound(a1) r = r + 1 i = a1(j).IndexOf(a2, 0) Do Until i <> 0 text1.Text = Val(i + 1)  i = a1(j).IndexOf(a2, i + 1) text2.Text = r  text3.Text = a1(j) If i <> 0 Then Exit For End If Loop Next a1に以下の内容があった時 a1(0) = "例1" a1(1) = "例2" a1(2) = "例3" ”例”と検索をかけると、 text1.Textには 1と出力。(位置表す) text2.Textには 1と出力。(行表す) text3.Textには 例1と出力。 exit for でループをぬけているのですが。 これを、検索ボタンを押すたびに、行と位置 が表示されるようにしたいのですが、 アドバイスおねがいします。

質問者が選んだベストアンサー

  • ベストアンサー
  • KG_
  • ベストアンサー率62% (34/54)
回答No.3

最後に該当した行を覚えておく必要がありますよね。 例) ------------------------------------ Private startIndex As Integer (省略) For j = startIndex To UBound(a1) (省略) If i <> 0 Then startIndex=j+1 '最終行+1を確保 Exit For End If (省略) ----------------------------------- startIndexの初期化のタイミングや最終行に達した場合等の処理は 考えてみてください:)

bi_bi_
質問者

お礼

 アドバイスありがとうございました^^

その他の回答 (3)

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

お使いのコードがあれば公開しても支障の無い範囲で投稿しましょう Array.FindIndexと前回発見した位置を記憶しておいてということでしょうか Formレベルの変数に dim sTag as String    ' 検索する文字列 Dim nStart as Integer  ' 検索開始位置 Private Function myFindFunc( byVal ss as String) as Boolean   return ( ss.IndexOf( sTag ) > -1 ) End if を記述して、ボタンのクリックイベントに dim r,i as integer sTag = Text.Text TextBox1.Clear() TextBox2.Clear() TextBox3.Clear() r = Array.FindIndex( a1, nStart, AddressOf myFindFunc ) if r > -1 then   TextBox1.Text = a1(r).IndexOf( sTag ) + 1   TextBox2.Text = r + 1   TextBox3.Text = a1(r) end if nStart = r + 1 といった感じでしょう ・・・

bi_bi_
質問者

お礼

アドバイスありがとうございました^^

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

検索対象をスキップするように組めばいいでしょう a2 = Text.Text Intger.TryParse( TextBox2.Text, r ) i = 1 j = r for each ss as string in a1   if j > 0 then     j -= 1     Continue For   end if   i = ss.IndexOf( a2 )   r += 1   if i > -1 then     TextBox1.Text = i+1     TextBox2.Text = r     TextBox3.Text = ss   end if next VB.NET2003以前なら for each ss as string in a1   if j > 0 then     j -= 1   else     i = ss.IndexOf( a2 )     r += 1     if i > -1 then       TextBox1.Text = i+1       TextBox2.Text = r       TextBox3.Text = ss     end if   end if next といった具合でしょう String.IndexOfで見つからなかった場合の値は -1ですよ

bi_bi_
質問者

補足

回答ありがとうございます。 説明下手ですみません。 a1に以下の内容があった時 a1(0) = "四面楚歌" a1(1) = "一石一石" a1(2) = "石橋を渡る" a1(3) = "石橋を渡る" a1(4) = "四面楚歌" 楚歌で検索ボタン(クリック)をしますと 1(行)3(位置)が表示されて。  もう一回検索ボタン(クリック)をしますと 5(行)3(位置)がでるようなことなのです。  ボタンをおすたびに、あったときは表示されるようにしたいのです。 アドバイスいただいた方法だと、最後までいきます。  説明下手ですみません。 よかったら おしえてください。

回答No.1

??? フォーム上にボタンを置いてボタン.Clickイベント中に上記の処理を入れればいいのでは? 以下独り言 またエスパー質問だろうか・・・

bi_bi_
質問者

補足

こんばんは、 上記の処理でやりますと。 ”例”と検索をかけると、 text1.Textには 1と出力。(位置表す) text2.Textには 1と出力。(行表す) text3.Textには 例1と出力。 このように表示されまして また クリック(検索ボタン)をおしても text1.Textには 1と出力。(位置表す) text2.Textには 2と出力。(行表す) text3.Textには 例2と出力。 と表示されないのです。 すみません 説明不足で よかったら アドバイスおねがいします。

関連するQ&A

  • VB2005 配列から要素を検索する方法

    VB2005入門者です。 配列の中要素を検索し、一致すれば処理を行うというプログラムを組みたいのですがうまくいきません。 1列目hoge_nameと2列目hoge_noが既に配列に代入してあり 0列目 POINT と1列目hoge_name[AやB]と2列目hoge_no[A00~A03]が一致した場合、3列目のhoge_id(0)からhoge_id(17)に格納したいのです。 hoge.txtは BEBE,A,A00  ,ABC POINT,A,A00  ,ABC POINT,A,A01 ,DEF POINT,B,A02 ,ABC ETC,A,A03   ,GHI POINT,B,A03  ,GHI POINT,A,A03  ,GHI といった感じで、スペースが不特定数混じったカンマ区切りテキストです。 以下で実行すると6行目の3列目でA04を探してしまい、6行目の情報をとってくれません。 hoge_no配列に含まれる文字列から検索し、一致した場合に処理できれば解決するのでは、と思いましたが。Allay.indexOfを試したりしましたがうまくいきませんでした。アドバイス頂きたいのでどなたかよろしくお願いします。 Dim reader1 As New System.IO.StreamReader(geo_name, System.Text.Encoding.Default) Dim i As Long = 0 Dim j As Long Dim answer() As String ReDim answer(0 To 0) Do Until reader1.EndOfStream line = reader1.ReadLine() If (line.Contains("POINT")) Then field = line.Split(",") answer(i) = Trim(field(1)) + "," + (field(2).Trim) + "," + (field(7)) If (field(1).Trim = hoge_name(i) = True And field(2).Trim = hoge_no(i)) = True Then hoge_id(i) = field(7) i = i + 1 ReDim Preserve answer(0 To i) ReDim Preserve hoge_id(0 To i) End If End If Loop For j = 0 To UBound(answer, 1) - 1 reader.Close() Next

  • 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

  • VB バリアント型の配列の例について

    長々と失礼します。私の使用している教科書に 「バリアント型の2次元配列」と「バリアントに2次元配列を代入」というのを組み合わると「行列i要素とする行列」たとえば 2 5 9 4 1 8 7 3 6 1 5 9 8 0 1 6を的確に表現できます。 と書いており、下のように書かれているのですが上のような配列を表示しません。どこが間違っているのでしょうか?そもそも上のように表示できるのか理解に苦しんでおります Option Base 1 Private Sub Command1_Click() Dim a(2,2) As Variant Dim c(2,2) As Integer For i = 1 To 2 For j = 1 To 2 For p = 1 To 2 For q = 1 To 2 c(p,q) = p + q + i * j Next q Next p a(i,j) Next j Next i For i = 1 To 2 For p = 1 To 2 For j = 1 To 2 For q = 1 To 2 Print a(i,j)(p,q), Next q Next j Print Next p Next i End Sub

  • EXCEL VBA 配列変数の値すべてを返すには

    EXCELは2002ですが、97でも動くと嬉しいです。 《質問》 1~10をランダムに並べるためのプログラムを書きました。 これはこれで動くのですが、一行(3行目)だではなく 4行目にも、5行目にも同じことをしたい場合、 バブルソートの部分をサブルーチン(関数)にしたいのですが X_v() = GetSortArray(n_s,n_v)()とはできません。.cloneもだめですよね。 かといって、要素毎に引くとその度にRndが効いて、1~10が並びません。 どのようにやるのが、スマートなのでしょうか?よろしくお願いします。 《以下プログラム》 Sub Bu_Click() Dim i As Integer Dim j As Integer Const n_e = 10 Const n_s = 1 Dim X_r(n_e) As Long Dim X_v(n_e) As Long Dim temp1 As Long Dim temp2 As Integer Randomize For i = n_s To n_e X_r(i) = Int(Rnd * 10 ^ 9) X_v(i) = i Next i For i = n_s To n_e - 1 For j = n_s To n_e - 1 If X_r(j + 1) < X_r(j) Then temp1 = X_r(j + 1) X_r(j + 1) = X_r(j) X_r(j) = temp1 temp2 = X_v(j + 1) X_v(j + 1) = X_v(j) X_v(j) = temp2 End If Next j Next i For i = 0 To n_e - 1 Cells(3, 3 + i).Value = X_v(i + 1) Next i End Sub Public Function GetSortArray(s As Integer, e As Integer) As Long() Dim r() As Long Dim v() As Long Dim temp1 As Long Dim temp2 As Integer ReDim r(e) ReDim v(e) Randomize For i = s To e r(i) = Int(Rnd * 10 ^ 9) v(i) = i Next i For i = s To e - 1 For j = s To e - 1 If r(j + 1) < r(j) Then temp1 = r(j + 1) r(j + 1) = r(j) r(j) = temp1 temp2 = v(j + 1) v(j + 1) = v(j) v(j) = temp2 End If Next j Next i GetSortArray = v() End Function ありゃ?Tabのスペース消えますね。

  • リストボックス内を検索(VB6.0)

    お世話になっています。 リストボックス内に表示したデータを検索するプログラムを作っています。 Private Sub txtName_Change()  Dim i As Integer  For i = 0 To List1.ListCount - 1   If List1.List(i) Like "*" & txtName.Text & "*" Then    List1.ListIndex = i    Exit For   End If  Next i End Sub という感じで、あいまい検索をしています。 検索結果は上手く取得できたのですが、 例えばテキストボックスに「井上」と入力して検索した場合 「上井」というように、 テキストボックスの内容が変わってしまいます。 同じコードを他の場所でも使用しているのですが、 そちらでは問題なく「井上」と表示されたままになっています。 きちんとテキストボックスの中身が「井上」のままでいるには どうしたらよいのでしょうか… 宜しくお願い致します。

  • ExcelVBAで行と列の検索

       A  B  C  D  E 1  コード あ  い  う  え 2  10  ○    ○ 3  20     ○  ○ 4  30          ○ 上記の表が5000件あります。Textbox1に入力し検索ボタンを押すと A列のコードを検索して一致する列の○のあるところの1行目の項目 をtextbox2に表示したいのですがうまく行きません。 よろしくお願い致します。 Private Sub CommandButton1_Click() '検索フォームボタン Dim i As Long Dim 最終行 As String Dim サーチ行 As Long Sheets(1).Activate 最終行 = Range("A1").End(xlDown).Row サーチ行 = 0 For i = 2 To 最終行 If TextBox1.Value = Range("A" & i) Then If Range("B" & i, "N" & i) = "" Then TextBox2.Text = Range("B1", "N1") サーチ行 = i Exit For End If End If Next If サーチ行 = 0 Then MsgBox TextBox1.Value & "データはありません。", vbInformation, "無し" End If TextBox1.SetFocus End Sub エラーはでません。データはありませんとなります。  

  • VB2005 初心者です。

    文書中の番号を振りなおしたいのですが、やり方がよく分かりません。 Dim a As String=textbox1.text Dim b As Integer=a.IndexOf("【作品番号") Dim c As String=a.Substring(b,5) Dim d As Integer=c.Length Do While b <> -1 b=a.Indexof("【作品番号",b+1) d=d+5 Loop Dim f As Integer=Cstr((d-5)/5) Dim g As Integer=0 g=g+1 For h As Integer=1 To f Dim i As String=textbox1.text.Replace("【作品番号","【作品番号" & h & "】") Next 最初のループまでで文章中に【作品番号*】がいくつあるかを調べて、(f回)その回数文だけまたループを回して番号を振りたいのですが、何もおきません。 本当に初心者なので、皆さんが見たらありえない構文かも知れませんが、ご教授願います。。。 ちなみに、作品番号は2桁3桁にもなることもあり、全角の数字にしたいのです。 よろしくお願い致します。

  • 検索 マクロ

    本を見ながら作ったのですが 検索してくれるのですが A列を検索してくれるのですが検索したいのは B列の4番目から下にあるだけ検索したいのですが どういじればいいのでしょうか? Option Explicit Private lastRow As Long Private Index As Integer Private Sub UserForm_Activate() Dim i As Long lastRow = Worksheets("顧客情報").Cells(Rows.Count, 1).End(xlUp).Row + 1 If lastRow <= 3 Then MsgBox "データがありません。" Exit Sub End If For i = 3 To lastRow 名前リストボックス.AddItem Cells(i, 1) Next End Sub Private Sub 検索ボタン_Click() Dim searchName As String searchName = 検索名前テキストボックス.Text If searchName = "" Then MsgBox "検索する名前を入力してください。" Else Dim i As Long Dim no As Long For i = 0 To 名前リストボックス.ListCount - 1 If 名前リストボックス.List(i) = searchName Then no = i 名前リストボックス.ListIndex = no Exit For ElseIf i >= 名前リストボックス.ListCount - 1 Then MsgBox "該当なし。" Exit For End If Next Index = no + 3 Rows(Index).Select End If End Sub

  • 【VB2005】です。txtファイルを配列に読み込もうとしています。

    45*45のtxtデータを配列に読み込もうとしているのですが、エラーが出ます。なぜでしょうか? 宜しくお願いします。 【VB2005を使っています。】 Private Sub OpenButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OpenButton1.Click Dim selectButton As DialogResult Dim filename As String Dim i, j As Integer \'開く ダイアログの表示 selectButton = DBOpenDialog1.ShowDialog() filename = DBOpenDialog1.FileName If selectButton = Windows.Forms.DialogResult.OK Then Dim sr As System.IO.StreamReader = Nothing Dim readFields() As String i = 0 sr = New System.IO.StreamReader(filename, System.Text.Encoding.Default) Do Until sr.EndOfStream readFields = sr.ReadLine().Split(\",\") For j = 0 To 44 Tests1(i, j) = readFields(j) Next j i += 1 Loop sr.Close() End If End Sub

  • VB2010でのコントロール多次元配列について

    教えてください。 実行中にコントロールを生成したいのですが、 Public Class Form1  Private myTxt(,) As System.Windows.Forms.TextBox  Me.myTxt = New System.Windows.Forms.TextBox(59, 2) {}  Dim i As Integer  Dim j As Integer  Dim h As Integer  Dim p As Integer  h = 10  p = 100  For i = 0 To Me.myTxt.GetLength(0) - 1   For j = 0 To Me.myTxt.GetLength(1) - 1    Me.myTxt(i, j) = New System.Windows.Forms.TextBox    Me.myTxt(i, j).Name = "myTxt" + i.ToString() + j.ToString()    Me.myTxt(i, j).Size = New Size(100, 30)    Me.myTxt(i, j).Location = New Point(p, h)    p = p + 100   Next j   h = h + 30  Next i  Me.myPnl.Controls.AddRange(Me.myTxt) と書くと最後の行が波線になり、 “型 'System.Windows.Forms.TextBox の 2 次元配列' の値を 'System.Windows.Forms.Control' に変換できません。”とエラーになります。 これはAddRangeは多次元配列に使用できないということなのでしょうか? 色々検索してみましたが、コントロールの生成に関する多次元配列が見つけられずに 困っていました。 最後のAddRange(Me.myTxt)をAdd(Me.myTxt(i,j))などと変えたりしても別のエラーになり、 基本的に間違っている気がしますがどこだかがわかりません。 詳しい方、宜しくお願い致します。

専門家に質問してみよう