엑셀 x 카카오톡, 카톡 문자보내기!
엑셀에서 바로 카카오톡 문자를 보내는 방법?! 1분이면 설정 완료!
이 강의에서는 엑셀 VBA에서 Win32 API를 호출해 카카오톡 채팅창으로 문자를 자동 전송하는 매크로의 구현 방법을 다룹니다. FindWindow, FindWindowEx, SendMessage 등 User32 라이브러리 함수의 동작 원리와 외부 프로그램의 창을 제어하는 VBA 기법을 단계별로 살펴봅니다.
관련 자료를 모았어요
더 깊이 살펴볼 수 있는 자료를 한곳에
영상강의
🚨 중요 알림 🚨
2024년 10월 8일 카카오톡 업데이트 이후 문자 전송 방식이 변경되어
이 강의에서 안내하는 매크로는 더 이상 동작하지 않습니다.
이후 업데이트 내용은 '카카오톡 문자 발송 자동화 서식'을 통해 제공해 드릴 예정이니 참고해 주세요.
엑셀 카카오톡 문자 보내기 단계별 알아보기
- 카카오톡 문자 보내기를 적용할 엑셀 파일을 실행합니다. (윈도우 XP 이상, 엑셀 2007 이상 버전이면 어느 환경에서나 사용할 수 있습니다.)

- 화면 상단에서 '개발도구' - '매크로' 를 클릭하거나 단축키 Alt+ F11을 눌러 매크로 편집창으로 이동합니다.
상단에 개발도구 탭이 보이지 않을 경우, 아래 개발도구 활성화 방법 포스트를 참고해 주세요.

- 매크로 편집창 상단에서 '삽입' - '모듈' 을 클릭하여 새로운 모듈을 삽입합니다.

- 아래 명령문을 복사하여 붙여넣기 합니다.
카카오톡 최신 버전을 사용 중일 경우, 아래 명령문에서 RichEdit20W 을 RichEdit50W 로 변경해 주세요.
Option Explicit #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 'https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-postmessagea Private Declare PtrSafe Function PostMessage Lib "user32" Alias "PostMessageA" _ (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 'https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-postmessagea Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" _ (ByVal hwnd As Long, _ ByVal wMsg As Long, _ ByVal wParam As Long, _ ByRef lParam As Any) As Long #End If Sub Send_Kakao(Target As Range, Msg As Range) Dim SendTo$: SendTo = Target.Value Dim Message$: Message = Msg.Value Dim hwnd_KakaoTalk As Long: Dim hwnd_RichEdit As Long Const WM_SETTEXT = &HC: Const WM_KEYDOWN = &H100 Const WM_KEYUP = &H101: Const VK_RETURN = &HD hwnd_KakaoTalk = FindWindow(vbNullString, SendTo) hwnd_RichEdit = FindWindowEx(hwnd_KakaoTalk, 0, "RichEdit50W", vbNullString) ' PC 카톡버전 Ver. 3.1.2.2472 이전 버전을 사용중일 경우 RichEdit50W 을 RichEdit20W 로 수정해주세요. If hwnd_RichEdit = 0 Then MsgBox SendTo & "의 채팅창이 실행되었는지 확인하세요.": Exit Sub Call SendMessage(hwnd_RichEdit, WM_SETTEXT, 0, ByVal Message) Call PostMessage(hwnd_RichEdit, WM_KEYDOWN, VK_RETURN, 0) End Sub
- 매크로 편집창에서 'Microsoft Excel 개체'를 확인합니다. 현재 실행 중인 엑셀 파일의 모든 시트가 나열되어 있습니다.

- 문자를 보낼 시트를 더블클릭하여 시트 모듈로 이동합니다.

- 아래 명령문을 복사하여 시트 모듈에 붙여넣기 합니다.
Private Sub Worksheet_Change(ByVal Target As Range) Dim 사용자명 As String: 사용자명 = "A1" '<<- 사용자명이 입력된 셀 주소를 입력하세요. Dim 보낼메세지 As String: 보낼메세지 = "A1" '<<- 보낼메세지가 입력된 셀주소를 입력하세요. If Target.Address(False, False) = 사용자명 Or Target.Address(False, False) = 보낼메세지 Then Send_Kakao Range(사용자명), Range(보낼메세지) End If End Sub
- 시트로 돌아가 '사용자명'과 '보낼 메세지'를 입력할 셀 주소를 확인합니다.

- 시트 모듈에 붙여넣은 명령문에서 '사용자명'과 '보낼메세지'의 값을 각각의 셀 주소로 변경합니다.

