Đổ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!
Sự góp ý chính đáng có chi là fiền!Hi vọng không cảm thấy fiền lòng!
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á.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?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?
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- 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 ???
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)
Dạ em chỉ 4 kho, xào đi xào lại chắc đủ sài!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 ĐÍ"......)
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!
Phần chữ màu đỏ em không hiểu lắmTui 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ị!
Ở 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ạpChắ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,
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 codebạ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.
Ở 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!
Em cũng đang test và sẽ Test cho các điều kiện khác nhau, 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ì?
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ơivodoi2x
Nếu thế thì code của bác concogia ở trên #8 có thể ứng dụng đượ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"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
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
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ônAh, 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
Thêm một cái ghê nữa nè, cũng không dám nhìn lại code
Híc
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 codeEm 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
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!
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
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?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é
-----------------
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ị!
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
Em đã kiểm tra và code còn một lỗi như sau: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!
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
Em chào Thầy cô & 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
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 )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
-------------
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ế
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
Em chào Thầy cô & anh chị!
Em có áp dụng code bài #34 vào thực tế như sau
Nhưng nó báo lỗiMã: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
"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)
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!