Nguoiay
Thành viên hoạt động
![](/diendan/data/PhoToDanhHieu/gold.gif)
![](/diendan/data/PhoToDanhHieu/gold.gif)
![](/diendan/data/PhoToDanhHieu/gold.gif)
- Tham gia
- 24/11/10
- Bài viết
- 139
- Được thích
- 34
Bạn xem thử đúng ý mình chưa nhé.Em đang tạo báo cáo tổng hợp bán hàng theo từng nhân viên theo ngày tháng phát sinh. Em loay hoay mãi không nghĩ ra cách xử lý nên đưa lên đây nhờ mọi người viết cho em đoạn code xử lý việc này.
Câu hỏi cụ thể ở file đính kèm.
Sub TongHop()
Dim Arr(), Sh As Worksheet, Cls As Range
Dim Rws As Long, J As Long, W As Integer, fDat As Date, lDat As Date, SoLg As Double, Dg As Integer, Hg As Integer
With Sheets("CSDL").[A2]
Rws = .CurrentRegion.Rows.Count + 6
Arr() = .Resize(Rws, 5).Value: ReDim dArr(1 To Rws, 1 To 4)
End With
fDat = [F1].Value: lDat = [f2].Value
On Error Resume Next
For Each Cls In Range([N2], [N2].End(xlDown))
W = W + 1: dArr(W + Dg, 1) = W
dArr(W + Dg, 2) = Cls.Value: Hg = W + Dg
For J = 1 To UBound(Arr())
If (Arr(J, 1) >= fDat And Arr(J, 1) <= lDat) And Arr(J, 2) = Cls.Value Then
Dg = Dg + 1: SoLg = SoLg + Arr(J, 5)
dArr(W + Dg, 3) = Arr(J, 3): dArr(W + Dg, 4) = Arr(J, 5)
End If
Next J
dArr(Hg, 4) = SoLg: SoLg = 0
Next Cls
[A7].Resize(W + Dg, 4).Value = dArr()
Randomize: [A6].Resize(, 4).Interior.ColorIndex = 34 + 9 * Rnd() \ 1
End Sub
Cách viết của anh dễ hiểu quá ! cảm ơn anh !Trễ chuyến rồi; Nhưng cũng cứ tham gia cho vui!
PHP:Sub TongHop() Dim Arr(), Sh As Worksheet, Cls As Range Dim Rws As Long, J As Long, W As Integer, fDat As Date, lDat As Date, SoLg As Double, Dg As Integer, Hg As Integer With Sheets("CSDL").[A2] Rws = .CurrentRegion.Rows.Count + 6 Arr() = .Resize(Rws, 5).Value: ReDim dArr(1 To Rws, 1 To 4) End With fDat = [F1].Value: lDat = [f2].Value On Error Resume Next For Each Cls In Range([N2], [N2].End(xlDown)) W = W + 1: dArr(W + Dg, 1) = W dArr(W + Dg, 2) = Cls.Value: Hg = W + Dg For J = 1 To UBound(Arr()) If (Arr(J, 1) >= fDat And Arr(J, 1) <= lDat) And Arr(J, 2) = Cls.Value Then Dg = Dg + 1: SoLg = SoLg + Arr(J, 5) dArr(W + Dg, 3) = Arr(J, 3): dArr(W + Dg, 4) = Arr(J, 5) End If Next J dArr(Hg, 4) = SoLg: SoLg = 0 Next Cls [A7].Resize(W + Dg, 4).Value = dArr() Randomize: [A6].Resize(, 4).Interior.ColorIndex = 34 + 9 * Rnd() \ 1 End Sub
Mã hàng của bạn lấy từ cột nào vậy?Em xem cả 2 bài của anh @giaiphap và @SA_DQ định áp dụng vào file của em nhưng không làm được ạ. Liên quan đến code mảng này em kém quá ạ. Nên đành đưa file lên đây nhờ mọi người hỗ trợ cho em.
Dựa vào sheet Data để tạo báo cáo ở sheet REPORT_NV. Cách làm tương tự (giống cấu trúc) như file demo trên của em.
Nhờ mọi người giúp em với ạ!
Cám ơn mọi người nhiều!
Mình muốn xem code để học hỏi thêm (trên điện thoại không xem được), không biết bạn có thể post đoạn code lên giùm được không. Thân chào bạn.Bạn xem thử đúng ý mình chưa nhé.
Em đã ghi chú ở sheet Data ạ.Mã hàng của bạn lấy từ cột nào vậy?
Cột F ở sheet Data của bạn tại sao lại có ô trống? Với dữ liệu kiểu này thì code chạy không chính xác nhé.Em đã ghi chú ở sheet Data ạ.
Link tải file sửa: https://drive.google.com/open?id=1KMTm6f82_fC1FNKy5ywT1JP0oOmjbUDx
Sub GPE()
Dim Arr(), dArr(), i As Long, tu As Date, den As Date, k As Long, Ma As String, Cs As String
Dim Rng As Range
With Sheets("Data")
i = .Range("S65000").End(xlUp).Row
If i < 4 Then i = 4
Arr = .Range("A4:S" & i).Value
End With
With Sheets("REPORT_NV")
ReDim dArr(1 To UBound(Arr), 1 To 4)
tu = .[F1]: den = .[F2]: Cs = .[F3]
For i = 1 To UBound(Arr)
If (Arr(i, 4) >= tu) And (Arr(i, 4) <= den) And (Arr(i, 19) = Cs) Then
k = k + 1
dArr(k, 2) = Arr(i, 6): dArr(k, 3) = Arr(i, 8): dArr(k, 4) = Arr(i, 12)
End If
Next i
If k Then
.Range("A8").Resize(k, 4) = dArr
.Range("A8").Resize(k, 4).Sort key1:=Range("B8")
dArr = .Range("A8").Resize(k, 4).Value
k = 1: Ma = dArr(1, 2): dArr(1, 1) = k
For i = 2 To UBound(dArr)
If dArr(i, 2) = Ma Then
dArr(i, 2) = ""
Else
Ma = dArr(i, 2)
k = k + 1: dArr(i, 1) = k
End If
Next i
.Range("A7").Resize(UBound(dArr) + 1, 4).ClearFormats
.Range("A8:D" & .Range("C65000").End(xlUp).Row).Clear
.Range("A8").Resize(UBound(dArr), 4) = dArr
k = UBound(dArr)
For Each Rng In .Range("A8").Resize(UBound(dArr)).SpecialCells(xlCellTypeConstants)
Rows(Rng.Row & ":" & Rng.Row).Insert Shift:=xlDown
Rng.Offset(-1).Resize(, 2).Value = Rng.Resize(, 2).Value
Rng.Offset(-1).Resize(, 4).Font.Bold = True
Rng.Resize(, 2).Value = ""
k = k + 1
Next Rng
For Each Rng In .Range("D8").Resize(k).SpecialCells(xlCellTypeConstants).Areas
.Range("D" & Rng.Row - 1).FormulaR1C1 = "=SUM(R[1]C:R[" & Rng.Cells.Count & "]C)"
Next Rng
.Range("A7:D7").Font.Bold = True
.Range("A7:D7").Interior.ThemeColor = xlThemeColorAccent1
.Range("A7:D7").HorizontalAlignment = xlCenter
.Range("A7:D7").Font.ThemeColor = xlThemeColorDark1
.Range("A7").Resize(k + 1, 4).Borders.LineStyle = 1
End If
End With
MsgBox "Da thuc hien xong! .::(^v^)::.", vbExclamation, "---GPE---"
End Sub
Sub GPE()
Dim Arr(), dArr(), i As Long, tu As Date, den As Date, k As Long, Ma As String, Cs As String
Dim Rng As Range
With Sheets("Data")
i = .Range("S65000").End(xlUp).Row
If i < 4 Then i = 4
Arr = .Range("A4:S" & i).Value
End With
With Sheets("REPORT_NV")
ReDim dArr(1 To UBound(Arr), 1 To 4)
tu = .[F1]: den = .[F2]: Cs = .[F3]
For i = 1 To UBound(Arr)
If (Arr(i, 4) >= tu) And (Arr(i, 4) <= den) And (Arr(i, 19) = Cs) Then
k = k + 1
If Arr(i, 6) <> "" Then Ma = Arr(i, 6)
dArr(k, 2) = Ma: dArr(k, 3) = Arr(i, 8): dArr(k, 4) = Arr(i, 12)
End If
Next i
If k Then
.Range("A8").Resize(k, 4) = dArr
.Range("A8").Resize(k, 4).Sort key1:=Range("B8")
dArr = .Range("A8").Resize(k, 4).Value
k = 1: Ma = dArr(1, 2): dArr(1, 1) = k
For i = 2 To UBound(dArr)
If dArr(i, 2) = Ma Then
dArr(i, 2) = ""
Else
Ma = dArr(i, 2)
k = k + 1: dArr(i, 1) = k
End If
Next i
.Range("A7").Resize(UBound(dArr) + 1, 4).ClearFormats
.Range("A8:D" & .Range("C65000").End(xlUp).Row).Clear
.Range("A8").Resize(UBound(dArr), 4) = dArr
k = UBound(dArr)
For Each Rng In .Range("A8").Resize(UBound(dArr)).SpecialCells(xlCellTypeConstants)
Rows(Rng.Row & ":" & Rng.Row).Insert Shift:=xlDown
Rng.Offset(-1).Resize(, 2).Value = Rng.Resize(, 2).Value
Rng.Offset(-1).Resize(, 4).Font.Bold = True
Rng.Resize(, 2).Value = ""
k = k + 1
Next Rng
For Each Rng In .Range("D8").Resize(k).SpecialCells(xlCellTypeConstants).Areas
.Range("D" & Rng.Row - 1).FormulaR1C1 = "=SUM(R[1]C:R[" & Rng.Cells.Count & "]C)"
Next Rng
.Range("A7:D7").Font.Bold = True
.Range("A7:D7").Interior.ThemeColor = xlThemeColorAccent1
.Range("A7:D7").HorizontalAlignment = xlCenter
.Range("A7:D7").Font.ThemeColor = xlThemeColorDark1
.Range("A7").Resize(k + 1, 4).Borders.LineStyle = 1
End If
End With
MsgBox "Da thuc hien xong! .::(^v^)::.", vbExclamation, "---GPE---"
End Sub
Bạn sửa code lại thế này để tính tổng các mã hàng bị trùng.Em đã ghi chú ở sheet Data ạ.
Link tải file sửa: https://drive.google.com/open?id=1KMTm6f82_fC1FNKy5ywT1JP0oOmjbUDx
Sub GPE()
Dim Arr(), dArr(), i As Long, tu As Date, den As Date, k As Long, Ma As String, Cs As String
Dim Rng As Range, Dic As Object
With Sheets("Data")
i = .Range("S65000").End(xlUp).Row
If i < 4 Then i = 4
Arr = .Range("A4:S" & i).Value
End With
With Sheets("REPORT_NV")
ReDim dArr(1 To UBound(Arr), 1 To 4)
tu = .[F1]: den = .[F2]: Cs = .[F3]
Set Dic = CreateObject("Scripting.Dictionary")
With Dic
For i = 1 To UBound(Arr)
If (Arr(i, 4) >= tu) And (Arr(i, 4) <= den) And (Arr(i, 19) = Cs) Then
Tmp = Arr(i, 6) & " - " & Arr(i, 8)
If Not .Exists(Tmp) Then
k = k + 1
.Add Tmp, k
dArr(k, 2) = Arr(i, 6): dArr(k, 3) = Arr(i, 8): dArr(k, 4) = Arr(i, 12)
Else
dArr(.Item(Tmp), 4) = dArr(.Item(Tmp), 4) + Arr(i, 12)
End If
End If
Next i
End With
Set Dic = Nothing
If k Then
.Range("A8").Resize(k, 4) = dArr
.Range("A8").Resize(k, 4).Sort key1:=Range("B8")
dArr = .Range("A8").Resize(k, 4).Value
k = 1: Ma = dArr(1, 2): dArr(1, 1) = k
For i = 2 To UBound(dArr)
If dArr(i, 2) = Ma Then
dArr(i, 2) = ""
Else
Ma = dArr(i, 2)
k = k + 1: dArr(i, 1) = k
End If
Next i
.Range("A7").Resize(UBound(dArr) + 1, 4).ClearFormats
.Range("A8:D" & .Range("C65000").End(xlUp).Row).Clear
.Range("A8").Resize(UBound(dArr), 4) = dArr
k = UBound(dArr)
For Each Rng In .Range("A8").Resize(UBound(dArr)).SpecialCells(xlCellTypeConstants)
Rows(Rng.Row & ":" & Rng.Row).Insert Shift:=xlDown
Rng.Offset(-1).Resize(, 2).Value = Rng.Resize(, 2).Value
Rng.Offset(-1).Resize(, 4).Font.Bold = True
Rng.Resize(, 2).Value = ""
k = k + 1
Next Rng
For Each Rng In .Range("D8").Resize(k).SpecialCells(xlCellTypeConstants).Areas
.Range("D" & Rng.Row - 1).FormulaR1C1 = "=SUM(R[1]C:R[" & Rng.Cells.Count & "]C)"
Next Rng
.Range("A7:D7").Font.Bold = True
.Range("A7:D7").Interior.ThemeColor = xlThemeColorAccent1
.Range("A7:D7").HorizontalAlignment = xlCenter
.Range("A7:D7").Font.ThemeColor = xlThemeColorDark1
.Range("A7").Resize(k + 1, 4).Borders.LineStyle = 1
End If
End With
MsgBox "Da thuc hien xong! .::(^v^)::.", vbExclamation, "---GPE---"
End Sub