Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.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
Vb.net 如何在vba和vb之间传递参数_Vb.net_Vba_Excel - Fatal编程技术网

Vb.net 如何在vba和vb之间传递参数

Vb.net 如何在vba和vb之间传递参数,vb.net,vba,excel,Vb.net,Vba,Excel,我正在制作一个工具,我需要在Excle文件中使用VBA启动一个程序(我想用VB编写)。当我关闭该程序时,它应该向VBA脚本返回一个参数 我刚开始使用VBA脚本,还没有编写任何VB程序。但我需要知道,在VBA脚本中编写什么,以及这是否可行 所以它应该是这样工作的: 我在Excel文件中,按下一个按钮 程序正在启动(同时从Excel文件中获取参数,这还不是很重要) 在那个程序中,我配置了一些东西 关闭该程序时,它应返回该配置的ID 我要用这个ID返回Excel文件 这可能吗?我需要在VBA脚本和

我正在制作一个工具,我需要在Excle文件中使用VBA启动一个程序(我想用VB编写)。当我关闭该程序时,它应该向VBA脚本返回一个参数

我刚开始使用VBA脚本,还没有编写任何VB程序。但我需要知道,在VBA脚本中编写什么,以及这是否可行

所以它应该是这样工作的:

  • 我在Excel文件中,按下一个按钮
  • 程序正在启动(同时从Excel文件中获取参数,这还不是很重要)
  • 在那个程序中,我配置了一些东西
  • 关闭该程序时,它应返回该配置的ID
  • 我要用这个ID返回Excel文件
这可能吗?我需要在VBA脚本和程序中编写什么来返回参数


我希望你能理解我的意思,你能帮我

你可以设置你的VB.exe以返回退出代码。只需确保id不是0(表示运行成功)或259(调用进程将认为进程仍在运行)。下面的VBA运行一个.exe,等待它关闭,然后返回退出代码

Option Explicit

' Api declarations
Private Declare Function GetExitCodeProcess Lib "Kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long
Private Declare Function OpenProcess Lib "Kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Long) As Long


Public Function RunProgram(ByVal strFilename As String) As Long

    '# PURPOSE: Run a program, wait until closed, and return the exit code

    Dim TaskID As Long
    Dim hProc As Long
    Dim lExitCode As Long

    Const ACCESS_TYPE = &H400
    Const STILL_ACTIVE = &H103

    ' Open the program
    TaskID = Shell(strFilename, 1)
    hProc = OpenProcess(ACCESS_TYPE, False, TaskID)
    If Err <> 0 Then
        Debug.Print "Cannot start " & strFilename, vbCritical, "Error"
        Exit Function
    End If


    ' Wait until program is closed
    Do
        GetExitCodeProcess hProc, lExitCode
        DoEvents
    Loop While lExitCode = STILL_ACTIVE

    ' Return the program's exit code
    RunProgram = lExitCode

End Function 
选项显式
'Api声明
私有声明函数getExitCode进程库“Kernel32”(ByVal hProcess As Long,lpExitCode As Long)为Long
私有声明函数OpenProcess Lib“Kernel32”(ByVal dwDesiredAccess为Long,ByVal bInheritHandle为Long,ByVal dwProcessId为Long)为Long
私有声明函数CloseHandle Lib“kernel32.dll”(ByVal hObject作为Long)作为Long
公共函数RunProgram(ByVal strFilename作为字符串)的长度
“#目的:运行程序,等待关闭,然后返回退出代码
暗淡的TaskID一样长
暗淡的hProc如长
Dim lExitCode尽可能长
常量访问类型=&H400
常量仍然处于活动状态=&H103
"打开程序,
TaskID=Shell(strFilename,1)
hProc=OpenProcess(访问类型,False,任务ID)
如果错误为0,则
调试。打印“无法启动”&strFilename,vbCritical,“错误”
退出功能
如果结束
'等待程序关闭
做
GetExitCodeProcess hProc,lExitCode
多芬特
lExitCode=仍处于活动状态时循环
'返回程序的退出代码
RunProgram=lExitCode
端函数

您可以将VB.exe设置为返回退出代码。只需确保id不是0(表示运行成功)或259(调用进程将认为进程仍在运行)。下面的VBA运行一个.exe,等待它关闭,然后返回退出代码

Option Explicit

' Api declarations
Private Declare Function GetExitCodeProcess Lib "Kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long
Private Declare Function OpenProcess Lib "Kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Long) As Long


Public Function RunProgram(ByVal strFilename As String) As Long

    '# PURPOSE: Run a program, wait until closed, and return the exit code

    Dim TaskID As Long
    Dim hProc As Long
    Dim lExitCode As Long

    Const ACCESS_TYPE = &H400
    Const STILL_ACTIVE = &H103

    ' Open the program
    TaskID = Shell(strFilename, 1)
    hProc = OpenProcess(ACCESS_TYPE, False, TaskID)
    If Err <> 0 Then
        Debug.Print "Cannot start " & strFilename, vbCritical, "Error"
        Exit Function
    End If


    ' Wait until program is closed
    Do
        GetExitCodeProcess hProc, lExitCode
        DoEvents
    Loop While lExitCode = STILL_ACTIVE

    ' Return the program's exit code
    RunProgram = lExitCode

End Function 
选项显式
'Api声明
私有声明函数getExitCode进程库“Kernel32”(ByVal hProcess As Long,lpExitCode As Long)为Long
私有声明函数OpenProcess Lib“Kernel32”(ByVal dwDesiredAccess为Long,ByVal bInheritHandle为Long,ByVal dwProcessId为Long)为Long
私有声明函数CloseHandle Lib“kernel32.dll”(ByVal hObject作为Long)作为Long
公共函数RunProgram(ByVal strFilename作为字符串)的长度
“#目的:运行程序,等待关闭,然后返回退出代码
暗淡的TaskID一样长
暗淡的hProc如长
Dim lExitCode尽可能长
常量访问类型=&H400
常量仍然处于活动状态=&H103
"打开程序,
TaskID=Shell(strFilename,1)
hProc=OpenProcess(访问类型,False,任务ID)
如果错误为0,则
调试。打印“无法启动”&strFilename,vbCritical,“错误”
退出功能
如果结束
'等待程序关闭
做
GetExitCodeProcess hProc,lExitCode
多芬特
lExitCode=仍处于活动状态时循环
'返回程序的退出代码
RunProgram=lExitCode
端函数

您是否考虑过将VB.Net代码作为COM对象库编写?通过这种方式,您可以在VBA代码中创建VB.Net类的实例,然后调用该实例上的函数以返回所需的值。请参阅:您是否考虑过将VB.Net代码作为COM对象库编写?通过这种方式,您可以在VBA代码中创建VB.Net类的实例,然后调用该实例上的函数以返回所需的值。见: