2016-07-22 2 views
1

Я создаю инструмент, где мне нужно запустить программу (которую я хочу кодировать с помощью VB), используя VBA в файле Excle. Когда я закрываю эту программу, она должна вернуть параметр сценарию VBA.Как передать параметры между vba и vb

Я только что начал с скрипта VBA и ничего не кодировал в программе VB. Но мне нужно знать, что писать в скрипте VBA, и это возможно.

Так оно и должно работать так:

  • Я нахожусь в файле Excel и я нажимаю кнопку
  • программка начинает (также получение параметра из файла Excel, это не то, что важно еще)
  • в этой программе я конфигурировать некоторые вещи
  • Закрытие, что программа должна вернуть идентификатор этой конфигурации
  • Я получаю обратно в Excel файл с этим идентификатором

Возможно ли это? И что мне нужно написать в скрипте VBA и в Programm, чтобы вернуть параметр?

Я надеюсь, вы понимаете, что я имею в виду, и вы можете помочь мне

+0

Вы можете прочитать [STDOUT] (https://msdn.microsoft.com/en-us/library/cbxxzwb5 (V = vs.84) .aspx) –

+1

Рассматривали ли вы написание кода VB.Net как библиотеку COM-объектов? Таким образом вы создаете экземпляр вашего класса VB.Net в коде VBA, а затем вызываете функцию на этом экземпляре, чтобы вернуть нужное значение. См .: [Пошаговое руководство: создание COM-объектов с помощью Visual Basic] (https://msdn.microsoft.com/en-us/library/x66s8zcd (v = vs.110) .aspx) – TnTinMn

ответ

0

Вы можете установить VB EXE-файл, чтобы вернуть код выхода. Просто убедитесь, что идентификатор не равен 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 
Смежные вопросы