Page 1 of 1
On Error GoTo Error
Posted: Mon Dec 15, 2014 11:29 am
by Totem
เรียน อาจารย์และเพื่อนสมาชิก

ได้ใช้ On Error GoTo ErrorHandler
ตัวอย่าง
Code: Select all
With Workbooks(Book_a).Sheets(Sheet_r).Select
On Error GoTo ErrorHandler
Workbooks(Book_1).Sheets(Sheet_A).Range("A1").CurrentRegion.Offset(0, 0). _
SpecialCells(xlCellTypeVisible).Copy
Range("A1").PasteSpecial xlPasteValuesAndNumberFormats
Application.CutCopyMode = False
Resume Next
ErrorHandler:
On Error GoTo ErrorHandler
Workbooks(Book_2).Sheets(Sheet_B).Range("A1").CurrentRegion.Offset(0, 0). _
SpecialCells(xlCellTypeVisible).Copy
Range("G1").PasteSpecial xlPasteValuesAndNumberFormats
Application.CutCopyMode = False
Resume Next
ErrorHandler:
Workbooks(Book_3).Sheets(Sheet_C).Range("A1").CurrentRegion.Offset(0, 0). _
SpecialCells(xlCellTypeVisible).Copy
Range("P1").PasteSpecial xlPasteValuesAndNumberFormats
Application.CutCopyMode = False
End With
End Sub
เงือนไข หากไปเปิด Workbooks(Book_1).Sheets(Sheet_A).Range("A1") และหรือ
Workbooks(Book_2).Sheets(Sheet_B).Range("A1") และหรือ
Workbooks(Book_3).Sheets(Sheet_C).Range("A1") และหรือ
ให้ On Error GoTo ErrorHandler
เช่น ต้องการ copy โดยเปิด Workbooks(Book_3).Sheets(Sheet_C).Range("A1") แต่ไม่ได้เปิด Workbooks(Book_1)และ Workbooks(Book_1) ให้ข้ามไปหา Workbooks(Book_3)
แล้วพบปัญหาว่า ไม่สามารถใช้ได้ จะขึ้นข้อความ Duplicate declaration in current scope
ถ้าใช้ On Error GoTo ErrorHandler เพียงข้าม Workbooks(Book_1) ไปใช้ได้ แต่ถ้าเป็น 2 Workbooks ไม่ได้ครับ
ช่วยปรับ Code หรือมีวิธีอื่นที่ดีกว่าการใช้คำสั่ง On Error GoTo ErrorHandler ขอบคุณครับ
Re: On Error GoTo Error
Posted: Mon Dec 15, 2014 8:28 pm
by bank9597
ลองปรับโค๊ดตามนี้ดูครับ
Code: Select all
With Workbooks(Book_a).Sheets(Sheet_r).Select
On Error GoTo ErrorHandler
Workbooks(Book_1).Sheets(Sheet_A).Range("A1").CurrentRegion.Offset(0, 0). _
SpecialCells(xlCellTypeVisible).Copy
Range("A1").PasteSpecial xlPasteValuesAndNumberFormats
Application.CutCopyMode = False
Resume Next
ErrorHandler:
On Error GoTo ErrorHandler
Workbooks(Book_2).Sheets(Sheet_B).Range("A1").CurrentRegion.Offset(0, 0). _
SpecialCells(xlCellTypeVisible).Copy
Range("G1").PasteSpecial xlPasteValuesAndNumberFormats
Application.CutCopyMode = False
Resume Next
exit sub
ErrorHandler:
Workbooks(Book_3).Sheets(Sheet_C).Range("A1").CurrentRegion.Offset(0, 0). _
SpecialCells(xlCellTypeVisible).Copy
Range("P1").PasteSpecial xlPasteValuesAndNumberFormats
Application.CutCopyMode = False
End With
End Sub
Re: On Error GoTo Error
Posted: Tue Dec 16, 2014 9:41 am
by Totem
bank9597 wrote:ลองปรับโค๊ดตามนี้ดูครับ
Code: Select all
With Workbooks(Book_a).Sheets(Sheet_r).Select
On Error GoTo ErrorHandler
Workbooks(Book_1).Sheets(Sheet_A).Range("A1").CurrentRegion.Offset(0, 0). _
SpecialCells(xlCellTypeVisible).Copy
Range("A1").PasteSpecial xlPasteValuesAndNumberFormats
Application.CutCopyMode = False
Resume Next
ErrorHandler:
On Error GoTo ErrorHandler
Workbooks(Book_2).Sheets(Sheet_B).Range("A1").CurrentRegion.Offset(0, 0). _
SpecialCells(xlCellTypeVisible).Copy
Range("G1").PasteSpecial xlPasteValuesAndNumberFormats
Application.CutCopyMode = False
Resume Next
exit sub
ErrorHandler:
Workbooks(Book_3).Sheets(Sheet_C).Range("A1").CurrentRegion.Offset(0, 0). _
SpecialCells(xlCellTypeVisible).Copy
Range("P1").PasteSpecial xlPasteValuesAndNumberFormats
Application.CutCopyMode = False
End With
End Sub

