Выполнение макроса Excel в / из определенного открытого файла - PullRequest
0 голосов
/ 07 июня 2018

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

Это суть того, что я делаю сейчас

Set xlApp = CreateObject("Excel.Application")
xlApp.Visible = True

path = "\\Gaalpa1cdfile19\north_sa_staff\Reports\Rpt-ProductionCurves\"

filename2018P1 = "2018 P1.xlsm"
Set xlbook2018P1 = xlApp.WorkBooks.Open(path & filename2018P1)
' Run Macro
xlApp.Run "AutoRefresh"

filename2018P3 = "P3 2018 HRR.xlsm"
Set xlbook2018P3 = xlApp.WorkBooks.Open(path & filename2018P3)
'Run Macro
xlApp.Run "AutoRefresh"

'My "pause"
WScript.Echo ("All Files were" & Chr(013) & _
              "opened and refreshed, update ppt before OK" & Chr(013) & _
              " DO NOT CLICK OK" & Chr(013))

'==========================
'Below is the trouble spot.
'==========================
xlapp.Run "'" & filename2018P1 & "'" & "!AutoPublish"
xlbook2018P1.Close False
Set xlbook2018P1 = Nothing

xlapp.run "'" & filename2018P3 & "'" & "!AutoPublish"
xlbook2018P3.Close False
Set xlbook2018P3 = Nothing

Первая часть работает нормально, но попытка запустить соответствующий макрос AutoPublish не дает.Код работает нормально, если я пропущу эту строку Run.(В настоящих именах файлов есть пробелы, и мне пришлось добавить одинарные кавычки, чтобы заставить его принять имя файла.)

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

РЕДАКТИРОВАТЬ:

Решение было:

xlbook2018P1.Activate ' This fixed it, I think
xlapp.Run "'" & filename2018P1 & "'" & "!AutoPublish"
xlbook2018P1.Close False
Set xlbook2018P1 = Nothing

xlbook2018P3.Activate
xlapp.run "'" & filename2018P3 & "'" & "!AutoPublish"
xlbook2018P3.Close False
Set xlbook2018P3 = Nothing    

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Похоже, возможное объяснение того, что вы видите, в том, что ваш макрос AutoPublish относится к ActiveWorkbook, а не к более безопасному ThisWorkbook.Если при вызове активна другая книга, это может привести к неожиданным результатам.

0 голосов
/ 07 июня 2018

При решении аналогичных задач я обычно работаю сначала, внедряя мастер-файл Excel, и вызываю подпрограмму в этом мастер-файле через VBS.Для меня преимущество заключается в том, что гораздо проще выполнить все задачи в VBA мастер-файла, чем кодировать все это в VBS.

Создать мастер-файл, например «Master.xlsm», перечислить всеВаши файлы вам нужно открыть на листе «Файлы» в столбце А, начиная со строки 1. Вставьте модуль и поместите в него следующий подпункт:

Sub Main()

    Dim strPath As String
    Dim strFile As String
    Dim lRow As Long
    Dim i As Long
    Dim k As Integer
    Dim n As Long
    Dim wb(1 To 3) As Workbook
    Dim wbTest As Workbook

    Set wbMaster = ThisWorkbook
    strPath = "\\Gaalpa1cdfile19\north_sa_staff\Reports\Rpt-ProductionCurves\"

    'Check how many files you need to open
    With Sheets("Files")
        lRow = Sheets("Files").Range("A" & .Rows.Count).End(xlUp).Row
    End With

    'open all available files
    For i = 1 To lRow
        Workbooks.Open (wbMaster.Sheets("Files").Range("A" & i).Value)
    Next

    'now run the two macros in each open file
    For k = 2 To Workbooks.Count 'this will work only if your master file is the only one open when starting the sub!
        Workbooks(k).Run "'" & Workbooks(k).Name & "'!AutoRefresh"
        DoEvents
        Workbooks(k).Run "'" & Workbooks(k).Name & "'!AutoPublish"
        DoEvents
    Next

    'and close all files previously opened except for the master file
    For n = Workbooks.Count To 2 Step -1
        Workbooks(n).Close False
    Next

End Sub
...