Code: Select all
Range("A1").Offset(x,y) หมายถึงถัดจาก A1 ไปจำนวน x บรรทัด y คอลัมน์
Range("A1").Offset(0,0) คือไม่ไปไหนยังอยู่ที่ A1 เหมือนเดิม
Range("A1").Offset(1,1) ตำแหน่งเซลล์จะไปอยู่ที่ B2
ผมติดปัญหาตรงนี้ตลอดอย่างที่เคยบอกอาจารย์ว่า อ่อนมากเลยกับ Offet เข้าไปอ่านที่อาจารย์โพสต์ไว้ในบอร์ดก็ยังไม่ค่อยเข้าใจ ยังไม่ทราบประโยชน์ว่าจะนำไปใช้ตรงไหนได้บ้าง แต่ตอนนี้ยอมรับว่าเข้าใจมาอีกระดับหนึ่งแล้วครับ จากตัวอย่างที่อาจารย์ยกโค๊ดมา ผมเข้าครับ อิอิ
ให้เร่งปูพื้นฐานเรื่องการอ้างอิงเกี่ยวกับ Workbook, Worksheet, Cell การ Loop ต่าง ๆ
ผมนั่งอ่านและนั่งดูวิดีโอการทำ Loop,Do While,Next,For Each หลายๆรอบ เพื่อจะได้นำปรับมาใช้ แต่ไม่เป็นผลเลย ผมยังคิดเอาความสามารถของมันออกมาใช้ไม่ได้เลยครับ ขาดความรู้พื้นฐานจริงๆ งานชิ้นนี้เสร็จ ผมจะเอาจริงกับพื้นฐานสักที
A1:A20 ของต้นทาง วางที่ A1:A20 ของปลายทาง, B1:B20 ของต้นทาง วางที่ C1:C20 ของปลายทาง ลักษณะของ Code จะได้เป็น
โค้ด: เลือกทั้งหมด
'Other code
Sheets(Target).Range("C1:C20") = Sheets(Source).Range("B1:B20").Value
'Other code
ทำเช่นนี้กับทุก Form สามารถเขียน Code การวางแต่ละ Form แยกจากกันได้แล้วค่อยสร้าง Procedure มาเรียกใช้ Code ทั้งหมดอีกที
แจ่มแจ้งครับ เห็นแนวทางทันที (คิดเองไม่ได้เลย) ผมต้องขอเวลาไปลองทำครับ
อธิบายอีกนิดน่ะครับ อาจจะสับสนหน่อย แต่อาจารย์ไม่สับสนแน่ครับ
ผมจะให้ทุกการทำงาน เริ่มจากชีท "WellCome" ซึ่งในขั้นต่อไปจะมีการซ่อนชีทที่ไม่จำเป็นออกไปแล้วจะแสดงชีทที่มีความเกี่ยวข้องกันมาแสดง เพื่อไม่ให้ผู้ทำงานออกนอกเส้นทางที่เราได้วางไว้ ในกรณีนี้ผมยกตัวอย่างการ "ทำใบสั่งซื้ออ้างQO" โดยให้เลือก "รหัสQO" ก่อนแล้วนำมายังชีท "PurchaseOrder" จะเห็นได้ว่าช่องรหัสQO จะล๊อคไว้
เมื่อทำรายการเรียบร้อยแล้ว ผมจะบังคับให้ "บันทึก" ข้อมูลก่อน ก่อนที่จะพิมพ์ใบสั่งซื้อ โดยพฤติกรรมการทำงานของพนักงานทั่วไป (ยกเว้นเราที่ทำระบบเอง) พอเค้าทำรายการเสร็จ เค้าจะสั่งพิมพ์ทันที โดยไม่ได้บันทึก พอไม่ได้บันทึก ข้อมูลจึงไม่มีใน Database พอทำใบสั่งซื้อใบที่ 2 ข้อมูลใบสั่งซื้อที่ 1 ที่ค้างอยู่ในชีท "PurchaseOrder" จะถูกเคลียร์ออกตามคำสั่ง ClearContents กลายเป็นว่าข้อมูลใบสั่งซื้อที่ 1ไม่ได้บันทึกไป ผมจึงไม่ได้ใช้วิธีการเคลียร์ข้อมูลก่อน ก่อนที่เอาข้อมูลใหม่ลง เพื่อป้องกันการลืมบันทึกข้อมูล
ที่ดึงข้อมูลมายัง FindPO นั้น สืบเนื่องมาจากการป้องกันการลืมบันทึกข้อมูล จริงๆแล้ว ไม่อยากทำให้มันยุ่งยากหลายขั้นตอน แต่เพื่อป้องการทำรายการผิดพลาด ผมเลยต้องทำแบบนี้ เพราะถ้าข้อมูลผิดพลาด ผมคิดว่ามันจะส่งผลระยะยาวกับระบบ ซึ่งอันนี้ผมคิดว่าอาจารย์คงรู้ดี
เมื่อทำรายการในชีท "PurchaseOrder" เสร็จแล้ว จะต้องกดบันทึกข้อมูลก่อน เพื่อส่งข้อมูลไปยัง Database ในขณะเดียวกันก็ส่งรหัส PO ไปยัง เซลล์ "D2" ของชีท "FindPO" ด้วย เพื่อดึงข้อมูลจาก Database ขึ้นมาแสดง ซึ่งถ้าไม่บันทึกก่อน ยังไงก็ไม่สามารถพิมพ์ใบสั่งซื้อได้ เพราะชีท "FindPO" ดึงข้อมูลจาก Database โดยตรง
การทำเช่นนี้เป็นการป้องกันกรณีความผิดพลาดที่อาจจะเกิดขึ้น เพราะผมเชื่อว่าคนเรามีโอกาสผิดพลาดได้ ต้องยอมรับว่าผมคิดได้ถึงแค่นี้ ตอนนี้ยังไม่เห็นวิธีการอื่น หากอาจารย์มีวิธีที่มันง่ายกว่านี้ รบกวนแนะนำด้วยน่ะครับ เพื่อจะได้ให้งานมันดีที่สุด