2017-02-13 61 views
0

我困在一小段代码中。 我有一个表单,当我点击一个按钮时,它会将所有选定的记录发送到电子邮件正文中,并在这些记录中列出电子邮件收件人。删除电子邮件中的重复字符串

那加是在电子邮件到“收件人”部分如下前景的部分:

With rst 
     Do While Not .EOF 
    strTO = strTO & ![EmailAddress] & ";" 
     .MoveNext 
     Loop 
    End With 

    olItem.Display 
    olItem.To = strTO 

正如你可以看到形成的代码,它需要字符串strTO[EmailAddress]上记录加值,还有一个;比移动到循环中的下一个记录。 我的问题是,是否有一种方法可以创建一个全局函数,在执行代码的olItem.To = strTO部分之前,您可以调用该函数,从而基本上清理删除任何重复项的字符串?

编辑:发现我可以正确发布我的答案,而不是编辑我的问题。

+1

最好的办法是创建一个不包含重复项的记录集。选中SELECT DISTINCT。如果这不适合,请查看VBA InStr,这将允许您在添加地址之前进行检查。 – Fionnuala

+0

感谢您的评论,不幸的是,distinct将无法正常工作,因为我需要查看这些行的多行,但我不需要它为To栏添加额外的重复电子邮件地址。 我正在调查我在网上找到的一些代码,名为RemoveDupWords2 这似乎是做我想做的,除了当我去调用函数我打电话RemoveDupWords2(strTO) 我得到ByRef Arugment不匹配错误。所以我现在正在研究这个。 – vladyerus

+0

就像我刚才提到的那样使用InStr,它可以包裹你当前的代码并且快速简单。 – Fionnuala

回答

0

我在全局模块中使用了以下函数。

Public Function getUniqueString(txtToSearch As String) As String 
    Dim initStr() As String, endStr As String 
    Dim i As Integer, j As Integer, repInt As Integer 

    initStr = Split(txtToSearch, ";") 
    repInt = 0 
    For i = 0 To UBound(initStr) 
     For j = 0 To UBound(initStr) 
      If initStr(i) = initStr(j) Then repInt = (repInt + 1) Mod 2 
     Next 
     If repInt < 2 And InStr(endStr, initStr(i)) = 0 Then endStr = endStr & ";" & initStr(i) 
    repInt = 0 
    Next 
    getUniqueString = Right(endStr, Len(endStr) - 1) 
End Function 

使用此功能时,我用下面的代码按下按钮时在窗体上调出它。

With rst 
     Do While Not .EOF 
      strTO = strTO & ![EmailAddress] & ";" 
      .MoveNext 
     Loop 
    End With 

    Dim strTOn As String 
    strTOn = getUniqueString(strTO) 

    olItem.Display 
    olItem.To = strTOn 

我的理解是,当函数是跑是它采用strTO串并把它变成一个数组,那么会发生什么情况都用;当分隔符被分隔时,它会检查数组中的所有内容与原始字符串,如果有重复项,它会将它们删除到新字符串strTOn中,而不是由olItem.To函数为Outlook应用程序调用。