วันพฤหัสบดีที่ 31 มีนาคม พ.ศ. 2559

#4 Hello World!!! Messagebox for VBA

ตอนนี้เราจะกล่าวถึง function สารพัดประโยชน์ ที่ใช้ตั้งแต่ฝึกหัดเขียนโปรแกรมจนถึงโปรแกรมที่ใช้งานจริงๆ นั้นคือ message box

ในแทบทุกภาษามักจะมี function เฉพาะ สำหรับเรียกใช้ message box นี่ก็เป็นอีก หนึ่งเครื่องยื่นยันว่า message box เป็นเครื่องมือที่ใช้บ่อยในวงการเขียนโปรแกรม

วัตถุประสงค์หลักๆของการใช้ message boxคือการส่งข้อความไปถึงผู้ใช้งาน(user) เผื่อให้ผู้ใช้งานรับทราบหรือตัดสินใจอะไรบางอย่าง

แล้วหน้าตา message box เป็นยังไง

จะเห็นได้ว่า message box บางครั้งมี แค่ ปุ่ม "OK" บางครั้ง มี "Yes" "No" หรือรูปแบบอื่นๆ

มันก็มีหน้าตาประมาณนี้ละครับ

Message box ใช้เมื่อไหร่บ้างละ

เราจะเห็น message boxได้ในหลายๆงาน
เช่นเวลา save file ทับ file เก่า

เตือนว่ามี error เวลาใส่ข้อมูลผิด

เตือนเวลาเราปิดโปรแกรมโดยที่ยังไม่ได้เซฟ

และยังมีวิธีการใช้ message box อีกมากมาย

เวิ่นเว้อมาเยอะแยะละ เรามาเริ่มการเขียนโปรแกรมกันเลยดีกว่า

Syntax
MsgBox(prompt[, buttons] [, title] [, helpfile, context])

*** วิธีการอ่านนะครับ ถ้ามี [ ] แปลว่าจะมีค่าหรือไม่มีค่าก็ได้นะครับ แต่ถ้ามารต้องมีค่าให้ครบในปีกกาเหลี่ยมนะครับ

Prompt (String) คือค่าที่เราอยากให้แสดงเพื่อที่จะแจ้งข้อมูลให้กับผู้ใช้ เราสามารถใส่อะไรไปก็ได้แต่ต้องเป็น string นะครับ

Buttons คือประเภทของปุ่มที่เราอยากให้แสดงนะครับ เช่น
vbOKOnly คือมีปุ่มโอเคปุ่ม OK ปุ่มเดียว
vbOKCancel คือมีปุ่ม OK กับ Cancel
vbYesNoCancel  คือมีปุ่ม Yea, No, Cancel
เอาละ เริ่มเดาง่ายแล้วใช่ไหมครับ งั้นลองทายอันนี้หน่อยครับ
vbRetryCancel มีปุ่มอะไรบ้างครับ

ปุ่ม Retry กับ Cancel (เย้ๆๆๆ ทายถูกกันใช่ไหมครับ)
คราวนี้เราก็เบิกใช้ได้ตามสะดวกนะครับ แต่อย่างไรก็ดีในตอนนี้ เราจะใช้เฉพาะ
vbOKOnly ก่อนนะครับ แล้ว Buttons ประเภทอื่นๆ จะเรียนใช้ในตอนที่เกี่ยวกับ 
Condition นะครับ

Title (String)
อันนี้คือส่วนหัวของ massage box ตามรูปข้างล่าง

เราใช้เพื่อให้ผู้ใช้งานสามารถเข้าใจสิ่งที่เดี๋ยวของได้ง่ายขึ้นครับ

[, helpfile, context] ใช้เพื่อเป็นข้อมูล เวลากด F1 นะครับ แต่รายละเอียดยังไม่ขอพูดในบทนี้นะครับ

เรามาดูตัวอย่าง code กันนะครับ

Sub learnMESSAGEBOX
Message box ไม่มี title
Messagebox มี title
Message box มี title และ เปลี่ยนปุ่ม


endsub

#2 Prepare Environment for VBA

หลังจากที่เราเข้าใจว่า VBA คืออะไรแล้ว สำหรับตอนที่2 นี้เราจะมาเตรียม Environment กันนะครับ เนื่องจากว่า เราใช้ Excel ระดับ Advance แล้ว ดังนั้นจึงต้องมีการจุดธูปอัญเชิญ VBA เอ๊ย การเตรียมความพร้อมสำหรับทำการเขียนโค๊ดกันสักหน่อย