เกิด error
End With without With
ผมจึงนำ End With ออก
code ทำงาน แต่ ถ้า Exit sub ใส่เข้าไป มันไม่ทำงานในส่วน
Code: Select all
Workbooks(Book_3).Sheets(Sheet_C).Range("A1").CurrentRegion.Offset(0, 0). _
SpecialCells(xlCellTypeVisible).Copy
Range("P1").PasteSpecial xlPasteValuesAndNumberFormats
Application.CutCopyMode = False
ซึ่งยังไม่ผลตามที่ต้องการครับ
Re: On Error GoTo Error
Posted: Tue Dec 16, 2014 1:20 pm
by bank9597

ถ้าไม่เห็นไฟล์แนบก็จะตอบยากครับ
ส่วนคำสั่ง On Error GoTo Error จะทำงานเมื่อเกิด Error เท่านั้น
Re: On Error GoTo Error
Posted: Tue Dec 16, 2014 1:57 pm
by Totem
bank9597 wrote:
ถ้าไม่เห็นไฟล์แนบก็จะตอบยากครับ
ส่วนคำสั่ง On Error GoTo Error จะทำงานเมื่อเกิด Error เท่านั้น
Code: Select all
Sub_On ErrorGoTo()
On Error GoTo ErrorHandler
Workbooks(Book_1).Sheets(Sheet_A).Range("A1").CurrentRegion.Offset(0, 0). _
SpecialCells(xlCellTypeVisible).Copy
Range("A1").PasteSpecial xlPasteValuesAndNumberFormats
Application.CutCopyMode = False
Resume Next
ErrorHandler:
On Error GoTo 0
Workbooks(Book_2).Sheets(Sheet_B).Range("A1").CurrentRegion.Offset(0, 0). _
SpecialCells(xlCellTypeVisible).Copy
Range("G1").PasteSpecial xlPasteValuesAndNumberFormats
Application.CutCopyMode = False
Workbooks(Book_3).Sheets(Sheet_C).Range("A1").CurrentRegion.Offset(0, 0). _
SpecialCells(xlCellTypeVisible).Copy
Range("P1").PasteSpecial xlPasteValuesAndNumberFormats
Application.CutCopyMode = False
End Sub
ตัวอย่างข้างต้นสามารถใช้งานได้แต่ ใช้ได้กรณีเดียวครับ
ตัวอย่าง 1.หากไม่เปิด Workbooks(Book_1) และ Workbooks(Book_2) ด้วย ให้ข้าม Error Workbooks(Book_1) และ Workbooks(Book_2) ไป แต่ Workbooks(Book_3) ทำงานได้ตามคำสั่งที่ต้องการ
2.หากไม่เปิด Workbooks(Book_1) และ Workbooks(Book_3) ด้วย ให้ข้าม Error Workbooks(Book_2) และWorkbooks(Book_3) ไป แต่ Workbooks(Book_1) ทำงานได้ตามคำสั่งที่ต้องการ
Re: On Error GoTo Error
Posted: Tue Dec 16, 2014 11:26 pm
by snasui

ช่วยเล่าว่าต้องการจะทำอะไรและปัญหาคืออะไรมาอีกรอบ จะได้เข้าใจในสิ่งที่ต้องการจะทำ จากที่เขียนมายังไม่กระจ่างครับ
การดัก Error จะดักได้ก็ต่อเมื่อเกิด Error หากไม่ Error แต่่เรามีทางเลือกในการทำงาน สามารถใช้ Select Case หรือ If เข้ามาช่วยได้
คำว่าไปเปิด เป็นการกระทำลักษณะใดครับ ในกรณีการเปิดไฟล์ ให้ตรวจสอบแค่เพียงชื่อไฟล์ก็เพียงพอ ไม่จำเป็นต้องตรวจสอบไปถึงตำแหน่งเซลล์แต่อย่างใดครับ
Re: On Error GoTo Error
Posted: Wed Dec 17, 2014 11:06 am
by Totem
snasui wrote:
ช่วยเล่าว่าต้องการจะทำอะไรและปัญหาคืออะไรมาอีกรอบ จะได้เข้าใจในสิ่งที่ต้องการจะทำ จากที่เขียนมายังไม่กระจ่างครับ
การดัก Error จะดักได้ก็ต่อเมื่อเกิด Error หากไม่ Error แต่่เรามีทางเลือกในการทำงาน สามารถใช้ Select Case หรือ If เข้ามาช่วยได้
คำว่าไปเปิด เป็นการกระทำลักษณะใดครับ ในกรณีการเปิดไฟล์ ให้ตรวจสอบแค่เพียงชื่อไฟล์ก็เพียงพอ ไม่จำเป็นต้องตรวจสอบไปถึงตำแหน่งเซลล์แต่อย่างใดครับ

