Sửa lỗi Runtime error "6" Over flow

Liên hệ QC

vanle33

Thành viên gạo cội
Tham gia
30/10/08
Bài viết
5,866
Được thích
3,953
Giới tính
Nam
Tôi có file Nhật ký này nhưng khi nhấn Cap Nhat thì bị lỗi Runtime error "6" Over Flow. Mong các thành viên trợ giúp sửa lỗi trên cho tôi.

Do tôi không phải chủ nhân của file này nên không có pass VBA mà phải dùng Remove VBA ... của bác siwtom.
 

File đính kèm

  • Nhat ky.xls
    195 KB · Đọc: 43
Lần chỉnh sửa cuối:
Code trên quá sức rườm rà, mà chả có 1 lời chú cho nên không thể đọc nổi.

Chỉ có thể mách cho bạn 2 điểm trầm tọng của code:

1. vòng lặp ngoài duyệt theo trị double (ITg) nhưng bên trong vòng lặp có con số đếm dùng trị integer (g). Vì vậy chuyện overflow rất dễ xảy ra

2. vòng lặp trong dựa vào giá trị ở một ô để kết thúc. Mà giá trị ấy lại là text. Sẽ có nhiều trường hợp lỗi, điểm hình là lôi bạn đã gặp.
text chỉ cần hơi trệch 1 chút (có dư 1 dấu cách chẳng hạn) là vòng lặp chạy mút chỉ. May mắn là bên trong vòng lặp có con số đếm i là integer, nó bị bể ổ (overflow) sau khi bạn chạy trên 16000 dòng. Bình thường, người ta dùng một từ gì rất khó nhầm, chẳng hạn "STOP", hoặc "END", và nhớ là phải trim, và ucase nó trước khi so sánh.
 
Upvote 0
Code trên quá sức rườm rà, mà chả có 1 lời chú cho nên không thể đọc nổi.

Chỉ có thể mách cho bạn 2 điểm trầm tọng của code:

1. vòng lặp ngoài duyệt theo trị double (ITg) nhưng bên trong vòng lặp có con số đếm dùng trị integer (g). Vì vậy chuyện overflow rất dễ xảy ra

2. vòng lặp trong dựa vào giá trị ở một ô để kết thúc. Mà giá trị ấy lại là text. Sẽ có nhiều trường hợp lỗi, điểm hình là lôi bạn đã gặp.
text chỉ cần hơi trệch 1 chút (có dư 1 dấu cách chẳng hạn) là vòng lặp chạy mút chỉ. May mắn là bên trong vòng lặp có con số đếm i là integer, nó bị bể ổ (overflow) sau khi bạn chạy trên 16000 dòng. Bình thường, người ta dùng một từ gì rất khó nhầm, chẳng hạn "STOP", hoặc "END", và nhớ là phải trim, và ucase nó trước khi so sánh.
Phải chăng nên thay integer thành long rồi On error resume next và On error go to 0 dò từng đoạn hả bạn VetMini
 
Upvote 0
Phải chăng nên thay integer thành long rồi On error resume next và On error go to 0 dò từng đoạn hả bạn VetMini
Trường hợp này là vòng lặp vô tận do không thỏa điều kiện thoát chứ không phải lỗi. Bẫy lỗi cũng vô dụng.
Khi dùng vòng lặp Do... Loop hoặc While... Wend cần xét điều kiện thoát vòng lặp cho thật chặt chẽ.
 
Upvote 0
Tôi chỉ có thể nêu ra một vài điểm trầm trọng thôi.

Code này viết không có 1 lời chú thích. Làm sao tôi biết được những chỗ sai là do code sai (không đúng với thuật toán) hay thuật toán sai (code đúng thuật toán, nhưng chính thuật toán không đạt yêu cầu) mà sửa?
 
Upvote 0
Code trên quá sức rườm rà, mà chả có 1 lời chú cho nên không thể đọc nổi.

