Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
编辑单元格时,如何从Excel中的AHK调用VBA宏?_Vba_Excel_Excel 2010_Autohotkey - Fatal编程技术网

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

编辑单元格时,如何从Excel中的AHK调用VBA宏?,vba,excel,excel-2010,autohotkey,Vba,Excel,Excel 2010,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(

我有一个调用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 
'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中的方法如下所示:

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 
'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一些德语BlaBla

要退出单元格编辑,只需将Enter发送到Excel窗口。如果有多个Excel窗口,则必须限制窗口标题,如
MyFile.xlsm ahk_class XLMAIN


睡眠之后
(您可能想处理确切的超时),我们再次调用宏。

您所说的“编辑单元格”到底是什么意思?另外,您使用的Excel版本是什么?@MCL,当我实际编辑单元格时。光标在里面。Excel 2010.AHK_L有尝试/捕获吗?我每天都更喜欢它。今天某个时候我得试试这个(它在我的工作机器上),但我怀疑它会起作用。!虽然我不明白为什么他们最终忽略了我的爱人。