Макрос Excel VBA не Instr

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

Исходный код:

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, поэтому она не работает.


person JoeP    schedule 28.03.2013    source источник


Ответы (3)


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

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

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
person Motes    schedule 28.03.2013
comment
Отлично спасибо! Извините за медленный ответ, я не был на работе с прошлой недели - person JoeP; 02.04.2013

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

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
person Community    schedule 28.03.2013

Не совсем уверен, что вы делаете с 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
person David Zemens    schedule 28.03.2013
comment
Хорошее объяснение, спасибо. Я уже принял предварительный ответ, но это, безусловно, очень полезно - person JoeP; 02.04.2013