变量包含相同的值(VBA)
为了生成邮件列表,我发现变量“To”中包含相同的值变量包含相同的值(VBA),vba,excel,if-statement,Vba,Excel,If Statement,为了生成邮件列表,我发现变量“To”中包含相同的值test@test.com。邮件列表是在Visual Basic for Applications(VBA)中定义的。嗯,我在考虑如何定义一个要检查的语句,当变量具有相同的值时,然后修剪所有重复项。这意味着我需要变量在邮件列表中只出现一次 例如: Dim objMail As Object Dim objOutlook As Object Set objOutlook = CreateObject("Outlook.Application") S
test@test.com
。邮件列表是在Visual Basic for Applications(VBA)中定义的。嗯,我在考虑如何定义一个要检查的语句,当变量具有相同的值时,然后修剪所有重复项。这意味着我需要变量在邮件列表中只出现一次
例如:
Dim objMail As Object
Dim objOutlook As Object
Set objOutlook = CreateObject("Outlook.Application")
Set objMail = objOutlook.CreateItem(0)
With objMail
.To = test@test.com; name1@test.com; name2@test.com; name3@test.com; test@test.com; name4@test.com
...
End With
有人知道吗?您可以使用字典删除重复项:
Sub Test()
Dim EmailAddresses As String
EmailAddresses = "test@test.com; name1@test.com; name2@test.com; name3@test.com; test@test.com; name4@test.com"
EmailAddresses = RemoveDuplicates(EmailAddresses)
Debug.Print EmailAddresses
End Sub
Public Function RemoveDuplicates(sTo As String) As String
Dim dict As Object
Dim vEmails As Variant
Dim x As Long
Dim sTemp As String
vEmails = Split(Replace(sTo, " ", ""), ";")
If UBound(vEmails) > 0 Then
'Remove duplicates.
Set dict = CreateObject("Scripting.Dictionary")
For x = LBound(vEmails) To UBound(vEmails)
If Not dict.exists(vEmails(x)) Then
dict.Add vEmails(x), 1
sTemp = sTemp & vEmails(x) & ";"
End If
Next x
sTemp = Left(sTemp, Len(sTemp) - 1) 'Remove the final ;
RemoveDuplicates = sTemp
Else
'There's only 1 address.
RemoveDuplicates = sTo
End If
End Function
如果你喜欢的话,上述内容实际上也可以通过几种方式简化
.Add
方法,因为字典项是惰性创建的。这意味着,如果一个项目不存在,那么简单地引用它就会创建它,如果它存在,就会覆盖它李>
键上执行Join
函数,而不是与字典并行手动构造字符串
Public Function RemoveDuplicates2(sTo As String) As String
Dim dict As Object
Dim vEmails As Variant
Dim x As Long
vEmails = Split(Replace(sTo, " ", ""), ";")
Set dict = CreateObject("Scripting.Dictionary")
For x = LBound(vEmails) To UBound(vEmails)
dict(vEmails(x)) = dict(vEmails(x)) 'Keep track of how many occurrences, in case you want to do something with it later
Next
RemoveDuplicates = Join(dict.Keys(), "; ")
End Function
您可以使用字典删除重复项:
Sub Test()
Dim EmailAddresses As String
EmailAddresses = "test@test.com; name1@test.com; name2@test.com; name3@test.com; test@test.com; name4@test.com"
EmailAddresses = RemoveDuplicates(EmailAddresses)
Debug.Print EmailAddresses
End Sub
Public Function RemoveDuplicates(sTo As String) As String
Dim dict As Object
Dim vEmails As Variant
Dim x As Long
Dim sTemp As String
vEmails = Split(Replace(sTo, " ", ""), ";")
If UBound(vEmails) > 0 Then
'Remove duplicates.
Set dict = CreateObject("Scripting.Dictionary")
For x = LBound(vEmails) To UBound(vEmails)
If Not dict.exists(vEmails(x)) Then
dict.Add vEmails(x), 1
sTemp = sTemp & vEmails(x) & ";"
End If
Next x
sTemp = Left(sTemp, Len(sTemp) - 1) 'Remove the final ;
RemoveDuplicates = sTemp
Else
'There's only 1 address.
RemoveDuplicates = sTo
End If
End Function
如果你喜欢的话,上述内容实际上也可以通过几种方式简化
.Add
方法,因为字典项是惰性创建的。这意味着,如果一个项目不存在,那么简单地引用它就会创建它,如果它存在,就会覆盖它李>
键上执行Join
函数,而不是与字典并行手动构造字符串
Public Function RemoveDuplicates2(sTo As String) As String
Dim dict As Object
Dim vEmails As Variant
Dim x As Long
vEmails = Split(Replace(sTo, " ", ""), ";")
Set dict = CreateObject("Scripting.Dictionary")
For x = LBound(vEmails) To UBound(vEmails)
dict(vEmails(x)) = dict(vEmails(x)) 'Keep track of how many occurrences, in case you want to do something with it later
Next
RemoveDuplicates = Join(dict.Keys(), "; ")
End Function
“To”变量是什么数据类型?它是一个数组吗?还是连接字符串?将列表转储到字典中。“它确实是为这类事情而设计的。”风暴莎草我编辑了我的帖子。现在您可以看到变量是如何定义的。“To”变量是什么数据类型?它是一个数组吗?还是连接字符串?将列表转储到字典中。“它确实是为这类事情而设计的。”风暴莎草我编辑了我的帖子。现在您可以看到变量是如何定义的;我在你的答案中添加了一个稍微简化的方法(&解释),希望没问题:)是的,很好,谢谢@David。我自己才刚刚开始使用这本词典,所以我仍然在想它是如何运作的。@DarrenBartrup Cook感谢Darren的帖子。我可以把你的例子和变量结合起来吗,我在我的文章中额外添加了什么;我在你的答案中添加了一个稍微简化的方法(&解释),希望没问题:)是的,很好,谢谢@David。我自己才刚刚开始使用这本词典,所以我仍然在想它是如何运作的。@DarrenBartrup Cook感谢Darren的帖子。我可以把你的例子和我在帖子中添加的变量结合起来吗?