自动化尝试保护VB项目并将其作为附件发送时出错

时间:2013-11-06 01:02:52

标签: vba excel-vba excel

当我尝试保护VBProject并将工作簿作为附件发送电子邮件时,我收到了自动化错误。我在这里缺少什么?

以下是保护VB项目的代码:

Sub ProtectVBProject(WB As Workbook, ByVal strPassWord As String)

Dim vbProj As Object

Set vbProj = WB.VBProject

'Is it already locked!    
If vbProj.Protection = 1 Then Exit Sub

Set Application.VBE.ActiveVBProject = vbProj

'SendKeys to set the project password    
SendKeys "+{TAB}{RIGHT}%V{+}{TAB}" & strPassWord & "{TAB}" & strPassWord & "~"

Application.VBE.CommandBars(1).FindControl(ID:=2578, recursive:=True).Execute

   'Close and Save    
    WB.Close True    

    End Sub

以下是调用ProtectVBProject以保护VB项目并附加工作簿并将其邮寄的代码

 TempFilePath = Environ$("temp") & "\"
    TempFileName = "Email Test " & Sourcewb.Name & " " _
                 & Format(Now, "dd-mmm-yy h-mm-ss")

Set OutApp = CreateObject("Outlook.Application")
OutApp.Session.Logon
Set OutMail = OutApp.CreateItem(0)

With Destwb
    .SaveAs TempFilePath & TempFileName & FileExtStr, _
            FileFormat:=FileFormatNum
    On Error Resume Next
    With OutMail
        .To = "aab2323@example.com"
        .CC = ""
        .BCC = ""
        .Subject = "Test Subject"               
        Call ProtectVBProject.ProtectVBProject(Destwb, "pa$$w0rd!")                
        .Attachments.Add Destwb.FullName
        .Send
    End With
    On Error GoTo 0
    .Close SaveChanges:=False
    Destwb.Close SaveChanges:=False
End With

Kill TempFilePath & TempFileName & FileExtStr

Set OutMail = Nothing
Set OutApp = Nothing

3 个答案:

答案 0 :(得分:1)

根据我的经验,SendKeys(用于锁定/解锁项目)不是很值得信赖,很多/大多数人会建议不要使用它们。

看看this blog,找到另一种方法来完成你正在尝试的事情。 (This SO帖子也很有帮助。)

虽然这些链接涉及对项目进行取消保护,但我确信这些方法也可用于保护项目。

如果您不想使用该路由,请尝试使用“模板”,其中“模板”工作簿已具有正确的代码并且项目已锁定。然后,您只需打开模板,将所需内容粘贴到工作簿中,然后SaveAs。 (这是我使用的方法in a similar situation。)保存后,您可以通过电子邮件发送文件。

答案 1 :(得分:0)

尝试删除对ProtectVBProject的额外引用。

您的代码说Call ProtectVBProject.ProtectVBProject(Destwb, "pa$$w0rd!")但我认为它应该只说Call ProtectVBProject(Destwb, "pa$$w0rd!")

答案 2 :(得分:0)

我认为这可能是因为您正在尝试在工作簿仍处于打开状态时发送它。您可以手动执行此操作而不会出现问题,但当我尝试通过SMTP执行此操作时,它会失败。

我想您只想发送(而不是保存)受保护的工作簿,因此您的选项要么保存受保护的单独副本,请关闭它然后发送电子邮件并终止文件。或者您可以使用类似的代码保存,关闭,发送,重新打开和取消保护。