1) สำหรับวิธีนี้เราจะเปิด VBA จาก Ribbon นะครับ ซึ่งวิธีนี้จะทำให้ได้เครื่องมือต่างๆมาด้วย เพื่อที่เราจะสามารถเล่นกับ VBA ได้มากขึ้น (เนื่องจากว่าตอนที่#2 นี้ผมยังใช้ Office 2010 อยู่ เพราะฉะนั้นขั้นตอนต่างๆก็ยังเป็น ของ 2010 อยู่นะครับ)

ขั้นตอนมีดังต่อไปนี้

1.1) เลือก Files
1.2) เลือก Options




1.3 เลือก Customize Ribbon (ตามช่อง 1)
1.4 เลือก Popular Command ในช่อง Choose command from (ตามช่อง 2)
1.5 เลือก Main Tabs ในช่อง Customize the ribbon (ตามช่อง 3)
1.6 ในช่อง Main tab ให้เรา ติ๊กถูกที่หน้าคำว่า Developer Option (ตามช่อง 4)
1.7 กด OK (ตามช่อง 5)








หลังจากกด โอเคแล้วจะเห็นได้ว่าจะมี Ribbon ชื่อว่า Developer ขึ้นมา และเราสามารถเปิด VBA ได้โดยคลิ๊ก Developer แล้ว Visual Basic






2) โดยปกติแล้วเราสามารถเรียกใช้ VBA ได้ โดยการกด Alt + F11 นะครับ อันนี้เป็นวิธีที่ง่ายและเร็วที่สุด


เอาละ เราเตรียม Environment พร้อมละเริ่มมีไฟอยากจะcoding ละในตอนต่อไปเราจะเริ่ม coding นะครับ

หากมีข้อสงสัย หรือว่าไม่สามารถทำตามได้ รบกวน Post คำถามมาข้างล่างเลยนะครับจะตอบกลับให้เร็วที่สุด ขอบคุณครับ

ตอนต่อไปเราจะมาเริ่มเขียน Coding กันแล้วนะครับ กับ #3 Hello World!!! Debug.Print in Excel VBA

ถ้าใครยังไม่ได้อ่านตอนที่แล้ว สามารถกลับไปอ่านได้นะครับที่ #1 VBA คืออะไร อะไรคือ VBA

#3 Hello World!!! Debug.Print in Excel VBA

ลองมาย้อนคิดดูว่าเวลาเปิดอ่านหนังสือเกี่ยวกับคอมพิวเตอร์สำหรับมือใหม่แล้วจะต้องเจอแบบฝึกหัดแรกๆในการเขียน code ต้องเป็นคำว่า Hello World ตลอดๆ ไม่มีหัวข้ออย่างอื่นคิดกันหรือไงน้าาาาา แต่สำหรับผม ผมว่ามันอาจเป็นคำศัพท์ง่ายๆ ที่สามารถใช้อธิบายเกี่ยวกับ โลกใหม่ที่เรากำลังเข้าไปเรียนรู้เกี่ยวกับมันก็ได้มั้งนั้นก็เป็นที่มาของเรื่องที่เราจะเรียนรู้กันวันนี้ #3 Hello World!!! Debug.Print in Excel VBA

วันนี้เราจะมาเรียนเรื่องเกี่ยวกับ การใช้ Immediate out และ msgbox (Message box) กัน ซึ่ง function 2 อันนี้ถือว่าเป็น function พื้นฐานสำหรับการที่เราจะเขียน coding ในหลายๆ ภาษา แถมยังใช้เพื่อการ debug ได้อีกด้วย เรามาดูกันว่า function ทั้ง 2 อันนี้ มีรูปแบบ syntax ยังไงแล้วเราจะเอาไปใช้ทำอะไรบ้างดีกว่า

function แรก คือ Debug.Print
function นี้เป็น function ที่จะแสดงค่าในกล่อง immediate windows เพื่อใช้สำหรับการที่เราต้องการให้ค่าต่างๆที่เราทำออกมานั้นไปแสดงอยู่ใน ช่อง Immediate output วัตถุประสงค์หลักๆ เพื่อที่จะดูค่าว่า สิ่งที่เรากำลังจะเอาไปใช้แสดงในหน้าจอนั้นถูกหรือเปล่า ถ้าถูกก็ดี ถ้าไม่ถูกก็จะได้รู้ว่าต้องการอะไรยังไงต่อ

