2016-10-14 2 views
0

だから私は検索することができますが、私はループに問題を抱えている、ここではいくつかのコンテキストの例です:私がする必要があるいくつかのことがありますペースト、各試合各行の検索 - エクセルVBAを

Sub Find_First() 
Dim FindString As String 
Dim Rng As Range 
FindString = InputBox("Enter a Search value") 
If Trim(FindString) <> "" Then 
With Sheets("DCCUEQ").Range("1:20") 'searches all of rows 1 to 20 
    Set Rng = .Find(What:=FindString, _ 
        After:=.Cells(.Cells.Count), _ 
        LookIn:=xlValues, _ 
        LookAt:=xlWhole, _ 
        SearchOrder:=xlByRows, _ 
        SearchDirection:=xlNext, _ 
        MatchCase:=False) 
    If Not Rng Is Nothing Then 
     Application.Goto Rng, True 'value found 
     MsgBox ("Value Found" & Rng) 
    Else 
     MsgBox "Nothing found" 'value not found 
    End If 
End With 
End If 
End Sub 

行うこの

FINDSTRINGが行にある場合は、コピーして(から:F)、その行を貼り付ける行5
から始まるシート3に、その行の残りの部分をスキップし、DCCUEQ
に次の行を検索 チェックし、要件が満たされている場合は、以前に貼り付けられた行(Sheet3上)の下に貼り付けます。
ループこの何も情報が行

に見つからなくなるまで私はロジック

に従うことによって、非常に簡単に残りの部分を行うことができ、コードのこの部分を埋めるには、いくつかのわずかな援助を得ることができますので、もしそれが大きなプログラムの一部であり、

答えに私を助けるための情報への助けや指示があれば幸いです。

+0

「私は問題がある」と言うとき、あなたは何を問題にしていますか?あなたのコードに問題が発生した行を与えることができれば、それはより簡単になります – Zac

答えて

2

フォーマットをコピーしたい場合があるので、Findで固定してください。ノートRng0は、見つけたときに無限ループを回避することです。

Sub Find_First() 

Dim Rng As Range 
Dim Rng0 As Range 
Dim NextRow As Integer 
Dim FindString As String 
FindString = InputBox("Enter a Search value") 

Dim dest As Worksheet 
Set dest = Worksheets("Sheet3") 

If Trim(FindString) <> "" Then 
    With Sheets("DCCUEQ").Range("1:20") 
     Set Rng0 = .Find(What:=FindString, _ 
       After:=.Cells(.Cells.Count), _ 
       LookIn:=xlValues, _ 
       LookAt:=xlWhole, _ 
       SearchOrder:=xlByRows, _ 
       SearchDirection:=xlNext, _ 
       MatchCase:=False) 
     NextRow = 5 
     Set Rng = Rng0 
     While Not Rng Is Nothing 
     .Range(.Cells(Rng.Row, 1), .Cells(Rng.Row, 6)).Copy dest.Range(dest.Cells(NextRow, 1), dest.Cells(NextRow, 6)) 
     NextRow = NextRow + 1 
     Set Rng = .Find(What:=FindString, _ 
        After:=Rng, _ 
        LookIn:=xlValues, _ 
        LookAt:=xlWhole, _ 
        SearchOrder:=xlByRows, _ 
        SearchDirection:=xlNext, _ 
        MatchCase:=False) 
     If Rng.Address = Rng0.Address Then Set Rng = Nothing 
     Wend 

    End With 
End If 

End Sub 
+0

ありがとう、完璧な答え。遅延、申し訳ありません週末のために申し訳ありません。 – Savagefool

+0

余分なフォーマットの考慮事項、無限ループ防止とコードのスピードのための最善の答えとして選ばれました。 – Savagefool

3

私は、2つのループ(列用と行用)を使用すると、あなたの文脈で完全に機能すると思います。

アドレスに2つの変数を含むセルを設定し、それを自分の文字列と比較します。同じ場合は、列のループをコピー/ペーストして終了し、残りの行をスキップします。

Sub Find_First() 

Dim FindString As String 
Dim Rng As Range 
FindString = InputBox("Enter a Search value") 

    If Trim(FindString) <> "" Then 

     With Sheets("DCCUEQ") 

      Dim s3r As Integer, i As Integer, j As Integer 
      s3r = 4 'this would determine the row in Sheet3 

      For i = 1 To 20 

       For j = 1 To 10 'Let's say the last column is J 

        Set Rng = .Cells(i, j) 

        If Rng = FindString Then 
         s3r = s3r + 1 
         .Range(.Cells(Rng.Row, 1), .Cells(Rng.Row, 6)).Copy Destination:=Worksheets("Sheet3").Range(Worksheets("Sheet3").Cells(s3r, 1), Worksheets("Sheet3").Cells(s3r, 6)) 
         Exit For 'it will go to the next row 
        End If 

       Next j 

      Next i 

      If s3r = 4 Then MsgBox "Nothing found" 

     End With 

    End If 

End Sub 

このようにすれば教えてください。

+0

そのレミのおかげで、遅れて、忙しい週末は申し訳ありません。 – Savagefool

関連する問題