2013-03-28 7 views
1

Я пытаюсь изменить код, который я нашел. Это функция VBA, которая ищет все экземпляры значения ячейки, а затем возвращает значение ячейки из каждого экземпляра в одну ячейку. Я пытаюсь вернуть только те значения, которые еще не были найдены, и, следовательно, заканчивается ячейкой, которая не содержит дубликатов.Excel Macro VBA Not Instr

Оригинальный код:

Function Lookup_concat(Search_string As String, _ 
Search_in_col As Range, Return_val_col As Range) 
Dim i As Long 
Dim result As String 
For i = 1 To Search_in_col.Count 
If Search_in_col.Cells(i, 1) = Search_string Then 
result = result & " " & Return_val_col.Cells(i, 1).Value 
End If 
Next 
Lookup_concat = Trim(result) 
End Function 

Я изменил код этого, я отступом редактирование вместо того чтобы держать его на той же линии, чтобы сделать его легче читать

Function Lookup_concat(Search_string As String, _ 
Search_in_col As Range, Return_val_col As Range) 
Dim i As Long 
Dim result As String 
For i = 1 To Search_in_col.Count 
If Search_in_col.Cells(i, 1) = Search_string 
     And Not (InStr(1, result, Return_val_col.Cells(i, 1).Value)) Then 
result = result & " " & Return_val_col.Cells(i, 1).Value 
End If 
Next 
Lookup_concat = Trim(result) 
End Function 

Это версия является самой близкой к функции PHP !strstr (что я понимаю) и, возможно, пытаюсь применить методы PHP к VBA, где я ошибаюсь. Мои мысли в том, что строка результата фактически заполнена ПОСЛЕ моей команды Instr, поэтому она не работает.

ответ

2

Я считаю, вы пытаетесь использовать два If s. Вы хотите добавлять только на основе строки, находящейся в диапазоне, а также только в том случае, если строка еще не добавлена.

Попробуйте это:

Function Lookup_concat(Search_string As String, _ 
Search_in_col As Range, Return_val_col As Range) 
    Dim i As Long 
    Dim result As String 

    For i = 1 To Search_in_col.Count 

     If (Instr(1, Search_in_col.Cells(i, 1), Search_string) > 0) 
      And (InStr(1, result, Return_val_col.Cells(i, 1).Value) = 0) Then 

     result = result & " " & Return_val_col.Cells(i, 1).Value 

     End If 

    Next 

    Lookup_concat = Trim(result) 

End Function 
+0

Отлично, спасибо! Извините за медленный ответ, я не был на работе с прошлой недели – JoeP

2

Это то, что вы ищете?

Function Lookup_concat(Search_string As String, Search_in_col As Range, Return_val_col As Range) 
    Dim i As Long 
    Dim result As String 
    For i = 1 To Search_in_col.Count 
     If InStr(1, Search_in_col.Cells(i, 1).Value, Search_string, vbTextCompare) > 0 Then 
      result = result & " " & Return_val_col.Cells(i, 1).Value 
     End If 
    Next 
    Lookup_concat = Trim(result) 
End Function 
1

Не совсем уверен, что вы делаете с Search_in_col и Return_val_col, но вам обязательно нужно использовать тест If Instr() > 0.

Если это результат> 1, то вам, вероятно, ничего не нужно делать. Если это результат 0, вам нужно будет выполнить свою конкатенацию. Это та часть, где я не уверен, почему вы передаете search_in_col.cells(i,1).Value в качестве параметра поиска, но затем объединяетесь с Return_val_col.Cells(i,1).Value, так что вы фактически не объединяете значение, которое вы используете в качестве параметра поиска ...

'if the cell's value exists in the search_string 
If InStr(1, Search_in_col.Cells(i, 1).Value, search_string, vbBinaryCompare) > 0 Then 
    'probably you want to do nothing here, since it's already existing 
Else: 
    'the cell's value does not exist in the search_string, so concatenate it 
    result = result & " " & "whatever value you want to append to the result" 
End If 
+0

Хорошее объяснение, спасибо. Я уже принял предыдущий ответ, но это, безусловно, очень полезно – JoeP