มีเอกสารรายงาน 1 ฉบับ ขอเรียกเป็น Workbook ชื่อ Book_report
และมีข้อมูลที่ต้องนำมาใช้ใน Book_report ซึ่งขอยกข้อมูลมา 3 ข้อมูล งานจริงมีมากว่านั้น ในแต่ละข้อมูลอยู่คนละไฟล์
ข้อมูลที่ 1 เป็น Book_1
ข้อมูลที่ 2 เป็น Book_2
ข้อมูลที่ 2 เป็น Book_3
ทั้ง 3 ข้อมูล อยู่คนละ Workbooks
จึงเขียน code ให้ Book_report คัดลอกข้อมูลใน Book_1,2,3 มาใช้งานในแต่ละเดือน
ซึ่งในแต่ละเดือนนั้น บางเดือนอาจไม่มีข้อมูลที่ 1 แต่มี ข้อมูล 2,3 หรือ บางเดือนอาจมีข้อมูลที่ 2 ไม่มีข้อมูล 1,3
มีความไม่แน่นอน หากในเดือนที่มีข้อมูลครบทั้ง 3 ข้อมูล (ครบทุกWorkbooks) การคัดลอกก็จะไม่มีปัญหา
แต่หากไม่ครบ เกิดปัญหา Error เพราะไฟล์ Workbooks นั้นๆ ไม่มี ผมจึงใช้ On Error GoTo ErrorHandler
เข้าไปจับ ให้สามารถข้าม Error นั้นๆ ได้ แต่เมื่อทำแล้ว ผมใส่ code On Error GoTo ErrorHandler ใช้ได้แค่
ดัก Error ได้ครั้งเดียว ใส่เพิ่ม code เข้าไปอีกแล้วพบปัญหาว่า ไม่สามารถใช้ได้ จะขึ้นข้อความ
Duplicate declaration in current scope น่าจะเกิดจากมีการใช้คำสั่ง On Error GoTo ErrorHandler ซ้ำกัน
จึงต้องการให้ปรับ code ให้ หรือถ้ามีวิธีอื่นที่ดีกว่าขอ code ตัวอย่าง โดยไม่ใช้ On Error GoTo ก็ได้ครับ
Re: On Error GoTo Error
Posted: Wed Dec 17, 2014 11:17 am
by snasui

แนบไฟล์ตัวอย่างพร้อม Code พร้อมไฟล์ต้นทางที่จะใช้ในการทดสอบ จะได้ช่วยดูได้ครับ
Re: On Error GoTo Error
Posted: Thu Dec 18, 2014 9:21 am
by Totem
snasui wrote:
แนบไฟล์ตัวอย่างพร้อม Code พร้อมไฟล์ต้นทางที่จะใช้ในการทดสอบ จะได้ช่วยดูได้ครับ

ตัวอย่าง code
Code: Select all
Sub OnErrorGoTO()
Dim Book_report As String
Book_report = "report.xlsm"
Book_1 = "1.xls"
Book_2 = "2.xls"
Book_3 = "3.xls"
Sheet_report = "report"
Sheet_A = "A"
Sheet_B = "B"
Sheet_C = "C"
With Workbooks(Book_report).Sheets(Sheet_report).Select
On Error GoTo ErrorHandler
Workbooks(Book_1).Sheets(Sheet_A).Range("A1").CurrentRegion.Offset(0, 0). _
SpecialCells(xlCellTypeVisible).Copy
Range("A1").PasteSpecial xlPasteValuesAndNumberFormats
Application.CutCopyMode = False
Resume Next
ErrorHandler:
On Error GoTo 0
On Error GoTo ErrorHandler
Workbooks(Book_2).Sheets(Sheet_B).Range("A1").CurrentRegion.Offset(0, 0). _
SpecialCells(xlCellTypeVisible).Copy
Range("G1").PasteSpecial xlPasteValuesAndNumberFormats
Application.CutCopyMode = False
Resume Next
ErrorHandler:
On Error GoTo 0
On Error GoTo ErrorHandler
Workbooks(Book_3).Sheets(Sheet_C).Range("A1").CurrentRegion.Offset(0, 0). _
SpecialCells(xlCellTypeVisible).Copy
Range("P1").PasteSpecial xlPasteValuesAndNumberFormats
Application.CutCopyMode = False
Resume Next
ErrorHandler:
On Error GoTo 0
End Sub
พร้อมไฟล์ต้นทางครับ
Re: On Error GoTo Error
Posted: Thu Dec 18, 2014 10:34 am
by snasui

