Code cộng dồn thay hàm Sumif để xử lý nhanh dữ liệu

Liên hệ QC

Phúc Lộc Thọ

Thành viên bị đình chỉ hoạt động
Thành viên bị đình chỉ hoạt động
Tham gia
12/8/22
Bài viết
32
Được thích
4
Chào tất cả mọi người GPE !
Mình có 1 file excel , hiện đang dùng hàm sumif để cộng dồn theo mã hiện tại chạy rất lâu ( khoảng 15 giây )
Mình xin nhờ các bạn giúp mình đoạn code để giúp file chạy nhanh nhất có thể. Mình xin cảm ơn các bạn

1661423996658.png
 

File đính kèm

  • CONG DON SL.xlsx
    11.2 KB · Đọc: 5
Giải pháp
1. CHo hỏi nếu 3 bảng nằm 3 sheet khác nhau thì sửa chổ này làm sao anh
TH_dautien = Array("B3", "E3", "H3", "K3") ' bang1, bang 2, bang 3, bang Ket Qua
2. Nếu thêm bảng 4, Bảng 5 em muốn Kết quả = Bảng 1 + 2 + 3 -4 - 5 thì phải sữa chổ nào
Anh có thê cho 1 đoạn code tổng quát để em chỉ cần thay input Ouput là xong
Tôi chỉ làm cho bạn lần cuối cùng. Cứ kiểu chốc chốc lại thêm yêu cầu thì tôi không chơi. Bạn đã có cơ hội để bổ sung mọi yêu cầu nên tôi không chấp nhận bổ sung thêm lần nào nữa.

Lưu ý:

1. Ở bài #1 bảng kết quả chỉ có những tên hàng xuất hiện ở bảng 1
Trích trong bài
Cột K tên hàng lấy từ Bảng 1 ( cột B )
Tức trong các bảng tiếp theo nếu...
Cái mong muốn của bạn bạn phải tự nghiên cứu đi: Trong VBA có hàm chuyển hết về chữ in đó.
Xin nhắc bạn:
→ Các cột có tiêu đề [tên hàng] của bạn trong thực tế phải là [Mã HH] (mã hàng hóa)
→ & vì lẽ đó nên chúng luôn luôn cần được viết/xài chữ in
→ Hoặc chúng được chọn nhập từ những ComboBox hay hộp Validation, . . . . .
(& đó cũng là lí do để bạn tự nghiền ngẫm & biết thêm, chớ không thoải mái nhập liệu vớ vẫn được.)
 
Upvote 0
Cảm ơn anh code chạy rất tốt. Nhưng em muốn code Không cần phải phân biệt chữ Hoa và Chữ thường thì phải sửa lại làm sao
Tôi làm cách khác dùng Dictionary.

Hiện thời các ô Tên Hàng đầu tiên ở bảng 1, 2, 3 và bảng kết quả nằm ở B3, E3, H3 và K3. Để bạn có thể linh hoạt thay đổi và dịch chuyển sang những cột khác mà không cố định ở B, E, H, K, và để có thể linh hoạt cho dữ liệu trong mỗi bảng có thể bắt đầu từ dòng bất kỳ chứ không cứng nhắc là dòng 3 thì tôi cho địa chỉ của các ô Tên Hàng đầu tiên vào mảng TH_dautien.

Tức hiện tại là:

TH_dautien = Array("B3", "E3", "H3", "K3") ' bang1, bang 2, bang 3, bang Ket Qua

Với cách này thì bạn cũng có thể dùng chung code cho bài


Trong bài này tôi hiểu là Tên Hàng trong bảng 1 là duy nhất. Nhưng code tôi viết lại chấp nhận cà trường hợp Tên Hàng trong bảng 1 lặp lại. Chính vì thế mà dùng được 1 code cho cả 2 bài. Trong bài ở link trên trước khi chạy code thì phải sửa thành.

TH_dautien = Array("B5", "H1", "J1", "E5") ' bang1, bang 2, bang 3, bang Ket Qua

Tức do bảng 2 (bắt đầu từ H1) trống nên không có cộng thêm Số Lượng. Do bảng 3 (bắt đầu từ J1) trống nên không có trừ đi Số Lượng. Vậy kết quả chỉ là cộng dồn Số Lượng trong bảng 1, và kết quả nhập vào bắt đầu từ E5.

Trong TH_dautien = ... thay cho cột H, J có thể chọn cột bất kỳ miễn là cột trống.

Lưu ý:
- Trước khi chạy code thì phải chọn sheet cần thao tác vì code chạy cho sheet hiện hành. Và sửa TH_dautien = ... cho đúng.
- Tôi chú thích từng dòng code. Hãy đọc chú thich để hiểu code.
 

File đính kèm

  • CONG DON SL.xlsm
    64.7 KB · Đọc: 20
