Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.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
VBA:AppActivate不使用最小化EXE(按进程ID终止正在运行的进程)_Vba_Excel_Excel 2010 - Fatal编程技术网

VBA:AppActivate不使用最小化EXE(按进程ID终止正在运行的进程)

VBA:AppActivate不使用最小化EXE(按进程ID终止正在运行的进程),vba,excel,excel-2010,Vba,Excel,Excel 2010,当在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 ThisWorkbo

当在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:

终止进程:

我能解决我的问题。我使用了“关闭然后重新打开”的概念。我的解决方案如下所示

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:

终止进程: