Vba 尝试保护VB项目并将其作为附件发送电子邮件时出现自动错误

Vba 尝试保护VB项目并将其作为附件发送电子邮件时出现自动错误,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

当我试图保护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

尝试删除对
project
的额外引用


你的代码说
调用ProtectVBProject.ProtectVBProject(Destwb,“pa$$w0rd!”)
但我认为它应该只说
调用ProtectVBProject(Destwb,“pa$$w0rd!”)

根据我的经验,SendKeys(用于锁定/解锁项目)不太可靠,许多/大多数人会建议不要使用它们

看看有没有其他方法来完成你正在尝试的事情。(所以这篇文章也很有帮助。)

虽然这些链接处理取消对项目的保护,但我相信这些方法也可以用于保护项目


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

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


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

快速查看显示没有错误的编码样式。错误具体发生在哪里?错误类型和描述是什么(如果可能的话)?@BK201我解决了自动错误,我关闭了这本书两次,第二次。close抛出了错误。我的模块名为ProtectVBProject,我的子模块名为ProtectVBProject。这是如何从模块调用sub。ModuleName.SubName()嗯,尽管这可能有效,但给不同的东西取相同的名称确实是一种不好的做法…我没有试图发送打开的工作簿,我保存了一份临时副本并发送该副本,这可能是您的问题,我认为在工作簿未打开的情况下,您无法访问VBProject属性-如果您尝试访问,将出现自动错误。BK201询问错误发生在哪里,您能告诉我们吗?此外,可能还会发布更多的代码,DestWb和SourceWb的设置将是进一步提供帮助的主要需求。