2016-06-12 2 views
0

У меня есть 2 листа в Excel. Я хочу определить, существует ли значение из листа 1 в листе2. Следующий код не создает никаких выходных данных или ошибок в моем файле.значение поиска от одного листа до листа пыльника в книге excel

Sub t() 
    For i = 2 To 48 
     For j = 2 To 48 
      If Worksheets("Operator PC").Cells(i, 1).Value = Worksheets("PC Locations").Cells(j, 1).Value Then 
       MsgBox "Value" 
      End If 
     Next j 
    Next i 
End Sub 
+0

Пожалуйста, дайте больше информации о файле (данные, имена листов и т.д. - возможно, в виде скриншота) – DAXaholic

+1

, как он смотрит на меня: никакого значения в '«Оператор ПК»A2: A48'! равна любому значению в «локациях ПК»! A2: A48' ... имейте в виду, что это чувствительно к регистру, а «PC2435R» не «PC2435r». Pls Проверьте, что '= OR (ISNUMBER (MATCH (« Operator PC »! A2: A48,« Расположение ПК »! A2: A48,0)))' (формула массива! Подтвердить с помощью ctrl + shift + enter) возвращает 'TRUE' , Если нет, то ваш 'Sub', вероятно, работает без каких-либо ошибок ... (имейте в виду, что эта формула НЕ чувствительна к регистру) –

+0

Также предложите протестировать ее с помощью Debug.Print (" i = "& i &" j = "& j) вместо MsgBox –

ответ

0

Вы могли бы сделать что-то вроде этого:

Sub t() 
    Dim rFirst As Range 
     Set rFirst = Worksheets("Sheet1").Range("A1").CurrentRegion 
    Dim rSecond As Range 
     Set rSecond = Worksheets("Sheet2").Range("A1").CurrentRegion 
    Dim rFound As Range 
    Dim rCell As Range 

    For Each rCell In rFirst 
     Set rFound = rSecond.Find(rCell, lookat:=xlWhole) 
     If Not rFound Is Nothing Then MsgBox (rCell.Value) 
    Next rCell 
End Sub 

Если лист очень большой, то лучше загружать диапазоны в память первого с вариантом вместо переменной диапазона.

0

Рассмотрите решение 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 
Смежные вопросы