#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. Вы потрясающие! Это сработало с первой попытки, и я смог настроить работу со вторым столбцом, чтобы получить точный результат. Большое вам спасибо!