엑셀 x 카카오톡 문자 보내기, 1분이면 설정 완료!

엑셀 사용자지정함수를 사용하여 엑셀로 카카오톡 문자를 보내는 방법을 알아봅니다.

# VBA

작성자 :
오빠두엑셀
최종 수정일 : 2024. 10. 11. 20:31
URL 복사
메모 남기기 : (132)

엑셀 카카오톡 문자 보내기, 1분이면 설정 완료!

엑셀 카카오톡 문자 보내기 목차 바로가기
영상강의

큰 화면으로 보기


🚨 중요 알림 🚨

2024년 10월 8일 카카오톡 업데이트 이후 문자 전송 방식이 변경되어
이번 강의에서 소개해드린 매크로는 사용할 수 없습니다.
이후 업데이트는 '카카오톡 문자 발송 자동화 서식'을 통해 제공할 예정이니 참고해주세요!

  • ✨ 엑셀 카카오톡 문자보내기 자동화 서식
    회원자료

엑셀 카카오톡 문자 보내기 단계별 알아보기

1. 엑셀 새로운 매크로 모듈 추가하기

  1. 카카오톡 문자 보내기를 수행할 엑셀 파일을 실행합니다. (윈도우 XP 이상, 엑셀 2007 이상 버전이면, 어디서든 사용 가능합니다.)

    엑셀 카카오톡 문자 보낼 파일 실행
    엑셀 카카오톡 문자 보내기를 추가할 파일을 실행합니다.
  2. 화면 상단의 '개발도구' - '매크로' 를 클릭, 또는 단축키 키보드 Alt+ F11를 눌러 매크로 편집창으로 이동합니다.
    상단의 개발도구가 안 보이실 경우, 아래 개발도구 활성화 방법 포스트를 참고하세요.

    엑셀 매크로 편집창 이동
    '개발도구' - 'Visual Basic'을 클릭하여 매크로 편집창으로 이동합니다.
  3. 매크로 편집창 상단의 '삽입' - '모듈' 을 클릭하여 새로운 모듈을 삽입합니다.

    새로운 모듈 삽입
    '삽입' - '모듈'로 새로운 모듈을 삽입합니다.
  4. 아래 명령문을 복사하여 붙여넣기 합니다.

    카카오톡 최신버전을 사용중이실 경우, 아래 명령문의 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

2. 원하는 시트 모듈에 명령문 추가하기

  1. 매크로 편집창의 'Microsoft Excel 개체'를 확인합니다. 현재 실행중인 엑셀파일의 모든 시트가 나열되어 있습니다.

    엑셀 카카오톡 보낼 시트 확인
    'Microsoft Excel 개체' 에서 시트목록을 확인합니다.
  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(보낼메세지)
    End If
     
    End Sub
  4. 해당 시트에서, '사용자명' 과 '보낼 메세지'를 입력할 셀 주소를 확인합니다.

    엑셀 카카오톡 문자 보낼 셀 확인
    사용자명과 보낼메세지를 입력할 셀 주소를 확인합니다.
  5. 시트 모듈에 붙여넣기 한 명령문의 '사용자명' 그리고 '보낼메세지'의 값을 각각의 셀 주소로 변경합니다.

    사용자명 및 보낼메세지 변수 수정
    명령문의 '사용자명', '보낼메세지' 값을 각각 수정합니다.
  6. 시트로 돌아온 뒤, 사용자명과 보낼메세지의 값을 입력하면 해당 사용자에게 카카오톡 메세지가 전송됩니다.
    (단, 사용자의 카카오톡 창은 백그라운드에서 실행중이여야만 합니다.)

    엑셀 카카오톡 문자 보내기 완료
    시트에 내용을 입력하면 사용자에게 카카오톡 문자가 전송됩니다.
  7. 작성한 파일은 반드시 '매크로 사용 통합문서(*.xlsm)' 로 저장하셔야 이후에도 카카오톡 문자보내기 기능을 사용할 수 있습니다.

    매크로 사용 통합문서 저장
    작성된 파일은 매크로사용 통합문서로 저장합니다.
  8. 또한 이후 파일 실행시 엑셀 창 상단의 [콘텐츠 사용] 버튼을 클릭하여 포함된 매크로를 활성화합니다.

    엑셀 매크로 활성화
    이후 파일 실행시 '콘텐츠 사용' 버튼을 클릭하여 포함된 매크로를 활성화합니다.
3. 명령문 동작원리 알아보기
  1. 사용된 윈도우 User32 라이브러리 함수 목록
    함수명 설명(관련 링크)
    FindWindowA 함수 실행중인 프로그램의 Class 또는 창 이름으로 검색하여 hWnd 값을 반환합니다.
    https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-findwindowa
    FindWindoeEX 함수 실행중인 특정 프로그램 안의 또 다른 개체를 Class 명으로 검색하여 해당 개체의 hWnd 값을 반환합니다.
    https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-findwindowexa
    SendMessageA 함수 지정한 hWnd 창에 특정 메세지를 전달합니다. (결과값이 반환될 때까지 기다린 뒤 값을 동기화합니다.)
    https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-sendmessagea
    PostMessageA 함수 지정한 hWnd 창에 특정 메세지를 전달합니다. (결과값을 기다리지 않고 바로 다음 동작을 수행합니다.)
    https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-postmessagea
  2. 변수를 설정합니다.
    변수 (데이터타입) 설명
    SendTo, Message (String) 사용자명과 보낼 메세지입니다.
    hwnd_KakaoTalk,
    hwnd_RichEdit (Long)
    지정한 사용자의 카카오톡 채팅방과 편집창의 창번호 고유값입니다.
    WM_SETTEXT, WMKEYDOWN
    WM_KEYUP, VK_RETURN (Double)
    각각의 키보드(또는 가상키) 고유값입니다.
  3. 지정한 사용자명의 카카오톡 채팅방, 그리고 편집창의 고유값을 받아옵니다.
    ' 카카오톡 채팅방과 편집창의 고유값을 반환합니다.
    hwnd_KakaoTalk = FindWindow(vbNullString, SendTo)
    hwnd_RichEdit = FindWindowEx(hwnd_KakaoTalk, 0, "RichEdit20W", vbNullString)
  4. 만약 편집창으로 받아온 값이 없을 경우(=0), "~~의 채팅창이 실행되었는지 확인하세요." 라는 안내메세지를 출력 후 명령문을 종료합니다.
    ' 편집창으로 받아온 값이 없을 경우 안내메세지를 출력 후 명령문을 종료합니다.
    If hwnd_RichEdit = 0 Then MsgBox SendTo & "의 채팅창이 실행되었는지 확인하세요.": Exit Sub
  5. 해당 사용자에게 보낼 메세지를 전송 후 명령문을 종료합니다.
    ' 메세지 전송 후 명령문을 종료합니다.
    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) 수정이 필요합니다. 수정이 필요한 부분은 카카오톡 보내기 명령문 안에 적어드렸습니다.

5 72 투표
게시글평점
132 댓글
Inline Feedbacks
모든 댓글 보기
132
0
여러분의 생각을 댓글로 남겨주세요.x