VBA - Uhrzeit und Datum an Dateinamen hängen

  • Sonstige

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von Sascha_77.

    VBA - Uhrzeit und Datum an Dateinamen hängen

    Hallo zusammen.

    Ich habe auf der Arbeit ein kleines Problem. Unsere Lieferanten stellen nach und nach auf elektronischen Rechnungsversand (als PDF) bei uns um. Ich habe jetzt auch schon einen Rechner zusammengezimmert der die eMails (Outlook 2003 / WinXP) empfängt, die Anhänge per VB-Script auf Festplatte speichert (C:\Temp) und alle 10 Minuten läuft eine Batch-Datei die die Rechnungen mit einem aktuellen Eingangsstempel versieht und es dann an den Drucker schickt.

    Da dieses Script alle 10 Minuten läuft werden natürlich erstmal alle Anhänge von Mails die in diesem zeitfenster eintrudeln auf Platte zwischengespeichert. Dummerweise haben wir Lieferanten die das Attachment immer gleich nennen. Aktuell hier: Rechnung.pdf

    Da haben wir 8 Mails auf einmal bekommen. Jetzt hat er natürlich 8 mal unter dem gleichen Namen das Attachment gespeichert. Somit 7 mal die Datei überschrieben, sodass die 10-Minuten-Batch nur eine Datei zum ausdrucken hat. Die anderen 7 sind futsch.

    Jetzt meine Frage. Unter Unix ist es ja ein einfaches z.b. die uhrzeit (inklusive Sekunden) und Datum in einen Dateinamen autom. zu schreiben (z.B. 250612_092155_Rechnung.pdf). Aber wie sieht das unter VB aus? Das hier ist der Code. Was muss ich einfügen um ihn dazu zu bewegen die uhrzeit mit sekundenangaben mit in den Dateinamen zu packen? Dann wäre jeder Dateiname einzigartig und die Gefahr das die Datei immer überschrieben wird ist gebannt. Am besten noch eine Pause von 5 Sekunden im Script damit auf keinen Fall 2 Dateien in der selben Sekunde geschrieben werden können.

    Public Sub Save_It(oMail As Outlook.MailItem)
    Dim strNewFolder As String
    Dim objPosteingang As MAPIFolder
    Dim objNewMail As MailItem

    ' Prüfe, ob der Ordner bereits existiert
    strNewFolder = "C:\Temp\"

    ' Target --> Posteingang
    Set objPosteingang = Application.GetNamespace("MAPI").GetDefaultFolder( olFolderInbox)

    ' Wenn neue Mails ankommen, dann enthaltene Anlagen in strNewFolder speichern
    For Each objNewMail In objPosteingang.Items
    With objNewMail
    If .UnRead = True Then
    intAnlagen = .Attachments.Count
    If intAnlagen > 0 Then
    For i = 1 To intAnlagen
    .Attachments.Item(i).SaveAsFile strNewFolder & "\" & .Attachments.Item(i).FileName
    Next i
    End If
    End If
    End With
    Next objNewMail

    End Sub

    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Das aktuelle Datum/ Uhrzeit bekommst du mit:

    Visual Basic-Quellcode

    1. Dim aktuell As Date
    2. aktuell = DateTime.Now

    das kannste ja dann in die Bezeichnung deines Dateinamens einflicken.. sprich in deine For..next schleife

    Die Anwendung "anhalten" oder unterbrechen:
    Timer-Funktion (Beispiel)
    In diesem Beispiel wird die Timer-Funktion verwendet, um die Anwendung kurzzeitig zu unterbrechen. In dem Beispiel wird außerdem DoEvents verwendet, um die Steuerung während der Pause an andere Prozesse abzugeben.

    Visual Basic-Quellcode

    1. Dim Pausenlänge, Start, Ende, Gesamtdauer
    2. If (MsgBox("5 Sekunden Pause?", 4)) = vbYes Then
    3. Pausenlänge = 5 ' Dauer festlegen.
    4. Start = Timer ' Anfangszeit setzen.
    5. Do While Timer < Start + Pausenlänge
    6. DoEvents ' Steuerung an andere Prozesse
    7. ' abgeben.
    8. Loop
    9. Ende = Timer ' Ende festlegen.
    10. Gesamtdauer = Ende - Start ' Gesamtdauer berechnen.
    11. MsgBox "Die Pause dauerte " & Gesamtdauer & " Sekunden"
    12. Else
    13. End
    14. End If

    Schau einfach in VBA Hilfe rein, das is da raus.
    LG
    Naja das Problem was ich habe ist wie ich das Syntax-Mäßig ins script einbauen kann sodass er auch wirklich den Dateinamen ändert. Wäre super wenn du mir das zeigen würdest. Ich komme aus dem Unix-Lager da ist das alles etwas einfacher mit solchen Dingen.

    Also irgendwie so:


    Dim aktuell As Date
    aktuell = DateTime.Now
    For i = 1 To intAnlagen
    .Attachments.Item(i).SaveAsFile strNewFolder & "\" & .Attachments.Item(i).FileName & aktuell &
    Next i
    End If
    End If
    End With
    Next objNewMail

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

    versuch es doch einfach mal anders herum.. sollte evtl schon funktionieren.

    Visual Basic-Quellcode

    1. .Attachments.Item(i).SaveAsFile strNewFolder & "\" & aktuell & .Attachments.Item(i).FileName

    damit sollte ja der Dateiname ja vorne ums aktuelle Datum mit Uhrzeit erweitert werden.
    Naja er hat das Attachment nicht gespeichert. Er hat die Mail zwar verschoben aber den Anhang nicht in c:\temp gesichert.

    Ich sollte vllt. erwähnen das ich das ganze über eine Regel in Outlook ausführen lasse sobald ne Mail reinflattert. (ThisOutlookSession)

    Wenn ich F8 bei geöffnetem Editor drücke markert er mir nix rot oder so. Scheint also von der syntax her korrekt zu sein? Dennoch speichert er dann nichts ab.
    Setz Dir mal in der Schleife ein Haltepunkt und schick dir mal ne Email mit Anhang. Dann bleibt er ja in der Zeile stehen und du kannst das ganze mal von Hand durchklicken. Und dir dann auch anschauen wie der Name ausschaut unter dem er das abspeichern willl, was dann ggf nicht klappt. Evtl musste den Speicherpfad vorher extra zusammenbasteln. Zwar in der Schleife aber vorher als extra namen.
    sowas:

    Visual Basic-Quellcode

    1. for i = 1 to intanlagen
    2. Dim Speichername As String
    3. Speichername = strnewfolder & "\" & datetime.Date & datetime.Time & .Attachments.Item(i).FileName
    4. .attachments.item(i).saveasfile speichername
    5. next i
    Hm also ich habe jetzt das hier versucht:



    Visual Basic-Quellcode

    1. Public Sub Save_It(oMail As Outlook.MailItem)
    2. Dim strNewFolder As String
    3. Dim objPosteingang As MAPIFolder
    4. Dim objNewMail As MailItem
    5. ' Prüfe, ob der Ordner bereits existiert
    6. strNewFolder = "C:\Temp\"
    7. ' Target --> Posteingang
    8. Set objPosteingang = Application.GetNamespace("MAPI").GetDefaultFolder(olFolderInbox)
    9. ' Wenn neue Mails ankommen, dann enthaltene Anlagen in strNewFolder speichern
    10. For Each objNewMail In objPosteingang.Items
    11. With objNewMail
    12. If .UnRead = True Then
    13. intanlagen = .Attachments.Count
    14. If intanlagen > 0 Then
    15. For i = 1 To intanlagen
    16. Dim Speichername As String
    17. Speichername = strNewFolder & "\" & DateTime.Date & DateTime.Time & .Attachments.Item(i).FileName
    18. .Attachments.Item(i).SaveAsFile Speichername
    19. Next i
    20. End If
    21. End If
    22. End With
    23. Next objNewMail
    24. End Sub


    Haltepunkt habe ich bei "For i = 1 To intanlagen" gesetzt und dann abgearbeitet. Hat er ohne Fehler gemacht. Aber leider immer noch keine Datei gespeichert.
    Ich habs:

    For i = 1 To intAnlagen
    .Attachments.Item(i).SaveAsFile strNewFolder & "\" & Date & .Attachments.Item(i).FileName
    Next i
    End If
    End If
    End With
    Next objNewMail



    Er setzt mir jetzt zum. das Datum vor den Dateinamen. "Now" funktioniert leider nicht. ich denke weil bei der Uhrzeit dann ":" als Trenner zwischen sind. Die erlaubt Windows bei dateinamen nicht. Wie kann ich das Zeitformat ändern?
    Habs jetzt mit Zufallszahlen gelöst. Klappt. :D

    Public Sub Save_It(oMail As Outlook.MailItem)
    Dim strNewFolder As String
    Dim objPosteingang As MAPIFolder
    Dim objNewMail As MailItem
    ' Prüfe, ob der Ordner bereits existiert
    strNewFolder = "C:\Temp\"

    ' Target --> Posteingang
    Set objPosteingang = Application.GetNamespace("MAPI").GetDefaultFolder(olFolderInbox)

    ' Wenn neue Mails ankommen, dann enthaltene Anlagen in strNewFolder speichern
    For Each objNewMail In objPosteingang.Items
    With objNewMail
    If .UnRead = True Then
    intAnlagen = .Attachments.Count
    If intAnlagen > 0 Then
    For i = 1 To intAnlagen
    Randomize Timer ' Zufallszahlengenerator initialisieren.
    strWurf = Int((999999 * Rnd) + 1) ' Zufallszahlen im Bereich von 1 bis 999999
    .Attachments.Item(i).SaveAsFile strNewFolder & "\" & strWurf & .Attachments.Item(i).FileName
    Next i
    End If
    End If
    End With
    Next objNewMail

    End Sub
    Zufallszahlen sind nicht so zufällig, wie man glaubt.

    Visual Basic-Quellcode

    1. Dim aktuell As String
    2. aktuell = Format(Now, "YYYY-MM-DD hhmmss")
    3. .Attachments.Item(i).SaveAsFile strNewFolder & "\" & aktuell & .Attachments.Item(i).FileName

    Oder ohne wait / pause:


    Visual Basic-Quellcode

    1. Dim aktuell As String
    2. aktuell = Format(Now, "YYYY-MM-DD hhmmss") & Timer * 100
    3. .Attachments.Item(i).SaveAsFile strNewFolder & "\" & aktuell & .Attachments.Item(i).FileName
    Gruß
    Peterfido

    Keine Unterstützung per PN!