Giúp Code: lấy số liệu từ Sheet Tổng hợp và Sheet có liên quan. (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

Hong.Van

Busy
Tham gia
7/5/12
Bài viết
2,328
Được thích
1,765
Em chào Thầy cô & anh chị!
Xin vui lòng viết code giúp em: Trích dữ liệu từ Sheet Tổng hợp và Sheet có liên quan
Em có mô tả trong Sheet Yeucau
Em cảm ơn!
 

File đính kèm

/(/ếu là mình, mình sẽ làm vầy:

Đổi tên trang 'T00' thành 'Ton' để lưu trữ sản lượng tồn của mọi tháng (Mỗi tháng 2 cột), bắt đầu từ T00 như bạn.

Các trang sau T01 bỏ đi; Trang T01 chuyển thành tên 'Report'

Khi nào bạn cần số liệu tháng nào thể hiện trên Report thì cho chạy macro từ CF có trên trang Report;

(/ì bạn ít nhiều đã biết VBA, nên mình khuyên bạn thế này:

Nếu dữ liệu CQ bạn đồ sộ thì fải nhờ đến mảng để xử lí, còn không thì bạn thử dùng AdvancedFillter xem sao;

Mỗi cách có ưu khuyết của nó; ví như xài mảng thì bạn cần học thêm để biết về cách xài mảng (Chẳng lẻ mỗi thay đổi chu trình QL bạn lại lên GPE nhờ chỉnh sửa sao?)

Xài AdvancedFilter tuy có chậm như dễ nắm bắt & bạn dễ chủ động trong chỉnh sửa, bảo trì & fát triển;

Sau đó có thêm thời gian thì nắm thêm cách xài mảng . . . .

Hi vọng không cảm thấy fiền lòng!
 
Upvote 0
Đổi tên trang 'T00' thành 'Ton' để lưu trữ sản lượng tồn của mọi tháng (Mỗi tháng 2 cột), bắt đầu từ T00 như bạn.

Các trang sau T01 bỏ đi; Trang T01 chuyển thành tên 'Report'

Khi nào bạn cần số liệu tháng nào thể hiện trên Report thì cho chạy macro từ CF có trên trang Report;

(/ì bạn ít nhiều đã biết VBA, nên mình khuyên bạn thế này:

Nếu dữ liệu CQ bạn đồ sộ thì fải nhờ đến mảng để xử lí, còn không thì bạn thử dùng AdvancedFillter xem sao;

Mỗi cách có ưu khuyết của nó; ví như xài mảng thì bạn cần học thêm để biết về cách xài mảng (Chẳng lẻ mỗi thay đổi chu trình QL bạn lại lên GPE nhờ chỉnh sửa sao?)

Xài AdvancedFilter tuy có chậm như dễ nắm bắt & bạn dễ chủ động trong chỉnh sửa, bảo trì & fát triển;

Sau đó có thêm thời gian thì nắm thêm cách xài mảng . . . .

Hi vọng không cảm thấy fiền lòng!

Cảm ơn sự góp ý của bạn.
Trước đây mình cũng có ý tạo một Trang Report, khi nào cần chỉ lọc số liệu "Từ ngày Đến ngày" là ra kết qủa, nhưng vì mỗi tháng còn fải lập định mức, so sánh giá vốn doanh thu của từng mặt hàng ... để trình cho các sếp xem, vì các sếp muốn xem trực diện của từng tháng để so sánh hay làm gì đó ... Nên mình ý tưởng lập thành các Sheet T01, ...T12
Số liệu cũng khá nhiều, mình cũng đã viết code nhưng dựa trên công thức nên chạy khá chậm. Vì thế Nhờ thầy cô & anh chị viết giúp code này
Mình cũng đang lò mò code dạng mảng, nên cũng muốn các Thầy và anh chị giúp, và cũng từ đây mình có thể áp dụng nó vào một số bài thực tế khác có dạng tương tự
Em cảm ơn!
---------------------
P/S:
Hi vọng không cảm thấy fiền lòng!
Sự góp ý chính đáng có chi là fiền!
 
Upvote 0
Em chào Thầy cô & anh chị!
Xin vui lòng viết code giúp em: Trích dữ liệu từ Sheet Tổng hợp và Sheet có liên quan
Em có mô tả trong Sheet Yeucau
Em cảm ơn!
Thấy dạng bài này cũng "khoái" nhưng không phải trong nghề nên còn lờ mờ quá.
Để xem kỹ lại từng yêu cầu xem sao.
 
Upvote 0
Bài này chắc cũng không khó lắm nhưng chưa hiểu rõ yêu cầu nên chưa biết khởi động thế nào
Số lượng dòng có thay đổi hay không? Dữ liệu từ cột A đến D có thay đổi không?
Nếu dựa vào công thức để viêt code chắc đơn giản thôi.
 
Upvote 0
Bài này không khó, chỉ thử thách lòng kiên nhẫn của chúng ta thôi
Nếu xử lý trực tiếp trên sheet thì....dễ ẹct, nhưng nếu chơi mảng thì đúng là.....tra tấn
Anh Ba Tê & chú Quang Hải hổng biết làm kế toán dzồi, xem mình làm kế toán nè
Trong sheet tổng hợp phải đầy đủ các Mã Vật tư nhe bồ tèo, hổng đủ, code nó "tèo" dzáng chịu
Mình copy cái bảng qua kế bên để kiểm "cha" nhé, kết quả ở vùng A ==> N, bấm Ctrl + W chạy code
Hihi, viết xong cóc dám nhìn lại code, ghê quá. Kế toán rắc rối thật. Híc, xài được thì xài, còn không thì thôi, mình ngồi buồn viết đại, đừng hỏi tiếp
Thân
 

File đính kèm

Upvote 0
Em chào Thầy cô & anh chị!
Xin vui lòng viết code giúp em: Trích dữ liệu từ Sheet Tổng hợp và Sheet có liên quan
Em có mô tả trong Sheet Yeucau
Em cảm ơn!
Nếu "cái sườn" này giống nhau mỗi tháng thì dễ dàng hơn. Có thể làm nó giống nhau mỗi tháng được không?
 

File đính kèm

  • Hong.Van.JPG
    Hong.Van.JPG
    41.5 KB · Đọc: 86
Upvote 0
Nếu "cái sườn" này giống nhau mỗi tháng thì dễ dàng hơn. Có thể làm nó giống nhau mỗi tháng được không?

Cái sườn này mỗi tháng sẽ không giống nhau, mà tháng sau sẽ GIỐNG hoặc NHIỀU HƠN tháng trước (không có trường hợp ít hơn)
Em ví dụ: Tháng 12 của năm trước (Sheet T00) và Tháng 01 năm nay (Sheet T01) chưa có nhóm mã 1561 và các mã con là H001, H002, ....
|
A​
|
B​
|
C​
|
D
7​
|STT|Mã|Mặt hàng|ĐVT
8​
||HH||
9​
|II|152|KHO NGUYÊN VẬT LIỆU|
10​
|1|L001|Dầu DO|Lít
11​
|2|L002|Nhớt |Lít
12​
|III|153|KHO CÔNG CỤ DỤNG CỤ|
13​
|1|D001|Vỏ xe|Cái
14​
|2|D002|Săm xe|Cái
15​
|3|D003|Yếm xe|Cái
16​
|IV|155|KHO THÀNH PHẨM|
17​
|1|P001|Gạch thẻ|Viên
18​
|2|P002|Gạch ống|Viên
19​
|Cộng|||
(Hình của T00 và T01)

Bắt đầu từ Tháng 2 (Sheet T02) phát sinh mới Mã 1561 và các mã con (H001, H002...)
Đồng thời phát sinh thêm L003 của nhóm 152 và P003 của nhóm 155

|
A​
|
B​
|
C​
|
D
7​
|STT|Mã|Mặt hàng|ĐVT
8​
||HH||
9​
|I| 1561|KHO HÀNG HÓA|
10​
|1| H001|Cát bê tông|m³
11​
|2| H002|Cát xây tô|m³
12​
|3| H003|Cát lấp|m³
13​
|II|152|KHO NGUYÊN VẬT LIỆU|
14​
|1|L001|Dầu DO|Lít
15​
|2|L002|Nhớt |Lít
16​
|| L003|Mỡ bò|Kg
17​
|III|153|KHO CÔNG CỤ DỤNG CỤ|
18​
|1|D001|Vỏ xe|Cái
19​
|2|D002|Săm xe|Cái
20​
|3|D003|Yếm xe|Cái
21​
|IV|155|KHO THÀNH PHẨM|
22​
|1|P001|Gạch thẻ|Viên
23​
|2|P002|Gạch ống|Viên
24​
|| P003|Gạch ngói|Viên
25​
|Cộng|||
(Hình của T02)
----------------
Lý do, em muốn áp dụng cho nhiều Cty, Nếu Cty khác mà không có nhóm (Ví dụ 155) thì khi đưa vào các tháng thì nhìn nó kỳ kỳ!
-----------------
Code của Thầy Concogia, em Test thì thấy tất cả các tháng phải có cùng số nhóm, ví dụ 152, 153, 155, nếu qua tháng sau mà tăng thêm 1 nhóm, ví dụ thêm nhóm 1561 là bị báo lỗi
---------------
Em xin cảm ơn
 
Upvote 0
Hihi, bài này bắt đầu vui rồi đây
Gần hiểu rồi
Bi giờ túm lại ( lần 1) nhé
1- "Cái sườn" ( lời của anh Ba Tê) là do bạn nhập
2- Sườn của tháng sau phải bằng hoặc nhiều hơn tháng trước, đương nhiên_ nhắc lại thôi ( nhưng lỡ tháng trước tồn bằng không (zero) vậy có mang qua tháng sau không Trời ??? )
Công việc:
1)- Lấy tồn tháng trước bỏ vào tháng sau
2)- Dò xuất nhập ở sheet TH bỏ vào sheet hiện hành
3)- Tính toán "lung sờ tung" theo một đống công thức của bạn
Theo mình, có 2 yêu cầu:
1-- Trong sheet TH phải có đủ các Mã hàng hóa (H00..,L00....vv..) xuất hiện trong cái "sườn" của bạn theo từng tháng_ tức là trong bảng tổng hợp phải có đủ các Mã hàng hóa của Tồn đem qua, Xuất Nhập trong tháng_ "thú dzị": trong bài của bạn không có Mã D001 trong tháng T01 ( nếu không sẽ cực hơn tý tẹo )
2-- Công ty bạn có 4 cái kho đó hay nhiều hơn ???? Nếu nhiều hơn thì phải có cái bảng chứa những em này (152 ==> KHO NGUYÊN VẬT LIỆU, 1561==>KHO HÀNG HÓA, 15 gì đó==> KHO "GÌO ĐÍ"......)
Híc, chắc phải túm lại vài lần & kiên nhẫn lắm mới hy vọng xử "em" này được. Cứ "Nhập Xuất Tồn" ....đau cả đầu
Thân
 
Upvote 0
2- Sườn của tháng sau phải bằng hoặc nhiều hơn tháng trước, đương nhiên_ nhắc lại thôi ( nhưng lỡ tháng trước tồn bằng không (zero) vậy có mang qua tháng sau không Trời ???
1/ Tháng trước tồn cuối kỳ bằng không hay lớn hơn 0 (thậm chí số ÂM), thì vẫn mang sang Tồn đầy kỳ của tháng sau và tương ứng với các nhóm kho (1561, 152...) và các mã hàng (H001, H002, ...L001,..., ...)
2/ Nếu tháng trước chưa có Mã kho 1561 và các mã hàng H001, H002 ... khi qua tháng sau có thêm mã Kho và các mã hàng vừa nói thì Tồn đầu kỳ của nó = 0


Trong sheet TH phải có đủ các Mã hàng hóa (H00..,L00....vv..) xuất hiện trong cái "sườn" của bạn theo từng tháng_ tức là trong bảng tổng hợp phải có đủ các Mã hàng hóa của Tồn đem qua, Xuất Nhập trong tháng

Trong Sheet TH không bắt buộc xuất hiện đủ Nhập hay Xuất của các mã H001,..; L001,...; D001, ...; P001.... Bởi vì có những mặt hàng sẽ không nhập hoặc xuất trong một tháng, thậm chí một năm.
Và sẽ có trường hợp đặc biệt như : Tháng 2 là TẾT -> nghĩ mua - bán, do đó bên Sheet TH sẽ không có các dòng phát sinh cho tháng 2, nhưng vẫn có Sheet T02 (như vậy Sheet T02 chỉ có các số liệu như sau: lấy tồn cuối kỳ của T001 làm Tồn đầu kỳ cho T002, Tính "ĐGBQ" cột J (cách tính giống như Công thức của em, để tránh báo lỗi #DIV/0!) và tính tồn cuối kỳ (cột L &M))

_ "thú dzị": trong bài của bạn không có Mã D001 trong tháng T01 ( nếu không sẽ cực hơn tý tẹo)

Trong bài 1 của em Mã D001 trong tháng 1, em không nhập xuất là ý em muốn như trên

Công ty bạn có 4 cái kho đó hay nhiều hơn ???? Nếu nhiều hơn thì phải có cái bảng chứa những em này (152 ==> KHO NGUYÊN VẬT LIỆU, 1561==>KHO HÀNG HÓA, 15 gì đó==> KHO "GÌO ĐÍ"......)
Dạ em chỉ 4 kho, xào đi xào lại chắc đủ sài!
----------------
Lưu ý cho em 1 trường hợp đặc biệt nữa: Ví dụ Công ty mới thành lập tháng 03/2012 (Nghĩa là tháng ba mới bắt đầu có mã Kho (1561, 152,...) và các mã hàng (H001, ...;L001,...) Em vẫn để tồn tại các sheet T00 (của Tháng 12 năm trước) T01, T02 (của tháng 1, 2 năm nay) Nhưng các Mã kho và hàng sẽ không có (nghĩa là các sheet T00, T01, T02 sẽ không có số liệu từ hàng thứ 9 trở xuống) Như vậy, ai có chạy code tại các Sheet T01, T02 sẽ không bị báo lỗi
Em cảm ơn!
 
Upvote 0
1/ Tháng trước tồn cuối kỳ bằng không hay lớn hơn 0 (thậm chí số ÂM), thì vẫn mang sang Tồn đầy kỳ của tháng sau và tương ứng với các nhóm kho (1561, 152...) và các mã hàng (H001, H002, ...L001,..., ...)
2/ Nếu tháng trước chưa có Mã kho 1561 và các mã hàng H001, H002 ... khi qua tháng sau có thêm mã Kho và các mã hàng vừa nói thì Tồn đầu kỳ của nó = 0
Trong Sheet TH không bắt buộc xuất hiện đủ Nhập hay Xuất của các mã H001,..; L001,...; D001, ...; P001.... Bởi vì có những mặt hàng sẽ không nhập hoặc xuất trong một tháng, thậm chí một năm.
Và sẽ có trường hợp đặc biệt như : Tháng 2 là TẾT -> nghĩ mua - bán, do đó bên Sheet TH sẽ không có các dòng phát sinh cho tháng 2, nhưng vẫn có Sheet T02 (như vậy Sheet T02 chỉ có các số liệu như sau: lấy tồn cuối kỳ của T001 làm Tồn đầu kỳ cho T002, Tính "ĐGBQ" cột J (cách tính giống như Công thức của em, để tránh báo lỗi #DIV/0!) và tính tồn cuối kỳ (cột L &M))



Trong bài 1 của em Mã D001 trong tháng 1, em không nhập xuất là ý em muốn như trên


Dạ em chỉ 4 kho, xào đi xào lại chắc đủ sài!
----------------
Lưu ý cho em 1 trường hợp đặc biệt nữa: Ví dụ Công ty mới thành lập tháng 03/2012 (Nghĩa là tháng ba mới bắt đầu có mã Kho (1561, 152,...) và các mã hàng (H001, ...;L001,...) Em vẫn để tồn tại các sheet T00 (của Tháng 12 năm trước) T01, T02 (của tháng 1, 2 năm nay) Nhưng các Mã kho và hàng sẽ không có (nghĩa là các sheet T00, T01, T02 sẽ không có số liệu từ hàng thứ 9 trở xuống) Như vậy, ai có chạy code tại các Sheet T01, T02 sẽ không bị báo lỗi
Em cảm ơn!

Tui không phải dân kế toán, nhưng với "công chuyện" của Excel thì tôi nghĩ như vầy:
_ Cửa hàng tui bán 100 mặt hàng.
_ Mỗi thàng tui thống kê 100 mặt hàng này, thằng nào giao dich bi nhiêu, bi nhiêu? (thằng nào không giao dịch trong tháng đó bỏ qua, không thống kê, không cho nó bằng 0, hổng phải là thống kê.)
_ Làm những chuyện không giống ai, híc! khó làm lắm!
(dù là cò già vẫn làm được)
_



 
Upvote 0
Mình cũng thử viết code nhưng loay hoay mãi hình như hỏng hiểu nên đành dừng lại. Mấy file kế toán này khó nhai quá đi. mà hình như dữ liệu cung cấp ít quá nên thấy thiếu cơ sở để suy đoán.
 
Upvote 0
Tui không phải dân kế toán, nhưng với "công chuyện" của Excel thì tôi nghĩ như vầy:
_ Cửa hàng tui bán 100 mặt hàng.
_ Mỗi thàng tui thống kê 100 mặt hàng này, thằng nào giao dich bi nhiêu, bi nhiêu? (thằng nào không giao dịch trong tháng đó bỏ qua, không thống kê, không cho nó bằng 0, hổng phải là thống kê.)
_
Phần chữ màu đỏ em không hiểu lắm
tháng nào mã nào không phát sinh mua bán thì fần nhập xuất nó bằng 0, nó chỉ có thể tồn hàng đầy kỳ hay cuối kỳ mà thôi, hoặc chỉ tồn tại cái tên trên các sheet T01,... T12 mà thôi
Chữ màu xanh: không cho nó bằng 0 , em cũng không hiểu luôn!
Vì em không biết lập trình nêm không biết chỗ khó của lập trình!
Thầy cứ giúp em viết code theo cách có thể nhất!
Em cảm ơn các thầy & anh chị!
 
Upvote 0
Phần chữ màu đỏ em không hiểu lắm
tháng nào mã nào không phát sinh mua bán thì fần nhập xuất nó bằng 0, nó chỉ có thể tồn hàng đầy kỳ hay cuối kỳ mà thôi, hoặc chỉ tồn tại cái tên trên các sheet T01,... T12 mà thôi
Chữ màu xanh: không cho nó bằng 0 , em cũng không hiểu luôn!
Vì em không biết lập trình nêm không biết chỗ khó của lập trình!
Thầy cứ giúp em viết code theo cách có thể nhất!
Em cảm ơn các thầy & anh chị!

Chắc ý bác Ba Tê muốn là các mục cột A B C D ở sheet kết quả T01 T02,..., là giống nhau và bao hàm tất cả các khoản mục lớn con và giống nhau, khi đó nếu khoản mục nào không có phát sinh trong tháng thì để 0 cái nào có thì đền vào
==> nếu được thế sẽ code nhanh hơn,

------------------

bạn nên cho biết rõ phần cột A B C D - ở các sheet Kết quả T01,T02,... vv Thì là do bạn nhập vào trước hay là muốn code tự động liệt kê ra
-(dĩ nhiên T00 hoặc của tháng trước tháng bắt đầu phải luôn có sẵn cả số liệu)

+ Nếu bạn nhập trước thì phải đảm bảo list đủ các khoản mục phát sinh trong tháng đó
+ Nếu muốn code tự động - thì cần phải chỗ nào cung cấp dữ liệu vào là các tên cụ thể cho cột C (hay là để trống.
 
Upvote 0
Chắc ý bác Ba Tê muốn là các mục cột A B C D ở sheet kết quả T01 T02,..., là giống nhau và bao hàm tất cả các khoản mục lớn con và giống nhau, khi đó nếu khoản mục nào không có phát sinh trong tháng thì để 0 cái nào có thì đền vào
==> nếu được thế sẽ code nhanh hơn,
Ở các cột A, B, C. D chì có thể giống nhau là kho hàng (1561, 152, 153, hay 155) nhưng không thể giống nhau ở các mã hàng con như H099, giả sử tháng 01 không có mã H099 nhưng đến tháng 12 thì phát sinh thêm mã này, lúc đó lại quay về các tháng trước để add mã này vào thì fức tạp

bạn nên cho biết rõ phần cột A B C D - ở các sheet Kết quả T01,T02,... vv Thì là do bạn nhập vào trước hay là muốn code tự động liệt kê ra
-(dĩ nhiên T00 hoặc của tháng trước tháng bắt đầu phải luôn có sẵn cả số liệu)

+ Nếu bạn nhập trước thì phải đảm bảo list đủ các khoản mục phát sinh trong tháng đó
+ Nếu muốn code tự động - thì cần phải chỗ nào cung cấp dữ liệu vào là các tên cụ thể cho cột C (hay là để trống.
Phần cột A, B, C, D của các sheet kết qủa là do em tự nhập tay vào trước khi chạy code
Và code không tự động chạy và nằm trên Module
Em cảm ơn!
 
Upvote 0
Ở các cột A, B, C. D chì có thể giống nhau là kho hàng (1561, 152, 153, hay 155) nhưng không thể giống nhau ở các mã hàng con như H099, giả sử tháng 01 không có mã H099 nhưng đến tháng 12 thì phát sinh thêm mã này, lúc đó lại quay về các tháng trước để add mã này vào thì fức tạp


Phần cột A, B, C, D của các sheet kết qủa là do em tự nhập tay vào trước khi chạy code
Và code không tự động chạy và nằm trên Module
Em cảm ơn!

Nếu thế thì code của bác concogia ở trên #8 có thể ứng dụng được

bạn đã thử chưa, và còn muốn khác thế nào nữa? hay còn tồn tại gì?
 
Upvote 0
Hihi, hiểu thêm tý tẹo
Thử bài này, không biết dữ liệu thật nhiều hông, làm kết quả trên sheet, phải làm đúng đã, có gì tính sau
vodoi2x
Nếu thế thì code của bác concogia ở trên #8 có thể ứng dụng được
Cái này vẫn chưa đủ bạn vodoi2x ạ vì những mã có trong cái sườn của bạn í mà cóc có trong bảng tổng hợp mới....... tèo chứ. Híc, kế với chả toán, chỉ tổ nhức đầu, Ba Tê trốn đâu mất tiêu dzồi, ra đây nhưc đầu chơi
Híc
 

File đính kèm

Upvote 0
Hihi, hiểu thêm tý tẹo
Thử bài này, không biết dữ liệu thật nhiều hông, làm kết quả trên sheet, phải làm đúng đã, có gì tính sau

Cái này vẫn chưa đủ bạn vodoi2x ạ vì những mã có trong cái sườn của bạn í mà cóc có trong bảng tổng hợp mới....... tèo chứ. Híc, kế với chả toán, chỉ tổ nhức đầu, Ba Tê trốn đâu mất tiêu dzồi, ra đây nhưc đầu chơi
Híc
Đang "theo dõi" và uống thuốc nhức đầu nè "Chời". Mấy hôm "gồi" đâu có bỏ qua, nhưng hổng dám "xía dzô" sợ "tầm bậy"
Híc!
 
Upvote 0
Hihi, hiểu thêm tý tẹo
Thử bài này, không biết dữ liệu thật nhiều hông, làm kết quả trên sheet, phải làm đúng đã, có gì tính sau

Cái này vẫn chưa đủ bạn vodoi2x ạ vì những mã có trong cái sườn của bạn í mà cóc có trong bảng tổng hợp mới....... tèo chứ. Híc, kế với chả toán, chỉ tổ nhức đầu, Ba Tê trốn đâu mất tiêu dzồi, ra đây nhưc đầu chơi
Híc

Ah, code cũ đúng thế thật vì bác số sánh gữa dton và dNx và loằng ngoằng loạn xị khó đọc thật

còn CODE mới lại không dùng Mảng cho vùng kết quả nữa ah, bác dùng RANGE rồi, lại khó đọc hơn đúng là chỉ bác cò mới thuộc đường đi lối về hihii

Sao bác không dùng code cũ là được, rui căn cứ vào ký tự I , II, ...IV của cột A vùng kết quả (hoặc cột B với SÓ 1561,152,...) mà xử các cái KHO
(dĩ nhiên khi đó khuyến cáo cho người nhập dữ liệu cột A)
thế là dễ dàng lên nhiều
 
Upvote 0
Ah, code cũ đúng thế thật vì bác số sánh gữa dton và dNx và loằng ngoằng loạn xị khó đọc thật

còn CODE mới lại không dùng Mảng cho vùng kết quả nữa ah, bác dùng RANGE rồi, lại khó đọc hơn đúng là chỉ bác cò mới thuộc đường đi lối về hihii

Sao bác không dùng code cũ là được, rui căn cứ vào ký tự I , II, ...IV của cột A vùng kết quả (hoặc cột B với SÓ 1561,152,...) mà xử các cái KHO
(dĩ nhiên khi đó khuyến cáo cho người nhập dữ liệu cột A)
thế là dễ dàng lên nhiều
Híc, ban đầu định không làm, tính "ghẹo" Ba Tê thôi, làm thử tí tẹo khích Ba Tê không ngờ ......sa vào bãi cát lún luôn
Nếu hiểu đúng & còn muốn viết thì phải viết lại từ đầu bạn ạ, đúng "nhàn cư vi ......mất ngủ"
Híc 3 cái
 
Upvote 0
Em tung code này ra chắc anh Cò và anh Bate lắc đầu ngao ngán đây. Viết xong hỏng dám đọc lại code, thấy ghê quá.

Bấm Ctrl + R để chạy code
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Thêm một cái ghê nữa nè, cũng không dám nhìn lại code
Híc

Vậy giờ dám nhìn lại chính code đã sửa từ code chính của bác không

CODE này được phát triển từ code ver1 của bac concogia (nên công thức các cột tính toán độ chính xác có gì hỏi bác Concogia nhé), cảm ơn bác Concogia,
------------
Hoàn thiện code hơn, đảm bảo

- cho phép kiểm soát lỗi: chỉ cho phép chạy macro khi đứng ở Sheet có tên T01,T02,...T12,
- báo lỗi khi không có dữ liệu, không có sheet T## trước đó, vv

- Bấm Ctrl+R để chạy chương trình
- Bấm Ctrl+Shift+R để xóa kết quả (khi muốn xem chạy lại)

------------
Code đã tinh chỉnh lại:

- nhanh hơn , vì chỉ nhặt vào dic những số liệu từ tổng hợp ứng với tháng đang tính toán mà thui

- sử dụng Array tối đa, không sủ dụng hàm , công thức hay range khác

- Viết gọn code lại chút,

---------------
cuối cùng chú ý:
Việc căn nhóm là dựa vào các ký tự chữ I II III,.... cột A của sheet kết quả --> vì thế chú ý khi nhập liệu cột A phải được chuẩn hóa là các Tài khoản (KHO) thì đánh số la mã (hoặc ký tự A B C...) còn các các mã mục nhỏ thì đánh số 1 2 3 .... như hiện tại, và đánh thứ tự liên tục (không có cell trống là tốt nhất )
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Em xin cảm ơn tấm lòng lòng của tất cả các Thầy & anh đã giúp em!
Em sẽ test tất cả các code, có gì vướng mắc em sẽ nhờ các thầy & anh giúp đỡ.
 
Upvote 0
Em tung code này ra chắc anh Cò và anh Bate lắc đầu ngao ngán đây. Viết xong hỏng dám đọc lại code, thấy ghê quá.

Bấm Ctrl + R để chạy code
1/Code của anh sẽ tạo ra luôn các mục cột A, B, C, D như vậy trong các tháng sau mà có thêm mã hàng mới thì fải làm sao, VD thêm Mã H004, H005 ...Em nghĩ anh chỉ cần tạo kết qủa từ cột E đến cột M, còn các cột A, B, C, D là các cột bắt buộc có dữ liệu trước khi chạy code

2/ Khi chạy code của tháng 3 (T03) thì lúc này sheet TH chưa có tháng 3, em muốn kết qủa của T03 vẫn lấy tồn cuối kỳ tháng trước sang (lấy tồn cuối kỳ của T02), vẫn tạo kết quả tại cột "ĐGBQ" (cột J) và tạo kết qủa cuối kỳ tại cột L & M

3/ Hôm qua em quên, Cột A (số thứ tự) là kết quả do 1 code khác chạy nên, nếu anh sửa code thì đừng dựa vào nó để viết code!
Em cảm ơn!
 
Upvote 0
cuối cùng chú ý:
Việc căn nhóm là dựa vào các ký tự chữ I II III,.... cột A của sheet kết quả --> vì thế chú ý khi nhập liệu cột A phải được chuẩn hóa là các Tài khoản (KHO) thì đánh số la mã (hoặc ký tự A B C...) còn các các mã mục nhỏ thì đánh số 1 2 3 .... như hiện tại, và đánh thứ tự liên tục (không có cell trống là tốt nhất )

Hôm qua vì vội trả lời mà em quên cột A (cột số thứ tự La mã và số) của các sheet kết qủa được tạo ra là do chạy một code khác

Như vậy dữ liệu ở các sheet kết qủa tại các cột B, C, D là nhập = tay (hoặc copy các tháng trước rồi thêm vào các mã mới nếu có phát sinh thêm)

Anh có thể giúp em lại một lần nữa là sửa code lại
Em thành thật xin lỗi anh và các Thầy vì đã làm mất thời gian và công sức của mọi người.
Em cảm ơn!
 
Upvote 0
Hôm qua vì vội trả lời mà em quên cột A (cột số thứ tự La mã và số) của các sheet kết qủa được tạo ra là do chạy một code khác

Như vậy dữ liệu ở các sheet kết qủa tại các cột B, C, D là nhập = tay (hoặc copy các tháng trước rồi thêm vào các mã mới nếu có phát sinh thêm)

Anh có thể giúp em lại một lần nữa là sửa code lại
Em thành thật xin lỗi anh và các Thầy vì đã làm mất thời gian và công sức của mọi người.
Em cảm ơn!

Dù do code khác tạo ra, nhưng vẫn theo quy luật tôi viết trên, thì vẫn không vấn đề gì

-----------
Còn muốn phân biệt KHO (khác so với các mã con) dựa vào cột B thì lấy file kèm sau,

Chú ý tại B chỉ có các tài khoản khó là 1 số (number) các khoản mục (mã) con đều là dạng chuỗi ký tự nhé (hiện luôn là ký tự vì bắt đầu bằng chữ cái: H , L...)

Mọi vấn đề khác giống như code trước đề cập bài trên với các bẫy lỗi đầy đủ
như thử bấm Ctrl+R chạy code ở sheet TH , TH00 hay bất cứ sheets nào không thuộc T01-T12 thì đều có báo lỗi và không chạy code
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Dù do code khác tạo ra, nhưng vẫn theo quy luật tôi viết trên, thì vẫn không vấn đề gì

-----------
Còn muốn phân biệt KHO (khác so với các mã con) dựa vào cột B thì lấy file kèm sau,

Chú ý tại B chỉ có các tài khoản khó là 1 số (number) các khoản mục (mã) con đều là dạng chuỗi ký tự nhé (hiện luôn là ký tự vì bắt đầu bằng chữ cái: H , L...)

Mọi vấn đề khác giống như code trước đề cập bài trên với các bẫy lỗi đầy đủ
như thử bấm Ctrl+R chạy code ở sheet TH , TH00 hay bất cứ sheets nào không thuộc T01-T12 thì đều có báo lỗi và không chạy code

Em đã test thử một số điều kiện và thấy chạy tốt
Còn một điểm hạn chế Các Thầy & anh giúp em chỗ này

1/Trong sheet "TH" của em chưa có ghi số liệu tháng 3, Giả sử tháng 3 là tháng "ăn chơi" trong suốt tháng 3 công ty sẽ KHÔNG NHẬP VÀ XUẤT, Như vậy khi chạy code tháng 3 thì chỉ cho kết quả Tồn đầu kỳ của tháng 3. Bây giờ em muốn cho kết qủa ở cột "ĐGBQ" (cột J) (nếu điều này không fức tạp) và cho kết qủa tồn cuối kỳ (cột L và M). Vì nếu không có kết qủa này thì sang tháng 4 (T04) số dư đầu kỳ của tháng này sẽ không lấy được của cuối kỳ tháng 03

2/ Mặt khác em thấy, nếu trong 1 tháng mà TOÀN BỘ Mã con Không CÓ NHẬP VÀ XUẤT thì kết qủa giống như mục 1 nói trên (VÍ DỤ: Bên sheet TH, trong tháng 02, ta Delete toàn bộ nhập xuất của các mã có chữ L đầu)


------------------
Nhân đây em xin các Thầy & anh viết giúp em code kết quả cho cả MỘT NĂM (nghĩa là lấy toàn bộ nhập xuất của một năm) và em đặt tên cho nó là sheet T13
(Em có làm công thức trong T13)
Em xin mô tả như sau:
Về số liệu kho hàng như mã 1561, 152, 153, 155 thì vẫn giống như code lấy cho kết quả từng tháng

Còn các mã con thì em lấy ví dụ mã H001 như sau
Tồn đầu kỳ cột E & F : vẫn lấy tồn cuối kỳ của sheet T00
Cột G, H, I : trước đây em dùng hàm SUMPRODUCT() để lấy kết quả, nay em chỉ dùng hàm SUMIF()
Cột J : Không tính
Cột K: trước đây em dùng công thức K10=I10*J10, nhưng bây giờ em dùng Hàm SUMIF()
Và cột L và M tính giống như trước

Em xin cảm ơn các Thầy cô & anh chị
---------------
P/s: vì em đang muốn áp dụng code ở đề tài này để áp dụng cho một số bài thực tế khác có cấu trúc gần giống, nếu chỗ đọan code nào khó thì cho ghi cho em vài lời ghi chú giải thích
 

File đính kèm

Upvote 0
Em đã test thử một số điều kiện và thấy chạy tốt
Còn một điểm hạn chế Các Thầy & anh giúp em chỗ này

1/Trong sheet "TH" của em chưa có ghi số liệu tháng 3, Giả sử tháng 3 là tháng "ăn chơi" trong suốt tháng 3 công ty sẽ KHÔNG NHẬP VÀ XUẤT, Như vậy khi chạy code tháng 3 thì chỉ cho kết quả Tồn đầu kỳ của tháng 3. Bây giờ em muốn cho kết qủa ở cột "ĐGBQ" (cột J) (nếu điều này không fức tạp) và cho kết qủa tồn cuối kỳ (cột L và M). Vì nếu không có kết qủa này thì sang tháng 4 (T04) số dư đầu kỳ của tháng này sẽ không lấy được của cuối kỳ tháng 03

2/ Mặt khác em thấy, nếu trong 1 tháng mà TOÀN BỘ Mã con Không CÓ NHẬP VÀ XUẤT thì kết qủa giống như mục 1 nói trên (VÍ DỤ: Bên sheet TH, trong tháng 02, ta Delete toàn bộ nhập xuất của các mã có chữ L đầu)


------------------
Nhân đây em xin các Thầy & anh viết giúp em code kết quả cho cả MỘT NĂM (nghĩa là lấy toàn bộ nhập xuất của một năm) và em đặt tên cho nó là sheet T13
(Em có làm công thức trong T13)
Em xin mô tả như sau:
Về số liệu kho hàng như mã 1561, 152, 153, 155 thì vẫn giống như code lấy cho kết quả từng tháng

Còn các mã con thì em lấy ví dụ mã H001 như sau
Tồn đầu kỳ cột E & F : vẫn lấy tồn cuối kỳ của sheet T00
Cột G, H, I : trước đây em dùng hàm SUMPRODUCT() để lấy kết quả, nay em chỉ dùng hàm SUMIF()
Cột J : Không tính
Cột K: trước đây em dùng công thức K10=I10*J10, nhưng bây giờ em dùng Hàm SUMIF()
Và cột L và M tính giống như trước

Em xin cảm ơn các Thầy cô & anh chị
---------------
P/s: vì em đang muốn áp dụng code ở đề tài này để áp dụng cho một số bài thực tế khác có cấu trúc gần giống, nếu chỗ đọan code nào khó thì cho ghi cho em vài lời ghi chú giải thích

Code bên trong dễ như đám rừng vậy đó nên không có chỗ nào cần chú thích cả đâu nhé.
Sheet T13 thì có nút bấm, những sheet kia thì CTRL + R để chạy code

PS: Nhớ phản hồi xem cái đám rừng kia mần ăn gì được không nhé
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Code bên trong dễ như đám rừng vậy đó nên không có chỗ nào cần chú thích cả đâu nhé.
Sheet T13 thì có nút bấm, những sheet kia thì CTRL + R để chạy code

PS: Nhớ phản hồi xem cái đám rừng kia mần ăn gì được không nhé
Em đã Test với dữ liệu nhỏ thì thấy rất tốt, để em tạo dữ liệu nhiều thì xem kết qủa ra sao?
Hi, như đám rừng thiệt, nhưng quan trọng em đọc có dễ hiểu không, từ đó có thể áp dụng vào các File khác.
-----------------
Anh vodoi2x vẫn giúp em hoàn tất bài trên nha, code của anh có điểm đặc biệt là hiện các thông báo
Mặt khác em vẫn muốn học cái hay của mỗi người.

Em xin cảm ơn tất cả các Thầy & anh chị!
 
Upvote 0
-----------------
Anh vodoi2x vẫn giúp em hoàn tất bài trên nha, code của anh có điểm đặc biệt là hiện các thông báo
Mặt khác em vẫn muốn học cái hay của mỗi người.

Em xin cảm ơn tất cả các Thầy & anh chị!

Muốn học gì thì cứ túm co........^^^^?cổ bác concogia nhe (hihiii) - vì code chính của bác ấy mà, tôi chỉ thêm mắm muối vào thôi và thêm chút bột ngọt nữa

Giờ không căn cứ vào giá trị số hay text của cột B (sheets kết quả) nữa, mà xem mã của cột B này có thuộc 4 tài khoản trong HẰNG SỐ tkChinh = "#1561#152#153#155#"
bấm Alt+F11 Mở code sẽ thấy 2 dòng này ngay module
PHP:
Const tkChinh = "#1561#152#153#155#" 'hang so cho phep Thay doi tai khoan CHINH
Const stRow = 9 'hang so dong bat dau cho phan du lieu cua tat cac sheet du lieu, ket qua
Bạn có thể bổ sung TÀI KHOẢN CHÍNH vào đây khi cần tăng thêm KHO (dĩ nhiên cho dư cũng được, nhưng nhớ là không thiếu và trùng các mã con hàng hóa )

-------------
Code vẫn thế chỉ sửa chút cho phép chạy ở sheet T13 - nên từ T01 ->T13 vẫn cứ bấm Ctrl+R để chạy và Ctrl+Shift+R để xóa
Mọi báo lỗi vẫn thế
 

File đính kèm

Upvote 0
Code bên trong dễ như đám rừng vậy đó nên không có chỗ nào cần chú thích cả đâu nhé.
Sheet T13 thì có nút bấm, những sheet kia thì CTRL + R để chạy code

PS: Nhớ phản hồi xem cái đám rừng kia mần ăn gì được không nhé
Em đã kiểm tra và code còn một lỗi như sau:
Tại Sheet TH, anh xóa cột B ( cột Ngày)
Tại Sheet T01, anh chạy code. Kết quả là nó vẫn cho kết qủa tại cell G10 và H10
Em cảm ơn
-----------
Mấy ngày nghiên cứu code của các Thầy & các anh, em thấy em còn mông lung quá! Không biết có thể áp dụng cho các bài khác của em được kg nữa!
 
Upvote 0
Em đã kiểm tra và code còn một lỗi như sau:
Tại Sheet TH, anh xóa cột B ( cột Ngày)
Tại Sheet T01, anh chạy code. Kết quả là nó vẫn cho kết qủa tại cell G10 và H10
Em cảm ơn
-----------
Mấy ngày nghiên cứu code của các Thầy & các anh, em thấy em còn mông lung quá! Không biết có thể áp dụng cho các bài khác của em được kg nữa!

Có ngon thì xóa cột C của sheet TH thì biết liền

Gần 1 tháng giờ mới phản hồi, hic....
 
Lần chỉnh sửa cuối:
Upvote 0
Xóa cột C thì em biết rồi


Hôm nay em vô tình xóa cột B rồi chạy code, thấy nó như vậy nên thông báo với anh

H Van thử thay thế điều kiện ở cột C thành cột B coi được không. Dùng hàm Month(cot B) +100 rồi dùng hàm right lấy 2 ký tự cuối, kết hợp chữ T thì được rồi.
 
Upvote 0
Muốn học gì thì cứ túm co........^^^^?cổ bác concogia nhe (hihiii) - vì code chính của bác ấy mà, tôi chỉ thêm mắm muối vào thôi và thêm chút bột ngọt nữa

Giờ không căn cứ vào giá trị số hay text của cột B (sheets kết quả) nữa, mà xem mã của cột B này có thuộc 4 tài khoản trong HẰNG SỐ tkChinh = "#1561#152#153#155#"
bấm Alt+F11 Mở code sẽ thấy 2 dòng này ngay module
PHP:
Const tkChinh = "#1561#152#153#155#" 'hang so cho phep Thay doi tai khoan CHINH
Const stRow = 9 'hang so dong bat dau cho phan du lieu cua tat cac sheet du lieu, ket qua
Bạn có thể bổ sung TÀI KHOẢN CHÍNH vào đây khi cần tăng thêm KHO (dĩ nhiên cho dư cũng được, nhưng nhớ là không thiếu và trùng các mã con hàng hóa )

-------------
Code vẫn thế chỉ sửa chút cho phép chạy ở sheet T13 - nên từ T01 ->T13 vẫn cứ bấm Ctrl+R để chạy và Ctrl+Shift+R để xóa
Mọi báo lỗi vẫn thế
Em chào Thầy cô & anh chị!
Em có áp dụng code bài #34 vào thực tế như sau
Mã:
Option Explicit


Const tkChinh = "#1561#152#153#155#" 'hang so cho phep Thay doi tai khoan CHINH
Const stRow = 9 'hang so dong bat dau cho phan du lieu cua tat cac sheet du lieu, ket qua


'bam phim tat Ctrl+R
'by vodoi2x vodoi2x vodoi2x vodoi2x vodoi2x
'main code from Concogia GPE


Sub TH()
    
    Dim CoT13 As Boolean, dTon As Object, dNx As Object, wSp As Worksheet, TongHop, ArrNx, aTon, kQ, ArrKq
    Dim i As Long, k As Long, kK As Long, MM As Long, j As Long, n As Long, nk As Long, tmP As String, WsPre, sT As String


'Kiem soat loi va nhap du lieu
    sT = Trim(UCase(ActiveSheet.Name))
    If Not sT Like "T##" Then MsgBox "Phai chay macro nay tai sheet " & Chr(13) & " T##:  T01,T02,...,T12,  T13", , "sub TH": Exit Sub
    MM = Val(Right(sT, 2))
    If MM < 1 Or MM > 13 Then MsgBox "Phai chay macro nay tai sheet " & Chr(13) & " T##:  T01,T02,...,T12   T13", , "sub TH": Exit Sub
    
    CoT13 = (MM = 13): k = IIf(CoT13, 0, MM - 1)
    On Error Resume Next
    Set wSp = Sheets("T" & Format(k, "00"))
    On Error GoTo 0
    If wSp Is Nothing Then MsgBox "Khong ton tai sheet ky truoc " & "T" & Format(k, "00"), , "sub TH": Exit Sub
    
    With wSp
        k = .[B65536].End(xlUp).Row
        If k < stRow Then MsgBox "Khong ton tai du lieu TON o sheet " & wSp.Name, , "sub TH": Exit Sub
        aTon = .Range("B" & stRow & ":B" & k).Resize(, 12).Value
    End With
    
    With Sheets("TH")
        k = .[C65536].End(xlUp).Row
        If k < stRow Then MsgBox "Khong ton tai du lieu o file tong hop", , "sub TH": Exit Sub
        TongHop = .Range("C" & stRow & ":C" & k).Resize(, 15)
    End With
    ReDim ArrNx(1 To UBound(TongHop), 1 To 4)
    
    k = [B65536].End(xlUp).Row
    If k < stRow Then MsgBox "Khong ton tai du lieu o Sheet hien tai", , "sub TH": Exit Sub
    kQ = Range("B" & stRow & ":B" & k).Value
    nk = UBound(kQ) + 1: ReDim ArrKq(1 To nk, 1 To 9)
    
'Tinh toan
    Set dNx = CreateObject("scripting.dictionary")
    n = IIf(CoT13, 4, 3)
    For i = 1 To UBound(TongHop)
        If CoT13 Or UCase(Trim(TongHop(i, 1))) = sT Then
            tmP = TongHop(i, 9)
            If Not dNx.exists(tmP) Then
                    k = k + 1:  dNx.Add tmP, k:  kK = k
            Else:   kK = dNx.Item(tmP):    End If
            
            For j = 1 To n
                [COLOR=#ff0000][B]ArrNx(kK, j) = ArrNx(kK, j) + TongHop(i, 11 + j)[/B][/COLOR]
            Next j
        End If
   Next i
   
   Set dTon = CreateObject("scripting.dictionary")
   With wSp
        For i = 1 To UBound(aTon)
            If Not dTon.exists(aTon(i, 1)) Then dTon.Add aTon(i, 1), Array(aTon(i, 11), aTon(i, 12))
        Next i
   End With
   
   For i = 1 To nk - 1  'nk-1=Ubound(kq)
        tmP = Trim(kQ(i, 1))
        If tmP <> "" Then
            If InStr(1, tkChinh, "#" & tmP & "#", vbTextCompare) Then
                k = i
            Else
                If dTon.exists(tmP) Then
                    ArrKq(i, 1) = dTon.Item(tmP)(0):            ArrKq(i, 2) = dTon.Item(tmP)(1)
                    ArrKq(k, 1) = ArrKq(k, 1) + ArrKq(i, 1):    ArrKq(k, 2) = ArrKq(k, 2) + ArrKq(i, 2)
                    ArrKq(nk, 1) = ArrKq(nk, 1) + ArrKq(i, 1):  ArrKq(nk, 2) = ArrKq(nk, 2) + ArrKq(i, 2)
                End If
            
                If dNx.exists(tmP) Then
                    For j = 3 To 5
                        ArrKq(i, j) = ArrNx(dNx.Item(tmP), j - 2)
                    Next j
                    If CoT13 Then ArrKq(i, 7) = ArrNx(dNx.Item(tmP), 4)
                End If
                
                If Not CoT13 Then
                    If ArrKq(i, 1) + ArrKq(i, 3) <> 0 Then ArrKq(i, 6) = (ArrKq(i, 2) + ArrKq(i, 4)) / (ArrKq(i, 1) + ArrKq(i, 3))
                    If ArrKq(i, 5) <> 0 Then ArrKq(i, 7) = ArrKq(i, 5) * ArrKq(i, 6)
                End If
                
                If ArrKq(i, 1) <> 0 Or ArrKq(i, 3) <> 0 Or ArrKq(i, 5) <> 0 Then ArrKq(i, 8) = ArrKq(i, 1) + ArrKq(i, 3) - ArrKq(i, 5)
                If ArrKq(i, 2) <> 0 Or ArrKq(i, 4) <> 0 Or ArrKq(i, 7) <> 0 Then ArrKq(i, 9) = ArrKq(i, 2) + ArrKq(i, 4) - ArrKq(i, 7)
                
                For j = 3 To 9
                    If j <> 6 And ArrKq(i, j) <> 0 Then ArrKq(k, j) = ArrKq(k, j) + ArrKq(i, j):   ArrKq(nk, j) = ArrKq(nk, j) + ArrKq(i, j)
                Next j
            End If
        End If
   Next i
   
'Gan ket qua & ket thuc
   Range("E" & stRow).Resize(nk, 9) = ArrKq
   Set dTon = Nothing: Set dNx = Nothing
End Sub
Nhưng nó báo lỗi
"Run - time error 9
Subcript out of range"

(dòng chữ màu đỏ)
Em đã tìm nhưng vẫn chưa được, Nhờ Thầy cô & anh chị giúp sửa code.
Em cảm ơn!
 

File đính kèm

Upvote 0
Em chào Thầy cô & anh chị!
Em có áp dụng code bài #34 vào thực tế như sau
Mã:
Option Explicit


Const tkChinh = "#1561#152#153#155#" 'hang so cho phep Thay doi tai khoan CHINH
Const stRow = 9 'hang so dong bat dau cho phan du lieu cua tat cac sheet du lieu, ket qua


'bam phim tat Ctrl+R
'by vodoi2x vodoi2x vodoi2x vodoi2x vodoi2x
'main code from Concogia GPE


Sub TH()
    
    Dim CoT13 As Boolean, dTon As Object, dNx As Object, wSp As Worksheet, TongHop, ArrNx, aTon, kQ, ArrKq
    Dim i As Long, k As Long, kK As Long, MM As Long, j As Long, n As Long, nk As Long, tmP As String, WsPre, sT As String


'Kiem soat loi va nhap du lieu
    sT = Trim(UCase(ActiveSheet.Name))
    If Not sT Like "T##" Then MsgBox "Phai chay macro nay tai sheet " & Chr(13) & " T##:  T01,T02,...,T12,  T13", , "sub TH": Exit Sub
    MM = Val(Right(sT, 2))
    If MM < 1 Or MM > 13 Then MsgBox "Phai chay macro nay tai sheet " & Chr(13) & " T##:  T01,T02,...,T12   T13", , "sub TH": Exit Sub
    
    CoT13 = (MM = 13): k = IIf(CoT13, 0, MM - 1)
    On Error Resume Next
    Set wSp = Sheets("T" & Format(k, "00"))
    On Error GoTo 0
    If wSp Is Nothing Then MsgBox "Khong ton tai sheet ky truoc " & "T" & Format(k, "00"), , "sub TH": Exit Sub
    
    With wSp
        k = .[B65536].End(xlUp).Row
        If k < stRow Then MsgBox "Khong ton tai du lieu TON o sheet " & wSp.Name, , "sub TH": Exit Sub
        aTon = .Range("B" & stRow & ":B" & k).Resize(, 12).Value
    End With
    
    With Sheets("TH")
        k = .[C65536].End(xlUp).Row
        If k < stRow Then MsgBox "Khong ton tai du lieu o file tong hop", , "sub TH": Exit Sub
        TongHop = .Range("C" & stRow & ":C" & k).Resize(, 15)
    End With
    ReDim ArrNx(1 To UBound(TongHop), 1 To 4)
    
    k = [B65536].End(xlUp).Row
    If k < stRow Then MsgBox "Khong ton tai du lieu o Sheet hien tai", , "sub TH": Exit Sub
    kQ = Range("B" & stRow & ":B" & k).Value
    nk = UBound(kQ) + 1: ReDim ArrKq(1 To nk, 1 To 9)
    
'Tinh toan
    Set dNx = CreateObject("scripting.dictionary")
    n = IIf(CoT13, 4, 3)
    For i = 1 To UBound(TongHop)
        If CoT13 Or UCase(Trim(TongHop(i, 1))) = sT Then
            tmP = TongHop(i, 9)
            If Not dNx.exists(tmP) Then
                    k = k + 1:  dNx.Add tmP, k:  kK = k
            Else:   kK = dNx.Item(tmP):    End If
            
            For j = 1 To n
                [COLOR=#ff0000][B]ArrNx(kK, j) = ArrNx(kK, j) + TongHop(i, 11 + j)[/B][/COLOR]
            Next j
        End If
   Next i
   
   Set dTon = CreateObject("scripting.dictionary")
   With wSp
        For i = 1 To UBound(aTon)
            If Not dTon.exists(aTon(i, 1)) Then dTon.Add aTon(i, 1), Array(aTon(i, 11), aTon(i, 12))
        Next i
   End With
   
   For i = 1 To nk - 1  'nk-1=Ubound(kq)
        tmP = Trim(kQ(i, 1))
        If tmP <> "" Then
            If InStr(1, tkChinh, "#" & tmP & "#", vbTextCompare) Then
                k = i
            Else
                If dTon.exists(tmP) Then
                    ArrKq(i, 1) = dTon.Item(tmP)(0):            ArrKq(i, 2) = dTon.Item(tmP)(1)
                    ArrKq(k, 1) = ArrKq(k, 1) + ArrKq(i, 1):    ArrKq(k, 2) = ArrKq(k, 2) + ArrKq(i, 2)
                    ArrKq(nk, 1) = ArrKq(nk, 1) + ArrKq(i, 1):  ArrKq(nk, 2) = ArrKq(nk, 2) + ArrKq(i, 2)
                End If
            
                If dNx.exists(tmP) Then
                    For j = 3 To 5
                        ArrKq(i, j) = ArrNx(dNx.Item(tmP), j - 2)
                    Next j
                    If CoT13 Then ArrKq(i, 7) = ArrNx(dNx.Item(tmP), 4)
                End If
                
                If Not CoT13 Then
                    If ArrKq(i, 1) + ArrKq(i, 3) <> 0 Then ArrKq(i, 6) = (ArrKq(i, 2) + ArrKq(i, 4)) / (ArrKq(i, 1) + ArrKq(i, 3))
                    If ArrKq(i, 5) <> 0 Then ArrKq(i, 7) = ArrKq(i, 5) * ArrKq(i, 6)
                End If
                
                If ArrKq(i, 1) <> 0 Or ArrKq(i, 3) <> 0 Or ArrKq(i, 5) <> 0 Then ArrKq(i, 8) = ArrKq(i, 1) + ArrKq(i, 3) - ArrKq(i, 5)
                If ArrKq(i, 2) <> 0 Or ArrKq(i, 4) <> 0 Or ArrKq(i, 7) <> 0 Then ArrKq(i, 9) = ArrKq(i, 2) + ArrKq(i, 4) - ArrKq(i, 7)
                
                For j = 3 To 9
                    If j <> 6 And ArrKq(i, j) <> 0 Then ArrKq(k, j) = ArrKq(k, j) + ArrKq(i, j):   ArrKq(nk, j) = ArrKq(nk, j) + ArrKq(i, j)
                Next j
            End If
        End If
   Next i
   
'Gan ket qua & ket thuc
   Range("E" & stRow).Resize(nk, 9) = ArrKq
   Set dTon = Nothing: Set dNx = Nothing
End Sub
Nhưng nó báo lỗi
"Run - time error 9
Subcript out of range"

(dòng chữ màu đỏ)
Em đã tìm nhưng vẫn chưa được, Nhờ Thầy cô & anh chị giúp sửa code.
Em cảm ơn!

Dòng này khai báo kích thước bị thiếu
Sửa lại vầy coi sao

ReDim ArrNx(1 To UBound(TongHop)*2, 1 To 4)
 
Upvote 0
Dòng này khai báo kích thước bị thiếu
Sửa lại vầy coi sao

ReDim ArrNx(1 To UBound(TongHop)*2, 1 To 4)

Sửa thế chạy được , NHƯNG SAI và sai cơ bản,

Nhưng nó báo lỗi
"Run - time error 9
Subcript out of range"

(dòng chữ màu đỏ)
Em đã tìm nhưng vẫn chưa được, Nhờ Thầy cô & anh chị giúp sửa code.
Em cảm ơn!

Vậy bạn hãy tìm đoạn có 3 dòng sau,
[GPECODE=vb]
'Tinh toan
Set dNx = CreateObject("scripting.dictionary")
n = IIf(CoT13, 4, 3)
[/GPECODE]

sửa thành
[GPECODE=vb]
'Tinh toan
Set dNx = CreateObject("scripting.dictionary")
n = IIf(CoT13, 4, 3): k = 0
[/GPECODE]

chỉ cần thêm : k = 0 đó ah,
 
Lần chỉnh sửa cuối:
Upvote 0

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

Back
Top Bottom