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:
Đường nào cũng về la mã mà bác. Không bị lỗi vòng lặp

Nhưng bạn chớ đào dường hầm từ đây đi La mã chứ bạn!

For I = BDau To KThuc
' . . . . . '
Next I

Nếu BDau> KThuc thì ta được báo lỗi;

Còn cái kia thì chạy hoài đền khi máy tính hết năng lượng

PHP:
do while batdau <= ketthuc

    ...
   Batdau = batdau + 1
loop

Ví dụ 2 trị 6/10/2015 & 7/1/2015 thì cái tham biến nào lớn hơn vậy bạn?
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Nhưng bạn chớ đào dường hầm từ đây đi La mã chứ bạn!

For I = BDau To KThuc
' . . . . . '
Next I

Nếu BDau> KThuc thì ta được báo lỗi; ???????????????????????

Còn cái kia thì chạy hoài đền khi máy tính hết năng lượng

PHP:
do while batdau <= ketthuc

    ...
   Batdau = batdau + 1
loop

Ví dụ 2 trị 6/10/2015 & 7/1/2015 thì cái tham biến nào lớn hơn vậy bạn?

Không có báo lỗi đâu. Nếu BDau > KThuc thì điều kiện vào vòng lặp không thoả. Tức là vòng lặp sẽ không chạy lượt nào cả.

Trên tiến trình hoạt động, vòng lặp For chỉ khác While ở chỗ cái trị so sánh cuối:
Trong vòng lặp For I = BDau To KThuc; cái trị KThuc được cố định. Dẫu bên trong vòng lặp có thay đổi KThuc thì trị ấy cũng chỉ có thể dùng để tính toán chứ nó không ảnh hưởng được vòng lặp.
Trong vòng lặp Do While batdau <= ketthuc; cái trị ketthuc là trị động. Nếu bên trong vòng lặp thay đổi nó thì ảnh hưởng tới vòng lặp.

Các bạn cần biết rõ lý thuyết này khi quyết định chọn lựa giữa For và While.

Đối với các bạn cần tốc độ, có lẽ cũng cần nên biết For chạy nhanh hơn While 1 chút (chỉ chút xíu thôi)
 
Upvote 0
Upvote 0
Chắc tác giả bài đăng gặp trường hợp giống lỗi như vầy:
PHP:
Option Explicit
Sub VongLapFor()
 Dim Dat1 As Date, Dat2 As Date, J As Integer
 
 Dat1 = #9/12/2015#:            Dat2 = #7/1/2015#
 For J = Dat1 To Dat2
    If J Mod 9 = 1 Then MsgBox Dat1 + J
 Next J
End Sub
 
Upvote 0
có mỗi cái vòng lặp mà cũng bị nói XỐI XẢ
giúp người cũng bị nói. (em ngu thì em dùng cách ngu) -0-/.
cáo biệt bác topic này của bác vanle33 nhe. tình hình là không đủ khả năng giúp bác rồi.
------------------------------
và chắc chắn rằng không lỗi được khi mà Bắt đầu luôn nhỏ hơn kết thúc.
tại sheet5 đã có công thức lấy 2 giá trị đó luôn rồi.
cho dù có định dạng ngày tháng năm hay tháng ngày năm cũng có sao
 
Lần chỉnh sửa cuối:
Upvote 0
có mỗi cái vòng lặp mà cũng bị nói XỐI XẢ
giúp người cũng bị nói. (em ngu thì em dùng cách ngu) -0-/.
cáo biệt bác topic này của bác vanle33 nhe. tình hình là không đủ khả năng giúp bác rồi.
Bạn đủ khả năng giúp mà. Tôi vẫn theo dõi cho dù không hiểu code. --=0
 
Upvote 0
Em copy toàn bộ code bài #37 thay cho code đang có trong file rồi nhấn Alt+Q
Thay đổi lại dữ liệu rồi nhấn Cap Nhat mà không thấy động tĩnh gì bác a.
Code bài đó chỉ là viết dễ nhìn (theo í mình quen) thôi;

Mình nghỉ là bạn đang vướng chổ thoát 1 trong 2 vòng lặp (hoặc tệ hơn là cả 2)

Với vòng lặp ngoài cần thử trước với các bước làm sau:

