ในตอนที่แล้วเราใช้ Excel VBA ส่งข้อความแจ้งเตือนเข้า Line กันไปแล้ว (แต่ยังไม่จบนะ) ในตอนนี้เราจะขอสลับฉากมาดูวิธีส่งเข้า Email กันบ้างครับ 555
การส่งบางอย่างจาก Excel เข้า Email ผมขอแบ่งออกเป็น 4 วิธีหลักๆ ดังนี้
- ใช้ Insert Hyperlink
- ใช้สูตร HYPERLINK
- ใช้ VBA ส่งผ่าน Outlook
- ใช้ VBA ส่งผ่านช่องทางอื่นๆ เช่น Gmail
เรามาดูแต่ละวิธีกันครับ เพราะมันไม่เหมือนกันเลย…
เน้นย้ำว่านี่เป็นวิธีส่งข้อความจาก Excel ผ่านบริการ Email ของผู้ให้บริการต่างๆ ไปที่ปลายทาง ซึ่งคนรับปลายทางเป็นเมลอะไรก็ได้นะครับ แต่คนส่งเป็นวิธีตามที่ผมบอกนี้
ปล. บทความนี้ยาวมาก ถ้าไม่อยากอ่านทั้งหมดให้กดไปดูวิธีที่ตัวเองสนใจได้เลย
สารบัญ
ใช้ Insert Hyperlink
วิธีนี้ง่ายสุด แต่ก็ทำอะไรได้น้อยสุดด้วย เพราะมันแค่ส่งข้อความบางอย่างจาก Excel เข้าโปรแกรมเมลของเราแล้วโปรยในช่องจะส่งหาใคร? subject อะไร? แล้วเปิดโปรแกรมเมลค้างไว้อย่างงั้น รอให้เรากดปุ่มส่งเองอีกที
วิธีทำที่ง่ายสุดๆ ก็ดังนี้
- ให้พิมพ์ข้อความใน Cell ซักอันว่า Send Mail แล้วคลิ๊กขวา Insert Link…/Hyperlink => Email Address
- ใส่ข้อมูล Email ปลายทาง และ Subject ที่ต้องการ แล้ว ok
- จะได้ผลลัพธ์ออกมาดังรูปเลย
ใช้สูตร HYPERLINK
มาดูวิธีถัดไปกัน ซึ่งอันนี้จะดีขึ้นมากว่าวิธีแรกอีกนิดนึง 555
=HYPERLINK(link_location,friendly_name)
สูตรนี้มี input แค่ 2 ตัว คือ link_location กับ friendly_name ซึ่ง friendly_name ก็คือจะให้แสดงข้อความที่เป็นตัว link ว่าอะไร? ในที่นี้ผมจะให้เป็น Send Mail จากสูตร
ตัวที่ยุ่งยากคือ link_location ต่างหาก ซึ่งการจะส่งเมลต้องใส่ link_location ในรูปแบบดังต่อไปนี้
mailto:ที่อยู่ผู้รับ?subject=ข้อความหัวข้อเมล&body=ข้อความเนื้อหา
เช่น ถ้าผมเขียนว่า
mailto:Test123@gmail.com?subject=ทดสอบจาก Hyperlink&body=ข้อความเนื้อหา จาก Hyperlink
จะได้ว่า
=HYPERLINK("mailto:Test123@gmail.com?subject=ทดสอบจาก Hyperlink&body=ข้อความเนื้อหา จาก Hyperlink","Send Mail จากสูตร")
หากลองกดที่ปุ่มดูจะได้ผลดังรูป
ซึ่งเราก็สามารถ Link สูตรกับข้อความใน Cell ได้ดังนี้
=HYPERLINK("mailto:"&C4&"?subject="&C5&"&body="&C6,"Send Mail จากสูตร")
แต่พอกดปุ่ม ปรากฏว่าที่เรากดขึ้นบรรทัดใหม่ไว้ มันไม่ยอมขึ้นบรรทัดใหม่ด้วย
ทางแก้คือ เราต้องทำการใส่สัญลักษณ์พิเศษในการขึ้นบรรทัดใหม่ด้วย นั่นคือ %0D%0A
ดังนั้นเราจะทำการใช้ฟังก์ชัน SUBSTITUTE แทนการกด Alt+Enter ซึ่งก็คือ CHAR(10) ด้วยสัญลักษณ์พิเศษ คือ %0D%0A ดังนี้ โดยผมสร้างข้อความ body ขึ้นมาใหม่ในช่อง C7 ด้วยสูตร
=SUBSTITUTE(C6,CHAR(10),"%0D%0A")
แล้วแก้สูตร HYPERLINK ให้ไปเอาค่า Body จาก C7 แทน
=HYPERLINK("mailto:"&C4&"?subject="&C5&"&body="&C7,"Send Mail จากสูตร")
จะเห็นว่าเมื่อกดปุ่มแล้ว ผลลัพธ์ทุกอย่าง OK ละ มีการขึ้นบรรทัดใหม่ตามที่กด Alt+Enter ใน Excel เลย
ใช้ VBA ส่งผ่าน Outlook
วิธีนี้เหมาะกับคนส่งที่ใช้ Outlook เป็น Email นะครับ อาจจะเป็นเมลบริษัทอะไรแบบนี้ ซึ่งผมว่าเว็บนี้เขียนไว้ดี งั้นผมขอเอาเนื้อหามาดัดแปลงเลยนะครับ
วิธีส่งข้อความเข้าไปแสดงใน Outlook
เอาแบบรวบรัดเลยนะ ถ้าเราอยากจะส่งข้อความบางอย่างเข้าไปแสดงผลในโปรแกรม Outlook ให้ทำดังนี้
ป.ล. ตอนแรกเราจะทำแบบให้มันเด้งหน้าต่างขึ้นมาให้เรากดส่งเองก่อน เพื่อจะทำสอบความถูกต้องของผลลัพธ์ ไว้ถ้ามันถูกแล้ว เราจะให้มันส่งเมลโดยที่ไม่ต้องเด้งหน้าต่างมาเลย
ให้เราสร้าง Module ใน VBA (วิธีเดียวกับบทความที่แล้ว) แล้วปะ Code นี้ลงไป แล้วลองกด F5 เพื่อ Run ดูครับ
Sub SendOutlook()
' SET Outlook APPLICATION OBJECT.
Dim objOutlook As Object
Set objOutlook = CreateObject("Outlook.Application")
' CREATE EMAIL OBJECT.
Dim objEmail As Object
Set objEmail = objOutlook.CreateItem(olMailItem)
With objEmail
.to = "ที่อยู่เมลปลายทาง"
.Subject = "ส่งจาก Excel VBA"
.Body = "ข้อความจาก Excel VBA"
.Display ' DISPLAY MESSAGE.
End With
' CLEAR.
Set objEmail = Nothing: Set objOutlook = Nothing
End Sub
ถ้ารันสำเร็จก็จะเปิดหน้าต่าง Outlook ออกมา
Tips : ถ้าใครกดแล้วไม่ติด ลองไปที่ Option ใน VBA -> References… -> ติ๊ก Microsoft Outlook xx.x Object Library เพิ่มดูนะครับ (แต่ผมไม่ได้ติ๊กยังใช้ได้เลย)
วิธีเพิ่มไฟล์แนบลงไป
ในระหว่าง With objEmail … กับ End With สามารถเพิ่มคำสั่งนี้ได้ครับ
.Attachments.Add ("ที่อยู่ไฟล์")
เช่น
.Attachments.Add ("d:\thepexcel\ประวัติวิทยากร-ศิระ-เทพเอ็กเซล-new2020.pdf")
สรุป คือ
Sub SendOutlook()
' SET Outlook APPLICATION OBJECT.
Dim objOutlook As Object
Set objOutlook = CreateObject("Outlook.Application")
' CREATE EMAIL OBJECT.
Dim objEmail As Object
Set objEmail = objOutlook.CreateItem(olMailItem)
With objEmail
.to = "ที่อยู่เมลปลายทาง"
.Subject = "ส่งจาก Excel VBA"
.Body = "ข้อความจาก Excel VBA แบบมีไฟล์แนบ"
.Attachments.Add ("ที่อยู่ไฟล์แนบ")
.Display ' DISPLAY MESSAGE.
End With
' CLEAR.
Set objEmail = Nothing: Set objOutlook = Nothing
End Sub
พอกด F5 ก็จะเห็นว่ามีหน้าต่างเด้งขึ้นมา และคราวนี้มีไฟล์แนบด้วยล่ะ!!
หลังจากนั้นจะลองกดปุ่ม Send ดูก็ได้ ว่ามันไปถูกต้องแล้วรึยัง? ถ้าถูกต้องแล้วเดี๋ยวเราจะทำ Step ถัดไปให้มันส่งไปเองโดยเราไม่ต้องขึ้นหน้าต่าง Outlook มาให้กดปุ่มเลย
วิธีให้มันส่งเมลเลย โดยที่ไม่ต้องเด้งหน้าต่างขึ้นมา
หลังจากทดสอบความถูกต้องหมดแล้วว่ามันได้ผล คราวนี้เราจะแก้ Code นิดหน่อย
โดยจะเปลี่ยนจาก
.Display ' DISPLAY MESSAGE.
เป็น
.Send ' SEND MESSAGE AUTO.
สรุปคือ code สุดท้าย จะเป็นดังนี้
Sub SendOutlook()
' SET Outlook APPLICATION OBJECT.
Dim objOutlook As Object
Set objOutlook = CreateObject("Outlook.Application")
' CREATE EMAIL OBJECT.
Dim objEmail As Object
Set objEmail = objOutlook.CreateItem(olMailItem)
With objEmail
.to = "ที่อยู่เมลปลายทาง"
.Subject = "ส่งจาก Excel VBA AUTO"
.Body = "ข้อความจาก Excel VBA แบบมีไฟล์แนบ แบบ Auto"
.Attachments.Add ("ที่อยู่ไฟล์แนบ")
.Send ' SEND MESSAGE AUTO.
End With
' CLEAR.
Set objEmail = Nothing: Set objOutlook = Nothing
End Sub
จากนั้นกด F5 เพื่อ Run Code จะพบว่ามี email ส่งไปยังปลายทางได้ทันที !!
ใช้ VBA ส่งผ่านช่องทางอื่นๆ เช่น Gmail
เอาล่ะ มาถึงวิธีสุดท้ายแล้ว นั่นคือ เราจะส่ง Email แบบ Auto ด้วยคนส่งที่ใช้ Gmail กันล่ะ!!
ซึ่งส่วนนี้ผมขอดัดแปลงจากเว็บนี้ครับ
ขั้นตอนแรกคือ Add Library ก่อน
การจะใช้วิธีนี้ได้ ต้องไป Add Library พิเศษก่อน โดยไปที่ ไปที่ Option ใน VBA -> References… -> ติ๊ก Microsoft CDO for Windows 2000 Library
ต่อไปคือ Allow Less Secure App
ให้ไปที่ https://www.google.com/settings/security/lesssecureapps แล้วเปิดคำสั่ง “Allow less secure apps”
ปล. ถ้า Account Google ของเราเปิดโหมด 2-Step Verification เอาไว้ จะทำให้ใช้ Allow Less Secure Apps ไม่ได้นะ ต้องไปปิดโหมดนี้ก่อน ซึ่งก็จะอันตรายขึ้นนะ
ใส่ Code VBA
สร้าง Module ใหม่แล้ว Copy Code นี้ลงไป
Sub SendGmail()
Dim Mail As CDO.Message
Dim strSubject As String
Dim strFrom As String
Dim strTo As String
Dim strCc As String
Dim strBcc As String
Dim strBody As String
Dim strAttach As String
Dim GmailAccount As String
Dim GmailPassword As String
Dim msURL As String
'เปลี่ยน code ที่นี่'============
GmailAccount = "ที่อยู่gmailของคุณ"
GmailPassword = "password gmail ของคุณ"
strSubject = "ทดสอบยิง Gmail จาก Excel VBA"
strFrom = GmailAccount
strTo = "emailปลายทาง"
strCc = ""
strBcc = ""
strBody = "เนื้อหาการทดสอบ"
strAttach = "ที่อยู่ไฟล์แนบ"
'เปลี่ยน code ที่นี่'============
'creating a CDO object
Set Mail = New CDO.Message
msURL = "http://schemas.microsoft.com/cdo/configuration"
With Mail.Configuration.Fields
'Enable SSL Authentication
.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True
'Make SMTP authentication Enabled=true (1)
.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
'Set the SMTP server and port Details
'Get these details from the Settings Page of your Gmail Account
.Item(msURL & "/smtpserver") = "smtp.gmail.com"
.Item(msURL & "/smtpserverport") = 465
.Item(msURL & "/sendusing") = 2
'Set your credentials of your Gmail Account
.Item(msURL & "/sendusername") = GmailAccount
.Item(msURL & "/sendpassword") = GmailPassword
'Update the configuration fields
.Update
End With
'Set All Email Properties
With Mail
.Subject = strSubject
.From = strFrom
.To = strTo
.CC = strCc
.BCC = strBcc
.TextBody = strBody
.AddAttachment (strAttach) 'To attach Documents in mail
End With
'to send the mail
Mail.Send
End Sub
จากนั้นเปลี่ยนพวก User/Pass และรายละเอียดของเมลเอาเองนะ ผมเขียนเอาไว้ใน section ‘เปลี่ยน code ที่นี่’============ แล้ว
จากนั้นกด F5 เพื่อ Run จะเก็นว่ามี Email ส่งได้แล้ว
แต่ถ้าใครขึ้นแบบนี้ แสดงว่ายังไม่ได้ไป enable คำสั่ง Allow Less Secure App นะครับ
ถ้าไม่ใช่ Gmail ต้องทำยังไง?
ถ้าจะส่งผ่านผู้ให้บริการรายอื่น เราต้องไปแก้ค่าใน Config ของ SMTP Server เช่นพวก Server/Port ดังนี้
smtpserver | smtpserverport | ||
Gmail | smtp.gmail.com | 465 | |
Yahoo | smtp.mail.yahoo.com | 465 | |
Office 365 | smtp.office365.com | 587 | |
Hotmail/Windows Live | smtp.live.com | 587 |
สำหรับบทความนี้ที่ยาวมากๆ ก็ขอจบเพียงเท่านี้
เดี๋ยวตอนหน้าเราจะเริ่มเอาความรู้จากทั้งสองตอนเข้ามาประยุกต์กับงานจริงมากขึ้นแล้ว เช่น แจ้งเตือนเมื่อเกิดเหตุการณ์บางอย่างในไฟล์ Excel เช่น Refresh ข้อมูลเสร็จ กรอกข้อมูลเสร็จตามกำหนด หรือว่า อาจมีงานที่ใกล้จะถึง Due Date ที่กำหนดไว้เป็นต้น