วันศุกร์ที่ 13 มิถุนายน พ.ศ. 2557

VBA สร้างฟังก์ชัน (function) หรือสูตรขึ้นมาใช้เองใน ไมโครซอฟท์เอ็กเซล

ห่างไปนานมาก... จนตอนนี้ผมอัปเกรดมาใช้ก excel 2013 แล้ว...
แรกสุดที่เคยจับเอ็กเซลคือ Excel 7 ที่มาพร้อมกับ windows 3.1 ...วันเวลาผ่านไปเร็วมาก ...อิอิ
มาเข้าเรื่องกัน....วันนี้มาอัปเดทบทความดีๆอีกสักเรื่อง..

เรื่อง..."การสร้างฟังก์ชัน หรือสูตรขึ้นมาใช้เอง ในไมโครซอฟท์ เอกเซล"



ทั่วไปเอ็กเซลจะมีสูตรให้เราเลือกใช้ตามสะดวก เยอะมาก ถ้าเราเรียนรู้ดีๆจะเป็นประโยชน์ในการทำเวิร์กชีตในการทำบัญชีหรือรายการคำนวน มาก บางทีอาจมีเยอะจนคนรู้จักไม่หมด ไม่เคยใช้เลยทีเดียว ถ้าใครสนใจก็ศึกษาด้านนี้ ผมเห็นว่าเดี๋ยวนี้มีหนังสือรวมสูตรเอ็กเซลดีๆ ออกมาขายหลายเล่มแล้ว ลองเดินหาตามร้านซีเอ็ดดูก็มีครับ

แต่ว่าบางที...มันก็ไม่มีสูตรที่เราก็ต้องการก็มีนะ!   หรือว่าเราอยากจะสร้างสูตรที่มีความซับซ้อนมากๆเพื่อลดขั้นตอนในการทำงานของเราเองได้ ...งานนี้ก็จำเป็นจะต้องเขียนมันขึ้นมาเอง...VBA ช่วยท่านได้...

ยกตัวอย่าง เช่น เราอยากจะมีสูตรที่ใช้คำนวนหาพื้นที่วงกลม โดยที่เราป้อนค่ารัศมีของวงกลมเข้าไปได้
โดยทั่วไป ในเซล์ก็สามารถใส่สูตรแบบนี้ได้ แต่ตัวอย่างนี้ต้องการแสดงให้เห็นว่าถ้าเราต้องการทำงานแบบเดียวกันนี้โดยใช้คำสั่ง VBA จะได้ได้ยังไง มาลองดูกันครับ

สูตรสำหรับ หาพื้นที่วงกลม:    
เมื่อ r คือค่ารัศมีของวงกลม

เราสามารถใส่สูตรเพื่อหาค่าพื้นที่นี้ได้ในเซลได้โดยตรง เช่น ต้องการหาพื้นที่ของวงกลมที่มีรัศมีเท่ากับ 7 หน่วย เราก็ใส่สูตรในเซลล์เป็น  

=pi()*7^2

ก็จะได้คำตอบเป็น 154 
(หมายเหตุ: เอ็กเซลมีค่า ไพน์สำหรับให้เรียกใช้ได้เลยผ่านฟังก์ชัน pi()  โดยที่ไม่ต้องป้อนค่าไพน์โดยตรงเป็น 22/7 หรือ 3.14 ซึ่งทั้งสองค่านี้เป็นเพียงค่าโดยประมาณ สำหรับค่าไพน์ที่เอ็กเซลใช้นั้นจะเป็นตัวเลขที่มีความละเอียดระดับ Double Precision หรือทศนิยม 14  ตำแหน่ง โดยเซตไว้ที่ค่า 3.14159265358979 หากต้องการตรวจสอบดูว่าฟังก์ชัน pi() ให้ค่าเป็นเท่าไหร่ ก็ให้ลองใส่สูตรในเซลเป็น =pi() แล้วเคาะ Enter ก็จะได้ค่าเป็นตัวเลขออกมาเลย แล้วลองเพิ่มจำนวนทศนิยมของเซลนั้นให้มากที่สุดก็จะเห็นค่าในตำแหน่งทศนิยมอื่นๆ)

ทีนี้ลองมาหาพื้นที่วงกลมด้วยการเขียน VBA บ้าง

1. เปิดหน้าต่าง VBA ขึ้นมา (Alt+F11)
2. เพิ่ม module สำหรับเขียน VBA (เมนู Insert > Module)
3. เริ่มเขียน function ของเราเอง
4. ใช้งาน function

สำหรับการเริ่มเขียน function มีรูปแบบดังนี้
1. บรรทัดแรกของ function ให้ขึ้นต้นด้วยคำว่า function เว้นวรรคหนึ่งที แล้วตามด้วยชื่อฟังก์ชัน (ชื่อฟังก์ชันควรตั้งให้สอดคล้องกับการทำงานเพื่อให้สามารถจดจำได้ง่าย นอกจากนี้เราไม่สามารถตั้งชื่อฟังก์ชันที่ขึ้นต้นด้วยตัวเลขหรืออักขระพิเศษได้ และไม่สามารถเว้นวรรคได้ หากต้องการเว้นวรรค นิยมใช้เครื่องหมาย ขีด(ล่าง) หรือ underscore เพื่อเชือมคำให้ต่อกัน และชื่อของฟังก์ชันไม่ควรจะยาวเกินไป) หลังชื่อของฟังก์ชัน ให้เคาะ Enter 1 ที ก็จะปรากฏว่าหลังชื่อของฟังก์ชันจะมีวงเล็บ ( ) เกิดขึ้นเอง และจะมีบรรทัดจบของฟังก์ชันซึ่งเป็นบรรทัดสุดท้ายของฟังก์ชันปรากฏมาให้ด้วย
ตัวอย่าง เช่น
เมื่อพิมพ์คำว่า   

function circle_area  
แล้วเคาะ Enter ก็จะปรากฏเป็น

Function circle_area ( )

End Function


2. คำสั่งต่างๆของฟังก์ชันจะอยู่ระหว่างบรรทัดแรก และบรรทัดสุดท้ายนี้ครับ

3. ภายในวงเล็บหลังชื่อของฟังก์ชัน ให้กำหนดชื่อของตัวแปรที่จะส่งเข้ามาให้ฟังก์ชันคำนวนก่อนให้คำตอบออกไป ในที่นี้คือค่ารัศมีของวงกลมที่จำเป็นต้องใช้ในสูตรข้างต้น ถ้าฟังก์ชันต้องการมากกว่าหนึ่งตัวก็ให้คั่นแต่ละดัวด้วย เครื่องหมายจุลภาค (comma) ตัวอย่าง เช่น

Function abc (x)    
หรือ
Function abc (x, y)

นอกจากนี้ เรายังสามารถกำหนดชนิดของตัวแปรที่ส่งเข้ามาได้ด้วย เพื่อการทำงานของฟังก์ชันที่ถูกต้องมากขึ้น เช่น ให้เป็นจำนวนเต็ม (Integer) หรือ ให้เป็นจำนวนจริงหรือจำนวนที่มีทศนิยมได้ (Double) เช่น

