2016-12-30 2 views
0

Я пытаюсь найти столбец (в моем случае столбец 3) и посмотреть, есть ли строка, передаваемая в функцию Extract. Когда оператор If получает удар, он копирует текст из другого столбца той же строки (в моем случае столбца 6) и выходит из цикла For. Цикл For в функции состоит в проверке всех строк в столбце 3. Чтобы проверить соответствие, я использовал функции рабочего листа, доступные в VBA.Если инструкция внутри цикла в VBA

Function Extract(x As String, Y As Integer) As String 

    Dim i As Integer 

    For i = 2 To Y 
     If Application.WorksheetFunction.IsNumber(Application.WorksheetFunction.Find(x, Cells(i, 3))) = True Then 
      Extract = Cells(i, 6) 
      Exit For 
     End If 
    Next i 

End Function 

Я попытался запустить этот кусок кода, который я написал, это не работает.

ответ

0

отредактирован, чтобы добавить "частичное совпадение" функциональность

  • частичное совпадение

    используя Find() метод Range объекта:

    Function Extract(x As String, Y As Integer) As String  
        Dim f As Range 
    
        Set f = Range(Cells(2, 3), Cells(Y, 3)).Find(what:=x, lookAt:=xlPart, LookIn:=xlValues) '<--| "xlPart" value of "lookAt" argument makes the "partial" match functionality 
        If Not f Is Nothing Then Extract = f.Offset(,3).Text  
    End Function 
    

    используя LookUp() метод Application Ob Ject:

    Function Extract(x As String, Y As Integer) As String 
        Dim f As Variant 
    
        f = Application.VLookup("*" & x & "*", Range(Cells(2, 3), Cells(Y, 6)), 4, False) '<--| the "False" argument and the asterisks ("*") makes the "partial" match functionality 
        If Not IsError(f) Then Extract = f 
    End Function 
    
  • точное совпадение

    Find() с использованием метода Range объекта:

    Function Extract(x As String, Y As Integer) As String  
        Dim f As Range 
    
        Set f = Range(Cells(2, 3), Cells(Y, 3)).Find(what:=x, lookAt:=xlWhole, LookIn:=xlValues) '<--| "xlWhole" value of "lookAt" argument makes the "exact" match functionality 
        If Not f Is Nothing Then Extract = f.Offset(,3).Text  
    End Function 
    

    используя LookUp() метод Application объекта:

    Function Extract(x As String, Y As Integer) As String 
        Dim f As Variant 
    
        f = Application.VLookup(x, Range(Cells(2, 3), Cells(Y, 6)), 4, False)'<--| the "False" 4th argument makes the "exact" match functionality 
        If Not IsError(f) Then Extract = f 
    End Function 
    
+0

Большое спасибо за вашу помощь! –

0

Вы можете использовать функцию Match, чтобы найти x в столбце 3. Если в столбце 3 появится совпадение, вы получите номер этой строки. Если не Extract вернет строку, чтобы вы знали, что совпадения нет.

Примечание: В моих тестах Extract не будет работать в моем Excel, может быть, это сохраненное слово или что-то, поэтому я изменил к Extract2

Edit 1: Измененный код для поддержки запрос ЗП для поиска также частичной строки - добавлен шаблон * до и после x.

Function Extract2(x As String, Y As Integer) As String 

If Not IsError(Application.Match("*" & x & "*", Columns(3), 0)) Then ' successful match 
    Extract2 = Cells(Application.Match("*" & x & "*", Columns(3), 0), 6) 
Else ' match was unable to find a result in column 3 
    Extract2 = x & " not found in Column 3" 
End If 

End Function 
+0

В моем случае каждая ячейка в поисковом столбце может иметь несколько строк. Установка match_type в 0 только ищет точную строку в ячейках. есть ли альтернатива? –

+0

'Match' также может возвращать большие или меньшие значения (путем изменения третьего параметра на 1 или -1), это то, что вы имеете в виду? вы можете прочитать о 'Match' здесь: https://msdn.microsoft.com/en-us/library/office/ff835873.aspx –

+0

@jyotirmayapatra см. отредактированный код для поддержки поиска вашей строки в ячейках с несколькими строками, позвольте мне знайте, если это то, что вы имели в виду. –

Смежные вопросы