Я предполагаю, что ваша проблема (как упомянуто в комментариях ), потому что вы создаете строку, которая выглядит следующим образом:
10 | 11 | 12
, но при тестировании строки выиспользуют:
InStr(tmp, cell) = 0
Если cell
содержит 1
, то InStr(tmp, cell)
не вернет 0
, поскольку 1
уже находится во встроенной строке (как часть10
, 11
или 12
).
Это можно исправить, создав строку следующим образом:
|10|11|12|
и затем проверив:
InStr(tmp, "|" & cell & "|") = 0
InStr
будет соответствовать значению ячейки только в том случае, если оно окружено символами канала (|
).
Однако я думаю, что гораздо более простым решением было бы использование Scripting.Dictionary
чтобы создать список уникальных чисел:
Dim ws As Worksheet
Dim lastrow As Long
Dim cell As Variant
' Add a reference (Tools -> References...) to Microsoft Scripting Runtime
Dim dict as New Scripting.Dictionary
Set ws = ActiveSheet
lastrow = ws.Cells(Rows.Count, 1).End(xlUp).Row
For Each cell In ws.Range("I2:I" & lastrow)
If cell.Value <> "" Then
dict(cell.Value) = 1 ' dummy value; we're only interested in the dictionary keys
End If
Next cell
, а затем использовать функцию Join
вместе с коллекцией словаря Keys
для построения строки значений с разделителями:
Dim msg As String
msg = Join(dict.Keys, vbNewLine)
Это работает, потому что словарь содержит только одну запись ключ / значение для данного ключа.