Workbooks.open return перед фокусом (Excel 2010 и 2016)

У меня есть макрос, который открывает новую книгу, а затем активирует (фокус) на первую книгу.

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

У меня этот код работает в Excel 2007, но я столкнулся с проблемой с открытой книгой в Excel 2010 и более поздних версиях. Проблема возникает из-за того, что Workbooks.Open возвращается в VBA до того, как Excel активирует новую книгу [она отлично работает с отладчиком].

Я могу сделать обходной путь, используя 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

person Makah    schedule 01.04.2016    source источник
comment
DoEvents между двумя последними строками? Иначе but.... что?   -  person Scott Holtzman    schedule 01.04.2016
comment
Быстрый вопрос. Почему вы хотите Activate это? Не уверен, что вы видите ЭТО   -  person Siddharth Rout    schedule 01.04.2016
comment
Привет @ScottHoltzman, DoEvents не сработало :-(   -  person Makah    schedule 01.04.2016
comment
@ScottHoltzman Мне не нравится делать обходные пути в моем коде. И сколько ждать нужно поставить 1с? 10 с?   -  person Makah    schedule 01.04.2016
comment
Привет, @SiddharthRout, я не использую Select и Activate в своем коде ... Вот почему я хочу Open () и оставаться в своей основной книге.   -  person Makah    schedule 01.04.2016
comment
Я отправил ответ. Проверить, помогает ли это? Возможно, вам придется обновить страницу.   -  person Siddharth Rout    schedule 01.04.2016
comment
@Makah - иногда нужны обходные пути (если они действительно вообще обходные пути - я имею в виду постоянно). А как насчет того, чтобы просто использовать блок With для продолжения работы над MainWorkbook ... как With Mainworkbook.Sheets(1) ... .Range("A1").Value = "Working" ... more code here ... End With   -  person Scott Holtzman    schedule 01.04.2016
comment
@ScottHoltzman Я создал класс, который использую везде https://github.com/makah/ExcelHelper/blob/master/OCFile.cls (комментарии на португальском). Я просто хочу добавить этот класс, чтобы он снова работал.   -  person Makah    schedule 01.04.2016
comment
Я только что видел вашу текущую правку :) Обновите страницу и посмотрите правку, которую я опубликовал   -  person Siddharth Rout    schedule 01.04.2016


Ответы (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

ИЗМЕНИТЬ

Увидев ваш текущий Edit.

MainWB.Activate
Application.ScreenUpdating = actualScreenUpdate

Вы активируете когда ScreenUpdating = False? Установите True, а затем активируйте :)

person Siddharth Rout    schedule 01.04.2016
comment
Мне любопытно, протестировали ли вы этот большой файл Excel. Я подозреваю, что OP открывает очень большой файл Excel, и код движется быстрее, чем открывается файл. Однако у меня не было этой проблемы, так как я обычно замечаю, что код останавливается на строке Workbooks.Open, пока не откроется. - person Scott Holtzman; 01.04.2016
comment
На данный момент у меня нет большого файла: P Но я сомневаюсь, что следующая строка будет запущена до того, как эта строка будет выполнена, поскольку Open происходит из Excel, в отличие от команды оболочки. В таком случае, когда вы используете Shell Command, код переходит к следующей строке - person Siddharth Rout; 01.04.2016
comment
@SiddharthRout вы используете Excel 2016? Можете ли вы протестировать мой код? - person Makah; 01.04.2016
comment
Нет, сейчас у меня нет Excel 2016, но вы пробовали ActiveWindow.WindowState = xlMinimized. Также установите Application.ScreenUpdating = True и сделайте то, что я сказал. Кстати, я пробовал приведенный выше код в Excel 2010 и 2013, и он работает. @Makah - person Siddharth Rout; 01.04.2016
comment
@SiddharthRout Спасибо! Проблема была в Application.ScreenUpdating = False. Я не понимаю, почему Microsoft изменила это. Кажется, что ScreenUpdating возвращает метод до того, как он должен - person Makah; 01.04.2016