Excel 自动热键';将活动句柄复制到特定工作表

Excel 自动热键';将活动句柄复制到特定工作表,excel,com,autohotkey,Excel,Com,Autohotkey,在.ahk脚本中创建当前活动Excel工作表句柄的最简单方法是: Xl := ComObjActive("Excel.Application") 尽管如此,如果一个工作簿切换到另一个工作簿,这将成为新的“当前活动工作表”,AutoHotkey会尝试通过COM在新工作簿上使用工作表和单元格的方法:当然,设计用于处理特定工作表和单元格的脚本在其他工作簿上不再工作 您知道如何为特定工作簿而不是当前活动工作表创建COM句柄吗 目标应该是允许用户在工作簿之间循环,而不会使Xl对象丢失其以前的句柄并转到新

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

Xl := ComObjActive("Excel.Application")
尽管如此,如果一个工作簿切换到另一个工作簿,这将成为新的“当前活动工作表”,AutoHotkey会尝试通过COM在新工作簿上使用工作表和单元格的方法:当然,设计用于处理特定工作表和单元格的脚本在其他工作簿上不再工作

您知道如何为特定工作簿而不是当前活动工作表创建COM句柄吗

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

示例

从头开始打开Excel工作簿,在名为“Sheet1”的工作表的单元格A1中键入
1234
;然后使用以下内容创建一个新的.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”的消息框


有没有办法把它链接到第一张纸上?当然,假设可以使用COM可以引用的专有名称将Excel文件保存到硬盘上。

一种方法是将活动工作簿对象存储在如下变量中

#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文件的完整路径一起使用,它将返回工作簿对象

#Persistent
fileselectfile, path

oWorkbook := ComObjGet(path)
SetTimer, xlRead, 10000
Return

xlRead:
{
  value := oWorkbook.Sheets(1).Range("A1").Value
  MsgBox, %value%
}
Return

希望这能帮助您完成所需的工作

您能添加一些代码来解决此问题吗?一种方法是在再次使用ComObjActive之前,将获得的COM对象存储在另一个新变量中。但是,请发布一些代码,以便我们可以通过指出如何在您的案例中这样做来提供帮助。添加了一些代码。存储听起来很有趣,不过如果能找到一个指定工作簿名称的解决方案,我们将不胜感激。