VBA:AppActivate 无法最小化 EXE(按进程 ID 杀死 运行 进程)
VBA : AppActivate not working on minimize EXE (Kill running process by process ID)
当在 Excel 中单击按钮时,我有 VBA 代码 运行 作为 EXE 应用程序。我的代码运行良好,但在最小化时不起作用。
我的代码在这里:
Sub GoToMenu()
Dim prvDir As String
On Error GoTo CallApp
'Get current directory before change
prvDir = CurDir
'Change to workbook directory
ChDrive ThisWorkbook.Path
ChDir (ThisWorkbook.Path)
'Active program via title
AppActivate ("My exe file title")
'Change back to previous directory
ChDrive prvDir
ChDir prvDir
On Error GoTo 0
Exit Sub
CallApp:
'Run MenuExcel.exe
Shell ThisWorkbook.Path + "\ExcelMenu.exe", vbNormalFocus
'Change back to previous directory
ChDrive prvDir
ChDir prvDir
End Sub
我可以解决我的问题。我使用了 "Close then Re-open" 这个概念。我的解决方案如下面的代码。
Sub GoToMenu()
Dim prvDir As String
On Error GoTo CallApp
'Get current directory before change
prvDir = CurDir
'Find "ExcelMenu" process and kill it before reopen
Call CloseExcelMenu
'Change directory to workbook directory
ChDrive ThisWorkbook.Path
ChDir (ThisWorkbook.Path)
CallApp:
On Error GoTo 0
'Run ExcelMenu.exe
Shell ThisWorkbook.Path + "\ExcelMenu.exe", vbNormalFocus
'Change back to previous directory
ChDrive prvDir
ChDir prvDir
End Sub
我在 运行 之前添加了关闭我的 exe 的子程序。
Sub CloseExcelMenu()
Dim strComputer As String
Dim objServices As Object, objProcessSet As Object, Process As Object
'Find running Process ID "ExcelMenu.exe"
strComputer = "."
Set objServices = GetObject("winmgmts:\" _
& strComputer & "\root\CIMV2")
Set objProcessSet = objServices.ExecQuery _
("Select Name, ProcessID FROM Win32_Process", , 48)
'Find the process ID with Process name
For Each Process In objProcessSet
If Process.properties_("Name").Value = "ExcelMenu.exe" Then
'Script for terminate process with image name
Shell "taskkill /PID " & Process.properties_("ProcessID"), vbNormalFocus
End If
Next
Set objProcessSet = Nothing
End Sub
这些是我的参考。
查找 运行ning 进程 ID:
VBA Getting program names and task ID of running processes
终止进程:
VBA script to close every instance of Excel except itself
当在 Excel 中单击按钮时,我有 VBA 代码 运行 作为 EXE 应用程序。我的代码运行良好,但在最小化时不起作用。 我的代码在这里:
Sub GoToMenu()
Dim prvDir As String
On Error GoTo CallApp
'Get current directory before change
prvDir = CurDir
'Change to workbook directory
ChDrive ThisWorkbook.Path
ChDir (ThisWorkbook.Path)
'Active program via title
AppActivate ("My exe file title")
'Change back to previous directory
ChDrive prvDir
ChDir prvDir
On Error GoTo 0
Exit Sub
CallApp:
'Run MenuExcel.exe
Shell ThisWorkbook.Path + "\ExcelMenu.exe", vbNormalFocus
'Change back to previous directory
ChDrive prvDir
ChDir prvDir
End Sub
我可以解决我的问题。我使用了 "Close then Re-open" 这个概念。我的解决方案如下面的代码。
Sub GoToMenu()
Dim prvDir As String
On Error GoTo CallApp
'Get current directory before change
prvDir = CurDir
'Find "ExcelMenu" process and kill it before reopen
Call CloseExcelMenu
'Change directory to workbook directory
ChDrive ThisWorkbook.Path
ChDir (ThisWorkbook.Path)
CallApp:
On Error GoTo 0
'Run ExcelMenu.exe
Shell ThisWorkbook.Path + "\ExcelMenu.exe", vbNormalFocus
'Change back to previous directory
ChDrive prvDir
ChDir prvDir
End Sub
我在 运行 之前添加了关闭我的 exe 的子程序。
Sub CloseExcelMenu()
Dim strComputer As String
Dim objServices As Object, objProcessSet As Object, Process As Object
'Find running Process ID "ExcelMenu.exe"
strComputer = "."
Set objServices = GetObject("winmgmts:\" _
& strComputer & "\root\CIMV2")
Set objProcessSet = objServices.ExecQuery _
("Select Name, ProcessID FROM Win32_Process", , 48)
'Find the process ID with Process name
For Each Process In objProcessSet
If Process.properties_("Name").Value = "ExcelMenu.exe" Then
'Script for terminate process with image name
Shell "taskkill /PID " & Process.properties_("ProcessID"), vbNormalFocus
End If
Next
Set objProcessSet = Nothing
End Sub
这些是我的参考。
查找 运行ning 进程 ID:
VBA Getting program names and task ID of running processes
终止进程:
VBA script to close every instance of Excel except itself