编辑单元格时如何在Excel中从AHK调用VBAmacros?

我有一个调用Excelmacros的autohotkey脚本。 基本上我有一个通用的快捷方式来添加一个任务到我的自定义GTD应用程序在Excel中

我的AHK代码如下:

RunMSExcelMacro(MacroName, args) { ; for AHK_L oExcel := ComObjActive("Excel.Application") ; oExcel.Workbooks("gtd_active.xlsm").Run(MacroName,args) oExcel.Run("'gtd_active.xlsm'!"+MacroName,args) ;oExcel.Run(MacroName,args) } #Space:: InputBox, newTask, Add New Task to GTD, What is the new task?, , 380, 130 if (newtask = "" or ErrorLevel){ ;if blank or "cancel" pressed (ErrorLevel = 1) don't do anything return } else {RunMSExcelMacro("addFromAHK", newTask) } return 

Excel中的方法如下:

 'this script allows AutoHotKey to add items to the GTD list 'without having to even access Excel - wtf hax :-) Sub addFromAHK(ByRef newTask As String) Dim myCell As Range 'I don't like hardcoding this but I cant be bothered to 'make this reference the constant right now Set myCell = MasterList.Range("C50000").End(xlUp) 'ugh such a hack. No easy way to get last cell without defiltering Do Until IsEmpty(myCell) = True Set myCell = myCell.Offset(1, 0) Loop 'save the task myCell.value = newTask End Sub 

不幸的是,如果我目前在Excel中编辑单元格,我不能调用一个macros,所以全局快捷方式失败。 请注意,这之前,我可以调用Excelmacros。

如果我这样做,有没有简单的方法来改变AHK代码基本上“退出单元格编辑”? 我不想写大量的代码来做到这一点,但我真的不知道这里最好的办法。

我第一次使用了AHK_L的try/catch (yay!)。 看看这个代码示例:

 RunMyMacro() { oExcel := ComObjActive("Excel.Application") try { oExcel.Run("'MyFile.xlsm'!TestSub") } catch e { ControlSend, , {Enter}, ahk_class XLMAIN Sleep, 200 oExcel.Run("'MyFile.xlsm'!TestSub") } } 

这是非常基本的,所以你必须做自己的微调。
如果调用macros时出现错误,我们直接假定那是因为我们正在编辑一个单元格。 如果你非常细致,你可以检查exception的消息( e.Message )来获取错误代码。 在我的机器上的消息是0x80010001 Some German BlaBla
要退出单元格编辑,我们只需发送回到Excel窗口。 如果有多个Excel窗口,则必须限制窗口标题,如MyFile.xlsm ahk_class XLMAIN
Sleep (你可能想要精确的超时),我们再次调用macros。