如何在不激活的情况下从宏打开文档

How to open document from Macro without Activating

我一直在开发一个宏,有时我需要打开一个文档,复制和编辑一些数据,然后 return 到上一个文档以继续使用宏。我有一个 fileDialog,我 运行 让用户选择文档,但问题是这会激活文档,导致屏幕闪烁,即使 ScreenUpdating 关闭。除了 Workbooks.Open 我可以使用不会激活新文档的替代方法吗? Workbooks.Open 中的设置我可以更改以防止它激活吗?一种在文档激活时阻止屏幕闪烁的方法?这是 fileDialog 的代码,每边都有几行代码:

Set fileDialog = Application.fileDialog(msoFileDialogFilePicker)
Application.ScreenUpdating = False
With fileDialog
    .InitialFileName = "C:\Users\User\Documents"
    .AllowMultiSelect = False
    .Filters.Clear
    .Title = dialogTitle
    If .Show = False Then
        Application.ScreenUpdating = True
        MsgBox "No file chosen. Click Import Contact List to try again."
        Exit Sub
    End If
    strPathFile = .SelectedItems(1)
End With
Set wbSource = Workbooks.Open(Filename:=strPathFile)

任何解决方案将不胜感激。

你可以试试

Set wbSource = Workbooks.Open(Filename:=strPathFile)
Workbooks(name of users workbook).Activate

Set wbSource = Workbooks.Add(trPathFile)

希望对您有所帮助。

打开工作簿时,您可以隐藏工作簿或激活 ThisWorkbook 以不显示刚刚打开的工作簿。

子打开并隐藏() 将 wbSource 调暗为工作簿 将 FileDialog 调暗为 FileDialog 将对话框标题调暗为字符串 将 strPathFile 调暗为字符串

Set FileDialog = Application.FileDialog(msoFileDialogFilePicker)
dialogTitle = "Open And Hide"

With FileDialog
    .InitialFileName = "C:\Users\User\Documents"
    .AllowMultiSelect = False
    .Filters.Clear
    .Title = dialogTitle
    If .Show = False Then
        Application.ScreenUpdating = True
        MsgBox "No file chosen. Click Import Contact List to try again."
        Exit Sub
    End If
    strPathFile = .SelectedItems(1)
End With
Set wbSource = Workbooks.Open(Filename:=strPathFile)
ThisWorkbook.Activate

'// Hide the workbook
'strPathFile = GetFilenameFromPath(strPathFile)
'Windows(strPathFile).Visible = False

结束子

函数 GetFilenameFromPath(ByVal strPath As String) As String ' Returns 字符串最右边的字符最多但不包括最右边的'\' ' 例如'c:\winnt\win.ini' returns 'win.ini'

If Right$(strPath, 1) <> "\" And Len(strPath) > 0 Then
    GetFilenameFromPath = GetFilenameFromPath(Left$(strPath, Len(strPath) - 1)) + Right$(strPath, 1)
End If

结束函数

我的假设是,您想让用户打开一个文件,让它保持打开状态,但之后让您的工作簿处于活动状态,以便打开的文件保留在“后台”,供用户稍后导航。您已经注意到一些烦人的闪烁并来到这里寻求答案。

使用与您类似的代码,我可以重现您描述的行为的唯一方法是打开一个文件 ,该文件已经在同一个 Excel 会话中打开(见下面的第三个用例)。请注意,您的代码不会关闭刚刚打开的工作簿,因此第一次 运行 时,您处于下面的用例 2 中,第二次 运行 时,您处于下面的用例 3。

但是,如果您可以在流程结束时关闭工作簿,您将处于下面的第一个用例中,一切都应该没问题。

让我们看看是否有人可以针对用例 2 和 3 提出解决方案。

这个第一个用例通常不会引入闪烁:

Application.ScreenUpdating = False
Application.EnableEvents = False 'For good measure.
Set myWb = Application.Workbooks.Open("... path of some workbook that's not already open ...")
'... Do stuff ...
myWb.Close
Application.EnableEvents = True
Application.ScreenUpdating = True

我无法让下面的其他 2 个用例按预期运行。

第二个用例是工作簿必须在上述过程结束时保持打开状态,但不处于活动状态,所有没有任何闪烁。 无论我试过什么,打开的工作簿在离开代码后变成活动的工作簿:

Application.ScreenUpdating = False
Application.EnableEvents = False 'For good measure.
Set myWb = Application.Workbooks.Open("... path of some workbook that's not already open ...")
'... Do stuff ...
'myWb.Close 'Here, the workbook is left opened.
ThisWorkbook.Activate 'Trying...
Application.EnableEvents = True
Application.ScreenUpdating = True
ThisWorkbook.Activate 'Trying harder...
'Be my guest...
'Note: Application.OnTime eventually calling ThisWorkbook.Activate doesn't count!

第三个用例很奇怪,很可能发生在 OP 身上。以上面的第二个用例为例,但打开一个工作簿 ,它已经在同一个 Excel 实例 中打开。即使在操作期间 ScreenUpdating = False 闪烁后(不酷),代码将以 ThisWorkbook 作为活动代码离开(酷!)。

我试过 myWb.Windows(1).Visible = FalseDoEvents,随便你怎么说,都没有用。欢迎您提出意见。

编辑(3 年后)

一个肮脏的解决方法是打开工作簿,然后立即将其 IsAddin 属性 设置为 True。这会将它从 Excel 的 UI 中删除,并在工作簿中保留执行代码,无论如何。需要注意的是,您现在必须管理打开的工作簿的可见性(例如,在用户希望看到它时设置 IsAddin = False)和生命周期(例如,在退出应用程序的工作簿时将其关闭)。但这是可行的。