Page 1 of 1

Run-time error '6' Overflow ใน VBA

Posted: Fri Jan 18, 2019 2:55 pm
by yopkub
สวัสดีครับ พอผมมีคำุถามเกี่ยวกับ Over flow error ครับ
คือ ผมเขียนโปรแกรม vba ให้เข้าไปดึงไฟล์ใน Path ที่ตั้งไว้ และ นำไฟล์ใน Path นั้นทั้งหมดมาเพิ่มข้อความที่กำหนด
จากนั้น ก็ให้ output ออกไปยัง path ที่กำหนดครับ

ถ้าผมใช้กับไฟล์ที่ขนาดไม่ใหญ่ มีไม่กี่ร้อยบรรทัด สัก 7-8 file จะไม่มีปัญหาครับ

แต่ปัญหาคือ ถ้าไฟล์ที่ผมไปวางใน Path Input มันมีขนาดใหญ่ (หลายบรรทัด)และหลายไฟล์จะเกิดปัญหา Over flow ครับ

ลอง Search ดูคือ Overflow error จะเกิดก็ต่อเมื่อ ค่าที่มันส่่งกลับมามีขนาดใหญ่กว่าตัวแปรที่กำหนด เช่น Integer ห้ามตัวเลขเกิน 32xxx อะไรประมาณนี้

แต่ที่ผมสงสัยคือ ผมไม่รู้ว่าไฟล์ vba program ที่ผมเขียนมัน Return กลับมาเป็นอะไรแล้วมันเกินได้ไงครับ

Code ตามข้างล่างครับ

Code: Select all

Sub Collect_data_from_NC_code()

    Dim myFile As String
    Dim text As String
    Dim buf As String
    Dim textline() As String
    Const TxtIn1 = "(K:"
    Const TxtIn2 = "(B:"
    Const TxtIn3 = "(S:"
    Const TxtFin = "(ORIGIN 2 NOT USE)"
    Const TxtFin2 = "(END OF FOOTER)"
    Const TxtOut0 = "POPEN;"
    Const TxtOut1 = "DPRNT[SR01*"
    Const TxtOut2 = "DPRNT[SR02*"
    Const TxtOut3 = "DPRNT[SR03*"

    
    Dim K As String
    Dim B As String
    Dim S As String
    Dim i As Integer
    Dim TxtSR01 As String
    Dim TxtSR02 As String
    Dim TxtSR03 As String
    
    
    
    Dim X As Integer



    For X = 9 To 38
    
    'Open file
    strFile_Path_In = Cells(X, 1)
    strFile_Path_Out = Cells(X, 11)
    
    'MsgBox (X)
    'MsgBox (Cells(X, 2))
    
    'strFile_Path_In = "D:\Mr.Jirawat\04_OA-support\02-MC\03_Other\Conprosys\Macro\Macro making\file1"
    'strFile_Path_Out = "D:\Mr.Jirawat\04_OA-support\02-MC\03_Other\Conprosys\Macro\Macro making\fileout2"
    
    'textline = Split(buf, vbLf)
    
    
    Open strFile_Path_In For Input As #1
        L = 1
        
        Do Until EOF(1)
        
            Line Input #1, buf
        Loop
        Close #1
        
               
        textline = Split(buf, vbLf)
        
        
        For i = 0 To UBound(textline)
        
            text = text & textline(i) & vbLf
            If InStr(textline(i), TxtIn1) > 0 Then
                
                'MsgBox (textline(i))
        
                TxtSR01 = Replace(textline(i), TxtIn1, "")
                TxtSR01 = Replace(TxtSR01, " ", "")
                TxtSR01 = Replace(TxtSR01, ")", "")
            End If
            If InStr(textline(i), TxtIn2) > 0 Then
                TxtSR02 = Replace(textline(i), TxtIn2, "")
                TxtSR02 = Replace(TxtSR02, " ", "")
                TxtSR02 = Replace(TxtSR02, ")", "")
            End If
            If InStr(textline(i), TxtIn3) > 0 Then
                TxtSR03 = Replace(textline(i), TxtIn3, "")
                TxtSR03 = Replace(TxtSR03, " ", "")
                TxtSR03 = Replace(TxtSR03, ")", "")
            End If
            
            If InStr(textline(i), TxtFin) > 0 Then
                ' Found line to insert
                text = text & TxtOut0 & vbLf
                text = text & TxtOut1 & TxtSR01 & "];" & vbLf
                text = text & TxtOut2 & TxtSR02 & "];" & vbLf
                text = text & TxtOut3 & TxtSR03 & "];" & vbLf
            End If
          
            If InStr(textline(i), TxtFin2) > 0 Then
                ' Found line to insert
                text = text & TxtOut0 & vbLf
                text = text & TxtOut1 & TxtSR01 & "];" & vbLf
                text = text & TxtOut2 & TxtSR02 & "];" & vbLf
                text = text & TxtOut3 & TxtSR03 & "];" & vbLf
                
            End If
            
        'MsgBox (textline(1))
        
        Next i
        
      'MsgBox (text)
           
           
    Open strFile_Path_Out For Output As #1
    Print #1, text
    MsgBox ("Endloop")
    text = ""
    Close #1
     
     
 
        'Range("A1").Value = Mid(text, K + 3, 5)
        'Range("A2").Value = Mid(text, B + 3, 2)
        'Range("A3").Value = Mid(text, S + 3, 4)
        
    Next X
    
        
