2016-07-22 77 views
1

我正在制作一个工具,我需要通过在Excle文件中使用VBA来启动一个程序(我想用VB编写代码)。当我关闭该程序时,它应该给VBA脚本返回一个参数。如何在vba和vb之间传递参数

我刚刚开始使用VBA脚本,并没有编写任何VB程序。但是我需要知道,在VBA脚本中写什么,并且这是可能的。

因此,它应该像这样工作:

  • 我在Excel文件我和我按下一个按钮
  • 的PROGRAMM开始(也从Excel文件得到一个参数,这不是重要的还)
  • 在这种PROGRAMM我configurate一些东西
  • 关闭该PROGRAMM应该归还该配置的ID
  • 我得到返回Excel与此ID文件

这可能吗?我需要在VBA脚本和Programm中编写什么来返回参数?

我希望你明白我的意思是,你能不能帮我

+0

你可以阅读[的StdOut(https://msdn.microsoft.com/en-us/library/cbxxzwb5(V = vs.84)的.aspx) –

+1

你有没有考虑写你的VB.Net代码作为一个COM对象库?这样你就可以在VBA代码中创建一个VB.Net类的实例,然后在该实例上调用一个函数来返回所需的值。请参阅:[演练:使用Visual Basic创建COM对象](https://msdn.microsoft.com/en-us/library/x66s8zcd(v = vs.110).aspx) – TnTinMn

回答

0

你可以设置你的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