Chỉ có thể mách cho bạn 2 điểm trầm tọng của code:

1. vòng lặp ngoài duyệt theo trị double (ITg) nhưng bên trong vòng lặp có con số đếm dùng trị integer (g). Vì vậy chuyện overflow rất dễ xảy ra

2. vòng lặp trong dựa vào giá trị ở một ô để kết thúc. Mà giá trị ấy lại là text. Sẽ có nhiều trường hợp lỗi, điểm hình là lôi bạn đã gặp.
text chỉ cần hơi trệch 1 chút (có dư 1 dấu cách chẳng hạn) là vòng lặp chạy mút chỉ. May mắn là bên trong vòng lặp có con số đếm i là integer, nó bị bể ổ (overflow) sau khi bạn chạy trên 16000 dòng. Bình thường, người ta dùng một từ gì rất khó nhầm, chẳng hạn "STOP", hoặc "END", và nhớ là phải trim, và ucase nó trước khi so sánh.
Về code là em mù tịt chuyện sửa chữa.
Bác giúp em chỉnh code để tối ưu tốc độ nhanh nhất, không bị lỗi Over flow với a.
Và bác giải quyết cho em vấn đề em hỏi ở #6 và #20 với a.
 
Upvote 0
Về code là em mù tịt chuyện sửa chữa.
Bác giúp em chỉnh code để tối ưu tốc độ nhanh nhất, không bị lỗi Over flow với a.
Và bác giải quyết cho em vấn đề em hỏi ở #6 và #20 với a.

Bạn cứ sửa theo 2 điểm đó là cải thiện một phần lớn , cứ làm vậy.
 
Upvote 0
Bạn cứ sửa theo 2 điểm đó là cải thiện một phần lớn , cứ làm vậy.
Có thật là sửa những chỗ đó sẽ cải thiện được tốc độ không? Tôi thì tôi nghĩ những chỗ đó chả liên quan gì đến tốc độ cả.Theo tôi, muốn cải thiện tốc độ thì:1. Không đọc và ghi dữ liệu trực tiếp trên từng ô mà lấy tất cả dữ liệu vào mảng, xử lý trên mảng và ghi dữ liệu xuống sheet 1 lần.2. Thay đổi thuật toán. Thuật toán hiện tại dùng 2 vòng lặp, vòng 1 duyệt qua các ngày, vòng 2 trong vòng 1 duyệt qua tất cả các dòng của dữ liệu. Hơi phí.Lý thuyết là thế nhưng nếu cảm thấy code hiện tại không quá chậm thì cũng không nên đau đầu làm gì.
 
Upvote 0
Về code là em mù tịt chuyện sửa chữa.
Bác giúp em chỉnh code để tối ưu tốc độ nhanh nhất, không bị lỗi Over flow với a.
Và bác giải quyết cho em vấn đề em hỏi ở #6 và #20 với a.

Đỏ:
Bạn hỏi trật người rồi. Tốc độ không phải là mục đích viết code của tôi. Trong mục này, có lẽ tôi đứng khoảng thứ 100 ở đây.

Xanh:
Tôi có nói rồi. Tôi lười làm việc theo kiểu đoán mò lắm. Code khong có chú thích giải thuật thì tôi chịu thua.
 
Upvote 0
Về code là em mù tịt chuyện sửa chữa.
Bác giúp em chỉnh code để tối ưu tốc độ nhanh nhất, không bị lỗi Over flow với a.
Và bác giải quyết cho em vấn đề em hỏi ở #6 và #20 với a.
lỗi Over flow là do chỗ
<> "Ket thuc"
bác sửa chỗ đó lại thành
= "K" & ChrW(7871) & "t th" & ChrW(250) & "c"
chỗ này
Sheet4.Cells(k, 4).Value = "Mua Công truong nghi"
liệu có cần như thế không
nếu cần thì tui viết lại cái khác cho (sẽ giúp hết khả năng)
code trên của ai thì bác liên hệ với người đó lại nha. code đó chạy hoàn toàn sai sau khi tui sửa chỗ kết thúc đó lại để thoát vòng lặp
 
