Hỏi về tăng tốc độ chạy do so sánh 2 mảng với nhau.

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

MỹHạnhCB

Đi mây, về gió. !!!
Tham gia
25/3/22
Bài viết
123
Được thích
18
Lần nữa xin kính chào các anh chị trong diễn đàn GPE ạ.
Lại là em đây, xin phiền các anh chị 1 lần nữa.
Em có 1 đoạn mã như sau. Nhưng thực hiện khá chậm (do thực hiện nhiều vòng lập, hoặc duyệt so sánh giữa 2 mảng). Mong các anh chị có thể biên tập, góp ý hoặc chỉ điểm cách giúp em để có thể nhanh hơn đáng kể ạ. Chứ khả năng của em chỉ đến nhiêu đây.
Em có gửi đính kèm để các anh chị có thể xem giúp.
Lần nữa xin cám ơn quý anh chị nhiều.
 

File đính kèm

  • edit_sdc.zip
    757 KB · Đọc: 6
Lần chỉnh sửa cuối:
...
Em có 1 đoạn mã như sau. Nhưng thực hiện khá chậm (em nghĩ do thực hiện nhiều vòng lập). ...
Lập trình đến một mức độ nào đó thì bạn phải biết học cách "ước lượng"
Đừng nói "em nghĩ" suông như vạy. Hãy cho biết thẳng thừng "theo em nhận xét thì do số vòng lặp cao..." (duyệt code đàng hoàng chứ không phải chỉ đoán chừng).
Kế đó làm con toán ước lượng trường hợp tốt nhất thì vòng lặp chạy bao nhiêu lần (MIN), trường hợp xấu nhất thì bao nhiêu lần (MAX)
Sau khi đã tin 70-80% do vòng lặp rồi thì mới tính tiếp.

Lưu ý là duyệt mảng hai chiều thì số lặp là số dòng nhân số cột. VBA dùng mảng trọng cột cho nên duyệt cột nhanh hơn dòng.
 
Upvote 0
Lập trình đến một mức độ nào đó thì bạn phải biết học cách "ước lượng"
Đừng nói "em nghĩ" suông như vạy. Hãy cho biết thẳng thừng "theo em nhận xét thì do số vòng lặp cao..." (duyệt code đàng hoàng chứ không phải chỉ đoán chừng).
Kế đó làm con toán ước lượng trường hợp tốt nhất thì vòng lặp chạy bao nhiêu lần (MIN), trường hợp xấu nhất thì bao nhiêu lần (MAX)
Sau khi đã tin 70-80% do vòng lặp rồi thì mới tính tiếp.

Lưu ý là duyệt mảng hai chiều thì số lặp là số dòng nhân số cột. VBA dùng mảng trọng cột cho nên duyệt cột nhanh hơn dòng.

Lập trình đến một mức độ nào đó thì bạn phải biết học cách "ước lượng"
Đừng nói "em nghĩ" suông như vạy. Hãy cho biết thẳng thừng "theo em nhận xét thì do số vòng lặp cao..." (duyệt code đàng hoàng chứ không phải chỉ đoán chừng).
Kế đó làm con toán ước lượng trường hợp tốt nhất thì vòng lặp chạy bao nhiêu lần (MIN), trường hợp xấu nhất thì bao nhiêu lần (MAX)
Sau khi đã tin 70-80% do vòng lặp rồi thì mới tính tiếp.

Lưu ý là duyệt mảng hai chiều thì số lặp là số dòng nhân số cột. VBA dùng mảng trọng cột cho nên duyệt cột nhanh hơn dòng.
vâng cám ơn anh đã góp ý. Em sẽ lưu ý hơn ạ. Anh có thể cho em 1 phương án trong trường hợp này không ạ.
 