(*) Trước khi bước vô vòng lặp cần thêm câu lệnh khẳng đình Ngay1<= Ngay2 Nêu không thì fải có biến trung gian để đổi chúng lại, đảm bảo Ngay1 luôn < hay = Ngay2

Tiếp theo, với dữ liệu ngày-tháng trong vòng lặp thì mình hay viết vầy

Do
Ngay1= Ngay1 + 1
If Ngay1 > Ngay2 Then Exit Do

Loop

Chân fương & dễ hiểu hơn ba cái thứ Wend/While kia

Thứ nữa, đã có người nhắc bạn là tạm thời vô hiệu hóa dòng
On Error Resume Next
đi để còn biết bạn đang gặp lỗi gì;
Một khi ta làm chủ được lỗi gây ra ta mới xử lí nó hay viết/xài dòng lệnh này.

Thường mình xài cách bẫy lỗi sau

On Error Goto GPE

'. . . . . . . . .

Thoat: Exit Sub
GPE:
If Err <> 6 then
Resume Next
else
Goto Thoat
end if
End Sub
 
Upvote 0
Tôi có nhắc nhở là chỉ nên dùng vòng lặp while nếu giới hạn vòng lặp là biến động (KThuc có khả năng thay đổi bên trong vòng lặp). Nếu nó cố định thì For tốt hơn.

Còn một việc nữa là các bạn nên cẩn thận khi dùng biến Double để làm điều kiện:
Nên nhớ Double là trị không chính xác 100%. Điển hình là trường hợp này, nếu bạn dùng nó để đếm khoảng ngày thì phải coi chừng bị mất ngày đầu hoặc ngày cuối.

Vid dụ: Ngay1 là "01/11/2015 10:30am" và Ngay2 là "10/11/2015 9:30am"
Bạn dùng 1 biến Ngay để đếm. Sau 9 vòng, Ngay sẽ là "10/11/2015 10:30am", lớn hơn Ngay2.
Kết quả là vòng lặp bỏ sót ngày cuối cùng.

Vì vậy, khi dùng Double để tính điều kiện, bạn phải suy nghĩ cho kỹ về điều kiện chặn trên/chặn dưới của dữ liệu. Điển hình trường hợp trên, nếu bạn muốn gồm cả ngày cuối thì phải dùng Round trước khi so sánh (lưu ý: Round của VBA là dạng của Access, không bảo đảm giống Round của Excel. Nếu muón Round của Excel thì dùng Application.Round)
 
Upvote 0
tôi xem Chủ đề này riết rồi cũng chả hiểu là các code ở trên đã thỏa mãn chưa ?
cứ viết đại 1 đoạn ở đây
Mã:
Public Sub helloHamDuyet()
Dim r As Long, k As Long, dArr(1 To 65000, 1 To 4), arr
Dim startDate As Date, endDate As Date, ub As Long, h As Boolean
arr = Sheet1.Range("A17:K" & Sheet1.[A65000].End(xlUp).Row).Value
ub = UBound(arr)
startDate = Sheet5.[F5].Value
endDate = Sheet5.[F6].Value
With Sheet4
    .Range("A14:D" & .UsedRange.SpecialCells(xlCellTypeLastCell).Row).ClearContents
    k = 1
    Do While WorksheetFunction.RoundDown(startDate, 0) <= _
             WorksheetFunction.RoundDown(endDate, 0)
        r = 1: h = False
        dArr(k, 1) = k
        dArr(k, 2) = startDate
        dArr(k, 4) = "Mua Công truong nghi"
        Do While arr(r, 1) <> arr(ub, 1)
            If arr(r, 11) = startDate Then
                dArr(k, 1) = k
                dArr(k, 2) = startDate
                dArr(k, 3) = arr(r, 2)
                dArr(k, 4) = "Nghiêm thu " & arr(r, 3)
                k = k + 1: h = True
            End If
            If arr(r, 6) <= startDate And arr(r, 7) >= startDate Then
                dArr(k, 1) = k
                dArr(k, 2) = startDate
                dArr(k, 3) = arr(r, 2)
                dArr(k, 4) = "Thi công " & arr(r, 3)
                k = k + 1: h = True
            End If
            r = r + 1
        Loop
        startDate = startDate + 1
        If Not h Then k = k + 1
    Loop
    .Range("A14:D14").Resize(k).Value = dArr
