Можно ли использовать InStr () в сочетании с Application.Vlookup ()? - PullRequest
0 голосов
/ 17 сентября 2018

В настоящее время у меня есть оператор With, который сравнивает значение ячейки с диапазоном ячеек, и InStr() возвращает true, затем помечает cell.Value как "Yes", а если нет, то "No".

Вот сценарий. Скажем, я проверяю значение A2, а это 111. Я сравниваю 111 с диапазоном других ячеек, и поле, которое должно соответствовать, равно 111, 222, 333, поскольку оно содержит 111. Мой первый набор кода ниже работает для этого, но медленно. Я надеялся на более быстрый путь и думаю, что смогу сделать это с формулой, но использование True вместо False в vlookup не работает так, как я думал.

Вот код:

With inv_twcg_ws
    For Each cell In .Range("A2:A" & .Cells(Rows.Count, "A").End(xlUp).Row)
        For Each cellx In report_rng
            If InStr(cellx.Value, cell.Value) Then
                cell.Offset(0, 6).Value = "Yes"
                Exit For
            End If
                cell.Offset(0, 6).Value = "No"
        Next cellx
    Next cell
End With

Проблема в том, что это довольно медленно. Мое приложение занимает около 5 минут для запуска. Я надеялся как-то объединить InStr() с Application.Vlookup(), чтобы попытаться ускорить формулу. Это возможно?

Вот мой текущий Vlookup, но использование True не подходит для моих нужд ...

With inv_twcg_ws
    For Each cell In .Range("G2:G" & .Cells(Rows.Count, "A").End(xlUp).Row)
        cell.Value = Application.WorksheetFunction.IfError(Application.VLookup(CStr(cell.Value), report_rng, 1, True), "No")
    Next cell
End With

1 Ответ

0 голосов
/ 17 сентября 2018

Использовать варианты массивов:

Dim report_ws As Worksheet
Set report_ws = report_wb.Worksheets(1)

Dim report_rng As Variant
report_rng = report_ws.Range("B2:B" & last_row)

Dim inv_twcg_ws As Worksheet
Set inv_twcg_ws = Worksheets("Sheet1") ' change to your sheet




With inv_twcg_ws
    Dim lkup_rng As Variant
    lkup_rng = .Range("A2:A" & .Cells(Rows.Count, "A").End(xlUp).Row).Value

    Dim otpt As Variant
    ReDim otpt(1 To UBound(lkup_rng, 1), 1 To 1) As Variant

    Dim i As Long
    For i = LBound(lkup_rng, 1) To UBound(lkup_rng, 1)
        otpt(i,1) = "No"
        Dim j As Long
        For j = LBound(report_rng, 1) To UBound(report_rng, 1)
            If InStr(report_rng(j, 1), lkup_rng(i, 1)) Then
                otpt(i,1) = "Yes"
                Exit For
            End If
        Next j
    Next i

    .Range("G2").Resize(UBound(otpt, 1)).Value = otpt
End With
...