2017-01-11 7 views
0

私はこのマクロを実行すると、範囲A1:Z20の単語 "needle"の列と行が表示されます。複数の単語 "針"がある場合、それは最後のものだけを出力します。このコードを変更して、最初の単語が表示されるようにするにはどうすればよいですか?VBA - 範囲内の最初の繰り返し単語を検索する

希望これは理にかなって、そしてここで、これまでに私のコードです:

Sub NeedleSearch() 
Dim SearchSpace As Variant 
Dim found As Boolean 
found = False 
SearchSpace = Range("A1:z20").Value 
Dim i As Integer, j As Integer 
For i = 1 To 20 
    For j = 1 To 26 
     If SearchSpace(i, j) = "needle" Then 
      Range("A25").Value = "Column " & j 
      Range("B25").Value = "Row " & i 
      found = True 
     End If 
    Next j 
Next i 
If found = False Then 
    Range("A25").Value = "needle not found" 
    Range("B25").Value = " " 
End If 
End Sub 

With No Repeated Words With 1 Repeated Word

+1

は、後に '出口For'を追加します。 'found = True' –

+0

または' do until loop'を実行します。 'do .... until until found = true' –

答えて

1

あなただけの最初occurenseが必要な場合は、ちょうどあなたのループを終了します!さらに詳述すると

Sub NeedleSearch() 
    Dim SearchSpace As Variant 
    Dim found As Boolean 
    found = False 
    SearchSpace = Range("A1:z20").Value 
    Dim i As Integer, j As Integer 
    For i = 1 To 20 
     For j = 1 To 26 
      If SearchSpace(i, j) = "needle" Then 
       Range("A25").Value = "Column " & j 
       Range("B25").Value = "Row " & i 
       found = True 
      End If 
      If found Then _ 
        Exit For 
     Next j 
     If found Then _ 
       Exit For 
    Next i 
    If found = False Then 
     Range("A25").Value = "needle not found" 
     Range("B25").Value = " " 
    End If 
End Sub 
+0

Aaah!どうもありがとうございました。 – Reety

0

:B25:needleの複数のインスタンスが存在する場合、このコードは実際には、何がそれがA25に見られる細胞のすべてのインスタンスを印刷します、です。たとえば、needleという3つのインスタンスがあるとします。 A1、B2、およびC3にある。あなたのループはA1をA25:B25に、次にB2を、次にC3に印刷します。それは非常に速く起こっているので、あなたはC3か、あなたが「最後の出来事」と呼んだものだけを見ます。

あなたはこのような何かにあなたのコードを変更することができます(私はあなたが最後にやろうとしている推測している何をしている)すべてソリューションをプリントアウトするために何ができるか:

Sub NeedleSearch() 
Dim SearchSpace As Variant 
Dim found As Boolean 
found = False 
SearchSpace = Range("A1:z20").Value 
Dim ws As Worksheet 
Dim i As Integer 
Dim j As Integer 
Dim k As Integer 

Set ws = ThisWorkbook.Sheets(1) 
k = 25 

For i = 1 To 20 
    For j = 1 To 26 
     If SearchSpace(i, j) = "needle" Then 
      ws.Cells(k, 1).Value = "Occurence " & k - 24 
      ws.Cells(k, 2).Value = "Column " & j 
      ws.Cells(k, 3).Value = "Row " & i 
      k = k + 1 
      found = True 
     End If 
    Next j 
Next i 
If found = False Then 
    ws.Range("A25").Value = "needle not found" 
End If 
End Sub 

それに応じてSheetのIDを変更してください。

HTH

+0

すごく、ありがとう!私もこれも必要でした:) – Reety

+0

素晴らしい、これを聞いて幸せ。しかし、いずれかの回答に正しいとマークして、質問に「既に回答済み」と表示されているようにしてください。 Cheerio :) –

0

あなたはRangeオブジェクトのFind()法によりループを回避することができ、次のよう

Option Explicit 

Sub NeedleSearch() 
    Dim f As Range 

    Set f = Range("A1:Z20").Find(what:="needle", LookIn:=xlValues, lookat:=xlWhole, After:=Range("Z20"), SearchOrder:=xlByRows) 
    If f Is Nothing Then 
     Range("A25").Value = "needle not found" 
     Range("B25").Value = " " 
    Else 
     Range("A25").Value = "Column " & f.Column 
     Range("B25").Value = "Row " & f.Row 
    End If 
End Sub 

も書き換えることができます。

Sub NeedleSearch() 
    Dim f As Range 
    Dim arr As Variant 

    Set f = Range("A1:Z20").Find(what:="needle", LookIn:=xlValues, lookat:=xlWhole, After:=Range("Z20"), SearchOrder:=xlByRows) 
    If f Is Nothing Then 
     arr = Array("needle not found", " ") 
    Else 
     arr = Array("Column " & f.Column, "Row " & f.Row) 
    End If 
    Range("A25:B25").Value = arr 
End Sub 
関連する問題