- 시트로 돌아온 뒤 사용자명과 보낼메세지 셀에 값을 입력하면 해당 사용자에게 카카오톡 메세지가 자동으로 전송됩니다.
(단, 상대방의 카카오톡 채팅창은 백그라운드에서 실행 중이어야 합니다.)
- 작성한 파일은 반드시 '매크로 사용 통합문서(*.xlsm)' 형식으로 저장해야 다음 실행 시에도 카카오톡 문자 보내기 기능을 사용할 수 있습니다.

- 또한 파일을 다시 실행할 때 엑셀 창 상단의 [콘텐츠 사용] 버튼을 클릭하여 매크로를 활성화합니다.

3. 명령문 동작원리 알아보기
- 사용된 윈도우 User32 라이브러리 함수 목록
함수명 설명(관련 링크) FindWindowA 함수 실행 중인 프로그램의 Class 또는 창 이름으로 검색하여 hWnd 값을 반환합니다.
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-findwindowaFindWindoeEX 함수 실행 중인 특정 프로그램 안의 또 다른 개체를 Class 명으로 검색하여 해당 개체의 hWnd 값을 반환합니다.
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-findwindowexaSendMessageA 함수 지정한 hWnd 창에 특정 메세지를 전달합니다. (결과값이 반환될 때까지 대기한 뒤 동기화합니다.)
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-sendmessageaPostMessageA 함수 지정한 hWnd 창에 특정 메세지를 전달합니다. (결과값을 기다리지 않고 곧바로 다음 동작을 수행합니다.)
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-postmessagea - 변수를 설정합니다.
변수 (데이터타입) 설명 SendTo, Message (String) 사용자명과 보낼 메세지를 저장하는 변수입니다. hwnd_KakaoTalk,
hwnd_RichEdit (Long)지정한 사용자의 카카오톡 채팅방과 편집창의 창 번호 고유값입니다. WM_SETTEXT, WMKEYDOWN
WM_KEYUP, VK_RETURN (Double)각 키보드(또는 가상키)의 고유값입니다. - 지정한 사용자명의 카카오톡 채팅방과 편집창의 고유값을 받아옵니다.
' 카카오톡 채팅방과 편집창의 고유값을 반환합니다. hwnd_KakaoTalk = FindWindow(vbNullString, SendTo) hwnd_RichEdit = FindWindowEx(hwnd_KakaoTalk, 0, "RichEdit20W", vbNullString)
- 만약 편집창 고유값이 0인 경우, "~~의 채팅창이 실행되었는지 확인하세요." 라는 안내 메세지를 출력한 뒤 명령문을 종료합니다.
' 편집창으로 받아온 값이 없을 경우 안내메세지를 출력 후 명령문을 종료합니다. If hwnd_RichEdit = 0 Then MsgBox SendTo & "의 채팅창이 실행되었는지 확인하세요.": Exit Sub
- 해당 사용자에게 메세지를 전송한 뒤 명령문을 종료합니다.
' 메세지 전송 후 명령문을 종료합니다. Call SendMessage(hwnd_RichEdit, WM_SETTEXT, 0, ByVal Message) Call PostMessage(hwnd_RichEdit, WM_KEYDOWN, VK_RETURN, 0)
자주 묻는 질문
1. 명령문을 정확히 입력했는데도 계속 오류 메세지가 출력됩니다.
- 본 명령문은 상대방의 카카오톡 채팅방이 반드시 백그라운드에서 실행 중일 때만 사용할 수 있습니다. 상대방의 채팅창이 실행 중인지 다시 확인해 보세요.
- 또는 상대방 이름에 '이모티콘'이 포함되어 있는지 확인해 보세요. 이름에 이모티콘이 포함되어 있을 경우 명령문을 사용할 수 없습니다. 채팅창 우측 상단의 () 모양 아이콘을 클릭한 뒤 [채팅방설정]에서 사용자 이름을 변경할 수 있습니다.

