code báo cáo tổng hợp từ ngày đến ngày (2 người xem)

  • Thread starter Thread starter DMQ
  • Ngày gửi Ngày gửi

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

DMQ

Thành viên dốt
Tham gia
21/3/12
Bài viết
722
Được thích
57
Giới tính
Nam
Em có file giả định nhờ các AC giúp viết code báo cáo tổng hợp từ ngày đến ngày. Em xin cám ơn trước.
 
Lần chỉnh sửa cuối:
Em xin nói rỏ là khi gỏ ngày vào Cell F2(Từ ngày) và H2(Đến ngày) ở sheet"BC" thì sẽ có báo cáo của từng mặt hàng trong khoảng thời gian đó.
 
Upvote 0
Em xin nói rỏ là khi gỏ ngày vào Cell F2(Từ ngày) và H2(Đến ngày) ở sheet"BC" thì sẽ có báo cáo của từng mặt hàng trong khoảng thời gian đó.
Sub này cho sự kiện Change trong sheet BC
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Union([F2], [H2])) Is Nothing Then
   Main
End If
End Sub
Copy hết cái rừng rậm này cho vào 1 Module
PHP:
Option Explicit
Dim Dic As Object, R As Long
Sub Main()
Dim Data(), Nhap(), Xuat(), StartD As Date, EndD As Date
Data = Sheet4.Range("E4", Sheet4.[I65536].End(3)).Value
ReDim Preserve Data(1 To UBound(Data), 1 To 8)
StartD = Sheet1.[F2].Value: EndD = Sheet1.[H2].Value
Ton Data
Nhap = Sheet2.Range("E4", Sheet2.[K65536].End(3)).Value
Xuat = Sheet3.Range("B4", Sheet3.[J65536].End(3)).Value
XuatNhap Nhap, 4, StartD, EndD, Data
XuatNhap Xuat, 6, StartD, EndD, Data
Sheet1.[C5].Resize(UBound(Data), 8) = Data
End Sub
PHP:
Sub Ton(Arr)
Set Dic = CreateObject("scripting.dictionary")
For R = 1 To UBound(Arr)
   If Not Dic.exists(Arr(R, 2)) Then
      Dic.Add (Arr(R, 2)), R
   End If
Next
End Sub
PHP:
Sub XuatNhap(Arr(), Col, A, B, Res())
Dim n As Long, X As Long
n = IIf(Col = 4, 6, 7)
For R = 1 To UBound(Arr)
   If Arr(R, 2) >= A Then
      If Arr(R, 2) <= B Then
         If Dic.exists(Arr(R, Col)) Then
            X = Dic.Item(Arr(R, Col))
            Res(X, n) = Res(X, n) + Arr(R, UBound(Arr, 2))
         End If
      End If
   End If
   Res(R, 8) = Res(R, 5) + Res(R, 6) - Res(R, 7)
Next
End Sub
Ps: Nếu cho công việc thì xài tạm code này, nếu là để nghiên cứu học thì mình khuyên là đừng bao giờ nghiên cứu code của mình. Lu xu bu lắm.
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu được Anh Quang Hai có thể nghiên cứu rút gọn code dùm Ah!!!
 
Upvote 0
Sao em thử thì code chạy lại không đúng. Ở dòng 55 của sheet:BC" trở xuống có "tồn đầu","nhập","xuất" mà không có cột"Tồn Cuối". Mong Anh xem lại giúp em!!!!
 
Upvote 0
Macro này dễ hiểu hơn nè;

Bạn kiểm tiếp xem sao
 

File đính kèm

