【问题标题】:Workbooks.open return before focus (Excel 2010 and 2016)Workbooks.open 焦点前返回(Excel 2010 和 2016)
【发布时间】:2016-04-01 17:52:06
【问题描述】:

我有一个宏可以打开一个新的工作簿,然后激活(聚焦)到第一个工作簿。

Code:
Set mainWorkbook = ActiveWorkbook
Set bdWorkbook = Workbooks.Open(FileName:="Another.xlsm", ReadOnly:=True)
mainWorkbook.Activate

我在 Excel 2007 中可以使用此代码,但在 Excel 2010 及更高版本中打开工作簿时遇到了问题。出现问题是因为 Workbooks.Open 在 Excel 激活新工作簿之前返回 VBA [使用调试器工作正常]。

我可以使用Application.Wait (Now + TimeValue("0:00:01")) 来解决问题,但是......

编辑:我的代码在 Excel 2016 中不起作用

Sub Sample()
    Dim path As String

    path = "A_PATH_FROM_MY_SERVER"

    actualScreenUpdate = Application.ScreenUpdating
    Application.ScreenUpdating = False

    Set MainWB = ActiveWorkbook
    Workbooks.Open fileName:=path, UpdateLinks:=False, ReadOnly:=isReadOnly
    Set bdWB = ActiveWorkbook
    DoEvents

    MainWB.Activate
    Application.ScreenUpdating = actualScreenUpdate

    With Sheets(MY_BD_SHEET)
        bdWB.ActiveSheet.UsedRange.Copy .[A1]
        '....
    End With
End Sub

【问题讨论】:

  • DoEvents 在最后两行之间?不然but....什么?
  • 快速提问。为什么要Activate呢?不知道你有没有看到THIS
  • 嗨@ScottHoltzman,DoEvents 不起作用:-(
  • @ScottHoltzman 我不喜欢在我的代码中做变通。我需要等待多长时间才能放入 1? 10 秒?
  • 嗨@SiddharthRout,我不在我的代码中使用 Select 和 Activate... 这就是为什么我想 Open() 并留在我的主工作簿中。

标签: vba excel


【解决方案1】:

这是你想要的吗? (久经考验

这将打开相关工作簿并将其最小化,从而将焦点返回到您的主工作簿。

Sub Sample()
    Dim wbThis As Workbook, wbThat As Workbook

    Set wbThis = ThisWorkbook
    Set wbThat = Workbooks.Open("C:\Users\Siddharth\Desktop\Sample.xlsx")

    DoEvents

    Application.WindowState = xlMinimized

    ' OR

    ActiveWindow.WindowState = xlMinimized
End Sub

编辑

查看您当前的编辑后。

MainWB.Activate
Application.ScreenUpdating = actualScreenUpdate

ScreenUpdating = False?将其设置为True,然后激活它:)

【讨论】:

  • 我很好奇你是否测试过这个大的 Excel 文件。我怀疑 OP 正在打开一个非常大的 excel 文件,并且代码移动得更快,然后文件打开。但是,我没有遇到过这个问题,因为我通常会注意到代码在Workbooks.Open 行停止,直到它真正打开。
  • 我目前没有大文件 :P 但我怀疑下一行是否会在执行该行之前运行,因为 Open 是在 Excel 中发生的,这与 Shell 命令不同。在这种情况下,当您使用 Shell 命令时,代码会移至下一行
  • @SiddharthRout 您在使用 Excel 2016 吗?你能测试我的代码吗?
  • 不,我目前没有 Excel 2016,但您尝试过ActiveWindow.WindowState = xlMinimized。还要设置Application.ScreenUpdating = True,然后按照我说的做。顺便说一句,我在 Excel 2010 和 2013 中尝试了上面的代码,它可以工作。 @Makah
  • @SiddharthRout 谢谢!问题是Application.ScreenUpdating = False。我不明白为什么微软改变了这一点。似乎ScreenUpdating 使方法在它应该返回之前返回
猜你喜欢
  • 1970-01-01
  • 2018-11-14
  • 2017-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多