Function abc (x As Integer)
หรือ
Function abc (x As Integer, y As Double)

และ เช่นเดียวกัน เราสามารถกำหนดชนิดของตัวแปรที่เป็นคำตอบของฟังก์ชันเราได้เช่นเดียวกัน เช่น

Function abc (x) As Double
หรือ
Function abc (x As Integer) As Double
หรือ
Function abc (x As Integer, y As Double) As Double

สำหรับการคำนวนของฟังก์ชันทั้งหมด สามารถทำได้ังนี้

Function cir_area (r As Double) As Double
   pi = 3.14159265358979          'กำหนดค่าให้กับไพน์ 
   cir_area = pi * r^2        'คำนวนพื้นที่ของวงกลม , เครื่องหมาย ^ คือการยกกำลัง
End Function

ข้อกำหนดอีกอย่างหนึ่งของการเขียนฟังก์ชันขึ้นมาใช้เอง คือจะต้องมีการกำหนดค่าให้ตัวแปรที่มีชื่อเดียวกันกับชื่อของฟังก์ชัน เพื่อให้ VBA นำค่าของตัวแปรนั้นซึ่งเป็นคำตอบส่งค่าออกไปเมื่อมีการเรียกใช้ฟังก์ชั้นนั้น (ในตัวอย่างข้างบน บรรทัดที่สามมีการกำหนดค่าให้ตัวแปรที่ชื่อ cir_area ซึ่งต้องเป็นชื่อเดียวกับชื่อฟังก์ชัน โดยใช้สูตรที่มีค่ารัศมีและค่าไพน์ มาคำนวณ

ทีนี้ลองตรวจสอบค่าของพื้นที่วงกลมโดยใช้สูตรในเซลของเอ็กเซลเป็น

=cir_area(7)  

ค่าที่ส่งมาคือ 7 จะกลายเป็นค่ารัศมีในรหัสคำสั่ง ก็จะได้คำตอบที่ได้ออกมาเป็น  154  ซึ่งตรงกับการใส่สูตรโดยตรง แสดงว่าถูกต้อง

ตัวอย่างที่ 2  จงเขียนฟังก์ชันสำหรับการคำนวณพื้นที่สามเหลี่ยมโดยใช้ VBA

สูตรการหาพื้นที่สามเหลี่ยม:  
Function tri_area (b As Double, h As Double) As Double 
   tri_area = 0.5 * b * h        'คำนวนพื้นที่ของสามเหลี่ยม
End Function

ลองตรวจสอบค่าของฟังก์ชันโดยพิมพ์สูตรต่อไปนี้

=tri_area (2, 4)

ซึ่ง 2 ก็คือตัวแปรแรก และ 4 คือตัวแปรที่สองที่ส่งให้ฟังก์ชัน จะได้เป็น b=2 และ h=4 ตามลำดับ และก็จะได้คำตอบออกมาเป็น 4 ซึ่งถูกต้อง [  (1/2)*2*4 = 4 ]

ทีนี้ก็ save ไฟล์ไว้ใช้งานต่อไป ฟังก์ชันก์นี้ก็จะอยู่ในไฟล์นี้ตลอดไปหากไม่ลบออกก่อน save

หมายเหตุ:  ฟังก์ชันที่เราเขียนขึ้นมานี้จะอยู่ในไฟล์นี้เท่านั้น ถ้าเราเปิดไฟล์อื่นขึ้นมามันจะใช้ไม่ได้ เราจะต้องสร้างฟังก์ชันขึ้นมาใหม่ในไฟล์นั้น หรือ copy จากไฟล์ที่เรามีแล้วมาใช้งานก็ได้

Tip: 
  1. ในตอนเรียกใช้ฟังก์ชัน เราจะต้องใส่เครื่องหมายเท่ากับ ("=") ก่อนสูตรเสมอ
  2. เมื่อเราพิมพ์ชื่อฟังก์ชันไปแล้วส่วนหนึ่ง จะมีรายการฟังก์ชันที่ชื่อใกล้เคียงกันขึ้นมาให้เราเลือกใช้ ถ้าท่านมองเห็นชื่อของฟังก์ชันนั้น ก็ใช้มือขว่ากดปุ่มลูกศร ขึ้น-ลง ให้ตรงกับชื่อนั้น แล้วใช้มือซ้ายกดปุ่ม Tab ก็จะทำให้ชื่อฟังก์ชันสมบูรณ์เอง ประหยัดเวลาในการพิมพ์ชื่อ โดยเฉพาะกรณีชื่อฟังก์ชันยาวๆ และแก้ปัญหาพิมพ์ชื่อฟังก์ชันผิดด้วย
  3. ในการเรียกใช้ฟังก์ชันนั้น แทนที่เราจะใส่เป็นตัวเลขส่งไปยังฟังก์ชันโดยตรง เรายังสามารถลิงค์ค่าในเซลล์อื่นไปแทนได้ด้วยเหมือนสูตรที่มีมากับเอ็กเซลทั่วไป ซึ่งถ้าค่าในเซลล์ที่ลิงค์มาเปลี่ยนค่า ค่าในเซลล์ที่ใช้สูตรที่เราเขียนก็จะเปลี่ยนค่าตามการคำนวรในฟังก์ชันที่เขียนขึ้นเองอัตโนมัติ เพิ่มความสะดวกในการทำเวิร์กชีตยิ่งขึ้นไปอีก

โดยหลักการง่ายๆแบบนี้ เราสามารถประยุกต์ใก้กับฟังก์ชันที่มีความซับซ้อนมากขึ้นได้เพื้อให้การเขียนสูตรในเวิร์กชีตสั้นกระทัดรัดขึ้นได้

ขอให้สนุกกับ VBA  
:D

วันพฤหัสบดีที่ 17 เมษายน พ.ศ. 2557

การสั่งพิมพ์ เอกสาร MS Excel จำนวนมากด้วยชุดคำสั่ง Excel VBA -- Auto print

ทำโปรแกรม Auto Print ง่ายๆใน MS Excel ด้วย VBA



ถ้าคุณเป็นคนหนึ่งที่ต้องทำงานเกี่ยวกับเอกสารโดยใช้ MS Excel เป็นหลัก และต้องมีการพิมพ์เอกสารจำนวนมหาศาลไม่รู้ตั้งกี่หน้าที่อยู่ในหนึ่งไฟล์ แล้วยิ่งคุณมีจำนวณไฟล์ที่ต้องพิมพ์เยอะแยะด้วยแล้วก็ คงไม่สนุกนักกับการต้องมาเปิด sheet แต่ละหน้าแล้วสั่งพิมพ์ ไปจนครบทุกแผ่น

วันนี้ผมมีทีเด็ด มาฝาก เกี่ยวกับการทำ Auto Print ใน MS Excel โดยเพียงแค่คุณเลือกว่าจะพิมพ์ไฟล์ใหนบ้าง เจ้าโปรแกรม Auto Print ก็จะพิมพ์ให้คุณครบทุกหน้า ครบทุกไฟล์ เลยทีเดียว ทีนี้คุณก็มีเวลาไปนั่งจิบกาแฟสบายๆ แล้วล่ะ ^^

เริ่มเลยนะครับ ผมใช้เครื่องมือที่สุดยอดมากที่มีมากลับ MS Excel อยู่แล้วนั่นก็คือ VBA (มาจากคำว่า Visual Basic for Application) คุณสามารถเข้าไปดูได้ว่าหน้าตาของเจ้า VBA นี้เป็นอย่างไรเพียงเปิดโปรแกรม MS Excel ขึ้นมา หลังจากนั้นก็กดปุ๋ม Alt+F11 (กดปุ่ม Altinate พร้อมกับ ปุ่ม F11) เท่านี้ก็จะมีหน้าต่างของ VBA ขึ้นมา หน้าตาก็จะแตกต่างกันไปตามเวอร์ชันของ MS Excel นะครับ

ไม่ว่าหน้าตาขอ VBA จะเป็นอย่างไรก็ตาม เพียงแค่คุณทำตามขั้นตอนต่อไปนี้คุณก็จะได้ Auto Print แล้ว

เปิดโปรแกรม MS Excel ขึ้นมา แล้ว กดคีย์ Alt+F11 เพื่่อเข้าสู่หน้าต่างของVBA
ในหน้าต่าง VBA ให้มองหาเมนูบนแถบเมนูบนสุดที่ชื่อว่า Insert (หรือ "แทรก" ในภาษาไทย) แล้วเลือกเมนูย่อย Module (โมดูล) ที่อยู่ในนั้นอีกที แล้วจะมีหน้าต่างอีกอันหนึ่งเปิดขึ้นมา
ให้ทำการ copy คำสั่งด้านล่างนี้ (ที่อยู่ระหว่างเส้นประ)ไปวางในหน้าต่างของ Module แล้วบันทึกไฟล์
Run หรือ เรียกใช้งานโปรแกรม โดยไปที่เมนู Run > Run Sub/Userform (หรืออาจใช้วิธีกดปุ่ม F5) แล้วจะมีอีกหน้าต่างหนึ่งเปิดขึ้นมาเพื่อให้เราเลือกไฟล์ที่จะพิมพ์ทั้งหมด เทคนิคในการเลือกหลายไฟล์นะครับ ก็กดปุ่ม Ctrl ค้างไว้ แล้วก็คลิ๊กเลือกไฟล์ที่ต้องการพิมพ์ไปเรื่อยๆจนครบ แล้วปล่อยปุ่ม Ctrl หลังจากนั้นก็ คลิกที่ปุ่ม Open File หรือเปิด (หรืออาจกดปุ่ม Enter แทนก็ได้) เท่านี้เครื่องพิมพ์ก็จะเริ่มทำงานแทนคุณแล้ว
หมายเหตุ: โปรแกรมนี้มันจะพิมพ์ทุกอย่างที่มีอยู่ในหน้าที่มีข้อมูลนะครับ ถ้าไม่มีข้อมูลไม่พิมพ์ ดังนั้น ก่อนสั่งพิมพ์ควรมีการจัดหน้าไว้ให้เรียบร้อยหมดก่อน ไม่งั้นโปรแกรมจะพิมพ์ทุกอย่างออกมาจริงๆครับ

ขอให้สนุกกับ Auto Print ใน MS Excel โดย VBA นะครับ^^
--------------------------------------------------------------------------------------------------------

Sub auto_print()
'
'This macro was written by Aj OP (http://thaiexcelvba.blogspot.com) .
'
Dim i As Integer, j As Integer
Dim varFile As Variant
Dim inFile As Integer
Dim OPENFILE
Dim currFile
Dim N
'
Application.ScreenUpdating = False
On Error GoTo 100
'
currFile = ActiveWorkbook.Name
varFile = _
Application.GetOpenFilename(FileFilter:="Microsoft Excel file, *.xlsx", MultiSelect:=True)
If (IsArray(varFile)) Then
For intfile = 1 To UBound(varFile)
Workbooks.OpenText Filename:=varFile(intfile)
OPENFILE = ActiveWorkbook.Name
'
For N = 1 To ActiveWorkbook.Sheets.Count
Sheets(N).Activate
ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True
Next N
Workbooks(OPENFILE).Close
Next intfile
Else
MsgBox "You did not select any file.", vbOKOnly + vbInformation
End If

100 End Sub

วันจันทร์ที่ 15 กรกฎาคม พ.ศ. 2556

การวนซ้ำคำนวณ หรือการวน Loop ใน VBA

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

วันนี้จะเขียนเกี่ยวกับ การกระทำที่วนซ้ำหลายๆรอบด้วยชุดคำสั่งเพื่อการวนซ้ำโดยเฉพาะที่อยู่ใน VBA ต่อไปจำเรียกการวนซ้ำว่าวนลูป (Loop) นะครับ ขออนุญาตทับศัพท์ไปเลย ว่า วนซ้ำ= Loop


ชุดคำสั่งเพื่อการวนซ้ำใน VBA จะมี 3 แบบ นะครับคือ
1) For....Next
2) Do....Loop Until
3) Do....Loop While

