MsgBox nach For-Next-Schleife

  • Sonstige

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von TacoLoco.

    MsgBox nach For-Next-Schleife

    Hallo, habe ein Problem mit einem Outlook Makro.. Und zwar verstehe ich nicht warum er nach jedem Schleifendurchlauf die MsgBox bringt, wollte sie eigentlich nur einmal nach Beendigung der Schleife.. Thx schonmal!

    Das Makro errechnet die verbrauchten Freiminuten meines Handyvertrages (60/60 Taktung) und gibt zusätzlich die angefallenen Kosten für SMS aus.. Die Vorarbeit leistet Mobile Archiver (mobilearchiving.com/?mobile-archiver-outlook)..

    Quellcode

    1. Sub CustomMailMessageRule(Item As Outlook.MailItem)
    2. Set Items = Application.Session.Folders("MobileArchiver").Folders("Outbound Calls").Items
    3. Dim min As Integer
    4. min = 0
    5. For i = 1 To Items.count()
    6. If Mid(Items(i).body, 71, 2) = "00" Then
    7. min = min + Mid(Items(i).body, 65, 2) * 60 + Mid(Items(i).body, 68, 2)
    8. Else
    9. min = min + Mid(Items(i).body, 65, 2) * 60 + Mid(Items(i).body, 68, 2) + 1
    10. End If
    11. Next
    12. Set Items = Application.Session.Folders("MobileArchiver").Folders("Sent Items").Items
    13. MsgBox "Freiminuten verbraucht: " & min & " ; Sonstige Kosten: " & Items.count * 0.19 & " €"
    14. End Sub

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „TacoLoco“ ()

    Die msgbox macht, was sie soll.

    Es fehlt die Bedingung zum Anzeigen drumherum.

    Visual Basic-Quellcode

    1. if min > MAXGRENZE then
    2. msgbox "Zu viel gelabert..."
    3. end if


    Die Schleife mit Count sollte bei 0 anfangen.

    Visual Basic-Quellcode

    1. For i = 0 To Items.count -1
    Gruß
    Peterfido

    Keine Unterstützung per PN!
    Also das mit dem "min > MAXGRENZE" verstehe ich nicht ganz, min ist doch die Anzahl der verbrauchten Minuten und nicht vorherzusehen.. Wenn ich mit i=0 starte funktioniert das Skript nicht, kann nicht sagen woran es liegt aber es kommt einfach keine Ausgabe (auch kein Fehler)

    Allerdings glaube ich zu wissen woher mein Problem resultiert.. Und zwar checkt mein Skript den ganzen Ordner ab, es würde also eine einmalige Ausführung reichen.. Outlook hingegen wendet das Skript einmal pro Mail an, wenn ich also 4 Mails im Ordner habe wird es 4 mal gestartet und gibt 4 mal das gleiche aus.. Wäre dankbar für weitere Anregungen.. =)

    Edit: Problem gelöst! Bin auf die Lösung gestoßen, als ich versucht habe eine Verknüpfung des Makros in einer Symbolleiste zu erstellen, dabei hat er aber das Makro nicht angezeigt.. Problem war "Sub CustomMailMessageRule(Item As Outlook.MailItem)", habe den Parameter aus der Klammer herausgenommen und ihn einfach innerhalb der Prozedur deklariert! Jetzt wird meine MsgBox auch nur einmal ausgegeben =)

    Hier nochmal mein funktionierender Code:

    Quellcode

    1. Sub Kosten()
    2. Dim Item As Outlook.MailItem
    3. Set Items = Application.Session.Folders("MobileArchiver").Folders("Sent Items").Items
    4. Dim sms As Integer
    5. sms = Items.count
    6. Set Items = Application.Session.Folders("MobileArchiver").Folders("Outbound Calls").Items
    7. Dim min As Integer
    8. min = 0
    9. For i = 1 To Items.count()
    10. If Mid(Items(i).body, 71, 2) = "00" Then
    11. min = min + Mid(Items(i).body, 65, 2) * 60 + Mid(Items(i).body, 68, 2)
    12. Else
    13. min = min + Mid(Items(i).body, 65, 2) * 60 + Mid(Items(i).body, 68, 2) + 1
    14. End If
    15. Next
    16. MsgBox "Freiminuten verbraucht: " & min & " ; Sonstige Kosten: " & sms * 0.19 & " €"
    17. End Sub


    So, falls es jmd interessiert, hab den Code noch erweitert:

    Quellcode

    1. Sub kosten()
    2. Dim Item As Outlook.MailItem
    3. Dim sms As Integer
    4. Dim min_free As Integer
    5. Dim min_charged As Integer
    6. Const min_credit As Integer = 200
    7. Const period_switch As Integer = 27
    8. Dim period_start As Date
    9. Dim period_end As Date
    10. sms = Application.Session.Folders("MobileArchiver").Folders("Sent Items").Items.count
    11. Set Items = Application.Session.Folders("MobileArchiver").Folders("Outbound Calls").Items
    12. min_free = 0
    13. min_charged = 0
    14. For i = 1 To Items.count()
    15. If Format(Date, "DD") < period_switch Then
    16. period_start = DateSerial(Format(Date, "YY"), Format(Date, "M") - 1, period_switch)
    17. period_end = DateSerial(Format(Date, "YY"), Format(Date, "M"), period_switch)
    18. Else
    19. period_start = DateSerial(Format(Date, "YY"), Format(Date, "M"), period_switch)
    20. period_end = DateSerial(Format(Date, "YY"), Format(Date, "M") + 1, period_switch)
    21. End If
    22. test = Format(start, "YY") + Format(period_start, "MM") + Format(period_start, "DD")
    23. If Items(i).ReceivedTime >= period_start Then
    24. If Items(i).ReceivedTime <= period_end Then
    25. If Mid(Items(i).body, 71, 2) = "00" Then
    26. If min_free >= min_credit Then
    27. min_charged = min_charged + Mid(Items(i).body, 65, 2) * 60 + Mid(Items(i).body, 68, 2)
    28. Else
    29. min_free = min_free + Mid(Items(i).body, 65, 2) * 60 + Mid(Items(i).body, 68, 2)
    30. End If
    31. Else
    32. If min_free >= min_credit Then
    33. min_charged = min_charged + Mid(Items(i).body, 65, 2) * 60 + Mid(Items(i).body, 68, 2) + 1
    34. Else
    35. min_free = min_free + Mid(Items(i).body, 65, 2) * 60 + Mid(Items(i).body, 68, 2) + 1
    36. End If
    37. End If
    38. End If
    39. End If
    40. Next i
    41. MsgBox "Freiminuten verbraucht: " & min_free & " ; Sonstige Kosten: " & (sms + min_charged) * 0.19 & " €" & " [Abrechnungszeitraum: " & period_start & " bis " & period_end & "]"
    42. End Sub


    Jetzt gibt er mir die verbrauchten Freiminuten und SMS-Kosten nur im aktuellen Abrechnungszeitraum an..

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „TacoLoco“ ()