2017-12-15 3 views
0

Ich versuche, ausgewählte Outlook-Mails zu greifen, sie auf der Festplatte als HTML zu speichern und eine andere Anwendung auszuführen.Ausführen eines Programms mit Shell - Kompilierfehler: Objekt erforderlich

Während E-Mails gespeichert werden, kämpfe ich mit dem Ausführen der anderen Anwendung. Es gibt einen "Kompilierfehler: Objekt erforderlich".

Public Sub maile() 
    Dim oMail As Outlook.MailItem 
    Dim objItem As Object 
    Dim sPath As String 
    Dim dtDate As Date 
    Dim sName As String 
    Dim enviro As String 
    Dim objShell As String 

    enviro = CStr(Environ("USERPROFILE")) 
    For Each objItem In ActiveExplorer.Selection 
     If objItem.MessageClass = "IPM.Note" Then 
      Set oMail = objItem 

      sName = oMail.Subject 
      ReplaceCharsForFileName sName, "-" 

      dtDate = oMail.ReceivedTime 
      sName = Format(dtDate, "yyyymmdd", vbUseSystemDayOfWeek, _ 
       vbUseSystem) & Format(dtDate, "-hhnnss", _ 
       vbUseSystemDayOfWeek, vbUseSystem) & "-" & sName & ".html" 

      sPath = "c:\maile\" 
      Debug.Print sPath & sName 
      oMail.SaveAs sPath & sName, olHTML 

     End If 

     strProgramPath = "C:\Pedro\dist\Pedro\Pedro.exe" 
     Set objShell = CreateObject("WScript.Shell") 
     objShell.Run strProgramPath 

    Next 

End Sub 

Private Sub ReplaceCharsForFileName(sName As String, sChr As String) 
    sName = Replace(sName, "'", sChr) 
    sName = Replace(sName, "*", sChr) 
    sName = Replace(sName, "/", sChr) 
    sName = Replace(sName, "\", sChr) 
    sName = Replace(sName, ":", sChr) 
    sName = Replace(sName, "?", sChr) 
    sName = Replace(sName, Chr(34), sChr) 
    sName = Replace(sName, "<", sChr) 
    sName = Replace(sName, ">", sChr) 
    sName = Replace(sName, "|", sChr) 
End Sub 
+0

Wissen Sie, welche Codezeile den Fehler generiert? –

Antwort

0

Ein bisschen Einführung in die Codierung, wenn Sie neu sind. Art-Theorie (stellen Sie sicher, mehr darüber jeden anderen Tag zu lernen, es ist ein schönes Thema!): Ihre Dinge in Ihrem Code haben eine Typ, die sie beschreibt. Zum Beispiel, welche Art von Dingen sie tun können und welche Art von Daten sie halten können. Die Typen sind oft unterteilt in Werttypen und Referenztypen. Werte sind native einfache Dinge wie Zahlen oder Strings, sie sind sicher und einfach, effizient und nett. Referenzen sind ziemlich viel komplexer und Sie können sie schrauben, aber sie sind so mächtig und flexibel Sie werden sie im Grunde lieben, wie diese berühmten Objekte im Allgemeinen.

Warum ist das in Ihrem Code wichtig? Sie behandeln grundsätzlich einen ValueType wie einen ReferenceType. VBA verlangt von Ihnen, dass die Zuweisungen an einen Referenztyp über

Set ReferenceType = value erfolgen.

Ich meine, Sie sind gezwungen, eine Set Zuweisung buchstabieren. Und ebenfalls ValueTypes kann nicht mit Set zugewiesen werden.

Wo ist es dir passiert? Am Anfang, sagen Sie

Dim objShell As String 

was bedeutet, dass Sie VBA doch sagen, dass objShell ist ein String, das heißt, ein Valuetype. Aber später schrieb man

Set objShell = CreateObject("WScript.Shell") 

und nach einem Set, VBA erwartet ein Reference. Deshalb klagt sie mit einem Objekt erforderlich Compile Fehler :)

Also, sagen Sie einfach an die Stelle

Dim objShell as Object 

beginnen, die durch die Art und Weise ist, was eine CreateObject() Funktion gibt Ihnen, Objekte :)

PD: Off-Thema: Sie sollten versuchen, Einrückung zu verbessern, es macht alles angenehmer zu lesen und es ist ein universelles Mantra in der Programmierung. Aber das ist ein anderes Thema :)

+0

Vielen Dank für Ihre Hilfe. Ich habe String in Objekt geändert und die Fehlermeldung wird nicht mehr angezeigt. Yay ! Leider läuft ein anderes Problem. Die Mails werden gespeichert, aber wenn das Programm, das vom Skript gestartet wird, startet, bekomme ich nur das schwarze Fenster (sieht aus wie ein cmd-Fenster), das sofort verschwindet, so dass ich es nicht lesen kann. Meine Hypothese ist, dass das Programm startet, bevor die Mails gespeichert werden, so dass es sie nicht finden kann und schließt.Trotzdem kann ich nicht sicher sagen, dass sich das Fenster schließt, bevor ich es lesen kann. Irgendwo in der Nähe? –

+0

Ja, ich konnte bestätigen, dass mein Programm tatsächlich gestartet wird, aber unmittelbar nach dem Skript beendet ist. Versucht, es für eine bestimmte Zeit warten zu lassen, aber das ist in der Situation nicht praktikabel. Sieht so aus, als müsste ich eine neue Frage stellen. –

+0

Ich würde mehr Informationen dafür benötigen, ich kenne Outlook-Bibliotheken nicht auswendig ... Haben Sie Debugging versucht? Die F5 und F8 Tasten, sie machen Magie. Hier ein kurzer Blick auf das Thema, vielleicht hilft es: http://www.excel-easy.com/vba/examples/debugging.html Auf diese Weise können Sie problematische Anweisungen erkennen, das ist wichtig, um Probleme und mögliche Lösungen zu erkennen. –

Verwandte Themen