Autohotkey运行Excel VBA宏,但不应用更改

时间:2016-04-27 19:46:24

标签: excel vba excel-vba autohotkey

我有一个Excel文件,比如Plano.xlsx,我正在尝试按照说明here的说明使用Autohotkey在其上运行VBA宏脚本。 我不希望Excel在此过程中可见。假设VBA代码在第一张纸上的单元格C1中输入值99。 经过数小时的反复试验,Autohotkey脚本可以顺利运行而不会出现错误,即它会在后台打开Excel进程 编辑Excel文件然后退出。问题是Excel文件根本没有变化。如果我手动粘贴它,VBA代码可以正常工作 在Excel中的新VBA模块中,不使用Autohotkey。

以下是代码:

#SingleInstance force

#Include Acc.ahk

VBcode=
(
Sub myFunction()
    Worksheets(1).Select
    Worksheets(1).Range("C1").Select
    Selection.Value = 99
End Sub
)

Excel_Run("myFunction")

Excel_Run(sFunction){
    FilePath = C:\Users\KostasK\Desktop\Plano.xlsx
    oExcel := ComObjCreate("Excel.Application")
    Excel_ImportCode(VBcode)
    oWorkbook := oExcel.Workbooks.Open(FilePath)
    Excel_Get().Run(sFunction)
    oWorkbook.Save
    oExcel.Quit
}

Excel_ImportCode(VBcode){
    if fileexist(A_ScriptDir . "\tempvbcode.txt")
        FileDelete, %A_ScriptDir%\tempvbcode.txt

    FileAppend, %VBcode%, %A_ScriptDir%\tempvbcode.txt

    Excel_Get().ActiveWorkbook.VBProject
        .VBComponents.Import(A_ScriptDir . "\tempvbcode.txt")
}

Excel_Get(WinTitle="ahk_class XLMAIN") {    ; by Sean and Jethrow, minor modification by Learning one
    ControlGet, hwnd, hwnd, , Excel71, %WinTitle%
    if !hwnd
        return
    Window := Acc_ObjectFromWindow(hwnd, -16)
    Loop
        try
            Application := Window.Application
        catch
            ControlSend, Excel71, {esc}, %WinTitle%
    Until !!Application
    return Application
}

要获取脚本中包含的Acc.ahk库,请参阅here。我的Autohotkey版本是v.1.1.23.05,我使用Excel 2013.我没有 仔细研究一下Excel_Get()函数,但我使用它而不是ComObjActive("Excel.Application"),因为后者会产生错误。那里 是关于here的一些有用信息。最后,请注意我在Excel信任中心启用了以下选项: Enable all macros (not recommended, potentially dangerous code can run)Trust access to the VBA project object model。另外,在加载项部分 在COM加载项中没有检查任何内容(我不知道这是否重要)。最后,我总是以管理员身份运行脚本。

1 个答案:

答案 0 :(得分:0)

这可以在没有VBA宏的情况下完成,同时文件被关闭。

FilePath = C:\Users\KostasK\Desktop\Plano.xlsx
oExcel := ComObjGet(FilePath)
oExcel.Worksheets("Sheet1").Range("C1").VALUE := "99" ; you can put actual sheet name instead "sheet1"
oExcel.Save
oExcel.Quit
oExcel :=