autohotkey: 运行 vba 带有 ahk 脚本的宏
autohotkey: Run vba macro with ahk script
#Include Com.ahk ; COM
RunMSWordMacro(correct)
{
COM_Init()
Word := COM_GetActiveObject("Word.Application")
COM_Invoke(Word, "Run", "!"correct)
COM_Release(Word)
COM_Term()
}
; the hotkey is 1
1::RunMSWordMacro("correct")
为什么这段代码不起作用?看图"message",帮帮我
拜托,我是 autohotkey 的新用户。
当我按下热键时,它给了我这条消息:
这是我的 vba 代码:
谢谢 David Metcalfe,这是我的 vba 代码:
Sub correct()
'
' correct Macro
'
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = "p "
.Forward = True
.Wrap = wdFindContinue
End With
Selection.Find.Execute
Selection.TypeText Text:="o "
End Sub
如果您解释代码的最终目标是什么,将会有所帮助。根据您提供的 VBA,您似乎只是想 运行 Microsoft Word,在这种情况下您可以完全使用 AutoHotkey。
Run 语法使用起来非常简单。
Run, C:\Path\to\Microsoft Word.exe
来自这里的帮助:
[https://autohotkey.com/boards/viewtopic.php?f=5&t=37197&e=1&view=unread#unread][1]
1:: RunMSWordMacro("correct")
RunMSWordMacro(name) {
GetWord().Run(name)
}
GetWord() {
if !hwnd := WinActive("ahk_class OpusApp")
hwnd := WinExist("ahk_class OpusApp")
ControlGet, ControlHwnd, Hwnd,, _WwG1, ahk_id %hwnd%
Return AccObjectFromWindow(ControlHwnd, -16).Application
}
AccObjectFromWindow(hWnd, idObject = 0)
{
static IID_IDispatch := "{00020400-0000-0000-C000-000000000046}"
, IID_IAccessible := "{618736e0-3c3d-11cf-810c-00aa00389b71}"
, OBJID_NATIVEOM := 0xFFFFFFF0, VT_DISPATCH := 9, h := DllCall("LoadLibrary", Str, "oleacc", Ptr)
VarSetCapacity(IID, 16), idObject &= 0xFFFFFFFF
DllCall("ole32\CLSIDFromString", Str, idObject = OBJID_NATIVEOM ? IID_IDispatch : IID_IAccessible, Ptr, &IID)
if DllCall("oleacc\AccessibleObjectFromWindow", Ptr, hWnd, UInt, idObject, Ptr, &IID, PtrP, pAcc) = 0
Return ComObjEnwrap(VT_DISPATCH, pAcc, 1)
}
#Include Com.ahk ; COM
RunMSWordMacro(correct)
{
COM_Init()
Word := COM_GetActiveObject("Word.Application")
COM_Invoke(Word, "Run", "!"correct)
COM_Release(Word)
COM_Term()
}
; the hotkey is 1
1::RunMSWordMacro("correct")
为什么这段代码不起作用?看图"message",帮帮我 拜托,我是 autohotkey 的新用户。
当我按下热键时,它给了我这条消息:
这是我的 vba 代码:
谢谢 David Metcalfe,这是我的 vba 代码:
Sub correct()
'
' correct Macro
'
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = "p "
.Forward = True
.Wrap = wdFindContinue
End With
Selection.Find.Execute
Selection.TypeText Text:="o "
End Sub
如果您解释代码的最终目标是什么,将会有所帮助。根据您提供的 VBA,您似乎只是想 运行 Microsoft Word,在这种情况下您可以完全使用 AutoHotkey。
Run 语法使用起来非常简单。
Run, C:\Path\to\Microsoft Word.exe
来自这里的帮助: [https://autohotkey.com/boards/viewtopic.php?f=5&t=37197&e=1&view=unread#unread][1]
1:: RunMSWordMacro("correct")
RunMSWordMacro(name) {
GetWord().Run(name)
}
GetWord() {
if !hwnd := WinActive("ahk_class OpusApp")
hwnd := WinExist("ahk_class OpusApp")
ControlGet, ControlHwnd, Hwnd,, _WwG1, ahk_id %hwnd%
Return AccObjectFromWindow(ControlHwnd, -16).Application
}
AccObjectFromWindow(hWnd, idObject = 0)
{
static IID_IDispatch := "{00020400-0000-0000-C000-000000000046}"
, IID_IAccessible := "{618736e0-3c3d-11cf-810c-00aa00389b71}"
, OBJID_NATIVEOM := 0xFFFFFFF0, VT_DISPATCH := 9, h := DllCall("LoadLibrary", Str, "oleacc", Ptr)
VarSetCapacity(IID, 16), idObject &= 0xFFFFFFFF
DllCall("ole32\CLSIDFromString", Str, idObject = OBJID_NATIVEOM ? IID_IDispatch : IID_IAccessible, Ptr, &IID)
if DllCall("oleacc\AccessibleObjectFromWindow", Ptr, hWnd, UInt, idObject, Ptr, &IID, PtrP, pAcc) = 0
Return ComObjEnwrap(VT_DISPATCH, pAcc, 1)
}