Upvote 0
Sao em thử thì code chạy lại không đúng. Ở dòng 55 của sheet:BC" trở xuống có "tồn đầu","nhập","xuất" mà không có cột"Tồn Cuối". Mong Anh xem lại giúp em!!!!
Sửa lại tẹo. Code ẩu quá
PHP:
Option Explicit
Dim Dic As Object, R As Long
Sub Main()
Dim Data(), Nhap(), Xuat(), StartD As Date, EndD As Date
Data = Sheet4.Range("E4", Sheet4.[I65536].End(3)).Value
ReDim Preserve Data(1 To UBound(Data), 1 To 8)
StartD = Sheet1.[F2].Value: EndD = Sheet1.[H2].Value
Ton Data
Nhap = Sheet2.Range("E4", Sheet2.[K65536].End(3)).Value
Xuat = Sheet3.Range("B4", Sheet3.[J65536].End(3)).Value
XuatNhap Nhap, 4, StartD, EndD, Data
XuatNhap Xuat, 6, StartD, EndD, Data
For R = 1 To UBound(Data)
   Data(R, 8) = Data(R, 5) + Data(R, 6) - Data(R, 7)
Next
Sheet1.[C5].Resize(UBound(Data), 8) = Data
End Sub
Sub Ton(Arr)
Set Dic = CreateObject("scripting.dictionary")
For R = 1 To UBound(Arr)
   If Not Dic.exists(Arr(R, 2)) Then
      Dic.Add (Arr(R, 2)), R
   End If
Next
End Sub
Sub XuatNhap(Arr(), Col, A, B, Res())
Dim n As Long, X As Long
n = IIf(Col = 4, 6, 7)
For R = 1 To UBound(Arr)
   If Arr(R, 2) >= A Then
      If Arr(R, 2) <= B Then
         If Dic.exists(Arr(R, Col)) Then
            X = Dic.Item(Arr(R, Col))
            Res(X, n) = Res(X, n) + Arr(R, UBound(Arr, 2))
         End If
      End If
   End If
Next
End Sub
 
