Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
变量包含相同的值(VBA)_Vba_Excel_If Statement - Fatal编程技术网

变量包含相同的值(VBA)

变量包含相同的值(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

为了生成邮件列表,我发现变量“To”中包含相同的值
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
如果你喜欢的话,上述内容实际上也可以通过几种方式简化

  • 对于这样简单的重复数据消除,无需使用.code>Exists方法或
    .Add
    方法,因为字典项是惰性创建的。这意味着,如果一个项目不存在,那么简单地引用它就会创建它,如果它存在,就会覆盖它
  • 您可以在dict的
    键上执行
    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
    
    如果你喜欢的话,上述内容实际上也可以通过几种方式简化

  • 对于这样简单的重复数据消除,无需使用.code>Exists方法或
    .Add
    方法,因为字典项是惰性创建的。这意味着,如果一个项目不存在,那么简单地引用它就会创建它,如果它存在,就会覆盖它
  • 您可以在dict的
    键上执行
    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的帖子。我可以把你的例子和我在帖子中添加的变量结合起来吗?