Upvote 0
lỗi Over flow là do chỗ
<> "Ket thuc"
bác sửa chỗ đó lại thành
= "K" & ChrW(7871) & "t th" & ChrW(250) & "c"
chỗ này
Sheet4.Cells(k, 4).Value = "Mua Công truong nghi"
liệu có cần như thế không
nếu cần thì tui viết lại cái khác cho (sẽ giúp hết khả năng)
code trên của ai thì bác liên hệ với người đó lại nha. code đó chạy hoàn toàn sai sau khi tui sửa chỗ kết thúc đó lại để thoát vòng lặp
Vấn đề này hôm qua đã nói tới rồi mà. Thế bạn thử viết lại xem.
 
Upvote 0
Đỏ:
Bạn hỏi trật người rồi. Tốc độ không phải là mục đích viết code của tôi. Trong mục này, có lẽ tôi đứng khoảng thứ 100 ở đây.

Xanh:
Tôi có nói rồi. Tôi lười làm việc theo kiểu đoán mò lắm. Code khong có chú thích giải thuật thì tôi chịu thua.
Nếu em hiểu không nhầm thì em xin giải thích cách làm thôi, chứ code thì làm biếng xem lắm, nhìn chạy hoài phát ngán
tại sheet 05-TTDV sẽ lấy thời gian bắt đầu với kết thúc ra để xét
tại sheet 01-Danh muc
tại cột F nếu ngày lớn hơn bắt đầu thì điền thông tin đó qua 04-Nhat ky
tại cột G nếu nhỏ hơn hoặc bằng ngày kết thúc thì quất qua 04- Nhat ky tiếp
 
Upvote 0
Code này có một số biến toàn cục module

Đây là code trong sheet Nhatky
Dim TGmin As Double
Dim TGmax As Double
Dim Itg As Double


Public Sub HamDuyet()
Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim h As Integer
Dim g As Integer

Cái phần màu xanh là biến toàn cục. Ít nhất là toàn cục trong local module.

Biến toàn cục được sử dụng khi:
1. có nhiều sub, functions trong cùng module cùng sử dụng trị của biến
2. sub được chạy nhiều lần, và mỗi lần thì dùng kết quả của lần chạy trước.
3. lý do khác

Trước khi biết được lý do, mọi nổ lực sửa code chỉ là làm mò, không khoa học.
 
Upvote 0
1) lỗi Over flow là do chỗ
<> "Ket thuc"
bác sửa chỗ đó lại thành
= "K" & ChrW(7871) & "t th" & ChrW(250) & "c"

2) chỗ này
Sheet4.Cells(k, 4).Value = "Mua Công truong nghi"
liệu có cần như thế không
nếu cần thì tui viết lại cái khác cho (sẽ giúp hết khả năng)
code trên của ai thì bác liên hệ với người đó lại nha. code đó chạy hoàn toàn sai sau khi tui sửa chỗ kết thúc đó lại để thoát vòng lặp
Mong bạn viết lại code cho tôi.
1) Tôi đã nói ở #6
2) Tôi cũng không hiểu tại sao là khi công trường không thi công gì lại xuất kết quả ra là "Mua Công truong nghi" --=0 cho dù bên sheet Danh muc không có ngày nào là Mưa.
 
Upvote 0
Mình đã dịch macro đó sang VBA của mình như sau:

PHP:
Option Explicit
Dim TGmin As Double, TGmax As Double, Itg As Double
Public Sub HamDuyet()
 Dim I As Integer, J As Integer, K As Integer, H As Integer, G As Integer
 
 Sheet4.Range("A15:A400").Resize(, 4).Value = ""