Upvote 0
Mã:
[COLOR=#000000][I]Option Explicit[/I][/COLOR]


[COLOR=#000000][I]Sub bcth()[/I][/COLOR]
[COLOR=#000000][I]On Error Resume Next[/I][/COLOR]
[COLOR=#000000][I]Dim ArrN(), ArrX(), MS(), Kq(), ID, i, j, s, bd, kd, Dic As Object[/I][/COLOR]
[COLOR=#000000][I]Set Dic = CreateObject("Scripting.Dictionary")[/I][/COLOR]
[COLOR=#000000][I]Sheet2.AutoFilterMode = False[/I][/COLOR]
[COLOR=#000000][I]Sheet3.AutoFilterMode = False[/I][/COLOR]
[COLOR=#000000][I]Sheet4.AutoFilterMode = False[/I][/COLOR]
[COLOR=#000000][I]Sheet1.Range("C5:J72").ClearContents[/I][/COLOR]
[COLOR=#000000][I]bd = Sheet1.Range("F2").Value[/I][/COLOR]
[COLOR=#000000][I]kd = Sheet1.Range("H2").Value[/I][/COLOR]
[COLOR=#000000][I]MS = Sheet4.Range("F4:I" & Sheet4.Range("F65000").End(3).Row).Value[/I][/COLOR]
[COLOR=#000000][I]ArrN = Sheet2.Range("E4:K" & Sheet2.Range("E65000").End(3).Row).Value[/I][/COLOR]
[COLOR=#000000][I]ArrX = Sheet3.Range("B4:J" & Sheet3.Range("B65000").End(3).Row).Value[/I][/COLOR]
[COLOR=#000000][I]ReDim Kq(1 To Sheet4.Range("F65000").End(3).Row, 1 To 11)[/I][/COLOR]

[COLOR=#000000][I]For i = 1 To UBound(MS, 1)[/I][/COLOR]
[COLOR=#000000][I]If MS(i, 1) <> "" Then[/I][/COLOR]
[COLOR=#000000][I]s = s + 1[/I][/COLOR]
[COLOR=#000000][I]Dic.Add CStr(MS(i, 1)), s[/I][/COLOR]
[COLOR=#000000][I]Kq(s, 1) = s[/I][/COLOR]
[COLOR=#000000][I]Kq(s, 2) = MS(i, 1)[/I][/COLOR]
[COLOR=#000000][I]Kq(s, 3) = MS(i, 2)[/I][/COLOR]
[COLOR=#000000][I]Kq(s, 4) = MS(i, 3)[/I][/COLOR]
[COLOR=#000000][I]Kq(s, 9) = MS(i, 4)[/I][/COLOR]
[COLOR=#000000][I]End If[/I][/COLOR]
[COLOR=#000000][I]Next i[/I][/COLOR]


[COLOR=#000000][I]For i = 1 To UBound(ArrN)[/I][/COLOR]
[COLOR=#000000][I]ID = Dic.Item(CStr(ArrN(i, 4)))[/I][/COLOR]
[COLOR=#000000][I]If ArrN(i, 2) < bd Then[/I][/COLOR]
[COLOR=#000000][I]Kq(ID, 10) = Kq(ID, 10) + ArrN(i, 7)[/I][/COLOR]
[COLOR=#000000][I]ElseIf ArrN(i, 2) >= bd And ArrN(i, 2) <= kd Then[/I][/COLOR]
[COLOR=#000000][I]Kq(ID, 6) = Kq(ID, 6) + ArrN(i, 7)[/I][/COLOR]
[COLOR=#000000][I]End If[/I][/COLOR]

[COLOR=#000000][I]Next i[/I][/COLOR]


[COLOR=#000000][I]For i = 1 To UBound(ArrX)[/I][/COLOR]
[COLOR=#000000][I]ID = Dic.Item(CStr(ArrX(i, 6)))[/I][/COLOR]
[COLOR=#000000][I]If ArrX(i, 2) < bd Then[/I][/COLOR]
[COLOR=#000000][I]Kq(ID, 11) = Kq(ID, 11) + ArrX(i, 9)[/I][/COLOR]
[COLOR=#000000][I]ElseIf ArrX(i, 2) >= bd And ArrX(i, 2) <= kd Then[/I][/COLOR]
[COLOR=#000000][I]Kq(ID, 7) = Kq(ID, 7) + ArrX(i, 9)[/I][/COLOR]
[COLOR=#000000][I]End If[/I][/COLOR]
[COLOR=#000000][I]Next i[/I][/COLOR]


[COLOR=#000000][I]For i = 1 To UBound(Kq)[/I][/COLOR]
[COLOR=#000000][I]Kq(i, 5) = Kq(i, 9) + Kq(i, 10) - Kq(i, 11)[/I][/COLOR]
[COLOR=#000000][I]Kq(i, 8) = Kq(i, 5) + Kq(i, 6) - Kq(i, 7)[/I][/COLOR]
[COLOR=#000000][I]Next i[/I][/COLOR]




[COLOR=#000000][I]If s > 0 Then Sheet1.Range("C5:J5").Resize(s) = Kq[/I][/COLOR]
[COLOR=#000000][I]Set Dic = Nothing[/I][/COLOR]
[COLOR=#000000][I]Erase ArrN(), ArrX(), MS(), Kq()[/I][/COLOR]


[COLOR=#000000][I]End Sub[/I][/COLOR]


E Mới bắt đầu với dic nên phải chơi đến 4 vòng lặp!$@!!!$@!!!$@!!!$@!!

đưa lên để đc góp ý %#^#$%#^#$%#^#$%#^#$
 
Upvote 0
Nếu được Anh Quang Hai có thể nghiên cứu rút gọn code dùm Ah!!!
Muốn gọn thì cho gọn, nhưng nhìn code không có "bờ rồ". Thay hết cái rừng kia bằng cái rừng này
Không xài vòng lặp nào cả.
PHP:
Sub XNT()
   Sheet1.[C5].CurrentRegion.Offset(1).ClearContents
   Sheet4.Range("E4", Sheet4.[I65536].End(3)).Copy Sheet1.[C5]
   With Sheet1.Range("G5", Sheet1.[G65536].End(3))
      .Offset(, 1).SpecialCells(4).Formula = _
      "=SUMPRODUCT((CTN!R4C8:R1000C8=RC4)*(CTN!R4C6:R1000C6>=R2C6)" _
      & "*(CTN!R4C6:R1000C6<=R2C8)*(CTN!R4C11:R1000C11))"
      .Offset(, 2).SpecialCells(4) = _
      "=SUMPRODUCT((CTX!R4C7:R1000C7=RC4)*(CTX!R4C3:R1000C3>=R2C6)" _
      & "*(CTX!R4C3:R1000C3<=R2C8)*(CTX!R4C10:R1000C10))"
       .Offset(, 3).SpecialCells(4) = "=RC[-3]+RC[-2]-RC[-1]"
       .Offset(, 1).Resize(, 3).Value = .Offset(, 1).Resize(, 3).Value
   End With
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Anh Quang Hai có thể giúp em trong sự kiện Worksheet_change khi gỏ ngày của "Đến ngày-H2" mà nhỏ hơn "Từ ngày-F2" thì không cho(như hiện MsgBox báo lỗi). Anh cho em hỏi (ngoài lề) sao code trong bài #9 của Anh sử dụng công thức mà khi em chọn vào cell lại không hiện công thức trên thanh Fomula.(Vì em thấy có những đoạn code sử dụng công thức thì hiện công thức trên thanh fomula)
 
Upvote 0
Thay mặt anh Hải (câu này cũng dễ --=0) mình xin trả lời bạn:

Anh Quang Hai có thể giúp em trong sự kiện Worksheet_change khi gỏ ngày của "Đến ngày-H2" mà nhỏ hơn "Từ ngày-F2" thì không cho(như hiện MsgBox báo lỗi).

Mã:
Private Sub Worksheet_Change(ByVal Target As Range)If Not Intersect(Target, Union([F2], [H2])) Is Nothing Then
[COLOR=#ff0000]If [H2] >= [F2] Then[/COLOR]
[COLOR=#ff0000]   Main[/COLOR]
[COLOR=#ff0000]Else[/COLOR]
[COLOR=#ff0000]    MsgBox "Den ngay phai lon hon hoac bang tu ngay"[/COLOR]
End If
End If
End Sub
Đoạn màu đỏ là thêm điều kiện vào.
Anh cho em hỏi (ngoài lề) sao code trong bài #9 của Anh sử dụng công thức mà khi em chọn vào cell lại không hiện công thức trên thanh Fomula.(Vì em thấy có những đoạn code sử dụng công thức thì hiện công thức trên thanh fomula)

Trong code có đoạn này:

Mã:
[COLOR=#007700][FONT=monospace].[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Offset[/FONT][/COLOR][COLOR=#007700][FONT=monospace](, [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]1[/FONT][/COLOR][COLOR=#007700][FONT=monospace]).[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Resize[/FONT][/COLOR][COLOR=#007700][FONT=monospace](, [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]3[/FONT][/COLOR][COLOR=#007700][FONT=monospace]).[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Value [/FONT][/COLOR][COLOR=#007700][FONT=monospace]= .[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Offset[/FONT][/COLOR][COLOR=#007700][FONT=monospace](, [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]1[/FONT][/COLOR][COLOR=#007700][FONT=monospace]).[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Resize[/FONT][/COLOR][COLOR=#007700][FONT=monospace](, [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]3[/FONT][/COLOR][COLOR=#007700][FONT=monospace]).[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Value[/FONT][/COLOR]

Mục đích là chuyển công thức thành Value đấy bạn ạ.
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn mhung12005 có thể cho mình hỏi ngoài lề chút nhe, sao cũng file đó mà copy qua máy khác thì lỗi Name ở CT vậy bạn. Mặc dù file đó chạy ngon lành ở máy mình. Mình nghĩ có thể định dạng máy kia khác mà mình chỉnh về cùng định dạng vẫn bị lỗi Name.
 
Upvote 0
Bạn mhung12005 có thể cho mình hỏi ngoài lề chút nhe, sao cũng file đó mà copy qua máy khác thì lỗi Name ở CT vậy bạn. Mặc dù file đó chạy ngon lành ở máy mình. Mình nghĩ có thể định dạng máy kia khác mà mình chỉnh về cùng định dạng vẫn bị lỗi Name.

Bạn thử đưa file lỗi đó lên xem nào, nói vậy thì khó quá. Giống như khám bệnh kiểu miêu tả ý :D
 
Upvote 0
Xin lỗi Anh QuangHai, vì file giả định của em đưa lên có 1 tháng nên Code Anh viết(bài#9) bị sai. Ý của em là khi báo cáo thì cột "Tồn đầu kỳ' sẽ là số lượng của "Tồn cuối kỳ" của tháng trước đó. ví dụ như xem "nhãn các loại" của ngày'1/2/2014" đến ngày"28/2/2014" thì "Tồn đầu kỳ" sẽ là số lượng của" tồn cuối kỳ" của tháng 1/2014. Mong Anh xem lại giúp em!!!!!
 
Upvote 0
Em đưa file mới lên có 03 tháng mong các AC giúp em báo cáo theo từ ngày đến ngày. Em xin giải thích thêm là "Tồn đầu kỳ" là số lương tốn tới ngày gần kề liến với ngày "Từ Ngày" , "nhập trong kỳ" là số lượng nhập trong khoảng >="Từ Ngày" đến <="Đến ngày", "Xuất trong kỳ" là số lượng xuất trong khoảng >="Từ ngày" đến <="đến ngày", "Tốn cuối kỳ bằng :"tồn đầu kỳ" cộng "nhập trong kỳ" trừ "xuất trong kỳ". ví dụ như báo cáo từ ngày 1/2/2014 đến ngày 28/2/2014 thì "tồn đầu kỳ" của tháng 2 là số lượng "tồn cuối kỳ" của tháng 1. Mong các Ac giúp đỡ!!!!
 

File đính kèm

Upvote 0
Với cơ sở dữ liệu của post#1 thì bạn tham khảo #8 ,bạn thay đổi ngày rồi chạy code xem chính xác chưa, mình làm theo cách bạn vừa nói đấy
 
Upvote 0
Bài #6 đã làm được như vậy rồi mà, chỉ tội rùa 1 tẹo.

[Thongbao]Em đưa file mới lên có 03 tháng mong các AC giúp em báo cáo theo từ ngày đến ngày. Em xin giải thích thêm là "Tồn đầu kỳ" là số lương tốn tới ngày gần kề liến với ngày "Từ Ngày" , "nhập trong kỳ" là số lượng nhập trong khoảng >="Từ Ngày" đến <="Đến ngày", "Xuất trong kỳ" là số lượng xuất trong khoảng >="Từ ngày" đến <="đến ngày", "Tốn cuối kỳ bằng :"tồn đầu kỳ" cộng "nhập trong kỳ" trừ "xuất trong kỳ". ví dụ như báo cáo từ ngày 1/2/2014 đến ngày 28/2/2014 thì "tồn đầu kỳ" của tháng 2 là số lượng "tồn cuối kỳ" của tháng 1. Mong các Ac giúp đỡ!!!![/Thongbao]

Thay vì .02 gy thì là .2 gy.
 
Upvote 0
Code của Bạn HYen17 hơi chậm vì dữ liệu mình nhiều (bạn nói "Thay vì .02 gy thì là .2 gy."--mình không hiểu.) còn của bạn boidaigai mình dang thử . Mong có AC nào tham gia viết code cho nhanh!!!
 
Upvote 0

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

Back
Top Bottom