AutoHotkey的ComObjActive句柄到特定的工作表

在.ahk脚本中创build当前活动Excel工作表的句柄最简单的方法是:

Xl := ComObjActive("Excel.Application") 

但是,如果切换到另一个工作簿,这将成为新的“ 当前活动工作表 ”,并且AutoHotkey尝试通过COM在新工作簿中使用工作表和单元格的方法:当然,devise用于处理特定工作表和单元格的脚本不起作用在不同的工作簿上。

你知道如何创buildCOM句柄到特定的工作簿,而不是当前活动表吗?

目标应该是允许用户在工作簿之间循环,而无需Xl对象丢失以前的句柄并转到新的句柄。

从头开始打开一个Excel工作簿,并在名为“ Sheet1 ”的工作表的A1单元格中键入1234 ; 然后使用以下内容创build一个新的.ahk脚本:

 #Persistent Xl := ComObjActive("Excel.Application") SetTimer, xlRead, 5000 Return xlRead: { value := Xl.Sheets("Sheets1").Range("A1").Value MsgBox, %value% } Return 

上面的脚本应该每隔5秒在消息框中显示“1234”。

在运行时,打开一个新的工作簿,并在名为“ Sheet1 ”的单元格A1中键入5678 ,并等待5秒钟:根据我的试验,AutoHotkey只需将句柄切换到新的活动工作表并显示一个消息框,其内容是“5678”。

任何方式来保持它链接到第一张? 当然,假设你可以把Excel文件保存到硬盘上,并用COM可以引用的正确名称。

一种方法是将活动工作簿对象存储在像这样的variables中

 #Persistent oExcel := ComObjActive("Excel.Application") this_book := oExcel.ActiveWorkbook SetTimer, xlRead, 10000 Return xlRead: { value := this_book.Sheets(1).Range("A1").Value MsgBox, %value% } Return 

第二种方法是使用ComObjGet与活动工作簿的全名,如果您事先知道它,则不需要ControlGetText命令只使用工作簿全名

 #Persistent SetTitleMatchMode, 2 ControlGetText, WorkBookName, Excel71, Microsoft Excel oWorkbook := ComObjGet(WorkBookName) SetTimer, xlRead, 10000 Return xlRead: { value := oWorkbook.Sheets(1).Range("A1").Value MsgBox, %value% } Return 

您也可以使用ComObjGet与Excel文件的完整path它将返回工作簿对象

 #Persistent fileselectfile, path oWorkbook := ComObjGet(path) SetTimer, xlRead, 10000 Return xlRead: { value := oWorkbook.Sheets(1).Range("A1").Value MsgBox, %value% } Return 

希望这可以帮助你做你所需要的