3 TGmin = Sheet5.Cells(5, 6).Value
 TGmax = Sheet5.Cells(6, 6).Value
5 Itg = TGmin
 K = 14:                                    G = 1
7 Do While Itg <= TGmax
    I = 15
9    Sheet4.Cells(K, 1).Value = G
    Sheet4.Cells(K, 2).Value = Itg
11    Sheet4.Cells(K, 4).Value = "Mua Công truong nghi"
    J = 0:                                  H = 0
13    Do While Sheet1.Cells(I, 1).Text <> "ket thuc"
' Phan nghiem thu'
        If Sheet1.Cells(I, 11).Value = Itg Then
15            Sheet4.Cells(K + J, 3).Value = Sheet1.Cells(I, 2).Value
            Sheet4.Cells(K + J, 4).Value = "Nghiêm thu " & Sheet1.Cells(I, 3).Value '<=|'
17            J = J + 1:                      H = 1
        End If
'Phan thi cong'
19        If (Sheet1.Cells(I, 6).Value <= Itg) And (Sheet1.Cells(I, 7).Value >= Itg) Then
            Sheet4.Cells(K + J, 3).Value = Sheet1.Cells(I, 2).Value
21            Sheet4.Cells(K + J, 4).Value = "Thi công " + Sheet1.Cells(I, 3).Value
            J = J + 1:                        H = 1
23        End If
        I = I + 1
25    Loop
    If H = 1 Then J = J - 1
27    Itg = Itg + 1
    K = K + J + 1:                            G = G + 1
29 Loop
End Sub

Thứ nhất:
Tên biến Không nên là 'TGMin' hay 'TGMax' để chỉ ngày/tháng/năm
Mà nên là 'fDat', 'lDat' hay Ngày1 & Ngày2
Để khỏi chuôi vô vòng lặp vô tận, trước dòng lệnh đánh số 5 ta cần thêm câu lệnh để khẳng định fDat <= lDat
(Nếu không đạt điều kiện này,ta fải xài động tác hoán đổi giữa chúng với nhau); Chuyện này đề fòng những kẻ say xỉn vận hành chương trình nhập ngày theo hệ Mĩ thay vì hệ Fáp hoặc ngược lại

Thoát vòng lặp trong, ta nên xài điều kiện khác, chứ xài như trong chương trình của bạn bấp bênh lắm.

Tựu chung là cần biến cái của người khác thành cái của mình, loại trừ thói đỏng đãnh của tác giả & đưa thói đổng đãnh của mình vào!
 
Upvote 0
Mong bạn viết lại code cho tôi.
1) Tôi đã nói ở #6
2) Tôi cũng không hiểu tại sao là khi công trường không thi công gì lại xuất kết quả ra là "Mua Công truong nghi" --=0 cho dù bên sheet Danh muc không có ngày nào là Mưa.
tạm thời bạn dùng cái này xem sao nha
còn 1 vấn đề Mưa! nghỉ này kia thì sao?
Ngày nào không có công việc thì cho mưa hả bạn
------------------
code này chạy sai 1 chỗ là ngày nó không liên tục nha (đó là ở những ngày không có công việc ấy- nó sẽ bỏ qua ngày đó không điền vào)
Mã:
Sub NhatKy()
Application.ScreenUpdating = False
BatDau = Sheet5.Range("F5").Value
KetThuc = Sheet5.Range("F6").Value
c = Sheet1.UsedRange.Rows.Count
j = 14
k = 1
'xoa du lieu
Sheet4.Range("A14:E100").Value = ""
'vong lap ket thuc khi ngay bat dau > ngay ket thuc
Do While BatDau <= KetThuc


For i = 18 To c


BDauau = Sheet1.Cells(i, 6).Value
KThuc = Sheet1.Cells(i, 7).Value


'kiem tra xem cong viec co namg trong khoang thoi gian xxxx khong
If BDauau <= BatDau And KThuc >= BatDau Then





