2013-12-19 1 views
0

Я пытаюсь изменить функцию VLOOKUP в VBA, но поскольку я впервые работаю в VBA, я не знаю, как это сделать. Я хочу применить vlookup для, например, 200 клеток в столбце в один момент. Я нашел, что это можно сделать с помощью цикла, но это не помогло мне. Допустим, у нас три столбца. Во-первых, есть lookupvalues, во вторых есть некоторые значения, а в третьем должны быть найдены значения. Допустим, я хочу искать значения только в тех строках, в которых значение во втором столбце равно нулю. И важно повторить, я хочу это, введя формулу только в одну ячейку. Кто-нибудь может мне помочь? ссылка на изображениеизмененный VLOOKUP в VBA excel

image

+0

вы хотите 'vlookup', который работает как' countifs'? я прав? – L42

+0

Я не вижу ничего важного, что имеет эта функция, которую я хочу совместно с countif. Но это возможно, я просто не понимаю тебя. – lulish89

+0

'countifs' в excel 2007 и выше имеют несколько критериев. как я понимаю, вы хотите, чтобы версия vlookup была с несколькими критериями? – L42

ответ

0

Тогда попробуйте это:

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)

Вот снимок экрана: sample image

+0

, но если ваши критерии 'являются строками, помещают знаки Qoutation. Подобно этому '= FLOOKUP (A1, I: J, 2,0, B1," your_string ")'. – L42

+0

Это не работает для меня, я не знаю, почему, я использую те же параметры, что и вы. Когда я вставляю какой-то текст ошибки, только то, что происходит, это то, что после оценки есть этот текст ошибки в ячейке, где я ставлю формулу, другие ячейки пусты. Я все еще пытаюсь понять, почему это не работает для меня. – lulish89

+0

Я обновил код. где вы положили код? должен быть в модуле. после помещения его в модуль, введите формулу, показанную на снимке экрана, как в столбце C. – L42