如何在不激活的情况下从宏打开文档
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 = False
、DoEvents
,随便你怎么说,都没有用。欢迎您提出意见。
编辑(3 年后)
一个肮脏的解决方法是打开工作簿,然后立即将其 IsAddin
属性 设置为 True
。这会将它从 Excel 的 UI 中删除,并在工作簿中保留执行代码,无论如何。需要注意的是,您现在必须管理打开的工作簿的可见性(例如,在用户希望看到它时设置 IsAddin = False
)和生命周期(例如,在退出应用程序的工作簿时将其关闭)。但这是可行的。
我一直在开发一个宏,有时我需要打开一个文档,复制和编辑一些数据,然后 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 = False
、DoEvents
,随便你怎么说,都没有用。欢迎您提出意见。
编辑(3 年后)
一个肮脏的解决方法是打开工作簿,然后立即将其 IsAddin
属性 设置为 True
。这会将它从 Excel 的 UI 中删除,并在工作簿中保留执行代码,无论如何。需要注意的是,您现在必须管理打开的工作簿的可见性(例如,在用户希望看到它时设置 IsAddin = False
)和生命周期(例如,在退出应用程序的工作簿时将其关闭)。但这是可行的。