'kiem tra ngay de dien vao
    If KTraNgay <> BatDau Then
        KTraNgay = BatDau
        DienNgay = BatDau
    Else
        DienNgay = ""
    End If
'kiem tra va dien hang muc
    HMucNguon = Sheet1.Cells(i, 2).Value
    If KTraHMuc <> HMucNguon Then
        KTraHMuc = HMucNguon
        DienHangMuc = HMucNguon
    Else
        DienHangMuc = ""
    End If
'kien tra va dien STT
    If DienNgay <> "" Then
    Sheet4.Cells(j, 1) = k
    k = k + 1
    End If



'dien vao sheet Nhat ky
Sheet4.Cells(j, 2) = DienNgay
Sheet4.Cells(j, 3).Value = DienHangMuc 'hang muc
Sheet4.Cells(j, 4).Value = Sheet1.Cells(i, 3).Value 'noi dung cong vc
j = j + 1
End If


Next i
    BatDau = BatDau + 1
Loop
Application.ScreenUpdating = True
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
tạm thời bạn dùng cái này xem sao nha
còn 1 vấn đề Mưa! nghỉ này kia thì sao?
Ngày nào không có công việc thì cho mưa hả bạn
------------------
code này chạy sai 1 chỗ là ngày nó không liên tục nha (đó là ở những ngày không có công việc ấy- nó sẽ bỏ qua ngày đó không điền vào)
Mã:
Sub NhatKy()
Application.ScreenUpdating = False
BatDau = Sheet5.Range("F5").Value
KetThuc = Sheet5.Range("F6").Value
c = Sheet1.UsedRange.Rows.Count
j = 14
k = 1
'xoa du lieu
Sheet4.Range("A14:E100").Value = ""
'vong lap ket thuc khi ngay bat dau > ngay ket thuc
Do While BatDau <= KetThuc


For i = 18 To c


BDauau = Sheet1.Cells(i, 6).Value
KThuc = Sheet1.Cells(i, 7).Value


'kiem tra xem cong viec co namg trong khoang thoi gian xxxx khong
If BDauau <= BatDau And KThuc >= BatDau Then




'kien tra va dien STT
    If DienNgay <> "" Then
    Sheet4.Cells(j, 1) = k
    k = k + 1
    End If
'kiem tra ngay de dien vao
    If KTraNgay <> BatDau Then
        KTraNgay = BatDau
        DienNgay = BatDau
    Else
        DienNgay = ""
    End If
'kiem tra va dien hang muc
    HMucNguon = Sheet1.Cells(i, 2).Value
    If KTraHMuc <> HMucNguon Then
        KTraHMuc = HMucNguon
        DienHangMuc = HMucNguon
    Else
        DienHangMuc = ""
    End If




'dien vao sheet Nhat ky
Sheet4.Cells(j, 2) = DienNgay
Sheet4.Cells(j, 3).Value = DienHangMuc 'hang muc
Sheet4.Cells(j, 4).Value = Sheet1.Cells(i, 3).Value 'noi dung cong vc
j = j + 1
End If


Next i
    BatDau = BatDau + 1
Loop
Application.ScreenUpdating = True
End Sub
Khi viết lại bạn vẫn đi theo lối mòn của code cũ.
Chỗ này
PHP:
Do While BatDau <= KetThuc
   ...
   BatDau = BatDau + 1
Loop
Phải nên viết như thế này:
PHP:
For i = BatDau To KetThuc
  ...
Next
 
Upvote 0
khi viết lại bạn vẫn đi theo lối mòn của code cũ.
Chỗ này
PHP:
do while batdau <= ketthuc
   ...
   Batdau = batdau + 1
loop
phải nên viết như thế này:
PHP:
for i = batdau to ketthuc
  ...
Next
đường nào cũng về la mã mà bác. Không bị lỗi vòng lặp
 
Upvote 0
Web KT
Back
Top Bottom