仅连接唯一值


0

我有这个功能

Public Function CONCATENATESPECIAL(rng As Range) As String
Dim rng1 As Range

CONCATENATESPECIAL = ""

For Each rng1 In rng
    If (Not Rows(rng1.Row).Hidden) And (rng1.Value <> "") Then
    CONCATENATESPECIAL = CONCATENATESPECIAL & rng1.Text & "|"
    End If
Next rng1

End Function

它基本上将某个范围内的值与“ |”连接。

我需要的是-是否可以对其进行编辑-如果在该范围内存在一些重复值,则仅将其包含一次?总结-仅连接唯一值。

提前致谢


3
也许可以在添加之前先INSTR()检查它.value是否已经存在CONCATENATESPECIAL
BruceWayne

1
@BruceWayne我看到的一个问题是数据可能是其他数据的子字符串,并且仍然是唯一的。一种替代方法是保存到数组过滤器,以用于唯一值并在之后进行联接。
gtwebb

Answers:


1

我可能会这样处理。我会将所有内容添加到集合中,并将键设置为等于范围值。on error resume next当它尝试将重复项放入集合时,该位将阻止它出错。我需要更多的验证,但是在大多数情况下应该足够了。

Public Function concatenatespecial(rng As Range) As String

Dim col As New Collection
Dim rng1 As Range
Dim str As String
Dim itm As Variant

On Error Resume Next
For Each rng1 In rng
    If rng1 <> "" Then
        col.Add rng1.Value, rng1.Value
    End If
Next rng1
On Error GoTo 0

For Each itm In col
    str = str & "|" & itm
Next itm

concatenatespecial = str

End Function

Collection .Add只需要一个参数。另外,让非托管(Resume Next)错误控制您的代码也是一种不好的做法,而且如果您有多个重复项,我认为它将无效。请在发布代码作为答案之前测试您的代码。
马塔·朱哈斯(MátéJuhász)

看起来像在工作。非常感谢你!
RomanŽydyk'17

是的,的确Collection.Add仅需要一个参数,但是我利用了可选Key参数必须唯一的事实。而且,尽管我同意让非托管Resume Next错误控制您的代码是很糟糕的,但这里的另一种选择是循环检查每个集合。为了降低风险,我从该Resume Next块中删除了所有代码,除了填充集合所需的代码。我也不清楚为什么您会认为重复多次会失败。我的测试表明,即使在这种情况下,它也能正常工作。
BamAlmighty

使用字典而不是字典,然后无需恢复下一个stackoverflow.com/a/915333
Rob Sedgwick
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.