【问题标题】:VB Script -- Excel "Activeworkbook" Getting Scrambled. How to declare explicit workbook?VB 脚本——Excel“Activeworkbook”被打乱。如何声明显式工作簿?
【发布时间】:2020-04-14 23:46:30
【问题描述】:

我是 VBA 的新手,但我正在尝试创建一个自动化脚本来打开、刷新、保存和关闭一些 Excel 报告。

我目前有一个 vbs 脚本,但遇到了 ACTIVEWORKBOOK 的问题

我的问题:有时,vba 选择了错误的工作簿作为 activeworkbook 并最终保存并关闭了错误的工作簿。

我的问题:如何明确声明 INCENTIVE REPORT 而不是使用 ActiveWorkBook

我的代码如下:

Dim objExcel

Set objExcel = CreateObject("Excel.Application")

**'THIS IS THE MASTER BOOK WHICH OPENS ALL OF THE OTHER FILES AND KEEPS TIMESTAMPS OF WHEN THEY WERE LAST SAVED**

objExcel.Workbooks.Open("S:\Analyst_Reporting\Automation\DAILY AUTOMATION BOOK.xlsm")  


objExcel.Visible = True

**'THIS OPENS AN "INCENTIVE REPORT"**

objExcel.Run "ThisWorkbook.INCENTIVE"  

 **'THIS REFRESHES THE "INCENTIVE REPORT"**

objExcel.Run "Thisworkbook.helloworld" 

***'THIS IS WHERE THE PROBLEM OCCURS.  INSTEAD OF SAVING THE INCENTIVE REPORT (WHICH SHOULD BE "ACTIVEWORKBOOK"), IT SAVES AND CLOSES THE "DAILY AUTOMATION BOOK" AND CRASHES THE REPORT***

objExcel.**ActiveWorkbook**.Save   

objExcel.ActiveWorkbook.Close(0)

objExcel.Run "Thisworkbook.INCENTIVETIMESTAMP"

objExcel.Run "Thisworkbook.SAVEtest"


objExcel.Run "ThisWorkbook.ACE"

objExcel.Run "Thisworkbook.helloworld"

objExcel.ActiveWorkbook.Save

objExcel.ActiveWorkbook.Close(0)

objExcel.Run "Thisworkbook.ACETIMESTAMP"

objExcel.Run "Thisworkbook.SAVEtest"




objExcel.Wait(Now + TimeValue("0:00:20"))

objExcel.ActiveWorkbook.Save

objExcel.ActiveWorkbook.Close(0)

objExcel.Quit

【问题讨论】:

  • 大概应该重写ThisWorkbook.Incentive 以返回一个工作簿对象。 Workbooks.Open 返回您需要捕获的工作簿引用。
  • 我是个大菜鸟。请原谅。我从我在记事本中制作的 .vbs 脚本运行它。我无法使用“workbooks.open”,因为 excel 文件受密码保护(我遇到了麻烦)。所以相反,我在主簿中运行“激励”宏来打开激励报告并输入密码,只读错误等。有没有办法从这个外部记事本显式声明工作簿文件? (上帝就是这样一个磨砂膏)
  • Incentive 设为Function,返回Workbook 对象。
  • 也许是一个宏,可以驻留在主工作簿中,例如“如果此工作簿是活动工作簿,则将另一个工作簿设为活动工作簿”
  • 不,没有必要这样做。你需要Function Incentive() As Workbook,而不是Sub

标签: excel vba vbscript automation


【解决方案1】:

非常感谢你们的帮助,我能够想出一个适合我的解决方案。

最初的问题是活动工作簿意外更改。为了解决这个问题,我声明了“activeworkbook = WBK”并使用 WBK 变量而不是使用“activeworkbook”。

以下示例:

Dim objExcel

Set objExcel = CreateObject("Excel.Application")



objExcel.Workbooks.Open("S:\Analyst_Reporting\Automation\DAILY AUTOMATION BOOK.xlsm") 


objExcel.Visible = True



objExcel.Run "ThisWorkbook.INCENTIVE"
set wbk = objExcel.ActiveWorkbook 'SETTING WBK = ACTIVEWORKBOOK HERE
objExcel.Run "ThisWorkbook.helloworld"
wbk.save                          'CALLING WBK INSTEAD OF "ACTIVEWORKBOOK.SAVE"
wbk.close(0)                      'CALLING WBK INSTEAD OF "ACTIVEWORKBOOK.CLOSE"
objExcel.Run "Thisworkbook.INCENTIVETIMESTAMP"
objExcel.Run "Thisworkbook.SAVEtest"


objExcel.Run "ThisWorkbook.ACE"
set wbk = objExcel.ActiveWorkbook
objExcel.Run "Thisworkbook.helloworld"
wbk.save
wbk.close(0)
objExcel.Run "Thisworkbook.ACETIMESTAMP"
objExcel.Run "Thisworkbook.SAVEtest"

objExcel.Run "ThisWorkbook.CLOSINGRATIO"
set wbk = objExcel.ActiveWorkbook
objExcel.Run "Thisworkbook.helloworld"
wbk.save
wbk.close(0)
objExcel.Run "Thisworkbook.CLOSINGRATIOTIMESTAMP"
objExcel.Run "Thisworkbook.SAVEtest"

这对我来说效果很好,尽管我确信还有更优雅的解决方案:)

再次感谢!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-04
    • 2018-02-26
    • 1970-01-01
    • 1970-01-01
    • 2014-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多