Excel VBA для сверки списка значений с диапазоном и возврата заданного значения в другом столбце

#excel #vba

#excel #vba

Вопрос:

Я пытаюсь ввести значение «Да» в столбце V, если значение столбца P соответствует любому из значений в заданном списке.

Лист «Фильтры» содержит список значений в столбце P.

На листе «Скомпилированные данные» я надеюсь сверить столбец P со списком, а затем ввести «Да» в столбце V для той же строки.

Я попытался использовать функцию индексации / сопоставления и функцию For / with, но, возможно, я не полностью понимаю каждое действие в этих функциях или мне нужно их объединить. Я новичок в VBA и уже несколько месяцев ссылаюсь на этот сайт, чтобы ответить на большинство моих вопросов, но этот ставит меня в тупик.

Комментарии:

1. Если вы просто хотите проверить, присутствует ли значение столбца V в какой-либо ячейке столбца P, просто используйте COUNTIF . В противном случае будет возвращено 0 или возвращено количество совпадений

2. Речь идет не только о том, чтобы знать, содержит ли ячейка значение. Я применяю список в качестве фильтра к двум независимым столбцам, которые удаляют неизвестные необходимые значения, если они строго фильтруются по списку. Я проведу эту проверку для обоих столбцов, чтобы вернуть да в столбце V, а затем отфильтрую пробелы в столбце V, чтобы сохранить только необходимые строки.

Ответ №1:

Поиск VBA

Excel

  • Обратите внимание, что это также можно обработать с помощью следующей формулы Excel в ячейке V2 :
     =IF(ISNUMBER(MATCH(P2,Filters!P:P,0)),"Yes","") 
     

VBA

 Option Explicit

Sub VBALookup()
    
    ' Destination
    Const dstName As String = "Compiled Data"
    Const dFirst As Long = 2
    Const dLookup As String = "P"
    Const dResult As String = "V"
    Const dString As String = "Yes"
    ' Source
    Const srcName As String = "Filters"
    Const sFirst As Long = 2
    Const sLookup As String = "P"
    ' Workbook
    Dim wb As Workbook
    Set wb = ThisWorkbook
    
    ' Declare Last Row for both worksheets.
    Dim LastRow As Long
    ' Source
    Dim src As Worksheet
    Set src = wb.Worksheets(srcName)
    LastRow = src.Cells(src.Rows.Count, sLookup).End(xlUp).Row
    Dim sRng As Range
    Set sRng = src.Cells(sFirst, sLookup).Resize(LastRow - sFirst   1)
    ' Destination
    Dim dst As Worksheet
    Set dst = wb.Worksheets(dstName)
    LastRow = dst.Cells(dst.Rows.Count, dLookup).End(xlUp).Row
    Dim dRng As Range
    Set dRng = dst.Cells(dFirst, dLookup).Resize(LastRow - dFirst   1)
    Dim ColumnOffset As Long
    ColumnOffset = dst.Columns(dResult).Column - dst.Columns(dLookup).Column
    ' Write Result String ('dString') to Destination Result Range.
    Dim cel As Range
    For Each cel In dRng.Cells
        If Not IsError(Application.Match(cel.Value, sRng, 0)) Then
            cel.Offset(, ColumnOffset).Value = dString
        End If
    Next cel
    ' Inform user.
    MsgBox "Lookup finished successfully.", vbInformation, "Success"
    
End Sub
 

Комментарии:

1. Вы потрясающие! Это сработало с первой попытки, и я смог настроить работу со вторым столбцом, чтобы получить точный результат. Большое вам спасибо!