2016-04-21 15 views
0

Um eine Mailing-Liste zu generieren, habe ich erkannt, dass in meiner Variablen "To" die gleichen Werte [email protected] enthält. Die Mailingliste wurde in Visual Basic für Applikationen (VBA) definiert. Nun, ich überlege mir, wie ich eine zu überprüfende Aussage definieren könnte, wenn die Variable die gleichen Werte hat und dann alle Duplikate trimmt. Das heißt, ich brauche die Variable nur einmal in der Mailingliste.Variable enthält dieselben Werte (VBA)

Zum Beispiel:

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 

Hat jemand eine Idee?

+0

welcher Datentyp ist die "To" Variable? Ist es ein Array? Oder eine verkettete Zeichenfolge? – StormsEdge

+0

Dump die Liste in ein Wörterbuch. Es ist buchstäblich für diese Art von Dingen gemacht. –

+0

@StormsEdge Ich habe meinen Beitrag bearbeitet. Jetzt können Sie sehen, wie die Variable definiert wurde. – yuro

Antwort

2

könnten Sie das Wörterbuch verwenden, um die Duplikate zu entfernen:

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 

Die oben tatsächlich ein paar Möglichkeiten, vereinfacht werden kann, auch wenn das Ihre Präferenz ist.

  1. Für einfache Entdupping wie diese, keine Notwendigkeit, die zu verwenden. Exists Methode oder die .Add Methode, weil Wörterbuch Elemente träge erstellt werden. Dies bedeutet, dass so einfach auf ein Objekt Bezug genommen wird, wenn es nicht existiert, oder es überschreiben, wenn dies der Fall ist.
  2. Anstatt die Zeichenfolge manuell parallel zum Wörterbuch zu erstellen, können Sie Join auf die Keys des Dict funktionieren.

Hier ist die überarbeitete Fassung:

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

Gute Verwendung des Wörterbuchs; Ich fügte einen leicht vereinfachten Ansatz (& Erklärung) zu Ihrer Antwort hinzu, hoffe, das ist in Ordnung :) –

+0

Ja, das ist gut, danke @David. Ich habe gerade erst begonnen, das Wörterbuch selbst zu benutzen, und habe immer noch den Kopf herumgerafft, wie alles funktioniert. –

+0

@ DarrenBartrup-Cook Danke Darren für deinen Beitrag. Kann ich Ihr Beispiel mit der Variable kombinieren, was ich zusätzlich zu meinem Beitrag hinzugefügt habe? – yuro