End Sub


Re: Run-time error '6' Overflow ใน VBA

Posted: Fri Jan 18, 2019 4:54 pm
by snasui
:D Overflow เกิดจากการประกาศตัวแปรในขอบเขตที่น้อยกว่าที่ใช้จริง เช่น ประกาศตัวแปรเป็น Integer แต่เวลาใช้จริงเกินขอบเขตของความเป็น Integer (-32768 ถึง 32767) ก็จะเกิด Overflow

สำหรับกรณีนี้ลองประกาศตัวแปร i เป็น Long หรือ Double ดู หากยังไม่ได้ให้แนบไฟล์ที่มีปัญหาพร้อมไฟล์ที่เกี่ยวข้องมาถามกันครับ

Re: Run-time error '6' Overflow ใน VBA

Posted: Mon Jan 21, 2019 9:29 am
by yopkub
ขอบคุณสำหรับคำแนะนำครับ

ผมทดลองเปลี่ยนตัวแปร i เป็น long หรือ Double แล้วครับ
ผลคือ ไม่เจอ Overflow error แล้วครับ แต่พอเจอไฟล์ใหญ่ (หลายบรรรทัด) มันจะประมวลผล output ให้ผมนานมากๆๆๆ
ผมทดลอง 8ไฟล์ (มีไฟล์ใหญ่ 2ไฟล์) ผมปล่อยให้เครื่องประมวล ใช้เวลาประมาณ 1ชม เลยครับ (ตอนทดลองกลั้นใจไม่กดปิดซะก่อน ผลเลยได้ออกมา Ok แต่นานมากครับ)

ผมจึงแนบไฟล์ vba ให้พี่รบกวนช่วยดูเพิ่มเติมเผื่อมีคำแนะนำไม่ให้ มันวิ่งคำนวณมากๆครับ
ส่วน ไฟล์ Input ผมจะแนบ3 ไฟล์เล็กให้ครับ (ที่คำนวณเร็วๆ) เพราะ ถ้าแนบไฟล์ใหญ่จะไม่พอพื้นที่ครับ รบกวนพี่ลอง Copy ไฟล์ข้างในเองให้มันมีหลายๆ บรรทัดมันจะใหญ่ครับ

ขอบคุณมากๆครับ
(คนใต้เหมือนกันครับ :cp: )

Re: Run-time error '6' Overflow ใน VBA

Posted: Mon Jan 21, 2019 8:16 pm
by snasui
:D เมื่อมีการ Loop หลายไฟล์และแต่ละไฟล์มีขนาดใหญ่ โปรแกรมย่อมต้องทำงานช้าอยู่แล้ว ถือว่าเป็นปกติครับ

Re: Run-time error '6' Overflow ใน VBA

Posted: Tue Jan 22, 2019 8:01 am
by yopkub
ขอบคุณครับ

เพิ่มเติมครับ พอมีแนวคิด ลดการเข้า loop ที่ต่างจากโปรแกรมผมไหมครับ เผื่อจะช่วยลดการเข้าลูปครับ

ขอบคุณครับ

Re: Run-time error '6' Overflow ใน VBA

Posted: Tue Jan 22, 2019 7:02 pm
by snasui
:D ตอบเป็นแนวทางไว้ก่อนแล้วกัน ลองทำดูว่าแตกต่างจากเดิมหรือไม่อย่างไร ติดตรงไหนค่อย ๆ ถามกันต่อครับ
  1. ปรับการ Loop เฉพาะเซลล์ที่มีค่าแทนการ Loop จากบรรทัดที่ 9 ถึง 38 ถ้ามีแค่ 3 บรรทัดก็ควรจะเป็น for x = 9 to 11 เช่นนี้เป็นต้น หลักการคือหาให้ได้ว่าบรรทัดสุดท้ายที่มีค่าคือบรรทัดใดก็ให้ Loop ไปแค่บรรทัดนั้น
  2. Code สำหรับการ Loop เข้าไปในเนื้อไฟล์สามารถทำได้หลายแบบ ที่เขียนมาก็เป็นวิธีการหนึ่งคือนำข้อมูลทั้งหมดมาใส่ตัวแปรแล้วค่อยแปลงตัวแปรนั้นเป็น Array แล้วค่อย Loop สมาชิกของ Array กับอีกแบบคือ Loop ไปทีละบรรทัดของข้อมูลแล้วนำค่าหลังจากมีการปรับเปลี่ยนให้ตรงกับที่ต้องการใส่ตัวแปร Array เมื่อ Loop ครบทุกบรรทัดค่อยนำ Array นี้ไปเขียนเป็นไฟล์ใหม่

Re: Run-time error '6' Overflow ใน VBA

Posted: Tue Jan 22, 2019 7:38 pm
by yopkub
ขอบคุณครับ จะลองๆดูครับ