



Sub này cho sự kiện Change trong sheet BCEm 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 đó.
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Union([F2], [H2])) Is Nothing Then
Main
End If
End Sub
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
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
Res(R, 8) = Res(R, 5) + Res(R, 6) - Res(R, 7)
Next
End Sub




Sửa lại tẹo. Code ẩu quá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!!!!
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
[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]












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àyNếu được Anh Quang Hai có thể nghiên cứu rút gọn code dùm Ah!!!
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
) 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).
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
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)
[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]
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.