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

时间:2017-11-10 00:24:09

标签: excel vba excel-vba excel-2016

我一直在研究一个宏,我需要在一个点上打开文档,复制和编辑一些数据,然后返回上一个文档继续使用宏。我有一个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)

非常感谢任何解决方案。

3 个答案:

答案 0 :(得分:0)

你可以尝试

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

Set wbSource = Workbooks.Add(trPathFile)

希望它有所帮助。

答案 1 :(得分:0)

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

Sub OpenAndHide()     Dim wbSource As Workbook     Dim FileDialog As FileDialog     Dim dialogTitle As String     Dim strPathFile As String

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

End Sub

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

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

结束功能

答案 2 :(得分:0)

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

我可以使用与您类似的代码重现您描述的行为的唯一方法是打开已在同一Excel会话中打开的文件 (请参阅下面的第3个用例)。请注意,您的代码不会关闭刚刚打开的工作簿,所以第一次运行它时,您在下面的用例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进行游戏,无法使用。欢迎您提出意见。