การจะดู immediate output นั้นเริ่มจากการ ที่เราเปิด View -> Immediate Windows


เราก็จะได้ immediate windows ขึ้นมาข้างล่างนะครับ


จากนั้นเราก็เริ่มใส่ข้อมูลลงไปโดย Syntax เพื่อที่จะ print เป็นดังนี้
Debug.Print [Iterms][;]

*** Parameter ที่อยู่ใน [] เป็นoptional แปลว่าไม่ต้องใส่ก็ได้
Debug.Print [items][;]

Sub test()

Debug.Print "Hello World with common text"
Debug.Print "Hello " & "World with concatenation"
Dim str As String
str = "Hello "
Debug.Print str & "World with variable"
End Sub



Trick บางที่ถ้าเราอยากให้มีการเว้นบันทัดเพื่อให้ดูง่ายๆ เราอาจจะใส่คำว่า Debug.Print ลงไปเฉยๆเลย ตามรูปข้างล่าง


เป็นไงครับสำหรับ แบบฝึกหัดแรก ถ้าใครเคยเขียน โปรแกรมมาก่อนคงไม่ยากและเห็นภาพชัดเจน แต่ถ้าใครยังไม่เห็นภาพ เดี๋ยวในบทต่อไปเรื่องเกี่ยวกับ messagebox คงจะเห็นภาพ และสามารถนำไปประยุกต์ใช้ได้มากขึ้นนะครับ


หากมีข้อสงสัย หรือว่าไม่สามารถทำตามได้ รบกวน Post คำถามมาข้างล่างเลยนะครับจะตอบกลับให้เร็วที่สุด ขอบคุณครับ


ถ้าใครยังไม่ได้อ่านตอนที่แล้ว สามารถกลับไปอ่านได้นะครับที่ #3 Hello World!!! Debug.Print in Excel VBA#1 VBA คืออะไร อะไรคือ VBA

วิธีการเตรียม Environment สำหรับเขียน VBA


วันเสาร์ที่ 26 มีนาคม พ.ศ. 2559

#1 VBA คืออะไร อะไรคือ VBA


VBA คืออะไร

สวัสดีครับ วันนี้ผมจะมาแนะนำเกี่ยวกับ ภาษาง่ายๆ ที่เขียนไม่ยากแต่มีประโยชน์กับชีวิตการทำงานในออฟฟิศเป็นอย่างสูงนะครับ ภาษาที่ผมจะขอแนะนำวันนี้ก็คือ ภาษา VBA นั้นเองงงง.....


VBA มีชื่อเต็มว่า Visual Basic for Application

ถือกำเนิดมากจากการเอาภาษา Visual Basic มาใช้เพื่อควบคุม Application หรือ โปรแกรมประยุกต์อื่นๆ เผื่อที่จะสามารถทำงานได้ตามที่เราสั่งได้นะครับ

โดยความสามารถหลักๆของ VBA นั้นทำให้ เราสามารถสร้าง function ได้เอง (UDFs - User Define Functions) ช่วยในการ automated งานต่างๆ อีกทั้งเราสามารถไปใช้ Windows API และ function พื้นฐานอย่างอื่นๆได้ ผ่านทาง DDLs (Dynamic-link libraries) นั่นคือสาเหตุที่ทำให้ VBA สามารถทำงานเจ๋งๆได้หลายๆอย่างเลยทีเดียว (รวมไปถึงสร้างไวรัสด้วย .....อะจึ๊ย....)

ถึงแม้ว่า VBA เนี่ยมีความสามารถพิเศษหลายๆอย่าง แถมยังมีชื่อมาจาก Visual Basic ซึ่งเป็น นึงในภาษาที่ Microsoft ปลุกปั้นมานมนานและมีบริษัทใหญ่ๆหลายบริษัทใช้ แต่ VBA นั้นจะเน้นไปทาง run ได้เฉพาะใน host application มากกว่าการที่จะรันเดี่ยวๆ VBA สามารถใช้งาน ActiveX/COM DLLs ได้ แต่ก็ไม่สามารถสร้างได้แต่ช่วงหลังๆ VBA ก็สร้างให้สามารถ รองรับ Class ที่เป็น Module ได้ก็ตาม

ปัจจุบันนี้ Application ในกลุ่ม Microsoft Office หลายๆตัวได้นำ VBA ไปรวมเป็นที่เรียบร้อยแล้ว แต่ที่เห็นใช้งานกันหลักๆก็ยังคงเป็น Excel กับ Access อยู่ดี


