Hỗ trợ giải thích hiện tượng Code chạy đơn thì đúng, chạy vòng lặp thì sai

Liên hệ QC

Tình nghĩa giang hồ

Thanh sơn bất cải, lục thủy trường lưu
Tham gia
29/9/20
Bài viết
330
Được thích
429
Em chào anh chị em có 1 hiện tượng mà em không biết giải thích sao.
Em xin mô tả hiện tượng code.
Trường hợp 1:
Nếu chạy trên Excel.
Bấm lần 1 codechạy đúng, bấm lần 2 code chạy đúng. Nhưng nếu bấm nhiều lần là chạy sai.

Trường hợp 2:
chạy code đó luôn luôn đúng. bấm 1 lần hay bấm 100 lần code đó luôn luôn đúng.
Nhưng trường hợp đúng này chỉ là chạy đơn độc code đó.

Trường hợp ta đặt code đó trong vòng lặp.
Thực tế em chạy dữ liệu có 2 sheet.
Sheet 1: lấy dữ liệu dòng kiểu dòng 1 to dòng 10
Còn sheet 2 là dữ liệu chạy
VD:
For i = 1 to 10 (đây là chạy từ dòng 1 đến dòng 10 trong sheet 1)
xoá sheet 2.
Lấy dữ liệu Sap (ERP) vào Sheet 2.
Chạy code

Next i


Hiện tượng xảy ra i = 1 code chạy luôn luôn đúng.
i=2 code chạy bị sai
Nếu chạy đơn độc i =2 vẫn đúng.
Nhưng chạy bằng vòng lặp là bị sai.
Em không biết giải thích hiện tượng này như thế nào.

Nhưng em nghĩ vấn đề theo em nghỉ i = 1 mãng (arr) nó lấy theo i =1,
Khi i = 2 mặt dù mình xoá dữ liệu cũ rồi, dữ liệu mới được thêm vào luôn. Nhưng vì lý do nào đó các kiểu mảng vẫn nhớ i =1 nên dữ liệu chạy loạn xạ.
Anh chị có ai gặp hiện tượng này chưa ? Có cách nào khắc phục không, hoặc cho em từ khoá về hiện tượng này với.

Trước đây em cũng hay bị hiện tượng này trên excel rồi. Nhưng do Excel chỉ nhấn nút 1 lần (kiểu nhấn 1 lần thì code chạy ok, nhần lần 2, lần 3 là code chạy lỗi).
Có liên quan gì về bộ nhớ đệm không anh chị ?
 
Lần chỉnh sửa cuối:
Này đơn giản mà thêm On Error Resume Next vảo la xong
On Error Resume Next là: các lỗi xảy ra sẽ bị bỏ qua và mã sẽ tiếp tục chạy (chỉ áp dụng cho trường hợp nào bắt lỗi ngừng hoạt động thôi)
Còn trường hợp của mình code vẫn chạy bình thường, nhưng kết quả tính toán bị sai nhé bạn.
For i =1 chạy đúng
i =2 kết quả tính toán, bị loạn.........code vẫn chạy. Nhưng kết quả sai
i=3 cũng thế........tính toán bị loạn. Kết quả sai.
i=4 tương tự
..............
Array hay dòng cuối, lastrow gì cũng hơi có hiện tượng loạn.........
Còn chạy đơn 1 giá trị thì đúng hết.
Khó là chỗ đó...........
 
Upvote 0
@Chủ bài đăng: Chạy code lần 2 thì loạn cào cào; Khi đó phải biết sao nó loạn & loạn như thế nào;
Muốn vậy
Lấy dữ liệu Sap (ERP) vào Sheet 2.
ta thử lấy 1 cách tối thiểu nhất; để xem mà còn biết nó loạn như thế nào.
 
