プロが教える店舗&オフィスのセキュリティ対策術

こんばんは、
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 でループをぬけているのですが。
これを、検索ボタンを押すたびに、行と位置
が表示されるようにしたいのですが、
アドバイスおねがいします。

A 回答 (4件)

最後に該当した行を覚えておく必要がありますよね。



例)
------------------------------------
Private startIndex As Integer
(省略)
For j = startIndex To UBound(a1)
(省略)
If i <> 0 Then
startIndex=j+1 '最終行+1を確保
Exit For
End If
(省略)
-----------------------------------

startIndexの初期化のタイミングや最終行に達した場合等の処理は
考えてみてください:)
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/09/23 23:10

お使いのコードがあれば公開しても支障の無い範囲で投稿しましょう



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
といった感じでしょう ・・・
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/09/23 23:09

検索対象をスキップするように組めばいいでしょう



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ですよ

この回答への補足

回答ありがとうございます。
説明下手ですみません。

a1に以下の内容があった時
a1(0) = "四面楚歌"
a1(1) = "一石一石"
a1(2) = "石橋を渡る"
a1(3) = "石橋を渡る"
a1(4) = "四面楚歌"

楚歌で検索ボタン(クリック)をしますと
1(行)3(位置)が表示されて。
 もう一回検索ボタン(クリック)をしますと
5(行)3(位置)がでるようなことなのです。
 ボタンをおすたびに、あったときは表示されるようにしたいのです。

アドバイスいただいた方法だと、最後までいきます。
 説明下手ですみません。
よかったら おしえてください。

補足日時:2008/09/23 12:48
    • good
    • 0

???


フォーム上にボタンを置いてボタン.Clickイベント中に上記の処理を入れればいいのでは?

以下独り言
またエスパー質問だろうか・・・

この回答への補足

こんばんは、
上記の処理でやりますと。
”例”と検索をかけると、
text1.Textには 1と出力。(位置表す)
text2.Textには 1と出力。(行表す)
text3.Textには 例1と出力。

このように表示されまして
また クリック(検索ボタン)をおしても

text1.Textには 1と出力。(位置表す)
text2.Textには 2と出力。(行表す)
text3.Textには 例2と出力。
と表示されないのです。
すみません 説明不足で
よかったら アドバイスおねがいします。

補足日時:2008/09/22 23:57
    • good
    • 0

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