แนบไฟล์ข้อมูลที่เกี่ยวข้องมาด้วยครับ
Re: On Error GoTo Error
Posted: Thu Dec 18, 2014 11:11 am
by Totem
snasui wrote:
แนบไฟล์ข้อมูลที่เกี่ยวข้องมาด้วยครับ

แนบไฟล์มาให้แล้วครับ
Re: On Error GoTo Error
Posted: Thu Dec 18, 2014 11:34 am
by snasui

กรณีมี ErrorHandler หลายตัวจะให้ชือซ้ำกันไม่ได้ Code ควรอยู่ใน Form ตามด้านล่างครับ
Code: Select all
Sub OnErrorGoTO()
Dim Book_report As String
Book_report = "report.xlsm"
Book_1 = "1.xls"
Book_2 = "2.xls"
Book_3 = "3.xls"
Sheet_report = "report"
Sheet_A = "A"
Sheet_B = "B"
Sheet_C = "C"
With Workbooks(Book_report).Sheets(Sheet_report).Select
On Error GoTo ErrorHandler
Workbooks(Book_1).Sheets(Sheet_A).Range("A1").CurrentRegion.Offset(0, 0). _
SpecialCells(xlCellTypeVisible).Copy
Range("A1").PasteSpecial xlPasteValuesAndNumberFormats
Application.CutCopyMode = False
Resume Next
ErrorHandler:
On Error GoTo 0
On Error GoTo ErrorHandler1
Workbooks(Book_2).Sheets(Sheet_B).Range("A1").CurrentRegion.Offset(0, 0). _
SpecialCells(xlCellTypeVisible).Copy
Range("G1").PasteSpecial xlPasteValuesAndNumberFormats
Application.CutCopyMode = False
Resume Next
ErrorHandler1:
On Error GoTo 0
On Error GoTo ErrorHandler2
Workbooks(Book_3).Sheets(Sheet_C).Range("A1").CurrentRegion.Offset(0, 0). _
SpecialCells(xlCellTypeVisible).Copy
Range("P1").PasteSpecial xlPasteValuesAndNumberFormats
Application.CutCopyMode = False
Resume Next
ErrorHandler2:
On Error GoTo 0
End With
End Sub
Re: On Error GoTo Error
Posted: Thu Dec 18, 2014 11:49 am
by Totem
snasui wrote:
กรณีมี ErrorHandler หลายตัวจะให้ชือซ้ำกันไม่ได้ Code ควรอยู่ใน Form ตามด้านล่างครับ
Code: Select all
Sub OnErrorGoTO()
Dim Book_report As String
Book_report = "report.xlsm"
Book_1 = "1.xls"
Book_2 = "2.xls"
Book_3 = "3.xls"
Sheet_report = "report"
Sheet_A = "A"
Sheet_B = "B"
Sheet_C = "C"
With Workbooks(Book_report).Sheets(Sheet_report).Select
On Error GoTo ErrorHandler
Workbooks(Book_1).Sheets(Sheet_A).Range("A1").CurrentRegion.Offset(0, 0). _
SpecialCells(xlCellTypeVisible).Copy
Range("A1").PasteSpecial xlPasteValuesAndNumberFormats
Application.CutCopyMode = False
Resume Next
ErrorHandler:
On Error GoTo 0
On Error GoTo ErrorHandler1
W orkbooks(Book_2).Sheets(Sheet_B).Range("A1").CurrentRegion.Offset(0, 0). _
SpecialCells(xlCellTypeVisible).Copy
Range("G1").PasteSpecial xlPasteValuesAndNumberFormats
Application.CutCopyMode = False
Resume Next
ErrorHandler1:
On Error GoTo 0
On Error GoTo ErrorHandler2
Workbooks(Book_3).Sheets(Sheet_C).Range("A1").CurrentRegion.Offset(0, 0). _
SpecialCells(xlCellTypeVisible).Copy
Range("P1").PasteSpecial xlPasteValuesAndNumberFormats
Application.CutCopyMode = False
Resume Next
ErrorHandler2:
On Error GoTo 0
End With
End Sub

ติดปัญหา Run-time error '9': Subscript out of range ตั้งแต่บรรทัดนี้ครับ
Code: Select all
W orkbooks(Book_2).Sheets(Sheet_B).Range("A1").CurrentRegion.Offset(0, 0). _
SpecialCells(xlCellTypeVisible).Copy
โดยที่ผมไม่เปิดไฟล์ "1.xls", "2.xls" แต่ เปิดไฟล์ "3.xls" ครับ
Re: On Error GoTo Error
Posted: Thu Dec 18, 2014 2:13 pm
by niwat2811
ลองแบบนี้ดูว่าใช้ได้ตามต้องการไหมครับ
Code: Select all
Sub test()
Dim wbk As Workbook
Dim Book_report As String
Application.ScreenUpdating = False
Book_report = "report.xlsm"
Book_1 = "1.xls"
Book_2 = "2.xls"
Book_3 = "3.xls"
Sheet_report = "report"
Sheet_A = "A"
Sheet_B = "B"
Sheet_C = "C"
For Each wbk In Workbooks
If wbk.Name = "1.xls" Then
wbk.Activate
Sheets(Sheet_A).Range("A1").CurrentRegion.Offset(0, 0). _
SpecialCells(xlCellTypeVisible).Copy
Workbooks(Book_report).Sheets(Sheet_report).Range("A1").PasteSpecial xlPasteValuesAndNumberFormats
Application.CutCopyMode = False
End If
If wbk.Name = "2.xls" Then
wbk.Activate
Sheets(Sheet_B).Range("A1").CurrentRegion.Offset(0, 0). _
SpecialCells(xlCellTypeVisible).Copy
Workbooks(Book_report).Sheets(Sheet_report).Range("G1").PasteSpecial xlPasteValuesAndNumberFormats
Application.CutCopyMode = False
End If
If wbk.Name = "3.xls" Then
wbk.Activate
Sheets(Sheet_C).Range("A1").CurrentRegion.Offset(0, 0). _
SpecialCells(xlCellTypeVisible).Copy
Workbooks(Book_report).Sheets(Sheet_report).Range("P1").PasteSpecial xlPasteValuesAndNumberFormats
Application.CutCopyMode = False
End If
Next
Workbooks(Book_report).Activate
Application.ScreenUpdating = True
End Sub
Re: On Error GoTo Error
Posted: Fri Dec 19, 2014 9:49 am
by Totem
niwat2811 wrote:ลองแบบนี้ดูว่าใช้ได้ตามต้องการไหมครับ
Code: Select all
Sub test()
Dim wbk As Workbook
Dim Book_report As String
Application.ScreenUpdating = False
Book_report = "report.xlsm"
Book_1 = "1.xls"
Book_2 = "2.xls"
Book_3 = "3.xls"
Sheet_report = "report"
Sheet_A = "A"
Sheet_B = "B"
Sheet_C = "C"
For Each wbk In Workbooks
If wbk.Name = "1.xls" Then
wbk.Activate
Sheets(Sheet_A).Range("A1").CurrentRegion.Offset(0, 0). _
SpecialCells(xlCellTypeVisible).Copy
Workbooks(Book_report).Sheets(Sheet_report).Range("A1").PasteSpecial xlPasteValuesAndNumberFormats
Application.CutCopyMode = False
End If
If wbk.Name = "2.xls" Then
wbk.Activate
Sheets(Sheet_B).Range("A1").CurrentRegion.Offset(0, 0). _
SpecialCells(xlCellTypeVisible).Copy
Workbooks(Book_report).Sheets(Sheet_report).Range("G1").PasteSpecial xlPasteValuesAndNumberFormats
Application.CutCopyMode = False
End If
If wbk.Name = "3.xls" Then
wbk.Activate
Sheets(Sheet_C).Range("A1").CurrentRegion.Offset(0, 0). _
SpecialCells(xlCellTypeVisible).Copy
Workbooks(Book_report).Sheets(Sheet_report).Range("P1").PasteSpecial xlPasteValuesAndNumberFormats
Application.CutCopyMode = False
End If
Next
Workbooks(Book_report).Activate
Application.ScreenUpdating = True
End Sub

code ที่ให้มา นำไปปฏิบัติจริงใช้ได้ดีตามจุดประสงค์ ไม่มีสะดุด

ขอขอบคุณ niwat2811 และ อาจารย์ มา ณ ที่นี้