1. การวนลูปด้วย For....Next
     การวนลูปแบบนี้เหมาะสำหรับกรณีที่เรารู้จำนวนของการวนรอบซ้ำที่ชัดเจน เช่น ต้องการวน 10 ครั้ง หรือ 100 ครั้ง เป็นต้น และจะต้องมีตัวแปรสำหรับการวนรอบแต่ละครั้งด้วย ที่นิยมใช้ก็มีเช่น ตัวแปร i , j หรือ k แต่อาจจะตั้งชื่อตัวแปรการวนซ้ำได้เองตามต้องการนะครับ มาดูตัวอย่างการใช้งานกัน...

รูปแบบของชุดคำสั่ง 
For V = M to N
     ...
     (แทรกชุดคำสั่งสำหรับในแต่ละรอบตรงนี้- ระหว่างบรรทัด For กับ Next)
     ...
Next

เมื่อ
  • คำว่า For และ Next เป็นคำบังคับที่ต้องมี
  • V เป็นชื่อตัวแปรสำหรับการวนลูป จะมีค่าเปลี่ยนไปในแต่ะรอบ ส่วนใหญ่(ถ้ามักไม่ค่อยคิดอะไรมาก)   ก็ใช้ตัว i, j หรือ k หรืออาจตั้งชือเป็นตัวอื่นตามที่ต้องการเช่น nLoop หรือ num เป็นต้น ในแต่ละรอบของการวนลูปค่า V จะเปลี่ยนไปทีละ 1
  • M เป็นตัวเลข เริ่มต้นของตัวแปร V ในการวนลูปครั้งแรก (โดยทั่วไปมักำหนดเท่ากับ 1 แต่เริ่มที่จำนวนเต็มอื่นก็ได้)
  • N เป็นตัวเลขสุดท้ายของตัวแปร V ในลูปสุดท้ายของการทำงาน ถ้ากำหนด M มีค่าเป็น 1 N ก็จะเป็นจำนวนรอบของการวนลูปพอดี


ตัวอย่างที่ 1 ต้องการหาผลลัพท์ของ 1+2+3+4+5+6+7+8+9+10 โดยใช้การวนลูปแบบ For....Next

