Я пытаюсь изменить функцию VLOOKUP в VBA, но поскольку я впервые работаю в VBA, я не знаю, как это сделать. Я хочу применить vlookup для, например, 200 клеток в столбце в один момент. Я нашел, что это можно сделать с помощью цикла, но это не помогло мне. Допустим, у нас три столбца. Во-первых, есть lookupvalues, во вторых есть некоторые значения, а в третьем должны быть найдены значения. Допустим, я хочу искать значения только в тех строках, в которых значение во втором столбце равно нулю. И важно повторить, я хочу это, введя формулу только в одну ячейку. Кто-нибудь может мне помочь? ссылка на изображениеизмененный VLOOKUP в VBA excel
ответ
Тогда попробуйте это:
Function FLOOKUP(lookup_value, table_array As Range, col_index_num As Long, _
range_lookup As Boolean, Optional ref_value, Optional criteria) As Variant
Dim FoundCell As Range
Dim LastCell As Range
Dim FirstAddr, find_value As String
Dim my_range As Range
Dim row_count, col_count As Long
Dim check As Boolean
col_count = table_array.Columns.Count
find_value = lookup_value
If col_index_num >= 0 Then
Set my_range = table_array.Resize(, 1)
Else
Set my_range = table_array.Resize(, 1).Offset(0, col_count - 1)
End If
With my_range
row_count = .Cells.Count
If row_count = 1048576 Then row_count = .Cells(.Cells.Count).End(xlUp).Row
End With
Set my_range = my_range.Resize(row_count)
Set LastCell = my_range.Cells(my_range.Cells.Count)
If range_lookup Then
Set FoundCell = my_range.Find(what:=find_value, after:=LastCell, LookIn:=xlFormulas, _
LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False)
Else
Set FoundCell = my_range.Find(what:=find_value, after:=LastCell, LookIn:=xlFormulas, _
LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False)
End If
If Not FoundCell Is Nothing Then
FirstAddr = FoundCell.Address
If IsNumeric(col_index_num) And Abs(col_index_num) <= col_count Then
Select Case col_index_num
Case Is > 0
If IsMissing(ref_value) Then
FLOOKUP = FoundCell.Offset(0, col_index_num - 1).Value
Else
If ref_value = criteria Then
FLOOKUP = FoundCell.Offset(0, col_index_num - 1).Value
Else
FLOOKUP = CVErr(xlErrNA)
Exit Function
End If
End If
Case Is < 0
If IsMissing(ref_value) Then
FLOOKUP = FoundCell.Offset(0, col_index_num + 1).Value
Else
If ref_value = criteria Then
FLOOKUP = FoundCell.Offset(0, col_index_num + 1).Value
Else
FLOOKUP = CVErr(xlErrNA)
Exit Function
End If
End If
End Select
Exit Function
Else
FLOOKUP = CVErr(xlErrRef)
Exit Function
End If
Else
FLOOKUP = CVErr(xlErrNA)
Exit Function
End If
End Function
Все еще нуждается в доработке, но я, как это поможет вам начать работу.
СИНТАКСИС:
FLOOKUP (искомое_значение, таблица_массив, номер_столбец, интервальный_просмотр, [ref_value], [критерии])
Первые четыре аргумента такой же, как Vlookup
, но с range_lookup
не обязательными.
Остальные два (2) являются необязательными.
ref_value
- это значение, которое вы хотите сравнить с (в вашем случае значения, найденные в столбце B).
criteria
- критерий испытания. (В вашем случае 0)
Вот снимок экрана:
, но если ваши критерии 'являются строками, помещают знаки Qoutation. Подобно этому '= FLOOKUP (A1, I: J, 2,0, B1," your_string ")'. – L42
Это не работает для меня, я не знаю, почему, я использую те же параметры, что и вы. Когда я вставляю какой-то текст ошибки, только то, что происходит, это то, что после оценки есть этот текст ошибки в ячейке, где я ставлю формулу, другие ячейки пусты. Я все еще пытаюсь понять, почему это не работает для меня. – lulish89
Я обновил код. где вы положили код? должен быть в модуле. после помещения его в модуль, введите формулу, показанную на снимке экрана, как в столбце C. – L42
вы хотите 'vlookup', который работает как' countifs'? я прав? – L42
Я не вижу ничего важного, что имеет эта функция, которую я хочу совместно с countif. Но это возможно, я просто не понимаю тебя. – lulish89
'countifs' в excel 2007 и выше имеют несколько критериев. как я понимаю, вы хотите, чтобы версия vlookup была с несколькими критериями? – L42