簡體   English   中英

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

我可以解決我的問題。 我使用了“先關閉然后再打開”的概念。 我的解決方案就像下面的代碼。

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

這些是我的參考。
查找正在運行的進程ID:
VBA獲取正在運行的進程的程序名稱和任務ID

終止進程:
VBA腳本關閉除自身以外的所有Excel實例

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM