VBA ต้องการโชว์ ฟอร์ม เมื่อเกิด Debug
Posted: Wed Jan 01, 2020 1:36 pm
(คำถามอยู่บรรทัดสุดท้าย)
สถานการณ์ คือ ผมต้องโหลดไฟล์ Excel มาจากฐานข้อมูล แล้วไฟล์นั้น ในแต่ละวันจะมีจำนวน Sheet ไม่เท่ากัน (สูงสุด คือ 6 Sheet)
สิ่งที่ผมต้องการข้อที่ 1 คือ รวมไฟล์ทุก Sheet มาไว้หน้าที่ 1 จากนั้น copy ทั้งหมด (เพื่อส่งไปอีก workbook) ในส่วนนี้ ผมใช้ On Error GoTo HandleError: เพื่อว่า เมื่อเกิด debug จากการค้นหา sheet ไม่เจอ (เช่น วันที่มี 3 Sheet ก็หา Sheet 4 ไม่เจอ) ให้ข้ามไป Sheet แรก แล้ว Copy ซึ่งในส่วนนี้สำเร็จอย่างงดงาม
(ตัวอย่าง) สมมติว่ามี 3 sheet
Sub คัดลอกและวาง()
On Error GoTo HandleError:
'copy จากหน้า 2 มาหน้า 1
Windows("ไฟล์สมมติ.xls").Activate Sheets("Sheet2").Select Selection.Copy
Sheets("Sheet1").Select Range("B26").Select ActiveSheet.Paste
'copy จากหน้า 3 มาหน้า 1
Windows("ไฟล์สมมติ.xls").Activate Sheets("Sheet3").Select Selection.Copy
Sheets("Sheet1").Select Range("B36").Select ActiveSheet.Paste
'copy จากหน้า 4 มาหน้า 1
Windows("ไฟล์สมมติ.xls").Activate Sheets("Sheet4").Select Selection.Copy
Sheets("Sheet1").Select Range("B46").Select ActiveSheet.Paste
HandleError:
'copy ข้อมูลทั้งหมดที่เอามาแปะไว้หน้าแรก
Sheets("Sheet1").Rows("13:100").Select Application.CutCopyMode = False Selection.Copy
มันก็สำเร็จดี แต่ปัญหาคือ ในกรณีที่ ผู้ใช้ไม่ได้เปิด "ไฟล์สมมติ.xls" ขึ้นมา มันจะแจ้งเตือน Debug อีกครั้ง ซึ่งผมต้องการแจ้งให้ผู้ใช้ทราบว่า กำลังลืมเปิด "ไฟล์สมมติ.xls" อยู่
ผมได้ทดลองใช้ On Error GoTo ซ้ำอีกครั้งแล้วแต่มันไม่ได้ผล
อีกแนวคิดที่ผมพยายามทำคือ ใช้ if โดยที่พยายามเขียนตรรกะว่า ถ้า การเลือก sheet ล้มเหลว ให้แสดง ฟอร์ม แต่ถ้าไม่ล้มเหลวให้ทำงานต่อไป ซึ่งผมไม่รู้ว่าต้องเขียนตรรกะนี้อย่างไร
หรือท่านใดมีหนทางอื่นๆ ที่สามารถให้ผลลัพธ์ได้ในทำนองเดียวกันนี้ รบกวนด้วยนะครับ
สถานการณ์ คือ ผมต้องโหลดไฟล์ Excel มาจากฐานข้อมูล แล้วไฟล์นั้น ในแต่ละวันจะมีจำนวน Sheet ไม่เท่ากัน (สูงสุด คือ 6 Sheet)
สิ่งที่ผมต้องการข้อที่ 1 คือ รวมไฟล์ทุก Sheet มาไว้หน้าที่ 1 จากนั้น copy ทั้งหมด (เพื่อส่งไปอีก workbook) ในส่วนนี้ ผมใช้ On Error GoTo HandleError: เพื่อว่า เมื่อเกิด debug จากการค้นหา sheet ไม่เจอ (เช่น วันที่มี 3 Sheet ก็หา Sheet 4 ไม่เจอ) ให้ข้ามไป Sheet แรก แล้ว Copy ซึ่งในส่วนนี้สำเร็จอย่างงดงาม
(ตัวอย่าง) สมมติว่ามี 3 sheet
Sub คัดลอกและวาง()
On Error GoTo HandleError:
'copy จากหน้า 2 มาหน้า 1
Windows("ไฟล์สมมติ.xls").Activate Sheets("Sheet2").Select Selection.Copy
Sheets("Sheet1").Select Range("B26").Select ActiveSheet.Paste
'copy จากหน้า 3 มาหน้า 1
Windows("ไฟล์สมมติ.xls").Activate Sheets("Sheet3").Select Selection.Copy
Sheets("Sheet1").Select Range("B36").Select ActiveSheet.Paste
'copy จากหน้า 4 มาหน้า 1
Windows("ไฟล์สมมติ.xls").Activate Sheets("Sheet4").Select Selection.Copy
Sheets("Sheet1").Select Range("B46").Select ActiveSheet.Paste
HandleError:
'copy ข้อมูลทั้งหมดที่เอามาแปะไว้หน้าแรก
Sheets("Sheet1").Rows("13:100").Select Application.CutCopyMode = False Selection.Copy
มันก็สำเร็จดี แต่ปัญหาคือ ในกรณีที่ ผู้ใช้ไม่ได้เปิด "ไฟล์สมมติ.xls" ขึ้นมา มันจะแจ้งเตือน Debug อีกครั้ง ซึ่งผมต้องการแจ้งให้ผู้ใช้ทราบว่า กำลังลืมเปิด "ไฟล์สมมติ.xls" อยู่
ผมได้ทดลองใช้ On Error GoTo ซ้ำอีกครั้งแล้วแต่มันไม่ได้ผล
อีกแนวคิดที่ผมพยายามทำคือ ใช้ if โดยที่พยายามเขียนตรรกะว่า ถ้า การเลือก sheet ล้มเหลว ให้แสดง ฟอร์ม แต่ถ้าไม่ล้มเหลวให้ทำงานต่อไป ซึ่งผมไม่รู้ว่าต้องเขียนตรรกะนี้อย่างไร
หรือท่านใดมีหนทางอื่นๆ ที่สามารถให้ผลลัพธ์ได้ในทำนองเดียวกันนี้ รบกวนด้วยนะครับ