【问题标题】:How to call VBA macro from AHK in Excel when editing a cell?编辑单元格时如何在 Excel 中从 AHK 调用 VBA 宏?
【发布时间】:2013-12-05 01:04:22
【问题描述】:

我有一个调用 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 代码更改为基本上“退出单元格编辑”?我不想为此编写大量代码,但我真的不确定这里的最佳方法。

【问题讨论】:

  • “编辑单元格”到底是什么意思?另外,您使用的是什么 Excel 版本?
  • @MCL 当我实际编辑一个单元格时。 IE光标在里面。 Excel 2010。

标签: vba excel excel-2010 autohotkey


【解决方案1】:

我第一次使用 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 窗口,则必须限制窗口标题,如 MyFile.xlsm ahk_class XLMAIN
Sleep 之后(您可能想玩弄确切的超时时间),我们再次调用我们的宏。

【讨论】:

  • AHK_L 有 try/catch 吗?我每天都更喜欢它。我今天某个时候必须尝试一下(它在我的工作机器上),但我怀疑这会奏效。
  • It does indeed!虽然我不明白他们为什么遗漏了我心爱的finally
猜你喜欢
  • 1970-01-01
  • 2020-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-19
  • 2014-02-05
相关资源
最近更新 更多