Рассмотрите решение SQL в виде Excel (при условии, что версия для ПК) может использовать Windows Jet/ACE SQL Engine для запуска запросов на книгах, включая текущий файл. Здесь вы избегаете вложенного цикла For
и если/затем логику и даже можете распространяться на другие столбцы или различные условия WHERE
.
Ниже приведен внутренний запрос соединения между обоими листами и выводится результаты на существующий лист с именем Соответствует. Обязательно измените ColA в strSQL с фактическим заголовком столбца 1. Две строки подключения включены для типов драйверов и провайдеров.
Sub RunSQL()
Dim conn As Object, rst As Object
Dim strConnection As String, strSQL As String
Dim LastRow As Integer
Set conn = CreateObject("ADODB.Connection")
Set rst = CreateObject("ADODB.Recordset")
' Specify full workbook path
' strConnection = "DRIVER={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};" _
' & "DBQ=C:\Path\To\Workbook.xlsm;"
strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;" _
& "Data Source='C:\Path\To\Workbook.xlsm';" _
& "Extended Properties=""Excel 8.0;HDR=YES;"";"
' OPEN DB CONNECTION
conn.Open strConnection
strSQL = " SELECT o.ColA FROM ['Operator PC'$] o" _
& " INNER JOIN ['PC Location'$] p" _
& " ON o.ColA = p.ColA"
' OPEN QUERY RECORDSET
rst.Open strSQL, conn
' COPY DATA TO WORKSHEET
LastRow = Worksheets("Matches").Cells(Worksheets("Matches") _
.Rows.Count, "A").End(xlUp).Row
Worksheets("Matches").Range("A" & LastRow + 1).CopyFromRecordset rst
rst.Close
conn.Close
End Sub
Пожалуйста, дайте больше информации о файле (данные, имена листов и т.д. - возможно, в виде скриншота) – DAXaholic
, как он смотрит на меня: никакого значения в '«Оператор ПК»A2: A48'! равна любому значению в «локациях ПК»! A2: A48' ... имейте в виду, что это чувствительно к регистру, а «PC2435R» не «PC2435r». Pls Проверьте, что '= OR (ISNUMBER (MATCH (« Operator PC »! A2: A48,« Расположение ПК »! A2: A48,0)))' (формула массива! Подтвердить с помощью ctrl + shift + enter) возвращает 'TRUE' , Если нет, то ваш 'Sub', вероятно, работает без каких-либо ошибок ... (имейте в виду, что эта формула НЕ чувствительна к регистру) –
Также предложите протестировать ее с помощью Debug.Print (" i = "& i &" j = "& j) вместо MsgBox –