Обмен данными между приложением Excel VBA и Windows Form - PullRequest
0 голосов
/ 02 января 2019

Мне было поручено работать с приложением, в котором электронная таблица Excel должна извлекать / получать доступ к значениям непосредственно из приложения Windows Form, работающего рядом с клиентом.Я читал о предоставлении компонентов .NET для COM, и я был в состоянии скомпилировать, зарегистрировать и использовать их из Excel.Тем не менее, ничего из того, что я прочитал до сих пор, не позволило мне напрямую подключиться к запущенному процессу / форме Windows и получить доступ к некоторым значениям в самой форме, потому что мне всегда нужно «Создать» объект .NET в VBA и я не могу получить доступ ктекущая тема.Мои вопросы:

  • Возможно ли иметь прямой процесс для обработки связи между электронной таблицей Excel и приложением Windows Form (без промежуточной базы данных или файла)?
  • Можно лискомпилировать вывод приложения формы Windows .NET в .dll?Пока что я могу получить его только для генерации .exe.

Пожалуйста, дайте мне знать, если это плохо сформулировано, и я могу попытаться объяснить проблему лучше.

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 03 января 2019

Я думаю, что лучше всего использовать сообщения между окнами. Вот пример для отправки с vb6 на vb.net, вы можете адаптировать его к vba:

код vb6:

Private Sub cmdSendData_Click()
Dim sString As String
Dim lHwnd As Long
Dim cds As COPYDATASTRUCT
Dim buf(1 To 255) As Byte

sString = Trim$(txtString)
If sString = "" Then Exit Sub
'
' Get the handle of the target application's visible window.
'
lHwnd = FindWindow(vbNullString, cWINDOW_TITLE)
'
' Copy the string into a byte array,
' converting it to ASCII. Assign lpData
' the address of the byte array.
'
Call CopyMemory(buf(1), ByVal sString, Len(sString))
With cds
    .dwData = 3
    .cbData = Len(sString) + 1
    .lpData = VarPtr(buf(1))
End With
'
' Send the string.
'
Call SendMessage(lHwnd, WM_COPYDATA, Me.hwnd, cds)
End Sub

код vb.net:

Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
    If m.Msg = MainForm.WM_COPYDATA Then
      Dim data As CopyData
      Dim message As String

      ' get the data...
      data = CType(m.GetLParam(GetType(CopyData)), CopyData)
      Dim B(255) As Byte
Marshal.Copy(data.lpData, B, 0, 255)
message = System.Text.Encoding.Default.GetString(B
      ' add the message
      Messages.Items.Add(String.Format("{0}: {1}", DateTime.Now.ToShortTimeString(), message))

      ' let them know we processed the message...
      m.Result = New IntPtr(1)
    Else
      MyBase.WndProc(m)
    End If
  End Sub

  Private Const WM_COPYDATA As Integer = &H4A

  <StructLayout(LayoutKind.Sequential)> _
  Private Structure CopyData
    Public dwData As IntPtr
    Public cbData As Integer
    Public lpData As IntPtr
  End Structure
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...