คำตอบที่ได้รับเลือกจากเจ้าของกระทู้
ความคิดเห็นที่ 3
เช็กเซลล์ที่เลือกให้ถูก จขกท.ไปดูเองเพราะไม่มีใครรู้ด้วย
ข้อผิดพลาดเกิดจากบรรทัด ActiveCell.Offset(1, 0).Range("A1").Select เพราะว่า .Range("A1") หลังจาก .Offset ไม่จำเป็นและอาจทำให้เกิดข้อผิดพลาดได้ คุณสามารถแก้ไขโดยลบ .Range("A1") ออก แล้วใช้เพียง:
แทน
ตัวอย่างโค้ดที่แก้ไขแล้ว:
Offset ใน VBA คือคำสั่งที่ใช้เพื่อเลื่อนตำแหน่งของเซลล์หรือช่วงเซลล์ไปยังตำแหน่งใหม่ โดยอิงจากตำแหน่งปัจจุบัน (เช่น ActiveCell หรือ Range ที่กำหนดไว้)
ตัวอย่าง:
หมายถึง เลื่อนจากเซลล์ที่ใช้อยู่ปัจจุบัน ไปลงด้านล่าง 2 แถว และไปทางขวา 3 คอลัมน์
พารามิเตอร์:
- ตัวแรก (จำนวนแถว): ถ้าเป็นบวก จะเลื่อนลง, ถ้าเป็นลบ จะเลื่อนไปด้านบน
- ตัวที่สอง (จำนวนคอลัมน์): ถ้าเป็นบวก จะเลื่อนไปทางขวา, ถ้าเป็นลบ จะเลื่อนไปทางซ้าย
ตัวอย่างการใช้งาน:
จะเป็นการเลือกเซลล์ที่อยู่ 1 แถวด้านล่างและ 2 คอลัมน์ทางขวาจากเซลล์ A1 ซึ่งก็คือเซลล์ C2
วิธีการตั้ง Breakpoint เพื่อดีบัก VBA
[Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้1. เปิดหน้าต่าง VBA Editor
กด ALT + F11 เพื่อเข้าสู่หน้าต่าง VBA
2. หาโค้ดที่ต้องการดีบัก
เปิดโมดูลหรือไฟล์ที่มีโค้ดและเลื่อนหาโค้ดที่คิดว่าน่าจะเป็นต้นเหตุของ Error
3. ตั้ง Breakpoint
- คลิกซ้ายที่ช่องซ้ายสุดของบรรทัดโค้ดที่ต้องการหยุด (เช่น บรรทัดที่ error เกิดขึ้น)
- หรือคลิกขวาแล้วเลือก Toggle Breakpoint
- หรือกด F9 ขณะอยู่ที่บรรทัดนั้น
เมื่อทำเช่นนี้ จุดนั้นจะกลายเป็นสีแดง แสดงว่ามันเป็นจุดหยุดของโปรแกรม
4. รันโปรแกรม
- กด F5 เพื่อรันโค้ด
- โปรแกรมจะหยุดทำงานเมื่อถึง Breakpoint ที่ตั้งไว้
5. ตรวจสอบค่าและสถานะของตัวแปร
- เมื่อหยุดตรงจุดนั้น คุณสามารถวางเมาส์เหนือ ตัวแปร เพื่อดูค่าได้
- หรือใช้หน้าต่าง Immediate (กด CTRL + G) เพื่อพิมพ์คำสั่งเช็คค่า เช่น ?ActiveCell.Address
- หรือใช้หน้าต่าง Watch เพื่อดูตัวแปรเฉพาะ
6. ดำเนินการทีละขั้นตอน
- กด F8 เพื่อเดินโค้ดทีละบรรทัด
- สังเกตค่าต่าง ๆ ที่เปลี่ยนแปลงไป
7. วิเคราะห์และแก้ไข
- เมื่อพบจุดที่ตัวแปรหรือเงื่อนไขผิดคาด ให้แก้ไขโค้ด แล้วรันใหม่
ตัวอย่าง
สมมติว่าคุณรู้ว่าข้อผิดพลาดเกิดที่บรรทัดนี้:
ให้ตั้ง Breakpoint ที่บรรทัดนี้ แล้วรันโค้ด จากนั้นดูค่า ActiveCell ว่าเป็นอะไร
ถ้าเป็น Nothing หรือไม่ได้กำหนดค่าอะไร ก็จะรู้ว่าปัญหาอยู่ตรงนั้น
ข้อผิดพลาดเกิดจากบรรทัด ActiveCell.Offset(1, 0).Range("A1").Select เพราะว่า .Range("A1") หลังจาก .Offset ไม่จำเป็นและอาจทำให้เกิดข้อผิดพลาดได้ คุณสามารถแก้ไขโดยลบ .Range("A1") ออก แล้วใช้เพียง:
ActiveCell.Offset(1, 0).Select
แทน
ตัวอย่างโค้ดที่แก้ไขแล้ว:
Sub A()
' คัดลอกข้อมูลจากแถว 13 ไปจนสุดคอลัมน์ที่ใช้
Range("A13").Select
Range(Selection, Selection.End(xlToRight)).Select
Selection.Copy
' ไปเลือกเซลล์ว่างในคอลัมน์ A ของ Sheet8
Sheets("Sheet8").Select
Selection.End(xlDown).Select
ActiveCell.Offset(1, 0).Select ' แก้ไขแล้ว
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
' เลื่อนขึ้น 2 แถวในคอลัมน์ A
ActiveCell.Offset(-2, 0).Select
Sheets("Input").Select
' เลือกช่วงเซลล์ที่ต้องการเคลียร์ข้อมูล
Range("C4, F4, I4, L4, C6, F6, I6, L6, C8, F8, C10").Select
Application.CutCopyMode = False
Selection.ClearContents
Range("C4").Select
End Sub
' คัดลอกข้อมูลจากแถว 13 ไปจนสุดคอลัมน์ที่ใช้
Range("A13").Select
Range(Selection, Selection.End(xlToRight)).Select
Selection.Copy
' ไปเลือกเซลล์ว่างในคอลัมน์ A ของ Sheet8
Sheets("Sheet8").Select
Selection.End(xlDown).Select
ActiveCell.Offset(1, 0).Select ' แก้ไขแล้ว
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
' เลื่อนขึ้น 2 แถวในคอลัมน์ A
ActiveCell.Offset(-2, 0).Select
Sheets("Input").Select
' เลือกช่วงเซลล์ที่ต้องการเคลียร์ข้อมูล
Range("C4, F4, I4, L4, C6, F6, I6, L6, C8, F8, C10").Select
Application.CutCopyMode = False
Selection.ClearContents
Range("C4").Select
End Sub
Offset ใน VBA คือคำสั่งที่ใช้เพื่อเลื่อนตำแหน่งของเซลล์หรือช่วงเซลล์ไปยังตำแหน่งใหม่ โดยอิงจากตำแหน่งปัจจุบัน (เช่น ActiveCell หรือ Range ที่กำหนดไว้)
ตัวอย่าง:
ActiveCell.Offset(2, 3)
หมายถึง เลื่อนจากเซลล์ที่ใช้อยู่ปัจจุบัน ไปลงด้านล่าง 2 แถว และไปทางขวา 3 คอลัมน์
พารามิเตอร์:
- ตัวแรก (จำนวนแถว): ถ้าเป็นบวก จะเลื่อนลง, ถ้าเป็นลบ จะเลื่อนไปด้านบน
- ตัวที่สอง (จำนวนคอลัมน์): ถ้าเป็นบวก จะเลื่อนไปทางขวา, ถ้าเป็นลบ จะเลื่อนไปทางซ้าย
ตัวอย่างการใช้งาน:
Range("A1").Offset(1, 2).Select
จะเป็นการเลือกเซลล์ที่อยู่ 1 แถวด้านล่างและ 2 คอลัมน์ทางขวาจากเซลล์ A1 ซึ่งก็คือเซลล์ C2
วิธีการตั้ง Breakpoint เพื่อดีบัก VBA
[Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้1. เปิดหน้าต่าง VBA Editor
กด ALT + F11 เพื่อเข้าสู่หน้าต่าง VBA
2. หาโค้ดที่ต้องการดีบัก
เปิดโมดูลหรือไฟล์ที่มีโค้ดและเลื่อนหาโค้ดที่คิดว่าน่าจะเป็นต้นเหตุของ Error
3. ตั้ง Breakpoint
- คลิกซ้ายที่ช่องซ้ายสุดของบรรทัดโค้ดที่ต้องการหยุด (เช่น บรรทัดที่ error เกิดขึ้น)
- หรือคลิกขวาแล้วเลือก Toggle Breakpoint
- หรือกด F9 ขณะอยู่ที่บรรทัดนั้น
เมื่อทำเช่นนี้ จุดนั้นจะกลายเป็นสีแดง แสดงว่ามันเป็นจุดหยุดของโปรแกรม
4. รันโปรแกรม
- กด F5 เพื่อรันโค้ด
- โปรแกรมจะหยุดทำงานเมื่อถึง Breakpoint ที่ตั้งไว้
5. ตรวจสอบค่าและสถานะของตัวแปร
- เมื่อหยุดตรงจุดนั้น คุณสามารถวางเมาส์เหนือ ตัวแปร เพื่อดูค่าได้
- หรือใช้หน้าต่าง Immediate (กด CTRL + G) เพื่อพิมพ์คำสั่งเช็คค่า เช่น ?ActiveCell.Address
- หรือใช้หน้าต่าง Watch เพื่อดูตัวแปรเฉพาะ
6. ดำเนินการทีละขั้นตอน
- กด F8 เพื่อเดินโค้ดทีละบรรทัด
- สังเกตค่าต่าง ๆ ที่เปลี่ยนแปลงไป
7. วิเคราะห์และแก้ไข
- เมื่อพบจุดที่ตัวแปรหรือเงื่อนไขผิดคาด ให้แก้ไขโค้ด แล้วรันใหม่
ตัวอย่าง
สมมติว่าคุณรู้ว่าข้อผิดพลาดเกิดที่บรรทัดนี้:
ActiveCell.Offset(1, 0).Range("A1").Select
ให้ตั้ง Breakpoint ที่บรรทัดนี้ แล้วรันโค้ด จากนั้นดูค่า ActiveCell ว่าเป็นอะไร
ถ้าเป็น Nothing หรือไม่ได้กำหนดค่าอะไร ก็จะรู้ว่าปัญหาอยู่ตรงนั้น
▼ กำลังโหลดข้อมูล... ▼
แสดงความคิดเห็น
คุณสามารถแสดงความคิดเห็นกับกระทู้นี้ได้ด้วยการเข้าสู่ระบบ
รันแมโครแล้ว Error
พอกดบันทึกข้อมูลแล้วเกิด Error ไม่ทราบว่ามันเกิดจากอะไรคะ เพราะทำขั้นตอนทุกอย่าง
ช่วยแก้ไขทีค่ะ