当我尝试保护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
答案 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执行此操作时,它会失败。
我想您只想发送(而不是保存)受保护的工作簿,因此您的选项要么保存受保护的单独副本,请关闭它然后发送电子邮件并终止文件。或者您可以使用类似的代码保存,关闭,发送,重新打开和取消保护。