【问题标题】:Protected Excel sheet copy to email bug受保护的 Excel 工作表复制到电子邮件错误
【发布时间】:2015-03-04 08:34:31
【问题描述】:

我有一个受保护的工作表,我想使用宏将其复制到电子邮件中。我目前正在使用以下代码:

Dim OutApp As Object
Dim OutMail As Object

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

Sheets("Ordering").Select
Range("A1:H63").Select
Selection.Copy

With OutMail
    .To = ""
    .Cc = ""
    .BCC = ""
    .Subject = ""
    .Display
End With

SendKeys "^({v})", True

Set OutMail = Nothing
Set OutApp = Nothing

这在大多数情况下都有效。但是,它似乎有一个错误,即创建了新电子邮件但未粘贴工作表。相反,Excel 告诉我它不能这样做,因为工作表受到保护。

我已尝试更改宏,使其在选择之前取消保护并在粘贴后进行保护,但这只会导致一封没有粘贴工作表的新电子邮件。

我尝试在保护命令之前添加一个等待命令,但这只会导致一封没有粘贴工作表的新电子邮件,并且宏需要更长的时间才能结束。

有什么想法吗?

【问题讨论】:

  • 尝试使用DoEvents 等待。请参阅 stackoverflow.com/questions/20963032/…support.microsoft.com/kb/118468。另外:1)尝试等待(在创建电子邮件和粘贴之间使用DoEventsWait <time>,2)使用断点并逐步执行以查看问题是否通过时间延迟解决。
  • 问题可能是因为您使用的是Select You should never use select 并且无论如何您都无法选择受保护的单元格。尝试使用Sheets("Ordering").Range("A1:H63").Copy
  • SendKeys 也是出了名的不可靠。您可能可以使用更好的方法将数据放入 Outlook 电子邮件中。给我一点时间考虑一下……

标签: vba email outlook


【解决方案1】:

通常在使用受保护的工作表时也可能有帮助的一件事是使用 VBA 保护它们并指定 UserInterFaceOnly:=True 参数。这允许宏在受保护的工作表上执行大多数功能。但是它只能由 VBA 完成,并且只在工作簿打开时持续存在,因此理想情况下它需要进入 workbook_open 事件模块。如果您要指定密码,那么密码保护您的 vba 模块也是一个好主意。保护例程的一些通用示例

For Each wsheet In ActiveWorkbook.Worksheets
    Select Case wsheet.Name
        Case "Some Specific Sheet Name 1", "Another Specific Sheet name"
            wsheet.Protect Password:=pw, DrawingObjects:=True, Contents:=True, Scenarios:=True, _
            AllowFiltering:=True, UserInterFaceOnly:=True
            wsheet.EnableSelection = xlNoRestrictions
        Case "Some Sheet I want to hide"
            wsheet.Protect Password:=pw, DrawingObjects:=True, Contents:=True, Scenarios:=True, _
            AllowFiltering:=True, UserInterFaceOnly:=True
            wsheet.EnableSelection = xlNoRestrictions
            wsheet.visible = False
        Case "LookupsSome Sheet I want to hide, but not protect"
            wsheet.visible = False
        Case "Some sheet I really really want to hide"
            wsheet.visible = xlVeryHidden
        Case "Some sheet I dont want to do anything with"
            'Dont do anything
        Case Else 'Every other sheet is hidden and protected
            wsheet.visible = False
            wsheet.Protect Password:=pw, DrawingObjects:=True, Contents:=True, Scenarios:=True, _
            AllowFiltering:=True, UserInterFaceOnly:=True
            wsheet.EnableSelection = xlNoRestrictions
    End Select
Next wsheet

【讨论】:

  • 虽然这可能是一个很好的建议,但它还不足以解决这个问题......
  • @David - 我从来没有说过这是一个解决方案,我说它很有用,考虑到受保护的工作表提到的问题。所以在这个问题的背景下,我觉得它是相关的和“有用的” - 我不期待任何“答案”投票,只是添加我认为与问题相关的有用信息,除了你的答案
【解决方案2】:

用这个代替SendKeys:

OutMail.GetInspector().WordEditor.Range(1,1).Paste

把它们放在一起,确保保护/取消保护工作表:

With Sheets("Ordering")
    .Unprotect
    .Range("A1:E12").Copy

    With OutMail
        .To = ""
        .Cc = ""
        .BCC = ""
        .Subject = ""
        .Display
        .GetInspector().WordEditor.Range(1,1).Paste
    End With

    .Protect
End With

【讨论】:

  • 我尝试了您的 SendKeys 替代方案,但我得到了“值超出范围”。我喜欢替代方案的想法。还有什么建议吗?
  • 你可以试试.GetInspector().WordEditor.Range(0,0).Paste 吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-23
  • 2016-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多