Upvote 0
Tôi làm cách khác dùng Dictionary.

Hiện thời các ô Tên Hàng đầu tiên ở bảng 1, 2, 3 và bảng kết quả nằm ở B3, E3, H3 và K3. Để bạn có thể linh hoạt thay đổi và dịch chuyển sang những cột khác mà không cố định ở B, E, H, K, và để có thể linh hoạt cho dữ liệu trong mỗi bảng có thể bắt đầu từ dòng bất kỳ chứ không cứng nhắc là dòng 3 thì tôi cho địa chỉ của các ô Tên Hàng đầu tiên vào mảng TH_dautien.

Tức hiện tại là:

TH_dautien = Array("B3", "E3", "H3", "K3") ' bang1, bang 2, bang 3, bang Ket Qua

Với cách này thì bạn cũng có thể dùng chung code cho bài


Trong bài này tôi hiểu là Tên Hàng trong bảng 1 là duy nhất. Nhưng code tôi viết lại chấp nhận cà trường hợp Tên Hàng trong bảng 1 lặp lại. Chính vì thế mà dùng được 1 code cho cả 2 bài. Trong bài ở link trên trước khi chạy code thì phải sửa thành.

TH_dautien = Array("B5", "H1", "J1", "E5") ' bang1, bang 2, bang 3, bang Ket Qua

Tức do bảng 2 (bắt đầu từ H1) trống nên không có cộng thêm Số Lượng. Do bảng 3 (bắt đầu từ J1) trống nên không có trừ đi Số Lượng. Vậy kết quả chỉ là cộng dồn Số Lượng trong bảng 1, và kết quả nhập vào bắt đầu từ E5.

Trong TH_dautien = ... thay cho cột H, J có thể chọn cột bất kỳ miễn là cột trống.

Lưu ý:
- Trước khi chạy code thì phải chọn sheet cần thao tác vì code chạy cho sheet hiện hành. Và sửa TH_dautien = ... cho đúng.
- Tôi chú thích từng dòng code. Hãy đọc chú thich để hiểu code.
cảm ơn anh. Code anh em test file thực tế từ 40 giây xuống còn 1 giây, nhanh gấp 40 lần
1. CHo hỏi nếu 3 bảng nằm 3 sheet khác nhau thì sửa chổ này làm sao anh
TH_dautien = Array("B3", "E3", "H3", "K3") ' bang1, bang 2, bang 3, bang Ket Qua

2. Nếu thêm bảng 4, Bảng 5 em muốn Kết quả = Bảng 1 + 2 + 3 -4 - 5 thì phải sữa chổ nào
Anh có thê cho 1 đoạn code tổng quát để em chỉ cần thay input Ouput là xong
Cảm ơn anh nhiều
 
Lần chỉnh sửa cuối:
Upvote 0
1. CHo hỏi nếu 3 bảng nằm 3 sheet khác nhau thì sửa chổ này làm sao anh
TH_dautien = Array("B3", "E3", "H3", "K3") ' bang1, bang 2, bang 3, bang Ket Qua
2. Nếu thêm bảng 4, Bảng 5 em muốn Kết quả = Bảng 1 + 2 + 3 -4 - 5 thì phải sữa chổ nào
Anh có thê cho 1 đoạn code tổng quát để em chỉ cần thay input Ouput là xong
Tôi chỉ làm cho bạn lần cuối cùng. Cứ kiểu chốc chốc lại thêm yêu cầu thì tôi không chơi. Bạn đã có cơ hội để bổ sung mọi yêu cầu nên tôi không chấp nhận bổ sung thêm lần nào nữa.

Lưu ý:

1. Ở bài #1 bảng kết quả chỉ có những tên hàng xuất hiện ở bảng 1
Trích trong bài
Cột K tên hàng lấy từ Bảng 1 ( cột B )
Tức trong các bảng tiếp theo nếu có tên hàng mới chưa có ở bảng 1 thì code cũng không lấy vào bảng kết quả. Và trong code sửa cho yêu cầu mới cũng thế - cột kết quả chỉ có tên hàng xuất hiện ở bảng 1.

2. mảng TH_dautien bây giờ có dạng
TH_dautien = Array(Array("'Sheet1'!B3", "'Sheet1'!E3", "'Sheet1'!H3", "'Sheet1'!K3"), Array(1, 1, -1, 1))

- Array("'Sheet1'!B3", "'Sheet1'!E3", "'Sheet1'!H3", "'Sheet1'!K3")
Bảng 1 luôn ở vị trí đầu tiên, còn bảng kết quả nằm ở vị trí cuối cùng.
Bây giờ phải nhập cả tên sheet vì mỗi bảng có thể nằm ở sheet khác.
Mỗi mục có dạng "'<tên sheet>'!<đia chỉ ô Tên hàng đầu tiên>"
"'Sheet1'!H3"
có nghĩa là ô H3 trên sheet1.
'' là 2 dấu nháy đơn. Nếu tên sheet không có dấu cách thì cho phép bỏ cặp nháy đơn, ngược lại bắt buộc phải có.

