在特定打开文件上执行Excel宏

时间:2018-06-06 23:43:20

标签: excel-vba vbscript vba excel

我需要打开一些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 :(得分:1)

在处理类似任务时,我通常首先实现主Excel文件,然后通过VBS调用此主文件中的sub。对我来说,优势似乎是更容易在主文件的VBA中填充所有任务,而不必在VBS中对所有任务进行编码。

创建主文件,例如“Master.xlsm”,列出您需要在A列中名为“Files”的工作表上打开的所有文件,从第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

答案 1 :(得分:0)

对于您所看到的内容,您的AutoPublish宏指的是ActiveWorkbook而不是更安全的ThisWorkbook,这似乎是一种可能的解释。如果另一个工作簿在被调用时处于活动状态,可能会导致意外结果。