เอ... ควบคุม Application อื่นๆ แปลว่ายังไงนะ?

ลองคิดอย่างนี้ดูครับ เวลา เราจะทำงานอะไรทีนึงเราก็ต้องค่อยๆ click ค่อยๆ พิมพ์ไปที่ละตัวๆใช่ไหมอ่ะครับ เช่น ผมต้องสร้าง report สรุปรายรับรายจ่ายของบริษัท ที่จะต้อง import file เข้ามาเพื่อทำ Pivot แล้วก็ต้องเอาไปทำกราฟต่อเพื่อที่จะนำเสนอผู้บริหาร ในทุกๆเดือน ผมก็ต้องมาผูกสูตรใน excel ใหม่ทุกรอบ ผมขอเรียกวิธีการทำงานอย่างนี้ว่าแบบ manual ละกัน จริงอยู่ว่าการใช้ function ของ excel อาจสามารถตอบโจทย์หลายๆ แต่หลายๆอย่างก็ยังจำเป็นต้องใช้คนเข้าไปคลิกจัดการ

แล้วลองคิดดูสิครับ ถ้าหากว่าเราต้องทำงานซ้ำซาก อย่างนี้ทุกๆเดือนๆ มันจะเสียเวลาขนาดไหน? จะดีกว่าไหมถ้าเราสามารถหาคนมาทำแทนเราได้? แล้วเค้าสามารถทำได้เหมือนเดิมอย่างไม่บกพร่อง?

VBA ก็เลยเกิดมาเผื่อสิ่งนี้ละครับ เราจะได้ไม่ต้องมานั่งทำงานเดิมๆซ้ำไปซ้ำมา โดย เราเขียนcode VBA เนี่ยละ ครั้งเดียวแล้วครั้งต่อๆไปมันก็จะทำงานแทนเราครับ แค่เราต้องรู้ว่าเราต้องสั่งเค้ายังไง แล้วเค้าก็จะทำตามที่เราสั่งอย่างไม่บกพร่อง

โอย ยากอ่ะ ต้องมานั่งเขียน code อีกเขียนไม่เป็นอ่ะ

อย่าเพิ่งอคติกับการเขียน code ครับ การเขียน VBA code ไม่ได้ยากเหมือน VB, JAVA, C# หรอกครับ เพราะว่า Microsoft ได้พัฒนาสิ่งที่เรียกว่า Macro มาพร้อมๆกับ VBA นี้ ซึ่งตัว Macro ตัวนี้มันก็สามารถใช้ในการบันทึกกิจกรรมต่างๆ แล้วแปลงเป็น VBA Code ให้เราได้ซึ่งจะทำให้เราสามารถเขียน Code ได้อย่างไม่อยากเย็นเลยครับ นอกจากนี้รูปแบบภาษาของ VBA ก็ยังค่อนข้างตรงไปตรงมาตาม style VB อีกด้วย

เอะ เดี๋ยวก่อนนะ เมื่อกี้บอกว่า VBA สามารถทำเป็น virus ได้ด้วยหรอ?

ใช่ครับ VBA ที่เราใช้ประโยชน์กับมันก็สามารถเปลี่ยนกลายเป็นไวรัสได้ครับ โดยเรามักจะเรียกไวรัสที่เกิดจาก VBA ว่า Macro virus ถ้าอยากหาข้อมูลเพิ่มเติ่มหา ได้จากในนี้เลย https://en.wikipedia.org/wiki/Macro_virus ดังนั้นการที่เราได้ macro มาสักตัวนึงอย่างลืมดูก่อนนะครับว่าเราได้ macro มาจากแหล่งที่น่าเชื่อถือได้หรือเปล่า ถ้าเราสามารถดู source code ได้ เราก็ควรเสียเวลาอ่านก่อนครับผม

โดยหลักๆแล้วผมจะเน้นการเขียน VBAเพื่อใช้ในงาน Excel และ Access เพราะว่า Excel และ Access นั้นจะเก็บข้อมูลในรูปแบบของตารางข้อมูล หรือ data table( คิดง่ายๆ มันเป็นช่องๆอ่ะครับ) เราเลยสามารถกำหนด ตำแหน่งได้อย่างง่ายดาย


ขอคุณข้อมูลจาก: https://en.wikipedia.org/wiki/Visual_Basic_for_Applications


หากมีคำถามสามารถถามมาได้ใน comment เลยนะครับ