anhkhang.ak1122
Thành viên mới
- Tham gia
- 24/5/23
- Bài viết
- 26
- Được thích
- 4
Bạn thử công thứcEm chào các bác. Em có sheet(TONG HOP) đang tổng hợp số lượng theo ngày của các màu. Do công việc yêu cầu phải chuyển sang dạng báo các khác như sheet(CHI TIET). Các bác xem giúp em với ạ. Nếu có code VBA thì càng tốt ạ. Em cảm ơn.
MÀU | NGÀY | 01/02 | 02/02 | 03/02 | 04/02 | 05/02 | . . . | . . . | 15/02 | 16/02 | 17/02 | 18/02 | 19/02 | ||||||||||||||
BLUE | NHẬN | 82 | 21 | 60 | 66 | 67 | 82 | 76 | 40 | 22 | 44 | ||||||||||||||||
BLUE | TRẢ | 65 | 25 | 14 | 54 | 73 | 56 | 53 | 48 | 11 | 49 | ||||||||||||||||
BLUE | TỒN | 17 | 13 | 59 | 71 | 65 | 151 | 174 | 166 | 177 | 172 |
Sub ChiTiet()
Dim Col As Integer, Cot As Integer, W As Integer, Nhan As Double, Tra As Double, Ton As Double
With Sheets("Tong Hop")
Col = .[B5].CurrentRegion.Columns.Count
ReDim Arr(1 To 3, 1 To Col)
For Cot = 3 To Col Step 2
W = W + 1: Nhan = .Cells(5, Cot).Value
Arr(1, W) = Nhan: Tra = .Cells(5, Cot + 1).Value
Arr(2, W) = Tra: Ton = Ton + Nhan - Tra
Arr(3, W) = Ton
Next Cot
End With
Sheets("Chi Tiet").[C5].Resize(3, W).Value = Arr()
End Sub
Thử với con macro dùng dictionaryEm chào các bác. Em có sheet(TONG HOP) đang tổng hợp số lượng theo ngày của các màu. Do công việc yêu cầu phải chuyển sang dạng báo các khác như sheet(CHI TIET). Các bác xem giúp em với ạ. Nếu có code VBA thì càng tốt ạ. Em cảm ơn.
Option Explicit
Option Compare Text
Sub GPE()
Dim dic As Object, key, ton$
Dim Lr&, Arr(), Lc&, i&, j&
ton = "t" & ChrW(7891) & "n"
Set dic = CreateObject("Scripting.Dictionary")
With Sheets("TONG HOP")
Lr = .Range("B" & Rows.Count).End(xlUp).Row
Lc = .Cells(4, Columns.Count).End(xlToLeft).Column
Arr = .Range(.Cells(3, 2), .Cells(Lr, Lc)).Value
End With
For i = 3 To UBound(Arr, 1)
For j = 2 To UBound(Arr, 2)
If Arr(1, j) = "" Then Arr(1, j) = Arr(1, j - 1)
key = Arr(i, 1) & "|" & Arr(1, j) & "|" & Arr(2, j)
If Not dic.exists(key) Then dic.Add (key), Arr(i, j)
Next j
Next i
With Sheets("CHI TIET")
Lr = .Range("A" & Rows.Count).End(xlUp).Row
Lc = .Cells(4, Columns.Count).End(xlToLeft).Column
For i = 5 To Lr
For j = 3 To Lc
If .Cells(i, 2) <> ton Then
key = .Cells(i, 1) & "|" & .Cells(4, j) & "|" & .Cells(i, 2)
If dic.exists(key) Then
.Cells(i, j) = dic.Item(key)
Else
.Cells(i, j) = ""
End If
End If
Next j
Next i
End With
MsgBox "Done"
Set dic = Nothing
End Sub
Option Explicit
Sub TongHop_anhkhangak1122()
Dim Dic As Object, sArr(), Res(), i&, Key$, iR&, iC&, j&, x&, T
Set Dic = CreateObject("scripting.dictionary")
With Sheets("TONG HOP")
iR = .Range("B" & Rows.Count).End(3).Row
iC = .Cells(4, Columns.Count).End(1).Column
sArr = .Range("B3").Resize(iR - 2, iC - 1).Value
End With
For i = 3 To UBound(sArr)
For j = 2 To UBound(sArr, 2) Step 2
For x = 0 To 1
Key = sArr(i, 1) & "#" & sArr(1, j) & "#" & sArr(2, j + x)
Dic(Key) = Dic(Key) + sArr(i, j + x)
Next
Next
Next
With Sheets("CHI TIET")
iR = .Range("A" & Rows.Count).End(3).Row
iC = .Cells(4, Columns.Count).End(1).Column
.Range("C5").Resize(iR - 3, iC).ClearContents
Res = .Range("A4").Resize(iR - 3, iC).Value
For i = 2 To UBound(Res) Step 3
For j = 3 To UBound(Res, 2)
For x = 0 To 1
Key = Res(i + x, 1) & "#" & Res(1, j) & "#" & Res(i + x, 2)
If Dic.exists(Key) = True Then
Res(i + x, j) = Dic.Item(Key)
End If
Next
Res(i + 2, j) = Res(i, j) - Res(i + 1, j)
Next
Next
.Range("A4").Resize(iR - 3, iC).Value = Res
End With
End Sub
Dạ cảm ơn bác ạ.Nếu bạn cần vầy thì tham khảo macro kèm theo dưới đây:
MÀU NGÀY 01/02 02/02 03/02 04/02 05/02 . . . . . . 15/02 16/02 17/02 18/02 19/02 BLUE NHẬN 82 21 60 66 67 82 76 40 22 44 BLUE TRẢ 65 25 14 54 73 56 53 48 11 49 BLUE TỒN 17 13 59 71 65 151 174 166 177 172
PHP:Sub ChiTiet() Dim Col As Integer, Cot As Integer, W As Integer, Nhan As Double, Tra As Double, Ton As Double With Sheets("Tong Hop") Col = .[B5].CurrentRegion.Columns.Count ReDim Arr(1 To 3, 1 To Col) For Cot = 3 To Col Step 2 W = W + 1: Nhan = .Cells(5, Cot).Value Arr(1, W) = Nhan: Tra = .Cells(5, Cot + 1).Value Arr(2, W) = Tra: Ton = Ton + Nhan - Tra Arr(3, W) = Ton Next Cot End With Sheets("Chi Tiet").[C5].Resize(3, W).Value = Arr() End Sub
Cảm ơn bạn nhiều nhá. Nếu có thể bạn có thể bạn có thể sửa code bỏ qua dòng tính tống và những ô màu vàng được không ? Vì mình thỉnh thoảng cần sửa số lượng nhận và trả.Tham khảo thêm cách khác coi sao
Mã:Option Explicit Sub TongHop_anhkhangak1122() Dim Dic As Object, sArr(), Res(), i&, Key$, iR&, iC&, j&, x&, T Set Dic = CreateObject("scripting.dictionary") With Sheets("TONG HOP") iR = .Range("B" & Rows.Count).End(3).Row iC = .Cells(4, Columns.Count).End(1).Column sArr = .Range("B3").Resize(iR - 2, iC - 1).Value End With For i = 3 To UBound(sArr) For j = 2 To UBound(sArr, 2) Step 2 For x = 0 To 1 Key = sArr(i, 1) & "#" & sArr(1, j) & "#" & sArr(2, j + x) Dic(Key) = Dic(Key) + sArr(i, j + x) Next Next Next With Sheets("CHI TIET") iR = .Range("A" & Rows.Count).End(3).Row iC = .Cells(4, Columns.Count).End(1).Column .Range("C5").Resize(iR - 3, iC).ClearContents Res = .Range("A4").Resize(iR - 3, iC).Value For i = 2 To UBound(Res) Step 3 For j = 3 To UBound(Res, 2) For x = 0 To 1 Key = Res(i + x, 1) & "#" & Res(1, j) & "#" & Res(i + x, 2) If Dic.exists(Key) = True Then Res(i + x, j) = Dic.Item(Key) End If Next Res(i + 2, j) = Res(i, j) - Res(i + 1, j) Next Next .Range("A4").Resize(iR - 3, iC).Value = Res End With End Sub
Cảm ơn bạn nhiều nhé. Code của bạn đúng ý mình. Khi mình cho dữ liệu gốc vào nó hơi chậm ạ.Thử với con macro dùng dictionary
PHP:Option Explicit Option Compare Text Sub GPE() Dim dic As Object, key, ton$ Dim Lr&, Arr(), Lc&, i&, j& ton = "t" & ChrW(7891) & "n" Set dic = CreateObject("Scripting.Dictionary") With Sheets("TONG HOP") Lr = .Range("B" & Rows.Count).End(xlUp).Row Lc = .Cells(4, Columns.Count).End(xlToLeft).Column Arr = .Range(.Cells(3, 2), .Cells(Lr, Lc)).Value End With For i = 3 To UBound(Arr, 1) For j = 2 To UBound(Arr, 2) If Arr(1, j) = "" Then Arr(1, j) = Arr(1, j - 1) key = Arr(i, 1) & "|" & Arr(1, j) & "|" & Arr(2, j) If Not dic.exists(key) Then dic.Add (key), Arr(i, j) Next j Next i With Sheets("CHI TIET") Lr = .Range("A" & Rows.Count).End(xlUp).Row Lc = .Cells(4, Columns.Count).End(xlToLeft).Column For i = 5 To Lr For j = 3 To Lc If .Cells(i, 2) <> ton Then key = .Cells(i, 1) & "|" & .Cells(4, j) & "|" & .Cells(i, 2) If dic.exists(key) Then .Cells(i, j) = dic.Item(key) Else .Cells(i, j) = "" End If End If Next j Next i End With MsgBox "Done" Set dic = Nothing End Sub
Option Explicit
Sub bebo021999()
Dim lr&, i&, j&, k&, c&, t&, m&
Dim rng, res(1 To 100000, 1 To 300), cell As Range
With Sheets("TONG HOP")
rng = .Range("B5").CurrentRegion.Value
End With
c = 2: k = 1: res(1, 1) = "MAU": res(1, 2) = "NGAY"
For j = 3 To UBound(rng, 2) - 1 Step 2
c = c + 1: res(1, c) = rng(1, j)
Select Case c
Case 3
For i = 3 To UBound(rng)
If Not IsEmpty(rng(i, 2)) Then
k = k + 1: res(k, 1) = rng(i, 2): res(k, 2) = "NHAN": res(k, c) = rng(i, j)
k = k + 1: res(k, 1) = rng(i, 2): res(k, 2) = "TRA": res(k, c) = rng(i, j + 1)
k = k + 1: res(k, 1) = rng(i, 2): res(k, 2) = "TON"
End If
Next
Case Else
For i = 3 To UBound(rng)
If Not IsEmpty(rng(i, 2)) Then
m = 0
For t = 1 To k
If rng(i, 2) = res(t, 1) Then m = m + 1
Select Case m
Case 1
res(t, c) = rng(i, j)
Case 2
res(t, c) = rng(i, j + 1)
End Select
Next
End If
Next
End Select
Next
Sheets("CHI TIET").Activate
Rows("4:1000").Delete
Range("A4").Resize(k, c).Value = res
With Range("A4").CurrentRegion
For Each cell In .SpecialCells(xlCellTypeBlanks)
cell.FormulaR1C1 = "=IFERROR(RC[-1]+0,0)+R[-2]C-R[-1]C " '"=IF(COLUMN()=3,0,B7)+C5-C6"
Next
End With
lr = Cells(Rows.Count, "A").End(xlUp).Row + 1
Cells(lr, 1).Value = "TONG": Cells(lr, 2).Value = "NHAN"
Cells(lr, 1).Resize(3, 1).MergeCells = True
Cells(lr + 1, 2).Value = "TRA": Cells(lr + 2, 2).Value = "TON"
Range(Cells(lr, 3), Cells(lr + 2, c)).Formula = "=SUMIF($B$5:$B" & lr - 1 & ",$B26,C$5:C" & lr - 1 & ")"
Range(Cells(5, c + 1), Cells(lr + 2, c + 1)).FormulaR1C1 = "=sum(RC[" & -c + 2 & "]:RC[-1])"
Cells(4, c + 1).Value = "TONG"
With Range("A4").CurrentRegion
.VerticalAlignment = xlCenter
.Borders.LineStyle = xlContinuous
End With
lr = Cells(Rows.Count, "B").End(xlUp).Row
For Each cell In Range("B5:B" & lr)
If cell.Value = "TON" Then
cell.Offset(0, -1).Value = ""
cell.Resize(1, c).Interior.Color = vbYellow
End If
Next
Range(Cells(4, c + 1), Cells(lr, c + 1)).Interior.Color = vbYellow
End Sub
Em nhìn qua code của bác bebo021999 thấy đã khủng rồi. Bác lại cho chạy luôn cả Màu và Ngày tháng giúp em nữa, tô màu Tồn nữa chứ. Cảm ơn bác rất rất nhiều.Làm đại, bạn test thử nhé:
PHP:Option Explicit Sub bebo021999() Dim lr&, i&, j&, k&, c&, t&, m& Dim rng, res(1 To 100000, 1 To 300), cell As Range With Sheets("TONG HOP") rng = .Range("B5").CurrentRegion.Value End With c = 2: k = 1: res(1, 1) = "MAU": res(1, 2) = "NGAY" For j = 3 To UBound(rng, 2) - 1 Step 2 c = c + 1: res(1, c) = rng(1, j) Select Case c Case 3 For i = 3 To UBound(rng) If Not IsEmpty(rng(i, 2)) Then k = k + 1: res(k, 1) = rng(i, 2): res(k, 2) = "NHAN": res(k, c) = rng(i, j) k = k + 1: res(k, 1) = rng(i, 2): res(k, 2) = "TRA": res(k, c) = rng(i, j + 1) k = k + 1: res(k, 1) = rng(i, 2): res(k, 2) = "TON" End If Next Case Else For i = 3 To UBound(rng) If Not IsEmpty(rng(i, 2)) Then m = 0 For t = 1 To k If rng(i, 2) = res(t, 1) Then m = m + 1 Select Case m Case 1 res(t, c) = rng(i, j) Case 2 res(t, c) = rng(i, j + 1) End Select Next End If Next End Select Next Sheets("CHI TIET").Activate Rows("4:1000").Delete Range("A4").Resize(k, c).Value = res With Range("A4").CurrentRegion For Each cell In .SpecialCells(xlCellTypeBlanks) cell.FormulaR1C1 = "=IFERROR(RC[-1]+0,0)+R[-2]C-R[-1]C " '"=IF(COLUMN()=3,0,B7)+C5-C6" Next End With lr = Cells(Rows.Count, "A").End(xlUp).Row + 1 Cells(lr, 1).Value = "TONG": Cells(lr, 2).Value = "NHAN" Cells(lr, 1).Resize(3, 1).MergeCells = True Cells(lr + 1, 2).Value = "TRA": Cells(lr + 2, 2).Value = "TON" Range(Cells(lr, 3), Cells(lr + 2, c)).Formula = "=SUMIF($B$5:$B" & lr - 1 & ",$B26,C$5:C" & lr - 1 & ")" Range(Cells(5, c + 1), Cells(lr + 2, c + 1)).FormulaR1C1 = "=sum(RC[" & -c + 2 & "]:RC[-1])" Cells(4, c + 1).Value = "TONG" With Range("A4").CurrentRegion .VerticalAlignment = xlCenter .Borders.LineStyle = xlContinuous End With lr = Cells(Rows.Count, "B").End(xlUp).Row For Each cell In Range("B5:B" & lr) If cell.Value = "TON" Then cell.Offset(0, -1).Value = "" cell.Resize(1, c).Interior.Color = vbYellow End If Next Range(Cells(4, c + 1), Cells(lr, c + 1)).Interior.Color = vbYellow End Sub