ห่างไปนานกับการเขียนบทความของ 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 มาตั้งแต่ต้น สามารถศึกษาได้ตามลำดับ ...ตามนี้นะครับ
ส่วนนี้เป็นส่วนที่สำคัญมาก เพราะว่าเป็นส่วนที่ติดต่อระหว่างการทำงานที่มองเห็นด้วยตา(ผมหมายถึง ค่าต่างๆที่อยู่ในเซล์ ที่ผู้ใช้ทั่วไปจะสามารถเห็นได้) และการทำงานคำนวณหรือประมวลผมด้านหลังม่านที่อยู่ใน 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 มาตั้งแต่ต้น สามารถศึกษาได้ตามลำดับ ...ตามนี้นะครับ
- ก้าวแรก กับVBA ใน เอกเซล http://thaiexcelvba.blogspot.com/2012/01/vba.html
- msgbox คำสั่งแรกใน Excel VBA http://thaiexcelvba.blogspot.com/2012/01/msgbox-excel-vba.html
รับข้อมูลจากผู้ใช้ด้วย Inputbox http://thaiexcelvba.blogspot.com/2012/01/inputbox.html