Sub summation()
     sum=0                'กำหนดตัวแปรชื่อ sum ที่จะใช้เป็นคำตอบของโจทก์นี้ให้มีค่าเป็น 0 ก่อนเริ่มวนลูป
     For i = 1 to 10    'เริ่มการวนลูป ในที่นี้ ตัว V หรือตัวแปรที่ใช้ในการวนลูปแต่ละรอบคือ ตัวแปร i มีค่า                                   'เริ่มจาก 1 เพิ่มขึ้นทีละ 1 ในแต่ละรอบจนถึงค่าสุดท้ายคือ 10 ก็หยุด

         sum=sum+i     'เป็นการกระทำที่อยู่ในลูปคือให้เอาค่า sum บวกกับค่า i ของแต่ละรอบแล้วเก็บไว้ที่
                               'ตัวแปร sum เหมือนเดิม

     Next i                 'จบการทำงานของลูปในหนึ่งรอบ
     Msgbox(sum)     'แสดงกล่องโต้ตอบที่มีค่า sum ออกมา
End Sub

อธิบายโปรแกรม
  ในบันทัด For ค่า i จะถูกกำหนดโดยคนเขียนให้มีค่เป็น 1 ในการทำงานครั้งแรกของการวนซ้ำ แล้วโปรแกรมจะตรวจสอบค่า i กับตัวเลขที่อยู่หลัง to ว่า i มีค่าเกิน ค่านี้หรือยัง ถ้ายังก็ให้ทำงานในคำสั่งที่อยู่ในลูป ถ้าเกินแล้วก็ไม่ต้องทำอะไร แล้วให้เลิกวนลูป แล้วข้ามไปทำคำสั่งหลังจากบรรทัด Next

ลูปที่ 1 (i มีค่าเป็น 1) --> sum + i จะมีค่าเป็น 0+1 ซึ่งมีค่าเป็น 1 แล้วบันทึกค่าเก็บไว้ที่ sum อีกครั้ง (ตอนนี้ sum มีค่าเป็น 1) แล้ว พอมาถึงบรรทัด Next มันก็จะไม่วิ่งไปข้างล่าง แต่จะวิ่งขึ้นไปที่คำสั่ง For อีกครั้ง

ลูปที่ 2 เมื่อมา For เป็นครั้งที่ 2 มันจะกำหนดค่า i ให้มีค่ามากกว่าเดิมอยู่ 1   i มีค่าเดิมเป็น 1 ดังนั้นในรอบที่ 2 นี้ i จะมีค่าเป็น 1+1=2 เอง(โดยที่เราไม่ต้องไปสั่งมันทำ) ถัดมาบรรทัดต่อไป ก็จะเอาค่า sum+i (ตอนนี้ sum มีค่า 1 และ i มีค่า 2) ดังนั้น sum+i =1+2=3 แล้วไปเก็บไว้ที่ตัวแปร sum อีกที (sum เก็บค่า=3) แล้วไปบรรทัด Next

ลูปที่ 3 i จะมีค่าเป็น 3 อัตโนมัติ ดังนั้น sum+i = 3+3=6
ลูปที่ 4 i จะมีค่าเป็น 4 อันโนมัติ ดังนั้น sum+i= 6+4=10
ลูปที่ 5 i จะมีค่าเป็น 5 อัตโนมัติ ดังนั้น sum+i = 10+5=15
ลูปที่ 6 i จะมีค่าเป็น 6 อันโนมัติ ดังนั้น sum+i= 15+6=21
ลูปที่ 7 i จะมีค่าเป็น 7 อัตโนมัติ ดังนั้น sum+i = 21+7=28
ลูปที่ 8 i จะมีค่าเป็น 8 อันโนมัติ ดังนั้น sum+i= 28+8=36
ลูปที่ 9 i จะมีค่าเป็น 9 อัตโนมัติ ดังนั้น sum+i = 36+9=45
ลูปที่ 10 i จะมีค่าเป็น 10 อันโนมัติ ดังนั้น sum+i= 45+10=55
ลูปที่ 11 i จะมีค่าเป็น 11 ซึ่งเกินตัวเลขที่เรากำหนดไว้หลัง to (คือค่า 10) โปรแกรมจะไม่ทำคำสั่งในลูป แล้วจะหลุดออกจากการวนซ้ำไปทำคำสั่งที่อยู่ถัดจากบรรทัด Next เลย ในที่นี้คือ  Msgbox(sum) ซึ่งก็คือแสดงค่า sum ออกมาในรูปของกล่องโต้ตอบ ก็จบโปรแกรม [อ่านการใช้งานคำสั่ง Msgbox ได้ที่ http://thaiexcelvba.blogspot.com/2012/01/msgbox-excel-vba.html ]

2. การวนลูปด้วย Do....Loop Until
     การวนซ้ำแบบนี้มักจะใช้กับกรณีที่รู้เงื่อนไขการหยุดการวนซ็ำอย่างชัดเจน ซึ่งอาจรู้หรือ ไม่รู้ จำนวนรอบของการวนซ้ำก็ได้ แต่ถ้ารู้จำนวนการวนซ้ำให้ใช้ For.....Next จะสะดวกกว่าครับ การทำงานของการวนซ้ำแบบนี้จะไม่มีตัวแปรในการวนแต่ละลูป ถ้าจะใช้ต้องกำหนดเข้ไปเอาเอง

รูปแบบของชุดคำสั่ง 
Do 
     ...
     (แทรกชุดคำสั่งสำหรับในแต่ละรอบตรงนี้- ระหว่างบรรทัด Do กับ Loop)
     ...
Loop Until ...(C หรือ เงื่อนไขจบลูป)


เมื่อ
  • คำว่า Do และ Loop Until เป็นคำบังคับที่ต้องมี
  • C เป็นเงื่อนไขสำหรับตัดสินว่าจะจบการวนซ้ำเมื่อไหร่ เช่น  i >10  เป็นต้น 
ตัวอย่างที่ 2 ต้องการหาผลลัพท์ของ 1+2+3+4+5+6+7+8+9+10 โดยใช้การวนลูปแบบ Do....Loop

Sub summation()
     i = 0                   'กำหนดค่าเริ่มต้นของตัวแปรที่ใช้ในการวนซ้ำ
     sum=0                'กำหนดตัวแปรชื่อ sum ที่จะใช้เป็นคำตอบของโจทก์นี้ให้มีค่าเป็น 0 ก่อนเริ่มวนลูป
     Do                     'เริ่มการวนลูป  
         i = i+1            'กำหนดค่าตัวแปรที่ใช้ในการคำนวณในแต่ละลูปเอง โดยให้มีค่าเพิ่มขึ้น 1
         sum=sum+i     'เอาค่า sum บวกกับค่า i ของแต่ละรอบแล้วเก็บไว้ที่ ตัวแปร sum เหมือนเดิม
     Loop Until i >9   'เงื่อนไขการจบการวนซ้ำ คือให้ทำวนซ้ำไปเรื่อยๆจนค่า i >9 ถึงหยุดวนซ้ำ
     Msgbox(sum)     'แสดงกล่องโต้ตอบที่มีค่า sum ออกมา
End Sub

ข้อสังเกตุ
1. การทำงานแบบวนซ้ำจะเริ่มที่บรรทัด Do ถึงบรรทัด Loop เท่านั้น
2. แต่ละรอบจะไม่มีตัวแปรในการวนซ้ำให้มา ต้องกำหนดเอาเอง เช่น i = i+1 ซึ่งอาจกำหนดเป็นอย่าง         อื่นก็ได้ตามความต้องการเช่น i = 5+i ก็ได้เป็นต้น
3. ในการวนซ้ำรอบสุดท้าย ก็คือเงื่อนไขที่กำหนดให้หยุดเป็นจริงครั้งแรก (เช่นที่ i มีค่าเป็น 10) โปรแกรมจะวนซ้ำขึ้นไปทำงานอีก 1 รอบแล้วออกจากการวนซ้ำ (นี่จึงใช้เงื่อนไขจบเป็น i >9  ถ้าใช้ i >10 ก็จะได้การวนซ้ำเพิ่มอีกหนึ่งรอบคือที่ i=11 มาด้วยซึ่งได้คำตอบเป็น sum=66)

3. การวนลูปด้วย Do....Loop While
     การวนซ้ำแบบนี้จะคล้ายๆกับ Do ...Loop Until คือมักจะใช้กับกรณีที่รู้เงื่อนไขการหยุดการวนซ็ำอย่างชัดเจน ซึ่งอาจรู้หรือ ไม่รู้ จำนวนรอบของการวนซ้ำก็ได้ แต่ถ้ารู้จำนวนการวนซ้ำให้ใช้ For.....Next จะสะดวกกว่าครับ ข้อแตกต่างระหว่าง Do...Loop Until กับ Do Loop While ก็คือ สำหรับ  Do Loop While มักจะใช้เงื่อนไขการจบที่เหตุการณ์หนึ่งไม่เป็นจริง (พูดอีกนัยหนึ่งคือให้วนซ้ำไปเรื่อยๆหากเงื่อนไขการวนซ้ำยังเป็นจริงอยู่ และหยุดวนซ้ำเมื่อเหตุการณ์นั้นไม่เป็นจริงต่อไป) การทำงานของการวนซ้ำแบบนี้จะไม่มีตัวแปรในการวนแต่ละลูป ถ้าจะใช้ต้องกำหนดเข้ไปเอาเอง

รูปแบบของชุดคำสั่ง 
Do 
     ...
     (แทรกชุดคำสั่งสำหรับในแต่ละรอบตรงนี้- ระหว่างบรรทัด Do กับ Loop)
     ...
Loop While ...(C หรือ เงื่อนไขจบลูป)


เมื่อ
  • คำว่า Do และ Loop Whileเป็นคำบังคับที่ต้องมี
  • C เป็นเงื่อนไขสำหรับตัดสินว่าจะจบการวนซ้ำเมื่อไหร่ เช่น  i <10  เป็นต้น 
ตัวอย่างที่ 3 ต้องการหาผลลัพท์ของ 1+2+3+4+5+6+7+8+9+10 โดยใช้การวนลูปแบบ Do..Loop While

Sub summation()
     i = 0                   'กำหนดค่าเริ่มต้นของตัวแปรที่ใช้ในการวนซ้ำ
     sum=0                'กำหนดตัวแปรชื่อ sum ที่จะใช้เป็นคำตอบของโจทก์นี้ให้มีค่าเป็น 0 ก่อนเริ่มวนลูป
     Do                     'เริ่มการวนลูป  
          i = i+1            'กำหนดค่าตัวแปรที่ใช้ในการคำนวณในแต่ละลูปเอง โดยให้มีค่าเพิ่มขึ้น 1
         sum=sum+i     'เอาค่า sum บวกกับค่า i ของแต่ละรอบแล้วเก็บไว้ที่ ตัวแปร sum เหมือนเดิม 
     Loop While i<10   'เงื่อนไขการจบการวนซ้ำ คือให้ทำวนซ้ำไปเรื่อยๆจนค่า i<10 ถึงหยุดวนซ้ำ
     Msgbox(sum)     'แสดงกล่องโต้ตอบที่มีค่า sum ออกมา
End Sub

ข้อสังเกตุ
1. การทำงานแบบวนซ้ำจะเริ่มที่บรรทัด Do ถึงบรรทัด Loop While เท่านั้น
2. แต่ละรอบจะไม่มีตัวแปรในการวนซ้ำให้มา ต้องกำหนดเอาเอง เช่น i = i+1 ซึ่งอาจกำหนดเป็นอย่าง         อื่นก็ได้ตามความต้องการเช่น i = 5+i ก็ได้เป็นต้น
3. ในการวนซ้ำรอบสุดท้าย ก็คือเงื่อนไขที่กำหนดให้หยุดไม่เป็นจริงครั้งแรก (เช่นที่ i มีค่าเป็น 10) โปรแกรมจะวนซ้ำขึ้นไปทำงานอีก 1 รอบแล้วออกจากการวนซ้ำ (นี่จึงใช้เงื่อนไขจบเป็น i<10  ถ้าใช้ i <11 ก็จะได้การวนซ้ำเพิ่มอีกหนึ่งรอบคือที่ i=11 มาด้วยซึ่งได้คำตอบเป็น sum=66)


ไม่ยากเลยใช่ไหมละครับ
ขอให้สนุกกับ การวนซ้ำใน VBA นะครับ ^^

วันจันทร์ที่ 24 กันยายน พ.ศ. 2555

คำสั่ง IF และการตัดสินใจ ใน VBA

กลับมาอีกครั้งหลังจากไปเตร็ดเตร่ กับเรื่องราวอื่นๆในชีวิตสะนาน จนบางทีลืมไปว่าเขียน Blog ไว้ยังไม่สำเร็จตั้งหลายบทความ วันนี้ก็เลยกลับมาทำให้สำเร็จสักเรื่อง กับบทความที่ไม่ยาวมาก นั่นคือ คำสั่ง IF

คำสั่ง IF ใช้ในการตัดสินใจในการเขียนโปรแกรมที่มีทางเลือกให้โปรแกรมมากกว่า 1 ทาง เช่น
ตัวอย่างที่ 1
              ถ้า  a > 10 -->  b=10  หรือ
              ถ้า  a <=10  (อ่านว่า a น้อยกว่าหรือเท่ากับ 10)  --> b=20

     จะเห็นว่า ค่าของ b ตามตัวอย่างข้างต้นนั้นขึ้นอยู่กับค่าของ a  ซึ่งมีอยู่ 2 กรณีคือ a มีค่าน้อยกว่า 10 และ a มีค่ามากกว่าหรือเท่ากับ 10
     ซึ่งเห็นว่ามีทางเลือกของโปรแกรมมากกว่าหนึ่งทาง เราสามารถเขียนโปรแกรมแทนการคิดแบบนี้ได้ดังนี้ครับ
รูปแบบที่ 1
------------------------------------------------------------------------------------------------------------

       If (ประโยคเงื่อนไขทางคณิตศาสตร์) Then
           การกระทำชุดที่ 1 สำหรับกรณีที่ ประโยคเงื่อนไขเป็นจริง (มีได้มากกว่าหนึ่งคำสั่ง)
        Else
           การกระทำชุดที่ 2 สำหรับกรณีที่ ประโยคเงื่อนไขเป็นเท็จ (มีได้มากกว่าหนึ่งคำสั่ง)
        End If 
----------------------------------------------------------------------------------------------------------
ประโยคเงื่อนไขทางคณิตศาสตร์ จะต้องสามารถให้ค่า True หรือ False ได้ ซึ่งต้องเป็น

  • สมการ บมีเครื่องหมาย =ล
  • อสมการ [มีเครื่องหมาย <, <=,  >,  >=, <>  ]
  • ตัวแปร บที่มีค่าเป็น True หรือ False] โดยที่เราสามารถกำหนดค่าให้ตัวแปรเป็น True หรือ False ได้โดยตรง เช่น a=True   หรือ  a=False


เพื่อให้เข้าใจง่าย จะลองเขียนโปรแกรมตามตัวอย่างที่ 1 ออกมาเป็นคำสั่ง IF ตามรูปแบบข้างต้น ได้ดังนี้


        If (a < 10) Then
           b = 10
        Else
           b = 20
        End If 

ในกรณีที่ มีหลายๆเงือนไข หรือมีจำนวนเงื่อนไขมากว่า 2   เช่น
ตัวอย่างที่ 2
         ถ้า a>10             --> b=1
         ถ้า  10> a > 20   --> b=2
         ถ้า  20> a > 30   --> b=3
         ถ้า  30> a > 40   --> b=4

รูปแบบการเขียนคำสั่ง IF มีดังนี้ครับ
รูปแบบที่ 2
----------------------------------------------------------------------------------------------------------


       If (ประโยคเงื่อนไขทางคณิตศาสตร์ที่ 1) Then 
           การกระทำชุดที่ 1 สำหรับกรณีที่ ประโยคเงื่อนไขเป็นจริง (มีได้มากกว่าหนึ่งคำสั่ง) 
        ElseIf (ประโยคเงื่อนไขทางคณิตศาสตร์ที่2 ) Then 
           การกระทำชุดที่ 2 สำหรับกรณีที่ ประโยคเงื่อนไขเป็นจริง (มีได้มากกว่าหนึ่งคำสั่ง) 
        ElseIf (ประโยคเงื่อนไขทางคณิตศาสตร์ที่3 ) Then 
           การกระทำชุดที่ 3 สำหรับกรณีที่ ประโยคเงื่อนไขเป็นจริง (มีได้มากกว่าหนึ่งคำสั่ง) 
        End If  

-------------------------------------------------------------------------------------------------------
หมายเหตุ  เราสามารถมี ElseIf ...Then  ได้ไม่จำกัดจำนวน ขึ้นอยู่กับจำนวนเงื่อนไขของเรา



เราสามารถเขียนโปรแกรมตามเงื่อนไขจากตัวอย่างที่่ 2 ตามรูปแบบที่2 ได้ดังนี้

If (a<10) Then
  b=1
ElseIf (a>10 And a<20) Then
  b=2
ElseIf (a>20 And a<30) Then
  b=3
ElseIf (a>30 And a<40) Then
 b=4
End If

ถ้าในกรณีที่ เงื่อนไขสุดท้าย เป็นเงื่อนไขที่ต้องทำถ้าเงื่อนไขก่อนหน้านี้ไม่จริงสักอัน เราจะไม่ใช้
ElseIf ...Then กับเงื่อนไขสุดท้าย แต่จะเปลี่ยนเป็น Else แทน เช่น


ตัวอย่างที่ 3
         ถ้า score >= 80             --> grade=A
         ถ้า 70<= score <80        --> grade=B
         ถ้า  60<= score <70        --> grade=C
         ถ้า  50<= score <60        --> grade=D
         ถ้า score <50                  --> grade=F 

เราสามารถเขียนโปรแกรมตามตัวอย่างที่ 3 ได้โดยจัดให้เงื่อนไข score<50 ไว้ล่างสุด เพื่อเป็นการบอกว่าถ้าเงื่อนไขต่างๆก่อนหน้านี้ไม่จริงให้ทำตามเงื่อนไขสุดท้ายนี้ โดยใช้ Else (ไม่ใช่ ElseIf...Then) ดังนี้

If(score>=80) Then
    grade="A"
ElseIf(70<= score And score<80) Then
    grade="B"
ElseIf(60<=score And score<70) Then
    grade="C"
ElseIf(50<=score And score<60) Then
    grade="D"
Else      ' เงื่อนไขสุดท้าย ใช้ Else แทน ElseIF...Then ถ้าไม่มีเงื่อนไขก่อนหน้านี้เป็นจริง ให้ทำตรงนี้ 
    grade="F"   
Endif

นอกจากนี้ยังมีกรณีพิเศษอีกเช่น มีเงื่อนไขที่มี 2 ทางเลือก แต่ว่าทางเลือกหนึ่งในสองนี้คือไม่ต้องทำอะไร เช่น
ตัวย่างที่ 4
     ถ้า a>0  --> b=b+1
     ถ้า a=0 และ a<0   --> ไม่ต้องทำอะไร
ถ้าเขียนโปรแกรมตามรูปแบบที่ 1 จะได้ว่า

If(a>0) Then
    b=b+1
Else

End If
จะเห็นว่าหลัง Else ไม่ต้องมีคำสั่งอะไร
เราสามารถเขียนโปรแกรมให้สั้นลงได้ โดยเขียนเพีงบรรทัดเดียวได้ โดยที่ไม่ต้องมี Else หรือ ElseIf...Then ได้ดังนี้

If(a>0) Then b=b+1

เพียงเท่านี้เราก็สามารถเขียนคำสั่ง IF เพื่อประกอบการตัดสินใจได้แล้วนะ ^^

เพิ่มเติม:

  1. เงื่อนไขที่อยูหลัง If หรือ ElseIf นั้นจะต้องเป็น สมการ อสมการ หรือ ตัวแปร ที่สามารถให้ค่าเป็นจริงหรือเป็นเท็จได้ 
         สมการ  (a+2=b-6)
         อสมการ (a<c-5)
        ตัวแปร (ที่มีค่า เป็น True หรือ False)
  1. อสมการที่ใช้ใน VBA มีดังนี้ 


  • <   น้อยกว่า
  • <= น้อยกว่าหรือเท่ากับ
  • >  มากกว่า
  • >= มากกว่าหรือเท่ากับ
  • <> ไม่เท่ากับ (เขียน < และ > ติดกัน)
3. เงือนไขที่ประกอบด้วย หลายๆเงือนไขต้องมีตัวเชื่อม เช่น And  หรือ Or ตัวอย่าง เช่น (a>0 And a<5)
   หรือ (a<5  Or  a>10)





วันอาทิตย์ที่ 10 มิถุนายน พ.ศ. 2555

การเก็บค่าจากเซล์ และการกำหนดค่าให้เซล โดย VBA