End With
End Sub
 
Upvote 0
PHP:
startDate = Sheet5.[F5].Value
endDate = Sheet5.[F6].Value
With Sheet4
    .Range("A14:D" & .UsedRange.SpecialCells(xlCellTypeLastCell).Row).ClearContents
    k = 1
    Do While WorksheetFunction.RoundDown(startDate, 0) <= _
             WorksheetFunction.RoundDown(endDate, 0)
 ' . . . . . . . . . '

 Loop

Lỡ người dùng nhập vô StartDate > EndDate thì sao đây bạn thân mến?
Chuyện này rất dễ diễn ra do nhập các loại ngày < 13 của các tháng < 10

Có người dùng tưởng hệ Mẽo nên nhập 1/9/2015 thay vì 9/1/2015 (!)
Lúc này fải khai thêm 1 biến

Dim tDat As Date
If fDate > lDate Then
tDat = fDate: fDate= lDate
lDate = tDat
End If

Chỉ sau đó mới nhãy vô vòng lặp được.
Còn chuyện chạy ra kết quả sai hay đúng thì là chuyện tiếp tục xử khác hay không.
 
Upvote 0
PHP:
startDate = Sheet5.[F5].Value
endDate = Sheet5.[F6].Value
With Sheet4
    .Range("A14:D" & .UsedRange.SpecialCells(xlCellTypeLastCell).Row).ClearContents
    k = 1
    Do While WorksheetFunction.RoundDown(startDate, 0) <= _
             WorksheetFunction.RoundDown(endDate, 0)
 ' . . . . . . . . . '

 Loop

Lỡ người dùng nhập vô StartDate > EndDate thì sao đây bạn thân mến?
Chuyện này rất dễ diễn ra do nhập các loại ngày < 13 của các tháng < 10

Có người dùng tưởng hệ Mẽo nên nhập 1/9/2015 thay vì 9/1/2015 (!)
Lúc này fải khai thêm 1 biến

Dim tDat As Date
If fDate > lDate Then
tDat = fDate: fDate= lDate
lDate = tDat
End If

Chỉ sau đó mới nhãy vô vòng lặp được.
Còn chuyện chạy ra kết quả sai hay đúng thì là chuyện tiếp tục xử khác hay không.

cám ơn thầy
đây là nội dung ô F5

ca9c902ec2439d962d9600105e7fd9b0.png




đã được Format theo chuẩn dd/MM/yyyy
và trong quá trình làm , người dùng nhập ngày tào lao thì người dùng phải tự chịu , không thể đổ trách nhiệm qua cho người viết code được ạ .
 
Upvote 0
tôi xem Chủ đề này riết rồi cũng chả hiểu là các code ở trên đã thỏa mãn chưa ?
cứ viết đại 1 đoạn ở đây
Mã:
Public Sub helloHamDuyet()
Dim r As Long, k As Long, dArr(1 To 65000, 1 To 4), arr
Dim startDate As Date, endDate As Date, ub As Long, h As Boolean
arr = Sheet1.Range("A17:K" & Sheet1.[A65000].End(xlUp).Row).Value
ub = UBound(arr)
startDate = Sheet5.[F5].Value
endDate = Sheet5.[F6].Value
With Sheet4
    .Range("A14:D" & .UsedRange.SpecialCells(xlCellTypeLastCell).Row).ClearContents
    k = 1
    Do While WorksheetFunction.RoundDown(startDate, 0) <= _
             WorksheetFunction.RoundDown(endDate, 0)
        r = 1: h = False
        dArr(k, 1) = k
        dArr(k, 2) = startDate
        dArr(k, 4) = "Mua Công truong nghi"
        Do While arr(r, 1) <> arr(ub, 1)
            If arr(r, 11) = startDate Then
                dArr(k, 1) = k
                dArr(k, 2) = startDate
                dArr(k, 3) = arr(r, 2)
                dArr(k, 4) = "Nghiêm thu " & arr(r, 3)
                k = k + 1: h = True
            End If
            If arr(r, 6) <= startDate And arr(r, 7) >= startDate Then
                dArr(k, 1) = k
                dArr(k, 2) = startDate
                dArr(k, 3) = arr(r, 2)
                dArr(k, 4) = "Thi công " & arr(r, 3)
                k = k + 1: h = True
            End If
            r = r + 1
        Loop
        startDate = startDate + 1
        If Not h Then k = k + 1
    Loop
    .Range("A14:D14").Resize(k).Value = dArr
