繁体   English   中英

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

[英]How to call VBA macro from AHK in Excel when editing a cell?

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

我的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中编辑单元格,我无法调用宏,因此全局快捷方式失败。 请注意,在我能够调用Excel宏之前,这个失败了。

如果我这样做,是否有一种简单的方法可以将AHK代码更改为“退出单元格编辑”? 我不想写大量的代码来做到这一点,但我真的不确定这里的最佳方法。

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

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")
    }
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM