Получить номер строки ячейки, которая соответствует поисковой «строке» в конкретном столбце без цикла - столбец имеет несколько совпадений - PullRequest
0 голосов
/ 07 июня 2019

Получить номер строки ячейки, которая соответствует поиску «строка» в конкретном столбце без цикла - столбец имеет несколько совпадений »

Я хочу получить строку # совпадающей строки в определенном столбце без зацикливания, потому что у меня более 50000 записей, и я не хочу зацикливать каждую строку, чтобы выяснить

Sub Mismatch()
    Dim sht As Worksheet

    Set Sht5 = ThisWorkbook.Worksheets("Result")

    Dim FindString As String
    FindString = "FAIL"    

    Sht5.Activate
    Columncount = Sht5.Range(Cells(1, 1), Cells(1, 1000)).Cells.SpecialCells(xlCellTypeConstants).Count 'CODE NEED TO BE UPDATED WITH COLUMN LENGTH
    'To find the column count

    lastReportRow = Sht5.Range("B" & Rows.Count).End(xlUp).row
    'to find the last used row

    For i = 2 To Columncount + 1
        Set Valuefound = Sht5.Range(Cells(2, i), Cells(lastReportRow, i)).Find(FindString, After:=Range("B2"), LookIn:=xlValues)

        If Valuefound Is Nothing Then
            MsgBox "Value not found"   
        Else
            For r = 2 To lastReportRow
                ActualString = Sht5.Cells(r, i).Value
                If FindString = ActualString Then
                    MsgBox r
                Else

                End If
                'For x = 2 To lastReportRow
            Next    
        End If
    Next
End Sub

Ответы [ 2 ]

1 голос
/ 07 июня 2019

Вы можете использовать Match:

    '...
    lastReportRow = Sht5.Range("B" & Rows.Count).End(xlUp).row


    For i = 2 To Columncount + 1

        Set rng = Sht5.Range(Sht5.Cells(2, i), Sht5.Cells(lastReportRow, i))
        Do
            m = Application.Match(FindString, rng, 0)
            If IsError(m) Then Exit Do '<< not found: exit search for this column
            Debug.Print "Found '" & FindString & "' at " & rng.Cells(m).Address
            'reset search range
            Set rng = Sht5.Range(rng.Cells(m+1), Sht5.Cells(lastReportRow, i))
        Loop

     Next i
End Sub
0 голосов
/ 07 июня 2019

См. В вашем коде вы можете заменить:

Это:

For i = 2 To Columncount + 1


Set Valuefound = Sht5.Range(Cells(2, i), Cells(lastReportRow, 
 i)).Find(FindString, After:=Range("B2"), LookIn:=xlValues)

    If Valuefound Is Nothing Then
        MsgBox "Value not found"

    Else
      For r = 2 To lastReportRow
         ActualString = Sht5.Cells(r, i).Value
         If FindString = ActualString Then
           MsgBox r
         Else

         End If
        'For x = 2 To lastReportRow
        Next

    End If


     Next

С помощью этого:

Set Valuefound = sht5.UsedRange.Find(FindString, After:=Range("B2"), LookIn:=xlValues, lookat:=xlWhole)

    If Valuefound Is Nothing Then
        MsgBox "Value not found"

    Else

        MsgBox Valuefound.Row

    End If

Valuefound.row даст вамточный ряд.Также вы можете добавить Valuefound.column, чтобы получить номер столбца Valuefound

Также вы можете добавить Range.FindNext согласно этой ссылке , чтобы получить доступ к значениям, которые встречаются более одного раза вданные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...