2015-06-25 4 views
0

Я использую грубую силу строку коды делает матч на две колонок, глядя что-то вроде этого:матча Две колонок для строки числа

For K = 1 To TPrice.ListRows.Count 
    If TPrice.DataBodyRange(K, 2).Value = str3 And TPrice.DataBodyRange(K, 3).Value = project_name Then 
     r = K + 2 
     Exit For 
    End If 
Next K 

Если переменная str3 не является уникальной на колонке 2, а переменная имя_проекта также не является уникальной в столбце 3. Но «сопоставляются», когда они находятся в одной строке. Набор данных может быть что-то вроде:

two column match

, где я хотел бы, чтобы соответствовать Джону Смиту, например, и возвращаемое значение будет строка таблицы 3, или номер строки 4. Но очевидно, что набор данных будет намного больше, и мне придется выложить некоторые данные из других столбцов в том же ряду, например, историю занятости Джона Смита и т. д.

Я недавно был ознакомлен с некоторыми знаниями в массиве (Thank вы Ральф!) и созерцая такой вид:

Public Sub Finding_John_Smith() 
Dim vArr As Variant 
Dim lCount As Long 
Dim V As Long 

vArr = ThisWorkbook.Worksheets("names").ListObjects(1).DataBodyRange.Value2 

    For lCount = LBound(vArr) To UBound(vArr) 
     Select Case vArr(lCount, 1) 
     Case "john" 
      If vArr(lCount, 2) = "Smith" Then 
       MsgBox "you found a match!" 
       V = lCount 
      End If 
     Case Else 
      MsgBox "name cannot be found!" 
     End Select 
    Next lCount 

    End Sub 

Мне просто интересно, среди вас эксперты, которые могут быть быстрее или какие-либо личные рекомендации, которые у вас могут быть! Большое вам спасибо за ваше время.

+0

Я никогда не видел хороший ответ на «что быстрее» вопросы? Почему бы не разобрать два куска кода? Для подхода грубой силы я ожидал бы, что массивы будут быстрее, чем рабочие листы. Однако использование преимуществ Excel может быть более быстрым. Почему бы не использовать 'Find' для поиска столбца 2 для каждого вхождения' str3', а затем проверить столбец 3 для 'project_name'. Справка для 'Find' показывает, как использовать его в цикле. 'AutoFilter' также может дать хорошие результаты. –

ответ

1

Вы могли приспособить следующее, чтобы получить то, что работает ...

Dim FullName As String: FullName = "John Smith" 

Dim tbl As ListObject: Set tbl = ActiveSheet.ListObjects("Table1") 
Dim SearchArr() As String: SearchArr = Split(FullName, " ") 

Application.Goto tbl 
With tbl 
    .Range.AutoFilter Field:=1, Criteria1:=SearchArr(0) 
    .Range.AutoFilter Field:=2, Criteria1:=SearchArr(1) 
    Dim Rng As Range: Set Rng = tbl.DataBodyRange.SpecialCells(xlCellTypeVisible) 
    .Range.AutoFilter Field:=1 
    .Range.AutoFilter Field:=2 
End With 
Смежные вопросы