Upvote 0
Mã:
""""
Dim found As Boolean
        found = False
   o = 0
27    For i = LBound(rn1, 1) To UBound(rn1, 1)
     traRn1 = rn1(i, 1) & "#" & rn1(i, 2) & "#" & rn1(i, 3)
        For l = LBound(rn2, 1) To UBound(rn2, 1)
29     traRn2 = rn2(l, 1) & "#" & rn2(l, 2) & "#" & rn2(l, 3)
31 If traRn1 <> "##" Or traRn2 <> "##" Then
            If traRn1 = traRn2 Then
            found = True
                Exit For
                    End If
                        End If
                            Next l
33 If traRn1 <> "##" Or traRn2 <> "##" Then
            If Not found Then
                    o = o + 1
                    ReDim Preserve so(1 To o)
                    so(o) = rn1(i, 1) & "_" & rn1(i, 2)
                        End If
                            End If
                                found = False
                                    Next i
""""""
Em thấy chậm ở đoạn duyệt qua giữa 2 mảng đây ạ. Không biết các anh chị có phương án nào khác với trường hợp này của em không ạ.
 
Upvote 0
1- Code nằm ở đâu, sheet nào, file nào?
2- Kết quả muốn có của code là gì?
3- Các source mà code dùng để tính toán là gì?
Bạn chưa giới thiệu về chương trình của bạn mà lại nhờ mọi người tham vấn thì biết đâu mà tham vấn bạn?
 
Upvote 0
1- Code nằm ở đâu, sheet nào, file nào?
2- Kết quả muốn có của code là gì?
3- Các source mà code dùng để tính toán là gì?
Bạn chưa giới thiệu về chương trình của bạn mà lại nhờ mọi người tham vấn thì biết đâu mà tham vấn bạn?
Vâng cảm ơn anh đã nhắc về sự thiếu sót. như đính kèm em có để ở đầu bài
Cụ thể là chạy code lấy tất cả files trong thư mục chuaky (sao khi loại bỏ giá trị trùng) được 1 mảng chứa là rn1 , sao đó chạy tiếp tất cả files trong thư mục daky (sao khi loại bỏ giá trị trùng) được 1 mảng chứa là rn2. Tiếp theo sẽ so sánh từng giá trị của mảng chứa rn1 (chuaky) nếu có trong mảng chứa rn2 (daky) thì bỏ qua, nếu chưa có thì lấy tên giá trị đó lưu vào mảng "so()". Và cuối cùng trả về mảng "so()") ra cột D.
Kết quả cuối cùng em muốn lấy là giá trị ở cột D. Tức các giá trị không tồn tại trong mảng chứa rn2 của mảng chứa rn1 ( giá trị của thư mục chuaky ). Thân.!
 
Upvote 0
Kinh nghiệm khi hỏi bài:

1- Không nên đưa nhiều file nằm nhiều nơi.
Nếu thực tế bạn để nhiều file ở nhiều nơi và muốn dùng code để lấy thông tin về 1 file:
Bạn nên tập hợp về 1 file duy nhất, gồm nhiều sheet.
Upload file đó lên và xin code.
Khi đã có code hoàn chỉnh, tùy biến lại code cho phù hợp với thực tế của mình
Không biết các bạn khác thế nào, riêng mình, gặp các bài mà có nhiều file đính kèm là mình chạy

2- Bạn nên có 2 sheet kết quả: 1 sheet là kết quả từ chạy code và 1 sheet là nhập tay kết quả muốn có.
 
Upvote 0
Kinh nghiệm khi hỏi bài:

1- Không nên đưa nhiều file nằm nhiều nơi.
Nếu thực tế bạn để nhiều file ở nhiều nơi và muốn dùng code để lấy thông tin về 1 file:
Bạn nên tập hợp về 1 file duy nhất, gồm nhiều sheet.
Upload file đó lên và xin code.
Khi đã có code hoàn chỉnh, tùy biến lại code cho phù hợp với thực tế của mình
Không biết các bạn khác thế nào, riêng mình, gặp các bài mà có nhiều file đính kèm là mình chạy

2- Bạn nên có 2 sheet kết quả: 1 sheet là kết quả từ chạy code và 1 sheet là nhập tay kết quả muốn có.
vâng cám ơn anh đã góp ý
 
Upvote 0
1. Giải quyết nhanh việc so sánh mảng:
Muốn dò mảng thì phải sắp xếp nó. Mảng đã được sắp xếp có thể dò theo thuật toán nhị phân, rất nhanh, rất hiệu quả.

2. Về cách làm việc trên Excel: việc tìm các keys có trong một mảng BANG1 nhưng không có trong mảng BANG2 có thể thực hiện bằng cách sau
2.1. đặt cột phụ, ở BANG1 thì trị là 1, ở BANG2 tghif trị là 2.
2.2. nối hai mảng với nhau
2.3. sort theo key và cột phụ (1,2)
2.4. đặt cột phụ thứ hai với công thức =IF(AND($cotphu2=1,$cotphu3=2,$key2=$key3), "X", "")
Sau đó, filter theo "X"

3. Cách khác trên Excel:
3.1. sort bảng BANG2
3.2. trên bảng BANG1, dùng hàm Index và Match để dò. Có kết quả thì đặt "X"
3.3. filter theo X

Hai cách trên đều có thể chuyển thành VBA nếu muốn.

Tuy nhiên, vói code thì dùng ADODB dễ hơn:
Câu SQL để gộp bangt BANG1 thì dùng Union và câu SQL để dò thì dùng NOT IN hoặc NOT EXISTS

Cuối cùng, cái gì ADODB làm được thì khả năng 99% có thể dùng Power Query.
 
Upvote 0
1. Giải quyết nhanh việc so sánh mảng:
Muốn dò mảng thì phải sắp xếp nó. Mảng đã được sắp xếp có thể dò theo thuật toán nhị phân, rất nhanh, rất hiệu quả.

2. Về cách làm việc trên Excel: việc tìm các keys có trong một mảng BANG1 nhưng không có trong mảng BANG2 có thể thực hiện bằng cách sau
2.1. đặt cột phụ, ở BANG1 thì trị là 1, ở BANG2 tghif trị là 2.
2.2. nối hai mảng với nhau
2.3. sort theo key và cột phụ (1,2)
2.4. đặt cột phụ thứ hai với công thức =IF(AND($cotphu2=1,$cotphu3=2,$key2=$key3), "X", "")
Sau đó, filter theo "X"

3. Cách khác trên Excel:
3.1. sort bảng BANG2
3.2. trên bảng BANG1, dùng hàm Index và Match để dò. Có kết quả thì đặt "X"
3.3. filter theo X

Hai cách trên đều có thể chuyển thành VBA nếu muốn.

Tuy nhiên, vói code thì dùng ADODB dễ hơn:
Câu SQL để gộp bangt BANG1 thì dùng Union và câu SQL để dò thì dùng NOT IN hoặc NOT EXISTS

Cuối cùng, cái gì ADODB làm được thì khả năng 99% có thể dùng Power Query.
Vâng cám ơn anh đã hướng dẫn.
 
Upvote 0
Web KT

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

Back
Top Bottom