Upvote 0
Úp toàn bộ code lên đi bạn.
Dạ em gửi file nhờ anh xem dùm
Em xin mô tả lại 1 tí
For j = 4 to dong cuoi(lastrows) của Sheet1
sau đó code sẽ xóa dữ liệu Sheet 2
mở SAP lấy dữ liệu Sap đẩy vào Sheet 2
phân tích dữ liệu excel trên Sheet 2
Từ dữ liệu phân tích, chạy lại SAP
Next j
kết quả là
................

j=4 luôn chạy đúng
j=5 là nó chạy sai, sai ở điểm phân tích,

Mà code phân tích, như em mô tả, chạy bấm 1 lần hoạt động tốt, lần 2 hoạt động tốt, lần n hoạt động tốt. Nhưng bỏ vào vòng lặp là không hoạt động tốt.
 

File đính kèm

  • F-32 NT-bị lỗi lần n.xlsb
    65.3 KB · Đọc: 12
Lần chỉnh sửa cuối:
Upvote 0
Bạn không mô tả gì về cái code bạn làm thì chịu thua.
Nhìn mớ hỗn độn trong code thật kinh khủng luôn, tôi vô cùng ngạc nhiên khi mà bạn vẫn xoay sở được với nó và vẫn được thực hiện công việc...
 

File đính kèm

  • F-32 NT_.xlsb
    67 KB · Đọc: 14
Upvote 0
Bạn không mô tả gì về cái code bạn làm thì chịu thua.
Nhìn mớ hỗn độn trong code thật kinh khủng luôn, tôi vô cùng ngạc nhiên khi mà bạn vẫn xoay sở được với nó và vẫn được thực hiện công việc...
Tôi thì ngạc nhiên sao quý vị có thể trả lời được khi mà thớt cứ nói "sai".
Trước mắt thì có ai thấy được tại sao thớt gọi nó là sai? thế nào mới là đúng?
 
Upvote 0
Tôi thì ngạc nhiên sao quý vị có thể trả lời được khi mà thớt cứ nói "sai".
Trước mắt thì có ai thấy được tại sao thớt gọi nó là sai? thế nào mới là đúng?
chuẩn rồi anh, còn chưa thấy bệnh nhân (file excel cụ thể, cấu trúc ntn) sao bắt bệnh được
Đang phỏng đoán theo miêu tả của người nhà bệnh nhân sao bắt chuẩn bệnh được
 
Upvote 0
Lưu ý: tôi không nói chuyện giải quyết vấn đề này. Có biết nó ra sao đâu mà giải quyết.

Tôi chỉ nhân cơ hội này, nói chuyện về "đoán mò cách debug".

Thường thì code chạy lần thứ nhất khác lần thứ nhì là do có biến toàn cục. Biến toàn cục chỉ được khởi trị lúc bắt đầu. Nếu mỗi lần chạy thay đổi nó thì kết quả mỗi lần có thể khác nhau.

Tương tự như vậy, nếu một đoạn code chạy 1 lần khác với chạy lặp lại nhiều lần là do có một hoặc vài biến nào đó bị thay đổi. Code của dân GPE rất có khả năng bị cái này, vì dựa vào tính chất khởi trị biến tự động của VBA.

Muốn debug, cắt đoạn code ấy cho vào hàm con. Lúc ấy tầm vực của các biến sẽ rõ rệt hơn.
Tầm vực = scope: xem bên dưới.

Không phải nó tát nhau thì là nó tát nó (ntn)
Trong ngữ cảnh lập trình, ntn là "ngoài tầm nhin" (out of scope).
 
Upvote 0
Dạ em gửi file nhờ anh xem dùm
Em xin mô tả lại 1 tí
For j = 4 to dong cuoi(lastrows) của Sheet1
sau đó code sẽ xóa dữ liệu Sheet 2
mở SAP lấy dữ liệu Sap đẩy vào Sheet 2
phân tích dữ liệu excel trên Sheet 2
Từ dữ liệu phân tích, chạy lại SAP
Next j
kết quả là
................

