【问题标题】:Remove duplicate text in string Function删除字符串函数中的重复文本
【发布时间】:2018-07-19 07:53:09
【问题描述】:

我有一个功能可以删除 Access 表的单个列中的重复文本字符串:

原始值:Cardholder、Reconciler、Reconciler、Cardholder、Approver

期望的输出:持卡人、核对人、批准人。

我有以下函数可以实现这一点,但如果只有一个值要返回,它会留下一个逗号(例如“持卡人”)

Function stringOfUniques(inputString As String) As String
        Dim inArray() As String
        Dim xVal As Variant
        Dim s As String
        inArray = Split(inputString, ",")
        For Each xVal In inArray
            If InStr(s, Trim(xVal)) = 0 Then _
            s = s & Trim(xVal) & " ,"
        Next xVal
        stringOfUniques = s
    End Function

应该调整哪个部分来反映这种变化?

谢谢。

【问题讨论】:

  • 只需抓住数组的最后一个元素,并用替换逗号的新字符串替换它的值。所以 inArray(inArray.Length - 1) = inArray(inArray.Length - 1).Replace(",", "")
  • 那行代码会在当前的 inArray = Split(inputString, ",") 行下面吗?还是应该改变那条线?
  • 将新的代码行放在 inArray=Split(inputString, ",") 下不起作用。我得到一个编译错误:无效的限定符。
  • 在你最后一行 stringOfUniques = s Dim lastComma As Integer = s.LastIndexOf(",") s = s.Substring(0, lastComma) 之前添加这两行代码
  • 这将在您的返回字符串中找到逗号字符的最后一次出现,并将 s 的子字符串抓取到最后一个逗号,因此将其排除在外,请参阅下面的答案。

标签: string function ms-access duplicates vba


【解决方案1】:

将数组的成员字符串作为键添加到 Scripting.Dictionary 对象。

然后你可以通过加入字典的键来产生你想要的输出字符串。

Public Function stringOfUniques(inputString As String) As String
    Dim xVal As Variant
    Dim strTrimmed As String
    Dim dct As Object
    Set dct = CreateObject("Scripting.Dictionary")
    For Each xVal In Split(inputString, ",")
        strTrimmed = Trim(xVal)
        If Len(strTrimmed) > 0 And Not dct.Exists(strTrimmed) Then
            dct.Add key:=strTrimmed, Item:=Null
        End If
    Next
    stringOfUniques = Join(dct.Keys, ", ")
End Function

【讨论】:

    【解决方案2】:

    对于包含其他字符串的字符串,使用instr 测试该项目是否已存在于字符串中将失败(例如,对于"pineapple,apple" 的输入,您的方法将返回"pineapple")。

    要提供替代方法,请考虑以下函数:

    Function StringOfUniques(strArg As String) As String
        Dim col As New Collection, var
        On Error Resume Next
        For Each var In Split(strArg, ",")
            col.Add var, var
        Next var
    
        Dim rtn() As String, i As Long
        ReDim rtn(1 To col.Count)
        For i = 1 To col.Count
            rtn(i) = col(i)
        Next i
    
        StringOfUniques = Join(rtn, ",")
    End Function
    

    一些例子:

    ?StringOfUniques("a,b,c")
    a,b,c
    
    ?StringOfUniques("a,a,b,b,c,c")
    a,b,c
    
    ?StringOfUniques("pineapple,apple")
    pineapple,apple
    

    此方法构造和填充 Collection 对象并依赖于与 Collection 中的每个项目关联的键必须是唯一的要求(因此使用On Error Resume Next 来说明尝试添加其键已经存在的项目的迭代出现在集合中)。

    这种捕获预期错误的方法可能不是最优雅的解决方案,但可能比不断迭代数组以测试项目是否已经存在更有效。

    【讨论】:

    • @Katie,您能否举一个您认为仍会在输出中返回重复项的输入示例?
    • @Katie 也许是因为你的分隔符有空格?尝试在我的代码中将"," 更改为", "
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-13
    • 2012-05-09
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 2013-11-12
    • 2020-03-30
    相关资源
    最近更新 更多