ห่างไปนานกับการเขียนบทความของ Thai Excel VBA Community นะครับ วันนี้พอมีเวลาบ้าง เลยกลับมาพร้อมกับบทความอีกเรื่องก็คือ การเก็บหรือดึงค่าจากเซล์ในเวิร์กชีต มาประมวลผลในโปรแกรม และการนำค่าไปใส่ไว้ในเซล์ของ เอกเซล ซึ่งทำโดยใช้ โค้ด VBA ล้วนๆนะครับ

ส่วนนี้เป็นส่วนที่สำคัญมาก เพราะว่าเป็นส่วนที่ติดต่อระหว่างการทำงานที่มองเห็นด้วยตา(ผมหมายถึง ค่าต่างๆที่อยู่ในเซล์ ที่ผู้ใช้ทั่วไปจะสามารถเห็นได้) และการทำงานคำนวณหรือประมวลผมด้านหลังม่านที่อยู่ใน VBA

เริ่มต้นด้วยตัวอย่างคงจะทำให้เข้าใจง่ายกว่า...มาเร้ย
ตัวอย่างที่ 1 ผมมีข้อมูลเก็บไว้ในเวิร์กชีตที่ชื่อว่า "sarary" ซึ่งต่อไปจะเรียกเวิร์กชีตสั้นๆว่า ชีต แล้วกันนะครับ แล้วชีต "sarary" นี้ก็เป็นชีตลำดับที่ 2 ของไฟล์ (การไล่ลำดับชีตจะนับจากซ้ายสุดเป็น ชีตที่ 1 ไล่ไปทางขวาเพิ่มขึ้นทีละ 1) ดูตามรูปด้านล่างประกอบ
ในรูปแสดงให้เห็นว่าไฟล์มี 3 ชีต คือ report (ซ้ายมือสุด)  , sarary (ในวงกลมสีแดง) และ extra (ขวามือสุด)


ทีนี้ผมต้องการให้โปรแกรมมาเก็บหรือดึงค่าเงินโอทีของเดือน มีนาคม ซึ่งมีค่าเป็น 700 ถ้าดูตามรูปด้านบนค่านี้จะอยู่ในเซล D5 แล้วให้โปรแกรมนำค่าโอทีนี้ไปเก็บไว้ที่ตัวแปรที่ชื่อว่า OT ดังนั้นโปรแกรมจะใช้คำสั่งประมาณนี้ครับ


OT = Sheets("sarary").Cells(5,4).value    หรือ
OT = Sheets(2).Cells(5,4).value 


อธิบายคำสั่ง    การระบุตำแหน่งเซล์ ต้องบอกด้วยว่าเป็นเซล์ของชีตใหน เพราะว่าแต่ละชีตจะมีเซลเหมือนกันหมด ซึ่งถ้าไม่ระบุโปรแกรมก็จะไปเอาค่าของเซลที่เราต้องการจากชีตที่ถูกเปิดอยู่ในตอนนั้นมา (บางทีอาจเปิดชีตอื่นอยู่ ค่าที่เก็บมาก็จะผิด) จึงต้องระบุชีตให้ชัดเจน ซึ่งทำได้ด้วยคำสั่ง

Sheets("ชื่่อชีตที่ต้องการ") ในที่นี้ชื่อชีตที่ต้องการคือ sarary ดังนั้นใช้  Sheets("sarary") 

หรืออาจระบุชีตเป็นลำดับที่จากซ้ายก็ได้ดังเช่น

