วันอาทิตย์ที่ 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 มาตั้งแต่ต้น สามารถศึกษาได้ตามลำดับ ...ตามนี้นะครับ