본문 바로가기
엑셀

매크로에서 실행파일에 메시지 보내기 (32, 64bit 공용)

by 델피1004 2026. 2. 9.
반응형

Option Explicit

Public Type COPYDATASTRUCT
    dwData As LongPtr
    cbData As Long
    lpData As LongPtr
End Type

#If VBA7 Then
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-findwindowa
Private Declare PtrSafe Function FindWindow Lib "user32.dll" Alias "FindWindowA" _
                                                        (ByVal lpClassName As String, _
                                                        ByVal lpWindowName As String) As Long
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-findwindowexa
Public Declare PtrSafe Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" _
                                                            (ByVal hwndParent As Long, _
                                                            ByVal hwndChildAfter As Long, _
                                                            ByVal lpszClass As String, _
                                                            ByVal lpszWindow As String) As Long
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-sendmessagea
Private Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" _
                                                            (ByVal hwnd As Long, _
                                                            ByVal wMsg As Long, _
                                                            ByVal wParam As Long, _
                                                            ByRef lParam As Any) As Long
#Else
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-findwindowa
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" _
                                                        (ByVal lpClassName As String, _
                                                        ByVal lpWindowName As String) As Long
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-findwindowexa
Public Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" _
                                                            (ByVal hwndParent As Long, _
                                                            ByVal hwndChildAfter As Long, _
                                                            ByVal lpszClass As String, _
                                                            ByVal lpszWindow As String) As Long
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-sendmessagea
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
                                                            (ByVal hwnd As Long, _
                                                            ByVal wMsg As Long, _
                                                            ByVal wParam As Long, _
                                                            ByRef lParam As Any) As Long
#End If


Sub Excel_Select(szSQL As String, nRow As Integer)
Dim hwnd_XXXX As Long
Dim hwnd_Main As Long
Dim data As COPYDATASTRUCT
Dim buffer() As Byte
Dim szChSQL As String


Const WM_COPYDATA = &H4A
Const WM_SETTEXT = &HC

hwnd_XXXX = FindWindow(vbNullString, "XXXX.exe")
hwnd_Main = FindWindowEx(hwnd_XXXX, 0, "TmainForm", vbNullString)


If hwnd_Main = 0 Then MsgBox "XXXX가 실행되었는지 확인하세요.": Exit Sub



szChSQL = szSQL + "      "
  
ReDim buffer(Len(szChSQL) * 2 - 1) As Byte

buffer = StrConv(szChSQL, vbFromUnicode)

data.dwData = 100
data.cbData = UBound(buffer) + 1
data.lpData = VarPtr(buffer(0))

Call SendMessage(hwnd_Main, WM_COPYDATA, 0, data)


End Sub


Sub Excel_Select2(szSQL As String, nRow As Integer)
Dim hwnd_XXXX As Long
Dim hwnd_Main As Long
Dim data As COPYDATASTRUCT
Dim buffer() As Byte
Dim szChSQL As String


Const WM_COPYDATA = &H4A
Const WM_SETTEXT = &HC

hwnd_XXXX = FindWindow(vbNullString, "XXXX.exe")
hwnd_Main = FindWindowEx(hwnd_XXXX, 0, "TmainForm", vbNullString)


If hwnd_Main = 0 Then MsgBox "XXXX가 실행되었는지 확인하세요.": Exit Sub

szChSQL = szSQL + "      "
  
ReDim buffer(Len(szChSQL) * 2 - 1) As Byte


buffer = StrConv(szChSQL, vbFromUnicode)

'' 삭제 문자 제거
'Dim i As Long
'For i = LBound(buffer) To UBound(buffer)
'    If buffer(i) = 127 Then ' 삭제 문자 ASCII 코드
'        buffer(i) = 0 ' 삭제 문자를 0으로 대체
'    End If
'Next i

data.dwData = 101
data.cbData = UBound(buffer) + 1
data.lpData = VarPtr(buffer(0))

Call SendMessage(hwnd_Main, WM_COPYDATA, 0, data)


End Sub

반응형

'엑셀' 카테고리의 다른 글

폴더안에 있는 워드 일괄 출력하는 매크로  (0) 2025.10.29

댓글