2016-04-21 2 views
0

Чтобы создать список рассылки, я узнал, что в моей переменной «Кому» содержатся те же значения [email protected]. Список рассылки был определен в Visual Basic для приложений (VBA). Хорошо, я рассматриваю, как я могу определить оператор для проверки, когда переменная имеет одинаковые значения, а затем обрезает все дубликаты. Это означает, что мне нужно, чтобы переменная отображалась только один раз в списке рассылки.Переменная содержит те же значения (VBA)

Например:

Dim objMail As Object 
Dim objOutlook As Object 
Set objOutlook = CreateObject("Outlook.Application") 
Set objMail = objOutlook.CreateItem(0) 

With objMail 
    .To = [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; [email protected] 
    ... 
End With 

Кто-нибудь есть идеи?

+0

какой тип данных переменной "К"? Это массив? Или конкатенированная строка? – StormsEdge

+0

Дамп списка в словаре. Это буквально сделано для такого рода вещей. –

+0

@StormsEdge Я редактировал свой пост. Теперь вы можете увидеть, как была определена переменная. – yuro

ответ

2

Вы можете использовать словарь для удаления дубликатов:

Sub Test() 

    Dim EmailAddresses As String 

    EmailAddresses = "[email protected]; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]" 
    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 

выше на самом деле может быть упрощен несколько способов, также, если это ваши предпочтения.

  1. Для простого удаления дубликатов, не нужно использовать. Exists метод или метод .Add, потому что словарные статьи создаются лениво. Это означает, что простое обращение к элементу будет создавать его, если оно не существует, или перезаписать его, если это произойдет.
  2. Вместо того, чтобы вручную строить строку параллельно со словарем, вы можете Join использовать функцию Keys.

Вот пересмотренная версия:

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 
+0

Хорошее использование словаря; Я добавил немного упрощенного подхода (и объяснения) к вашему ответу, надеюсь, что это нормально :) –

+0

Да, это прекрасно благодаря @David. Я только что начал использовать словарь самостоятельно, так что все еще раздумываю над тем, как все это работает. –

+0

@ DarrenBartrup-Cook Спасибо Даррен за сообщение. Могу ли я объединить ваш пример с переменной, что я добавил в свой пост дополнительно? – yuro

Смежные вопросы