Sheets(ลำดับของชีตจากซ้ายสุดในที่นี้ชื่อชีตที่ต้องการคือ sarary อยู่ในลำดับที่ 2 จากซ้าสุด ดังนั้นใช้  Sheets(2) 

ข้อสังเกตุ 
1. หลังคำว่า Sheet จะมี s ด้วยนะ กลายเป็น Sheets
2. หากใช้ชื่อชีต ต้องมีเครื่องหมายคำพูดครอบชื่อชีตไว้ด้วย แต่ถ้าใช้ตัวเลขลำดับชีตไม่ต้องมีเครื่องหมายคำพูดครอบตัวเลข

หลังจากนั้นก็ระบุเซล์ที่ต้องการเก็บค่าต่อจาก Sheets("sarary")   หรือ Sheets(2)   ได้เลยโดยการคั่นด้วยจุด ( . )

การระบุตำแหน่งเซล์จะต้องบอกด้วย แถว และ คอลัมน์ เช่น เซลตำแหน่ง D5 นั้น จะอยู่แถวที่ 5 (นับ คือแถวบนสุด ไล่ลงมา) และอยู่คอลัมน์ที่ 4 (นับ 1 คอลัมน์ซ้ายสุด ไล่ไปทางขวา) ดังนั้นเราสามารถระบุตำแหน่งของเซล์ D5 ได้คือ

Cells(5,4)  แล้วก็เติม .value ต่อท้ายเข้าไปเพื่อเป็นการบอกถึงการเก็บค่าของเซล์

เมื่อนำไปต่อกับการระบุชีต จะกลายเป็น


Sheets("sarary").Cells(5,4). value      หรือ  Sheets(2).Cells(5,4).value 


เป็นอันเสร็จเรียบร้อยสำหรับการเก็บค่าจากเซล์ของชีตที่ต้องการ ถ้าต้องการเก็บไว้ในตัวแปร OT ก็เพียงกำหนดลงไปเลยว่า OT เท่ากับค่าที่เราเก็บมาดังนี้


OT = Sheets("sarary").Cells(5,4).value    หรือ
OT = Sheets(2).Cells(5,4).value 


โปรแกรมจริง ชื่อ read_cell
Sub read_cell()
    OT = Sheets("sarary").Cells(5,4).value
End Sub

ตรวจสอบการทำงานเก็บค่าจากเซล์ว่าถูกต้องหรือไม่ โดยเพิ่มคำสั่ง MsgBox เพื่อแสดงค่า OT ในรูปแบบของกล่องโต้ตอบออกมา โดยเพิ่มคำสั่งต่อท้ายเข้าไปหลังเก็บค่ามา (ดูบทความเกี่ยวกับ MsgBox ได้ที่ http://thaiexcelvba.blogspot.com/2012/01/msgbox-excel-vba.html)

Sub read_cell()
    OT = Sheets("sarary").Cells(5,4).value
    MsgBox(OT)
End Sub


เมื่อทดลอง รันโปรแกรม ก็จะมีกล่องข้อความ(จากคำสั่ง MsgBox) แสดงค่า OT ที่ไปเก็บมาดังรูปด้านล่าง ซึ่งแสดงค่า 700 ออกมา ....ถูกต้อง ^^



ส่วนการกำหนดค่าให้เซล์ ก็ไม่มีอะไรยากเลยครับ เพียงแต่สลับคำสั่งจากซ้ายเป็นขวา และขวาเป็นซ้าย ดังนี้

รูปแบบ

เซล์ที่ต้องการ = ค่าที่กำหนด 

เช่น Sheets("sarary").Cells(5.4).value = OT  เป็นต้น

ลองมาดูโปรแกรมที่มีทั้งการเก็บค่า และการกำหนดค่า ในเซล์


Sub read_cell()
   sarary =  Sheets("sarary").Cells(5,3).value   'เก็บค่าเงินเดือน ของมีนาคม จากเซล C5
   OT = Sheets("sarary").Cells(5,4).value        'เก็บโอที ของมีนาคม จากเซล D5
   allowance = Sheets("sarary").Cells(5,5).value        'เก็บเบี้ยเลี้ยง ของมีนาคม จากเซล E5    
   income = sarary + OT + allowance        'คำนวณค่ารายรับ = เงินเดือน + โอ ที +   เบี้ยเลี้ยง
   Sheets("sarary").Cells(5,6).value= income      'นำค่ารายรับที่ได้ไปเป็นไว้ในเซล F5
End Sub



เมื่อ รัน โปรแกรม (ปุ่ม F5) ก็จะได้ผลลัพธ์รายรับของเดือนมีนาคม เท่ากับ 25850 ไปเก็บไว้ที่เซล F5  ดังรูปด้านล่าง

ไม่ยากเลยไช่ไหมละครับ ลองไปประยุกต์ใช้นะครับ


ขอให้มีความสุขกับ VBA ทุกคนนะครับ ^^


ปล.สำหรับคนที่ยัไม่ได้ติดตามบทความของ Thai Excel VBA Community มาตั้งแต่ต้น สามารถศึกษาได้ตามลำดับ ...ตามนี้นะครับ



วันอาทิตย์ที่ 29 มกราคม พ.ศ. 2555

รับข้อมูลจากผู้ใช้ด้วย Inputbox

กล่องโต้ตอบกับผู้ใช้อีกแบบหนึ่ง ที่สามารถรับข้อมูลจากผู้ใช้ได้ด้วย นั่นก็คือ Input Box ลักษณะของ Input Box นี้จะเป็นกล่องโต้ตอบที่มีข้อความเพื่อบอกให้ผู้ใช้ทำอะไร หรือใส่อะไรลงในช่อง และ ช่องสำหรับให้ผู้ใช้กรอกข้อมูล ลักษณะดังภาพข้างล่าง

ซึ่งในภาพจะเห็นว่า มีข้อความให้ผู้ใช้กรอกชื่อตนเองใส่เข้าไปในช่อง นอกจากนี้ก็ยังมีปุ่ม อยู่ 2 คือ OK และ Cancel เพื่อแสดงการตอบรับหรือปฏิเสธกล่องโต้ตอบนี้

รูปแบบ

     inputbox("ข้อความที่ต้องการแสดงออกทางกล่องโต้ตอบ")


ตัวอย่าง
    ผมต้องการให้ผู้ใช้กรอกชื่อตนเองลงในช่องรับข้อมูล แล้วกดปุ่ม OK ลงในโปรแกรมย่อย (sub)ที่ชื่อว่า request ที่มีหนึ่งคำสั่งคือ inputbox อยู่ภายใน Code ของโปรแกรมสามารเขียนได้ดังนี้


Sub request()
    InputBox ("Please type your name in the box below and then click OK.")
End Sub

เมื่อทำการทดสอบการทำงานของโปรแกรม โดยการกดปุ่ม F5 จะได้ผลลัพท์ดังนี้


ซึ่งจะเห็นว่าในกล่องโต้ตอบแบบ Input box นี้ จะมีการแสดงข้อความของเราออกมาและมีช่องรับข้อมูลให้มาด้วย  แต่โดยทั่วไปกล่องโต้ตอบแบบ Input Box นี้มักจะต้องเกี่ยวข้องกับการนำข้อมูลในช่องรับข้อมูลที่ผู้ใช้กรอกเข้ามาไปประมวลผลต่อ ดังนั้นเราจะต้องเขียน Code เพื่อเก็บค่าที่ผู้ใช้กรอกเข้ามาไว้ด้วย โดยจะเก็บค่าดังกล่าวไว้ในรูปของตัวแปรใดตัวแปรหนึ่ง ตัวอย่างต่อไปนี้คือการนำค่าที่ผู้ใช้กรอกเข้ามาไปเก็บไว้ในตัวแปรที่ชื่อว่า UserName

Sub request()
    UserName = InputBox("Please type your name in the box below and then click OK.")
End Sub

แต่เพื่อต้องการตรวจสอบว่าตัวแปร UserName เก็บค่าที่ถูกต้องตามที่ผู้ใช้กรอกเข้ามาหรือไม่เราอาจทดสอบโดยการเพิ่มคำสั่งให้แสดงกล่องโต้ตอบที่มีข้อความเป็นค่าที่ผู้ใช้กรอกเข้ามาเพิ่มอีกหนึ่งคำสั่งดังนี้

Sub request()
    UserName = InputBox("Please type your name in the box below and then click OK.")
    MsgBox (UserName)
End Sub

เมื่อทำการทดสอบการทำงานของโปรแกรม โดยกดปุ่ม F5 แล้วป้อนคำว่า VBA เข้าไปในช่องรับข้อมูลแล้วกดปุ่ม OK จะพบว่ามีกล่องโต้ตอบแสดงข้อความ VBA ออกมา ซึ่งแสดงว่าตัวแปร UserName เก็บค่าที่เราป้อนเข้าไปถูกต้อง ผลลัพธ์ดังแสดงในภาพข้างล่าง




จะเห็นว่าการใช้งานกล่องโต้ตอบแบบ Input Box นั้นง่ายมาก 

ขอให้สนุกกับการใช้ Input Box นะครับ ^^

msgbox คำสั่งแรกใน Excel VBA

เริ่มเขียน VBA ครั้งแรกต้องนี่เลยครับ การแสดงข้อความโต้ตอบกับผู้ชมด้วยคำสั่ง  msgbox

รูปแบบ
       msgbox("ข้อความที่ต้องการโต้ตอบออกมา")

ตัวอย่าง 
ผมจะสร้างโปรแกรมย่อย (sub) ที่ชื่อว่า response ที่มีหนึ่งคำสั่งอยู่ภายใน โดยใช้คำสั่ง msgbox ให้แสดงข้อความโต้ตอบออกมาว่า I love you.


Sub response()
    MsgBox ("I love you.")
End Sub


หลังจากนั้น ก็ทดสอบการทำงานของโปรแกรม โดยการกดที่ปุ่ม  Run sub ที่มีหน้าตาคล้ายๆกับรูป
หรือ กดคีย์ลัด F5 แทนก็ได้ครับ แล้วโปรแกรมก็จะแสดงข้อความโต้ตอบออกมาลักษณะดังรูป (ภาพนี้ใช้ MS Excel 2007)




เมื่อทดลองเปลี่ยนข้อความจาก I love you. เป็น Thai Excel VBA  ตาม Code ข้างล่าง ก็จะได้ผลลัพท์เป็น


Sub response()
    MsgBox ("Thai Excel VBA Community.")       
End Sub


เห็นไม๊ครับว่า ง่ายนิดเดียวเอง ลองนำไปประยุกต์ใช้นะครับ

ขอให้มีความสุขกับ message box นะ ^^