2. 단톡방에도 사용할 수 있나요?
- 단톡방에서도 사용할 수 있습니다. 단톡방에 표시되는 이름을 사용자명으로 입력해 주세요.
3. 메세지를 보낸 뒤 보낸 메세지 셀을 초기화하고 싶습니다. 어떻게 해야 하나요?
- 메세지를 전송한 뒤 보낼메세지 셀을 초기화하려면 시트 모듈의 명령문을 아래와 같이 수정해 주세요.
Private Sub Worksheet_Change(ByVal Target As Range) Dim 사용자명 As String: 사용자명 = "A1" '<<- 사용자명이 입력된 셀 주소를 입력하세요. Dim 보낼메세지 As String: 보낼메세지 = "A1" '<<- 보낼메세지가 입력된 셀주소를 입력하세요. If Target.Address(False, False) = 사용자명 Or Target.Address(False, False) = 보낼메세지 Then Send_Kakao Range(사용자명), Range(보낼메세지) ' 보낼메세지를 초기화합니다. Range(보낼메세지).Value = "" End If End Sub
4. 엔터 입력 후 보낼메세지 셀로 자동 포커싱하려면 어떻게 해야 하나요?
- 엔터 입력 후 보낼 메세지 셀로 자동 포커싱하려면 명령문의 'Send_Kakao Range(사용자명), Range(보낼메세지)' 다음에 아래 줄을 추가해 주세요.
If Target.Address(False, False) = 사용자명 Or Target.Address(False, False) = 보낼메세지 Then Send_Kakao Range(사용자명), Range(보낼메세지) ' 보낼메세지 셀을 선택합니다. Range(보낼메세지).Select End If
5. 여러 명에게 동시에 메세지를 보내려면 어떻게 해야 하나요?
- 여러 명에게 동시에 메세지를 전송하려면 시트 모듈을 아래와 같이 수정합니다. '보낼메세지' 값이 변경되면 모든 사용자에게 동일한 메세지가 전송됩니다.
Private Sub Worksheet_Change(ByVal Target As Range) Dim 사용자명 As String: 사용자명 = "A1:A10" '<<- 사용자명이 입력된 넓은 범위를 입력하세요. Dim 보낼메세지 As String: 보낼메세지 = "A1" '<<- 보낼메세지가 입력된 셀주소를 입력하세요. Dim Rng As Range If Target.Address(False, False) = 보낼메세지 Then ' 사용자명 범위의 셀을 하나씩 돌아가며 각각의 사용자에게 메세지를 전송합니다. For Each Rng In Range(사용자명) ' 사용자명이 빈칸이 아닐 경우에만 메세지를 전송합니다. If Rng.Value <> "" Then Send_Kakao Rng, Range(보낼메세지) Next End If End Sub
6. 메세지 발송 성공/실패 여부를 출력하려면 어떻게 해야 하나요?
메세지 전송 성공/실패 여부를 다른 셀에 출력하려면 명령문을 아래와 같이 수정해 주세요.
Send_KaKao 명령문
Sub Send_Kakao(Target As Range, Msg As Range, Result As Range) Dim SendTo$: SendTo = Target.Value Dim Message$: Message = Msg.Value Dim hwnd_KakaoTalk As Long: Dim hwnd_RichEdit As Long Const WM_SETTEXT = &HC: Const WM_KEYDOWN = &H100 Const WM_KEYUP = &H101: Const VK_RETURN = &HD hwnd_KakaoTalk = FindWindow(vbNullString, SendTo) hwnd_RichEdit = FindWindowEx(hwnd_KakaoTalk, 0, "RichEdit20W", vbNullString) If hwnd_RichEdit = 0 Then MsgBox SendTo & "의 채팅창이 실행되었는지 확인하세요." Result.Value = "[채팅창을 확인하세요]" Exit Sub End If Call SendMessage(hwnd_RichEdit, WM_SETTEXT, 0, ByVal Message) Call PostMessage(hwnd_RichEdit, WM_KEYDOWN, VK_RETURN, 0) Result.Value = "[완료] " & SendTo & "," & Left(Message, 4) & "..." End Sub
시트 모듈 명령문
Private Sub Worksheet_Change(ByVal Target As Range) Dim 사용자명 As String: 사용자명 = "A1" '<< - 사용자명이 입력된 셀 주소를 입력하세요. Dim 보낼메세지 As String: 보낼메세지 = "A1" '<< - 보낼메세지가 입력된 셀주소를 입력하세요. Dim 결과출력 As String: 결과출력 = "A1" '<< - 결과를 출력할 셀 주소를 입력하세요 If Target.Address(False, False) = 사용자명 Or Target.Address(False, False) = 보낼메세지 Then Send_Kakao Range(사용자명), Range(보낼메세지), Range(결과출력) End If End Sub
7. 메시지 발송 전 확인창을 띄우려면 어떻게 해야 하나요?
메세지 발송 전 '정말로 메세지를 보내겠습니까?' 확인창을 띄운 뒤 메세지를 전송하려면 시트 모듈 명령문을 아래와 같이 수정합니다.
Private Sub Worksheet_Change(ByVal Target As Range) Dim 사용자명 As String: 사용자명 = "A1" '<<- 사용자명이 입력된 셀 주소를 입력하세요. Dim 보낼메세지 As String: 보낼메세지 = "A1" '<<- 보낼메세지가 입력된 셀주소를 입력하세요. Dim YN As VbMsgBoxResult If Target.Address(False, False) = 사용자명 Or Target.Address(False, False) = 보낼메세지 Then YN = MsgBox("정말로 메세지를 보내시겠습니까?", vbYesNo) If YN = vbYes Then Send_Kakao Range(사용자명), Range(보낼메세지) End If End If End Sub
8. 잘 사용하던 중 갑자기 메세지 발송이 되지 않습니다.
2020년 5월에 카카오톡 버전이 업데이트되면서 채팅창에서 사용되는 hWnd 값이 변경되었습니다.
따라서 사용 중인 PC 카카오톡 버전이 Ver. 3.1.2.2472 이상이라면 hWnd 값(hwnd_RichEdit) 수정이 필요합니다. 수정해야 할 부분은 카카오톡 보내기 명령문 안에 함께 안내해 두었습니다.
혹시 엑셀창을 최대화하셨나요?
그러실경우, 엑셀 창을 약간 작게 만드신 뒤, 카카오톡창을 옆에 빈 공간으로 옮긴 뒤 메세지를 보내보시길 바랍니다^-^
감사합니다.
어떤 오류 메세지가 출력되시나요? 또는 사용중인 PC 버전이 어떻게 되시나요?
어떤 오류가 발생하는지 자세히 말씀해주시면 확인 후 답변드리겠습니다.
감사합니다!
메세지 전송 성공/실패 여부를 출력하는 방법을 질문6에 수정된 명령문과 함께 작성해드렸으니 확인해보시겠어요?^^
https://www.oppadu.com/엑셀-카카오톡-문자-보내기/#q6
감사합니다!
파일을 저장하실 때 '매크로포함 워크시트(*.xlsm) 형식으로 저장해주셔야 합니다.
그리고 실행하실때에도 반드시 '매크로포함' 버튼을 눌러 포함된 매크로를 활성해주셔야 합니다.
감사합니다!
구글 스프레스시트로는 만들수 없나요 ???
여러명에게 보내는것도 가능합니다. Send_KAKAO 명령문을 응용하시면 되겠는데요.
기본적인 VBA 지식이 필요합니다.
시트의 A1 ~ A10셀에 보낼 사용자명을 입력하신 뒤, For문을 사용해서
Send_KAKAO Range("A"&i), Range(보낼메세지)
Next
형식으로 작성해보시기 바랍니다.
제시해드린 답변이 도움이 되셨길 바랍니다.
1.sendkakao 추가기능을 설치하였는데요, 엑셀을 실행할때마다 추가기능 엑셀파일이 열립니다.
2.강의내용 질문인데요, 여러 메시지를 보낼 때 열방향으로만 보내지는데요, 행방향으로 보낼 수 있을까요?
3.카톡으로 보내기 전에 확인창 띄워서 실수로 전송하는걸 막을 수 있을까요?
4.아, 그리구 가능하다면 내용을 모두 작성 후 전송버튼 같은걸 누르면 전송이 된다던가 하는 기능을 구현할 수 있을까요?
항상 좋은 강의 감사합니다^^
1. 엑셀파일이 열린다는게 정확히 어떤 말씀이신가요? 추가기능을 설치하시면 BackGround에서 실행되는게 정상이고, 별도의 엑셀파일이 실행되실경우 추가기능 제거 후 다시 설치해보시기 바랍니다.
2. 행 방향으로도 보내실 수 있습니다 ^^ 명령문을 필요에따라 적절히 수정하셔야 하는데, 약간의 VBA 지식이 필요합니다.
3. 확인창을 띄운 뒤 메세지를 보내시려면 시트모듈을 아래와 같이 수정해보세요.
Dim 사용자명 As String: 사용자명 = "A1" '<<- 사용자명이 입력된 셀 주소를 입력하세요.
Dim 보낼메세지 As String: 보낼메세지 = "A1" '<<- 보낼메세지가 입력된 셀주소를 입력하세요.
Dim YN As VbMsgBoxResult
If Target.Address(False, False) = 사용자명 Or Target.Address(False, False) = 보낼메세지 Then
YN = MsgBox("정말로 메세지를 보내시겠습니까?", vbYesNo)
If YN = vbYes Then
Send_Kakao Range(사용자명), Range(보낼메세지)
End If
End If
End Sub
4. 도형을 추가하신 뒤, 해당 도형에 매크로 지정을 해주시면 됩니다. 관련 내용은 이전 퀵VBA 강의에서 여러번 설명 드렸으니 이전강의 확인해보시면 도움이 되실겁니다.
제시해드린 답변이 도움이 되셨길 바랍니다.
감사합니다^^
회사에서 일할때 카톡에 반복적인 복사/붙여넣기 했는데~
신계계를 경험하게 해주셨어요!!
채팅창은 반드시 백그라운드에서 실행되어 있어야 합니다.
사진전송은 시트에서 사용되는 '함수' 형식으로는 구현이 불가능합니다. Send_KAKAO 명령문을 수정하신다면, 명령문 실행 형태로는 사진전송을 구현할 수 있습니다. 다만 VBA 관련 지식이 필요합니다.
답변이 도움이 되셨길 바랍니다.
감사합니다.