- Array(1, 1, -1, 1)

Nhập những số bất kỳ dương hoặc âm. Số lớn nhỏ đều được vì code chỉ xét dấu cộng trừ mà thôi. Cột nào để cộng thêm thì nhập số dương, cột để trừ đi thì nhập số âm. Ngoại trừ cột đầu và cuối dù là nhập âm dương thì code vẫn cho đó là dương, vì cột cuối là kết qua còn cột đầu được coi là cột TỒN ĐẦU. Các cột khác được coi là các cột NHẬP (cộng thêm) và XUẤT (trừ đi). Các cột NHẬP, XUẤT có thể ở thứ tự bất kỳ, không nhất thiết phải hết NHẬP mới tới XUẤT.

3. Với code mới này mà giải quyết bài ở chủ đề "bên kia" thì không cần thêm các cột TRỐNG nữa. Lúc này chỉ cần liệt kê bảng 1 và bảng Kết Quả. vd.

TH_dautien = Array(Array("'Sheet1'!B5", "'Sheet1'!E5"), Array(1, 1))

4. Với code mới khi chạy code thì sheet hiện hành có thể là sheet bất kỳ. Miễn là tập tin chứa code là tập tin hiện hành (khi mở nhiều tâp tin)
 

File đính kèm

  • CONG DON SL.xlsm
    67.9 KB · Đọc: 16
Upvote 0
Giải pháp
Tôi chỉ làm cho bạn lần cuối cùng. Cứ kiểu chốc chốc lại thêm yêu cầu thì tôi không chơi. Bạn đã có cơ hội để bổ sung mọi yêu cầu nên tôi không chấp nhận bổ sung thêm lần nào nữa.

Lưu ý:

1. Ở bài #1 bảng kết quả chỉ có những tên hàng xuất hiện ở bảng 1
Trích trong bài

Tức trong các bảng tiếp theo nếu có tên hàng mới chưa có ở bảng 1 thì code cũng không lấy vào bảng kết quả. Và trong code sửa cho yêu cầu mới cũng thế - cột kết quả chỉ có tên hàng xuất hiện ở bảng 1.

2. mảng TH_dautien bây giờ có dạng
TH_dautien = Array(Array("'Sheet1'!B3", "'Sheet1'!E3", "'Sheet1'!H3", "'Sheet1'!K3"), Array(1, 1, -1, 1))

- Array("'Sheet1'!B3", "'Sheet1'!E3", "'Sheet1'!H3", "'Sheet1'!K3")
Bảng 1 luôn ở vị trí đầu tiên, còn bảng kết quả nằm ở vị trí cuối cùng.
Bây giờ phải nhập cả tên sheet vì mỗi bảng có thể nằm ở sheet khác.
Mỗi mục có dạng "'<tên sheet>'!<đia chỉ ô Tên hàng đầu tiên>"
"'Sheet1'!H3"
có nghĩa là ô H3 trên sheet1.
'' là 2 dấu nháy đơn. Nếu tên sheet không có dấu cách thì cho phép bỏ cặp nháy đơn, ngược lại bắt buộc phải có.

- Array(1, 1, -1, 1)

Nhập những số bất kỳ dương hoặc âm. Số lớn nhỏ đều được vì code chỉ xét dấu cộng trừ mà thôi. Cột nào để cộng thêm thì nhập số dương, cột để trừ đi thì nhập số âm. Ngoại trừ cột đầu và cuối dù là nhập âm dương thì code vẫn cho đó là dương, vì cột cuối là kết qua còn cột đầu được coi là cột TỒN ĐẦU. Các cột khác được coi là các cột NHẬP (cộng thêm) và XUẤT (trừ đi). Các cột NHẬP, XUẤT có thể ở thứ tự bất kỳ, không nhất thiết phải hết NHẬP mới tới XUẤT.

3. Với code mới này mà giải quyết bài ở chủ đề "bên kia" thì không cần thêm các cột TRỐNG nữa. Lúc này chỉ cần liệt kê bảng 1 và bảng Kết Quả. vd.

TH_dautien = Array(Array("'Sheet1'!B5", "'Sheet1'!E5"), Array(1, 1))

4. Với code mới khi chạy code thì sheet hiện hành có thể là sheet bất kỳ. Miễn là tập tin chứa code là tập tin hiện hành (khi mở nhiều tâp tin)
Dạ em đã hiểu. chân thành cảm ơn anh đã bỏ thời gian giúp em
 
Upvote 0
Web KT

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

Back
Top Bottom