Nhờ kiểm tra và sửa lỗi của code vba

Liên hệ QC

Tuan_hcth

Thành viên thường trực
Tham gia
8/4/07
Bài viết
206
Được thích
11
Em chào anh, chị

Nhờ anh, chị kiểm tra code vba dưới đây khi chạy nó báo lỗi ở dòng bôi đậm màu tím ạ:

Sub Tonghop_duytri()
Dim Dic As Object, irow As Long, I As Long
Dim arr As Variant, tmparr As Variant
Dim lr As Long

With Sheet3
.Range("B14:D10000").ClearContents
End With

Set Dic = CreateObject("Scripting.dictionary")
lr = Sheet2.Cells(Rows.Count, 3).End(3).Row
tmparr = Sheet2.Range("C4:H" & lr).Value
ReDim arr(1 To UBound(tmparr, 1), 1 To UBound(tmparr, 2))
For irow = 1 To UBound(tmparr, 1)
If tmparr(irow, 6) = Sheet3.Range("P2").Value Then
If Not IsEmpty(tmparr(irow, 1)) And Not Dic.Exists(tmparr(irow, 1)) Then
I = I + 1
Dic.Add tmparr(irow, 1), I
arr(I, 1) = tmparr(irow, 1)
End If
arr(Dic.Item(tmparr(irow, 1)), 3) = arr(Dic.Item(tmparr(irow, 1)), 3) + tmparr(irow, 3)
End If
Next irow
Sheet3.Range("B14").Resize(I, 3).Value = arr
End Sub

Em cảm ơn
 
Bạn phải tự tập thói quen là "báo lỗi ở dòng..." vẫn chưa đủ. Phải cho biết chi tiết "lỗi báo thế nào".
Lấy tờ giấy ghi lại cái lỗi nó báo. Tập quen thì sẽ học được cách xử lý khi thấy báo lỗi.

Chú: đừng có nói với tôi cách xử lý hiệu quả nhất là lên GPE "nhờ kiểm tra lỗi code VBA" nhé
 
Upvote 0
Bạn phải tự tập thói quen là "báo lỗi ở dòng..." vẫn chưa đủ. Phải cho biết chi tiết "lỗi báo thế nào".
Lấy tờ giấy ghi lại cái lỗi nó báo. Tập quen thì sẽ học được cách xử lý khi thấy báo lỗi.

Chú: đừng có nói với tôi cách xử lý hiệu quả nhất là lên GPE "nhờ kiểm tra lỗi code VBA" nhé

Dạ. Em gửi hình ảnh thông báo lỗi ạ. Trước đây máy cũ thì chạy vẫn ra kết quả, nhưng khi em chạy trên máy mới thì thấy thông báo lỗi

1583813414811.png
 
Upvote 0
Dạ. Em gửi hình ảnh thông báo lỗi ạ. Trước đây máy cũ thì chạy vẫn ra kết quả, nhưng khi em chạy trên máy mới thì thấy thông báo lỗi

View attachment 233124
đoạn này bạn Debug lại xem
For irow = 1 To UBound(tmparr, 1)
nó chạy ngoài diều kiện bạn xét...
... Có thể kết quả sửa lại có thể là -1, -2
For irow = 1 To UBound(tmparr, 1) -1
 
Upvote 0
1.- Sao bạn không giả lập file & đưa lên, nhỉ?

2.- Nó đang báo lỗi ở dòng lệnh nào vậy, do hình không thấy dòng lệnh nào tô vàng cả

3.+ Khuyên bạn nên đánh số các dòng lệnh 1 cách cách quản; SAu đó xài hàm Erl() & Err() để có định hướng khử lỗi tiếp theo.
 
Upvote 0
1.- Sao bạn không giả lập file & đưa lên, nhỉ?

2.- Nó đang báo lỗi ở dòng lệnh nào vậy, do hình không thấy dòng lệnh nào tô vàng cả

