Page 1 of 1

On Error GoTo Error

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

:D ได้ใช้ 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
:D เกิด 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
:D ถ้าไม่เห็นไฟล์แนบก็จะตอบยากครับ

ส่วนคำสั่ง On Error GoTo Error จะทำงานเมื่อเกิด Error เท่านั้น

Re: On Error GoTo Error

Posted: Tue Dec 16, 2014 1:57 pm
by Totem
bank9597 wrote::D ถ้าไม่เห็นไฟล์แนบก็จะตอบยากครับ

ส่วนคำสั่ง 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
:D ช่วยเล่าว่าต้องการจะทำอะไรและปัญหาคืออะไรมาอีกรอบ จะได้เข้าใจในสิ่งที่ต้องการจะทำ จากที่เขียนมายังไม่กระจ่างครับ

การดัก Error จะดักได้ก็ต่อเมื่อเกิด Error หากไม่ Error แต่่เรามีทางเลือกในการทำงาน สามารถใช้ Select Case หรือ If เข้ามาช่วยได้

คำว่าไปเปิด เป็นการกระทำลักษณะใดครับ ในกรณีการเปิดไฟล์ ให้ตรวจสอบแค่เพียงชื่อไฟล์ก็เพียงพอ ไม่จำเป็นต้องตรวจสอบไปถึงตำแหน่งเซลล์แต่อย่างใดครับ

Re: On Error GoTo Error

Posted: Wed Dec 17, 2014 11:06 am
by Totem
snasui wrote::D ช่วยเล่าว่าต้องการจะทำอะไรและปัญหาคืออะไรมาอีกรอบ จะได้เข้าใจในสิ่งที่ต้องการจะทำ จากที่เขียนมายังไม่กระจ่างครับ

การดัก Error จะดักได้ก็ต่อเมื่อเกิด Error หากไม่ Error แต่่เรามีทางเลือกในการทำงาน สามารถใช้ Select Case หรือ If เข้ามาช่วยได้

คำว่าไปเปิด เป็นการกระทำลักษณะใดครับ ในกรณีการเปิดไฟล์ ให้ตรวจสอบแค่เพียงชื่อไฟล์ก็เพียงพอ ไม่จำเป็นต้องตรวจสอบไปถึงตำแหน่งเซลล์แต่อย่างใดครับ
:D มีเอกสารรายงาน 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
:D แนบไฟล์ตัวอย่างพร้อม Code พร้อมไฟล์ต้นทางที่จะใช้ในการทดสอบ จะได้ช่วยดูได้ครับ

Re: On Error GoTo Error

Posted: Thu Dec 18, 2014 9:21 am
by Totem
snasui wrote::D แนบไฟล์ตัวอย่างพร้อม Code พร้อมไฟล์ต้นทางที่จะใช้ในการทดสอบ จะได้ช่วยดูได้ครับ
:D ตัวอย่าง 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
:D แนบไฟล์ข้อมูลที่เกี่ยวข้องมาด้วยครับ

Re: On Error GoTo Error

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

Re: On Error GoTo Error

Posted: Thu Dec 18, 2014 11:34 am
by snasui
:D กรณีมี 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::D กรณีมี 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
:D ติดปัญหา 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
:D code ที่ให้มา นำไปปฏิบัติจริงใช้ได้ดีตามจุดประสงค์ ไม่มีสะดุด :thup: ขอขอบคุณ niwat2811 และ อาจารย์ มา ณ ที่นี้