【问题标题】:Excel doc locked for read only after Outlook VBA code updates worksheet在 Outlook VBA 代码更新工作表后 Excel 文档锁定为只读
【发布时间】:2019-01-21 16:06:10
【问题描述】:

我已经修改了代码,用于检查新 Outlook 电子邮件的主题行中的关键字、打开工作簿并将某些信息粘贴到此工作簿中:

Option Explicit

Private WithEvents Items As Outlook.Items

Private Sub Application_Startup()

  Dim olApp As Outlook.Application
  Dim objNS As Outlook.NameSpace
  Set olApp = Outlook.Application
  Set objNS = olApp.GetNamespace("MAPI")

  ' default local Inbox
  Set Items = objNS.GetDefaultFolder(olFolderInbox).Items

End Sub

Private Sub Items_ItemAdd(ByVal item As Object)

  On Error GoTo ErrorHandler

  Dim Msg As Outlook.MailItem

  If TypeName(item) = "MailItem" Then
    Set Msg = item
    If InStr(Msg.Subject, "Re:") > 0 Then
        Exit Sub
    ElseIf InStr(Msg.Subject, "MDI Board") > 0 Then '// Keyword goes here

        '// Declare all variables needed for excel functionality and open appropriate document
        Dim oXL As Object
        Dim oWS As Object
        Dim lngRow As Long

        Set oXL = CreateObject("Excel.Application")
        oXL.Workbooks.Open FileName:="T:\Capstone Proj\TimeStampsOnly.xlsx", AddTOMRU:=False, UpdateLinks:=False

        '// Change sheet name to suit
        Set oWS = oXL.Sheets("TimeStamps")
        lngRow = oWS.Range("A" & oXL.Rows.Count).End(-4162).Offset(1).Row '// -4162 = xlUp. not available late bound

        With oWS
            .cells(lngRow, 1).Value = Msg.SenderName
            .cells(lngRow, 2).Value = Msg.ReceivedTime
            .cells(lngRow, 3).Value = Msg.ReceivedByName
            .cells(lngRow, 4).Value = Msg.Subject
            .cells(lngRow, 5).Value = Msg.Body

        '// And others as needed - you will have Intellisense

        End With

        With oXL
            .activeworkbook.Save
            .activeworkbook.Close SaveChanges:=2   '// 2 = xlDoNotSaveChanges but not availabe late bound
            .Application.Quit
        End With

        Set oXL = Nothing
        Set oWS = Nothing

    End If
  Else
    Exit Sub
  End If

ExitPoint:

  Exit Sub

ErrorHandler:
  MsgBox Err.Number & " - " & Err.Description
  Resume ExitPoint

  '// Debug only
  Resume

End Sub

运行 Outlook VBA 代码后,我无法访问工作簿。即使我的机器上没有运行 Excel 的实例或“此文件是只读的”等,它也会给出多个错误,例如“工作簿已打开”。

我试图通过使用另一个带有更新宏的工作簿来规避此问题,该宏将使用有问题的工作簿中的信息更新仪表板,但是当我尝试将变量设置为带有 Outlook 数据的工作簿。

Dim wkb As Excel.Workbook
Dim wks As Excel.Worksheet
Set wkb = Excel.Workbooks("T:\Capstone Proj\TimeStampsOnly.xlsx")
Set wks = wkb.Worksheets("Timestamps")

【问题讨论】:

  • 如果您的代码在工作簿打开时出错,它不会关闭,Excel 实例将保持打开状态。检查您的任务管理器是否有仍在运行的 Excel 实例。
  • @TimWilliams 在写这篇文章之前我已经检查了我的任务管理器几次,以确保没有任何东西在运行并且它仍然抛出错误。
  • 如果工作簿尚未打开,则需要打开它:Set wkb = Excel.Workbooks.Open("T:\Capstone Proj\TimeStampsOnly.xlsx")
  • @TimWilliams 这消除了我的“下标超出范围”错误,尽管我不喜欢花费计算机资源来打开然后关闭工作簿只是为了捕获一个单元格值,它似乎是唯一的大大地。 - 当调用时间戳工作簿时,Outlook VBA 中是否有任何内容导致“被'另一个用户'锁定编辑”?似乎 excel 将 Outlook 宏视为一个人并在文件运行后锁定文件

标签: excel vba outlook


【解决方案1】:

瓦格纳布拉加!

过去我也遇到过类似的问题。在我的例子中,我不是在寻找主题包含某些字符,而是主题等于一个字符串。无论哪种方式,这与您的问题无关。

我发现,和你的一样,我的代码在尝试将电子邮件中的信息放入 Excel 时出错。我确实阅读了有关您问题的 cmets,并且知道您不想使用不必要的计算能力。我的方法不是完成你想做的最有效的方法,但它是我能做到的唯一方法。

首先,我没有从 Outlook VBA 编辑 Excel 工作簿。我试图这样做,但这是 my 代码出错的地方。相反,我将电子邮件对象设置为变量的值(以便于引用)。然后我使用Split(...) 函数将我想要的电子邮件中的信息读取到一个数组中。该代码创建了一个文本文件并将数据写入其中,以便 Excel 可以访问它。在写电子​​邮件中的数据之前,我还在第一行写了文本“!NEWDATA!”。您可以使用任何您想要的字符串,只要顶部有一个唯一标识符,以便 Excel 识别它应该从文件中获取数据。然后我打开了工作簿,就像使用 VBA 打开任何其他文件一样。

现在,Excel 工作簿也需要一些 VBA 代码才能使我的方法正常工作。在工作簿代码中的Workbook_Open() VBA 子代码中,Excel 应读取第一行或第一个x 字符数。您可以使用任何一种方法,但这应该指向文件中包含“!NEWDATA!”或其他字符串的部分。如果此字符串是您从 Outlook 写入的字符串,请继续阅读该文件。如果不是,Exit Sub。从这里您可以让 Excel 读取文件的其余部分(通过 Outlook VBA 用您选择的分隔符分隔)并将数据放入相应的单元格中。然后更改“!NEWDATA!”和文件的其余部分,以便如果您手动启动 Excel(并且您不想导入任何数据)Workbook_Open() sub 将停止并且不会出错。您可以将其更改为空白文件、“No new data”或您喜欢的任何其他字符串。之后,使用 VBA 保存工作簿并关闭它。

您可能知道,如果您不希望用户看到工作簿,可以将 Excel 窗口的 Visible 属性设置为 False

如果您有任何问题或 cmets,请告诉我。我很乐意回答您的任何问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-12
    • 1970-01-01
    • 2019-09-25
    相关资源
    最近更新 更多