3.+ Khuyên bạn nên đánh số các dòng lệnh 1 cách cách quản; SAu đó xài hàm Erl() & Err() để có định hướng khử lỗi tiếp theo.
Nó thông báo lỗi ở hàng như bài #1 đã nêu anh ạ.
 
Upvote 0
Ngừoi nào viết cái code ở bài #1 hãi hùng quá.
Từ tmp trong lập trình có nghĩa là temporary (tạm thời). Theo lệ thường thì chỉ dùng cho biến tạm chứa một trị nào đó, và lập tức trả lại (chỉ dùng trong vòng 3-4 dòng). Ở đây, cả mọt cái mảng dữ liệu dùng từ đầu đến cuối code mà cũng đặt tên tmp* được thì tại sao các biến còn lại không tmp quách cho được tiếng thống nhất.

tmparr(irow, 1) được nhắc 6 lần mà chả chú thích nó là cái gì. Người viết code có căn bản đã đặt cho nó một cái tên cho dễ hiểu:
theKey = tmparr(irow, 1)

Theo như code bài #1 thì:
If Not IsEmpty(tmparr(irow, 1)) And Not Dic.Exists(tmparr(irow, 1)) Then ' tmparr(irow, 1) empty sẽ khong được ghi vào dic
...
End If
arr(Dic.Item(tmparr(irow, 1)), 3) = arr(Dic.Item(tmparr(irow, 1)), 3) + tmparr(irow, 3) ' nếu tmparr(irow, 1) = empty thì sao?
End If
Next irow

Code cần sửa lại là:
If Not IsEmpty(tmparr(irow, 1)) Then
If Not Dic.Exists(tmparr(irow, 1)) Then
...
End If
arr(Dic.Item(tmparr(irow, 1)), 3) = arr(Dic.Item(tmparr(irow, 1)), 3) + tmparr(irow, 3) ' nếu tmparr(irow, 1) = empty thì sao?
End If
End If
Next irow

Sau khi sửa xong, nếu còn lỗi thì hỏi tiếp.
 
Upvote 0
Ngừoi nào viết cái code ở bài #1 hãi hùng quá.
Từ tmp trong lập trình có nghĩa là temporary (tạm thời). Theo lệ thường thì chỉ dùng cho biến tạm chứa một trị nào đó, và lập tức trả lại (chỉ dùng trong vòng 3-4 dòng). Ở đây, cả mọt cái mảng dữ liệu dùng từ đầu đến cuối code mà cũng đặt tên tmp* được thì tại sao các biến còn lại không tmp quách cho được tiếng thống nhất.

tmparr(irow, 1) được nhắc 6 lần mà chả chú thích nó là cái gì. Người viết code có căn bản đã đặt cho nó một cái tên cho dễ hiểu:
theKey = tmparr(irow, 1)

Theo như code bài #1 thì:
If Not IsEmpty(tmparr(irow, 1)) And Not Dic.Exists(tmparr(irow, 1)) Then ' tmparr(irow, 1) empty sẽ khong được ghi vào dic
...
End If
arr(Dic.Item(tmparr(irow, 1)), 3) = arr(Dic.Item(tmparr(irow, 1)), 3) + tmparr(irow, 3) ' nếu tmparr(irow, 1) = empty thì sao?
End If
Next irow

Code cần sửa lại là:
If Not IsEmpty(tmparr(irow, 1)) Then
If Not Dic.Exists(tmparr(irow, 1)) Then
...
End If
arr(Dic.Item(tmparr(irow, 1)), 3) = arr(Dic.Item(tmparr(irow, 1)), 3) + tmparr(irow, 3) ' nếu tmparr(irow, 1) = empty thì sao?
End If
End If
Next irow

Sau khi sửa xong, nếu còn lỗi thì hỏi tiếp.
Em cảm ơn anh Việt. Code chạy được rồi ạ
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom