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

问题描述 投票:0回答:1

我试图抓取选定的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
vba outlook
1个回答
1
投票

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

为什么这在您的代码中很重要?您基本上将ValueType视为ReferenceType。 VBA要求您通过以下方式完成对ReferenceType的分配

Set ReferenceType = value

我的意思是,你被迫拼出一个Set任务。同样,ValueTypes不能与Set一起分配。

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

Dim objShell As String

这意味着你告诉VBA objShell是一个String,也就是ValueType。但后来你写了

Set objShell = CreateObject("WScript.Shell")

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

所以,只是在开头说

Dim objShell as Object

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

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

© www.soinside.com 2019 - 2024. All rights reserved.