End With
End Sub
Code chạy nhanh.
Nhưng tại sheet Nhat ky xuất kết quả ra bạn chỉnh code để
Nếu có nhiều công việc nghiệm thu hoặc thi công ,... trong 1 ngày thì tại cột B chỉ ghi 1 ngày
Phần tôi tô màu vàng Chỉ có số 100 ở A113 và ngày 24/07/2015 tại B113, các cell A114, A115, A116, B114, B115, B116 để trống. 117 và B117 sẽ là số thứ tự và ngày công việc tiếp theo.
 

File đính kèm

  • 2.jpg
    2.jpg
    140.8 KB · Đọc: 27
Upvote 0
Tôi chỉ muốn code chạy ra kết quả như bài #20
xóa bỏ hết tất cả những gì liên quan thời gian max, min.
Chỉ đơn giản là tìm bên sheet Danh muc có đầu việc nào (tương ứng với ngày nào) thì lọc sang sheet Nhat ky. Đầu việc nào có thời gian thi công "Bắt đầu" và "Kết thúc" thì đầu việc đó sẽ được lặp đi, lặp lại tại nhiều dòng (= nhiều ngày).
Chỉ đơn giản vậy thôi.
Mong các thành viên sửa code cho tôi.
 
Upvote 0
Tôi chỉ muốn code chạy ra kết quả như bài #20
xóa bỏ hết tất cả những gì liên quan thời gian max, min.
Chỉ đơn giản là tìm bên sheet Danh muc có đầu việc nào (tương ứng với ngày nào) thì lọc sang sheet Nhat ky. Đầu việc nào có thời gian thi công "Bắt đầu" và "Kết thúc" thì đầu việc đó sẽ được lặp đi, lặp lại tại nhiều dòng (= nhiều ngày).
Chỉ đơn giản vậy thôi.
Mong các thành viên sửa code cho tôi.
anh nói tới #20 thì không đơn giản
cột H , I là yếu tố giờ phút , nó có liên quan gì ở đây ???
 
Upvote 0
anh nói tới #20 thì không đơn giản
cột H , I là yếu tố giờ phút , nó có liên quan gì ở đây ???
Có 2 cách để làm Nhật ký thi công
1) Thực hiện 1 cách TỔNG QUAN CHUNG CHUNG thì chỉ yêu cầu như #58.
2) Thực hiện 1 cách CHI TIẾT của cách 1 thêm giờ phút vào ngày nghiệm thu công việc.
Tôi nói như thế này để bạn hình dung một phần công việc thi công xây dựng
Công việc A thi công trong khoảng thời gian từ ngày 01/05/2015 (cột F) đến 09/05/2015 (cột G). Đến ngày 09/05/2015 là xong thì vào ngày (cột J) Nhà thầu sẽ yêu cầu Chủ đầu tư, Tư vấn giám sát tổ chức nghiệm thu vào giờ phút (cột H) ngày 10/05/2015 (cột K).
Sau khi có Phiếu yêu cầu thì 3 bên Nhà thầu, Tư vấn giám sát sẽ nghiệm thu vào lúc giờ phút (cột H) đến giờ phút (cột I) ngày 10/05/2015 (cột K) .
Khi chuyển sang ghi Nhật ký thì nếu làm 1 cách CHI TIẾT thì phải ghi tất cả những dữ liệu là các cột chữ đậm vào Nhật ký
01/05/2015 : Thi công việc A
.....
09/05/2015 : Thi công việc A
Yêu cầu nghiệm thu công việc A vào lúc (cột H) ngày (cột K)
10/05/2015 : Nghiệm thu công việc A từ lúc (cột H) đến (cột I) ngày (cột K)


----
Vậy là xong 1 công việc A chuyển sang viết lần lượt tất cả các công việc khác.
 
Upvote 0
Web KT
Back
Top Bottom