【问题标题】:AutoHotkey's ComObjActive handle to specific WorksheetAutoHotkey 对特定工作表的 ComObjActive 句柄
【发布时间】:2015-01-16 17:55:22
【问题描述】:

在 .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”的消息框。

有什么办法让它与第一张纸保持联系吗?当然假设可以将 Excel 文件以 COM 可以引用的专有名称保存到硬盘。

【问题讨论】:

  • 你能添加一些代码来解决这个问题吗?一种方法是在再次使用 ComObjActive 之前将获得的 COM 对象存储在另一个新变量中。但是请发布一些代码,以便我们可以帮助您指出如何在您的情况下执行此操作
  • 添加了一些代码。存储听起来很有趣,但非常感谢指定工作簿名称的解决方案。

标签: excel com autohotkey


【解决方案1】:

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

#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

希望这能帮助你做你需要的事情

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-30
    • 2018-08-30
    • 1970-01-01
    • 1970-01-01
    • 2011-08-28
    相关资源
    最近更新 更多