Code load dữ liệu chạy được trên máy này nhưng lỗi trên máy khác ?

  • Thread starter thanhphuongvip
  • Ngày gửi
Trạng thái
Không mở trả lời sau này.

tuhocvba

Administrator
Thành viên BQT
Bọn này làm phản hết rồi. Không để cho người ta luyện tập, phá đám hết rồi. Cắt chức hết.
 
T

thanhphuongvip

Guest
Mã:
                 dic.Item(dk) = dic.Item(dk) & "#" & i
[/QUOTE]
Cho mình hỏi chỗ:
[CODE]  dic.Item(dk) = dic.Item(dk) & "#" & i
sao nó lại có phần "#"&i nghĩa là sao hả mọi người, nếu không có phần đó có được ko?
 

tuhocvba

Administrator
Thành viên BQT
Thắc mắc đúng chỗ rồi. Dictionary thì điều kiện cần là tính duy nhất.
Nhưng mà data của bạn lại như thế này.
Bạn cần đăng nhập để thấy hình ảnh


Cái mã hóa đơn nó bị trùng lặp. Thành ra nếu phát hiện hóa đơn = 2 thì nạp vào từ điển lần 1, ok.
Nhưng ở dòng sau lại thấy hóa đơn =2. Tất nhiên người code muốn ghi chú lại dòng mà có hóa đơn = 2.
Vậy cách suy nghĩ là: các dòng có hóa đơn = 2 thì nạp vào từ điển keyword =2 (mã hóa đơn) và items lưu các dòng có hóa đơn =2: dòng 1#dòng 2 # dòng 3 ...
 

tuhocvba

Administrator
Thành viên BQT
Đầu tiên thì phải đọc dữ liệu ở sheet ChiTietBanHang:
Bạn cần đăng nhập để thấy hình ảnh

Cái khung màu đỏ to tướng ấy, là vùng được chỉ định gán (từ cột A tới cột M, bắt đầu từ dòng 10, dòng kết thúc là lr).
Sau khi gán thì vị trí mảng như thế này, tôi phóng to ra. Vấn đề của câu hỏi của bạn lần này là đã không hiểu vị trí các phần tử của mảng nên đã không sửa được code.
Bạn cần đăng nhập để thấy hình ảnh


Bây giờ chúng ta sẽ đọc hóa đơn trên cột A.
Bạn cần đăng nhập để thấy hình ảnh

Tôi giả sử i = 1. thì khi đó bạn có hóa đơn dk = 2. //i là vị trí dòng trong mảng. i=1 là dòng thứ nhất trong mảng arr(1,x): x là vị trí cột trong mảng.
Như vậy code trên là nó chỉ quan tâm cột 1: arr(i,1) và nó cho i chạy từ dòng 1 tới tới dòng cuối qua câu lệnh for được thể hiện ở trên.
và code nó sẽ nạp vào từ điển hai thứ nó quan tâm.
hóa đơn = 2, hóa đơn này ở dòng thứ mấy trong mảng? ở dòng 1.
Vậy nó nạp: dic.Add 2(hóa đơn), 1(dòng trong mảng). Chú ý cái 1 là Item. còn 2 là key. Giống như từ điển: keyword để tra (key) và nội dung của từ cần tra (item).
Tiếp tục i = 2, nó lại tìm ra hóa đơn = 2.
Cái hóa đơn bằng 2 đã tồn tại trong từ điển rồi (vừa add ban nãy, khi i = 1).
Bạn cần đăng nhập để thấy hình ảnh

Cho nên trường hợp này, khung màu xanh được thực thi.
dic.Item(2) = dic.Item(2) & "#" & i => nó gán item của cái key2 là = 1#2 (trạng thái trước đó là 1).

Vậy bây giờ, cần tra cái hóa đơn 2 thì nó chỉ cần đọc cái dic.Item(2) là được dãy 1#2. (đây là vị trí dòng trong mảng arr).
như vậy lấy thông tin của hóa đơn = 2 thì nó tra item ra cái dãy 1#2 tức là dòng 1 và dòng 2 trong mảng. Vậy tách cái này ra chỉ muốn lấy 1 và 2 thôi chứ khôgn để # nữa thì nó sẽ dùng split("1#2","#") thì tách ra được 1 và 2. Vậy là nó lôi hai ông arr(1,x) : dòng 1, cột x bất kỳ. và arr(2,y) : dòng 2 cột y bất kỳ là ra các dòng thông tin của hóa đơn = 2.
Về split nếu không hiểu thì đọc cái bài viết này cũng đã nói về split:

Trong bài toán thực tế này, tôi nghĩ là dùng for~next và if là đã đủ giải quyết vấn đề, tuy code không mạnh, nhưng cách nghĩ rõ ràng, người đọc dễ hiểu. Đối với người mới học, họ cần cái đó.
Topic này sẽ khóa ở đây. Chủ topic hãy quay lại , hãy bắt đầu từ đó, đừng học thiếu hệ thống như hiện nay. Các vấn đề để giải đáp sẽ lan man vì kiến thức người học không có hệ thống.

Vấn đề mà topic này chưa giải quyết được: Là chưa hiểu nguyên nhân lỗi ở đâu. Xét thấy vấn đề là khó, nằm ngoài khả năng của những người ở đây. Nếu có phát hiện gì, chúng tôi sẽ có chủ đề riêng và thông báo tới bạn.
 
Trạng thái
Không mở trả lời sau này.
Top