使用Shell运行程序 - 编译错误:需要对象

时间:2017-12-15 08:40:23

标签: vba outlook

我正在尝试抓取选定的Outlook邮件,将其作为html保存到磁盘并运行其他应用程序。

虽然电子邮件已保存,但我正在努力运行其他应用程序。有一个“编译错误:需要对象”。

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

1 个答案:

答案 0 :(得分:1)

如果你是新手,可以对编码进行一些介绍。类型理论(确保在任何一天都能了解更多信息,这是一个很棒的主题!):代码中的 thing 有一个描述它们的类型。比如,他们可以做什么样的事情以及他们可以拥有什么样的数据。类型通常分为值类型引用类型。值是本机简单的东西,如数字或字符串,它们安全,简单,高效和美观。参考文献相当复杂,你可以搞定它们,但是它们非常强大和灵活,你们基本上都喜欢它们,就像那些着名的 Objects 一般。

为什么这在您的代码中很重要?您基本上将 ValueType 视为 ReferenceType 。 VBA要求您通过

完成对 ReferenceType 的分配

Set ReferenceType = value

我的意思是,你被强制拼出Set作业。同样, ValueTypes 不能与Set分配。

你发生在哪里?一开始,你说

Dim objShell As String

这意味着您告诉VBA objShellString,即 ValueType 。但后来你写了

Set objShell = CreateObject("WScript.Shell")

Set之后,VBA期待 ReferenceType 。这就是为什么它抱怨对象需要编译错误:)

所以,只是在开头说而不是

Dim objShell as Object

这就是CreateObject()函数给你的方式,对象:)

PD:偏离主题:你应该尝试改进缩进,它使阅读更加愉快,这是编程中的普遍口头禅。但这是一个不同的主题:)