j=4 luôn chạy đúng
j=5 là nó chạy sai, sai ở điểm phân tích,

Mà code phân tích, như em mô tả, chạy bấm 1 lần hoạt động tốt, lần 2 hoạt động tốt, lần n hoạt động tốt. Nhưng bỏ vào vòng lặp là không hoạt động tốt.
Theo mình bạn nên thêm 1 code ghi thông báo của SAP ra 1 cột để đọc lỗi trong trường hợp đã bẫy lỗi On Error Resume Next
Với F-32 Clear Customer, và giảm trừ không toàn phần (Partial Pmt), phần phân tích để ghép theo thứ tự từ giao dịch xa nhất trở về phải đảm bảo Difference = 0
Đồng thời code trên không thể chạy test được do không có môi trường test.
 
Upvote 0
Lưu ý: tôi không nói chuyện giải quyết vấn đề này. Có biết nó ra sao đâu mà giải quyết.

Tôi chỉ nhân cơ hội này, nói chuyện về "đoán mò cách debug".

Thường thì code chạy lần thứ nhất khác lần thứ nhì là do có biến toàn cục. Biến toàn cục chỉ được khởi trị lúc bắt đầu. Nếu mỗi lần chạy thay đổi nó thì kết quả mỗi lần có thể khác nhau.

Tương tự như vậy, nếu một đoạn code chạy 1 lần khác với chạy lặp lại nhiều lần là do có một hoặc vài biến nào đó bị thay đổi. Code của dân GPE rất có khả năng bị cái này, vì dựa vào tính chất khởi trị biến tự động của VBA.

Muốn debug, cắt đoạn code ấy cho vào hàm con. Lúc ấy tầm vực của các biến sẽ rõ rệt hơn.
Tầm vực = scope: xem bên dưới.


Trong ngữ cảnh lập trình, ntn là "ngoài tầm nhin" (out of scope).
Nhận định của anh em thấy hợp lý,
Em cũng từng bị code hoạt động ok, nhưng bỏ vào vòng lặp là sai.
Em VD thế này nhé anh:
Code:
Dim arr(), r As Long, c As Long, a As Long, kq()
arr = Sheet2.Range("A1:B1000")
ReDim kq(1 To UBound(arr, 1) * UBound(arr, 2), 1 To 1)
For c = 1 To UBound(arr, 2)
For r = 1 To UBound(arr, 1)
If arr(r, c) <> "" Then
a = a + 1
kq(a, 1) = arr(r, c)
End If
Next
Next
Sheet2.Range("L1").Resize(a, 1).Value = kq

Đoạn code này để trong vòng lặp bên dưới

For i = 2 to dòng cuối của sheet1
xóa dữ liệu sheet 2.
chạy SAP, lấy dữ liệu SAP vào sheet2.
chạy đoạn code này.
kết thúc chẳng hạn
Next


Giả sử i =2 có mảng lấy 3 giá trị sẽ gán xuống sheet 2 ở L1 là 1, 2, 3
trường hợp i = 2 đó ok, nhưng khi i = 3, thì mặt dù code của mình ở trên
Sheet2.Range("L1").Resize(a, 1).Value = kq
kết quả phải ghi ra ở L1.
Nhưng không, khi i = 3 thì code nó lại ghi ra ở L4, mặt dù L1, L2, L3 không có dữ liệu.
Theo nhìn nhận của dân nghiệp dư như em, là code nó vẫn còn nhớ về quá khứ.
Mong muốn của em là:
For i = 2 to......
Thực hiện
xóa hết quá khứ
Next i

Tức là i = 2 thực hiện xong, là phải clear hết quá khứ
i =3 là một quá trình mới rồi.
Còn hiện tại thì, em không biết có 1 biến nào cứ vương vấn quá khứ, gây hiện tượng sai code.
 
Upvote 0
Web KT

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

Back
Top Bottom