excel - 在特定打开文件上/从特定打开文件执行 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
解决方案
在处理类似任务时,我通常先实现一个主 Excel 文件,然后通过 VBS 在这个主文件中调用一个子文件。对我来说,优势似乎是在主文件的 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
推荐阅读
- r - 如何从 R 中的数据框中生成包含数据的 QR 码?
- node.js - React Native - 运行“npm start”和“react-native run-android”时出错
- objective-c - 如何将类型化的可变数组从 Swift 返回到 Objective-C?
- ruby-on-rails - -nil:NilClass 的未定义方法“用户”
- f# - 如何以 1 种记录类型或功能制定配方
- qt - Qt:当多个排队的信号调用同一个槽时如何避免死锁
- ruby-on-rails - 覆盖编辑功能 Devise, rails
- python - 我的 Kivy 程序在左下角随机出现一个白色方块
- python - aiohttp 并发 GET 请求导致 ClientConnectorError(8, 'nodename nor servname provided, or not known')
- swift - NSWindow 标题栏不能完全透明?