엑셀 카카오톡 문자 보내기, 1분이면 설정 완료!
엑셀 카카오톡 문자 보내기 목차 바로가기
- 영상강의
- SendKAKAO 함수 추가기능 다운로드
- 채팅방 내역을 실시간으로 조회하려면? GetKAKAO 함수 다운로드
- 카카오톡 문자 보내기 모듈 추가하기
- 실시간으로 명령문을 실행할 시트모듈에 추가하기
- 명령문 동작원리 알아보기
- 질문1. 명령문을 제대로 입력했는데도, 계속 오류메세지가 출력됩니다.
- 질문2. 단톡방에도 사용할 수 있나요?
- 질문3. 메세지 전송 후, 보낼 메세지 셀을 초기화하고 싶습니다.
- 질문4. 엔터입력 후, 다시 보낼메세지 셀로 포커싱하고 싶습니다.
- 질문5. 여러사람에게 동시에 메세지를 전송하고 싶습니다.
- 질문6. 메세지 전송 성공/실패 여부를 출력하고 싶습니다.
- 질문7. 메세지 발송 전 확인창을 띄운 뒤, '확인' 버튼을 눌러 메세지를 전송하고 싶습니다.
- 질문8. 잘 사용 중 이였는데, 갑자기 메세지 발송이 안됩니다.
영상강의
🚨 중요 알림 🚨
2024년 10월 8일 카카오톡 업데이트 이후 문자 전송 방식이 변경되어
이번 강의에서 소개해드린 매크로는 사용할 수 없습니다.
이후 업데이트는 '카카오톡 문자 발송 자동화 서식'을 통해 제공할 예정이니 참고해주세요!
- ✨ 엑셀 카카오톡 문자보내기 자동화 서식회원자료
엑셀 카카오톡 문자 보내기 단계별 알아보기
- 카카오톡 문자 보내기를 수행할 엑셀 파일을 실행합니다. (윈도우 XP 이상, 엑셀 2007 이상 버전이면, 어디서든 사용 가능합니다.)
엑셀 카카오톡 문자 보내기를 추가할 파일을 실행합니다. - 화면 상단의 '개발도구' - '매크로' 를 클릭, 또는 단축키 키보드 Alt+ F11키를 눌러 매크로 편집창으로 이동합니다.
상단의 개발도구가 안 보이실 경우, 아래 개발도구 활성화 방법 포스트를 참고하세요.'개발도구' - 'Visual Basic'을 클릭하여 매크로 편집창으로 이동합니다. - 매크로 편집창 상단의 '삽입' - '모듈' 을 클릭하여 새로운 모듈을 삽입합니다.
'삽입' - '모듈'로 새로운 모듈을 삽입합니다. - 아래 명령문을 복사하여 붙여넣기 합니다.
카카오톡 최신버전을 사용중이실 경우, 아래 명령문의 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 개체'를 확인합니다. 현재 실행중인 엑셀파일의 모든 시트가 나열되어 있습니다.
'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) 수정이 필요합니다. 수정이 필요한 부분은 카카오톡 보내기 명령문 안에 적어드렸습니다.
- 카카오톡 문자 보내기를 수행할 엑셀 파일을 실행합니다. (윈도우 XP 이상, 엑셀 2007 이상 버전이면, 어디서든 사용 가능합니다.)