как перейти от одной серии кода, выполнить другую в другом модуле и вернуться назад - PullRequest
0 голосов
/ 10 февраля 2019

В этом фрагменте кода, над которым я работаю, откроется определенная рабочая книга с событием «при открытии», который будет обрабатывать передачу большого количества данных и затем сохранять их как.Все в порядке, вот где я теряюсь ...

После бита переноса ему нужно легко вернуть фокус на родительскую книгу, но для обработки необходимо вернуться в родительский кодпоследние шаги и закрытие трансферной книги ...

Теперь, прежде чем она будет запущена, я разделяю код, потому что эта книга уже тяжелый файл, я стараюсь не перегружать ее, а также иметь в виду мойклиентские компьютеры, как правило, не так хороши, как мои, поэтому их затормаживает на своем компьютере.

Я описал событие продолжения, но я не уверен, как перенастроить фокус на эту линиюcode.

Sub TransferMe()
    'Runs the script to start the transfer manager

    answer = MsgBox("This will transfer then clear all data for new period, are you sure you want to continue?", vbYesNo, Title:="New Period")
    If answer = vbYes Then
        MsgBox ("Please be patient this may take a few minuets."), Title:="Please Wait..."

        Application.Cursor = xlWait

        'open the transfer manager
        Workbooks.Open Filename:="C:\Users\dlroy\Dropbox\SSS\WORKING OR COMPLETE\Ian McDermid - Pump Bar\Prime Cost Suite\TransManager.xlsm"

        'this is where the transfer workbook opens which has an "on open" event
        'that will handle transferring all of my data
        'it then needs to set focus back on the original worksheet and restart the code

        'Ending code will handle closing the transfer workbook with out 
        'saving as it will already save as
        'and then complete the last couple of steps and end the macro.

        Application.Cursor = xlDefault
    Else
        MsgBox ("Goodbye."), Title:="Exit"
        Exit Sub     
    End If             
End Sub

Мне просто нужно вернуться в родительский код и продолжить выполнение.Любые идеи будут потрясающими!Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 10 февраля 2019

Вы можете справиться с этим с помощью таймера Application.OnTime.

Открывая вторую рабочую книгу, вы запускаете таймер:

Option Explicit

Private TimerStart As Double
Private Const SecondsToWait As Double = 10
Private OtherWorkbook As Workbook

Private Sub StartOtherWorkbookAndTimer()
    TimerStart = Timer
    Application.OnTime Now + TimeValue("00:00:01"), "CheckIfOtherWorkbookFinished"
    Workbooks.Open (Application.DefaultFilePath & "\NameOfOtherWorkbook.xlsm")
End Sub

Следующие дополнительные проверки выполняются каждую секунду, например, в течение 10 секунд., если другая рабочая книга еще открыта.Если другая рабочая книга выполнила свою работу и тем временем закрылась сама, вы можете выполнить оставшуюся работу.

Если другая рабочая книга не закрывается сама, вам нужно распознать завершение задач другой рабочей книги понапример, значение в его первой ячейке.Это также обрабатывается этим подпунктом:

Private Sub CheckIfOtherWorkbookFinished()
    Dim secondsElapsed As Double
    secondsElapsed = Timer - TimerStart
    On Error Resume Next
    Set OtherWorkbook = Workbooks("NameOfOtherWorkbook.xlsm")
    On Error GoTo 0
    If OtherWorkbook Is Nothing Then
        MsgBox "Other workbook is closed. Now I do the remaining work ..."
        ' do the remaining work here, if other workbook is closed within 10 seconds
    ElseIf OtherWorkbook.Worksheets(1).Range("A1").Value = "ready" Then
        MsgBox "Other workbook is ready. Now I do the remaining work ..."
        ' do the remaining work here, if other workbook said "ready" in it's first cell
        OtherWorkbook.Close
    ElseIf Int(SecondsToWait - secondsElapsed) > 0 Then
        Application.OnTime Now + TimeValue("00:00:01"), "CheckIfOtherWorkbookFinished"
    Else
        MsgBox SecondsToWait & " seconds elapsed, but other workbook still open?!"
    End If
End Sub
0 голосов
/ 10 февраля 2019

Я думаю, что только добавление одной строки в конце событий книги переноса

Workbooks("Parent.xlsm").Worksheets(1).Range("K1").Value = True

и добавление следующих трех строк в коде родительской книги после открытия книги переноса решит проблему

ThisWorkbook.Worksheets(1).Range("K1").Value = False
    Do While ThisWorkbook.Worksheets(1).Range("K1").Value = False
    DoEvents
    Loop

может измениться в соответствии с вашими параметрами.

0 голосов
/ 10 февраля 2019

Когда вы открываете книгу, установите ее как ссылку на переменную объекта, тогда вы сможете легко обращаться к ней и что-то с ней делать.

Лично я не рекомендую устанавливать "фокус", чтобы делать вещи, но если вам это нужно, см. код ниже.

' Declare object variables
Dim mainWorkbook As Excel.Workbook

'open the transfer manager
Set mainWorkbook = Workbooks.Open(Filename:="C:\Users\dlroy\Dropbox\SSS\WORKING OR COMPLETE\Ian McDermid - Pump Bar\Prime Cost Suite\TransManager.xlsm")

' Refer to a sheet
debug.print mainworkbook.Worksheets(1).Name

' Set focus
mainWorkbook.Activate

' Close it
mainworkbook.Close
...