Phương Phương mito
Thành viên thường trực




			
		- Tham gia
 - 1/5/19
 
- Bài viết
 - 275
 
- Được thích
 - 65
 




Bạn giải thích tại sao có dòng thì có " (90)" hoặc "(92)" có dòng thì không? Số tô đậm trong ngoặc ấy được lấy thế nào?Mến trào anh chị và các bạn,
Nhờ anh chị sửa code giúp em với ạ. Kết quả mong muốn như tại G2 ạ. Code em làm chưa cho được Tổng cộng vào ô mà để tạm tại cột E. Em chưa biết tính khoảng cách giữa 2 lần thành toán ạ. Em cảm ơn ạ.




Cứ lấy ngày thanh toán trừ đi ngày thanh toán gần nhất trước đó ạBạn giải thích tại sao có dòng thì có " (90)" hoặc "(92)" có dòng thì không? Số tô đậm trong ngoặc ấy được lấy thế nào?
25/12/2021-25.000.000
25/03/2022 (90) -29.000.000
dạ, ngại quá vì em hay chát chít với các bạn kiểu xinh nhật, sin trào, xương sương....nên nhiều khi viết thành thói quen xấu ạ. Em sẽ chú ý hơn ạ.Vụ này dàn dụa quá.




Data sort sẵn như thế thì dùng dic chi cho mất công hè?Mến trào anh chị và các bạn,
Nhờ anh chị sửa code giúp em với ạ. Kết quả mong muốn như tại G2 ạ. Code em làm chưa cho được Tổng cộng vào ô mà để tạm tại cột E. Em chưa biết tính khoảng cách giữa 2 lần thành toán ạ. Em cảm ơn ạ.




Mong a chỉ code ạ !Data sort sẵn như thế thì dùng dic chi cho mất công hè?




Code:Mong a chỉ code ạ !
Sub Maika()
    Dim i&, t&, Lr&, Arr(), KQ()
    Dim dDate As Date, dTotal#, Key$
    With Sheets("Data")
        Lr = .Cells(1000000, 1).End(3).Row
        Arr = .Range("A2:E" & Lr + 1).Value
        ReDim KQ(1 To UBound(Arr), 1 To 4)
        t = 1: dDate = .Cells(2, 3)
        For i = 1 To UBound(Arr) - 1
            Key = Arr(i, 1) & "|" & Arr(i, 4)
            If Arr(i + 1, 1) & "|" & Arr(i + 1, 4) = Key Then
                If Arr(i, 3) <> dDate Then
                    KQ(t, 4) = KQ(t, 4) & Arr(i, 3) & "(" & Arr(i, 3) - dDate & ")" & "-" & Format(Arr(i, 5), "#,##0") & Chr(10)
                Else
                    KQ(t, 4) = KQ(t, 4) & Arr(i, 3) & "-" & Format(Arr(i, 5), "#,##0") & Chr(10)
                End If
                dTotal = dTotal + Arr(i, 5): dDate = Arr(i, 3)
            Else
                KQ(t, 1) = Arr(i, 1)
                KQ(t, 2) = Arr(i, 2)
                KQ(t, 3) = Arr(i, 4)
                dTotal = dTotal + Arr(i, 5)
                KQ(t, 4) = KQ(t, 4) & Arr(i, 3) & "(" & Arr(i, 3) - dDate & ")" & "-" & Format(Arr(i, 5), "#,##0") & Chr(10) & "Tong cong: " & Format(dTotal, "#,##0")
                t = t + 1: dTotal = 0: dDate = Arr(i + 1, 3)
            End If
        Next
        Sheets("KQ").Range("A2:D90000").ClearContents
        Sheets("KQ").Range("A2").Resize(t, 4) = KQ
    End With
End Sub
	



Anh cho em hỏi thêm ạ. Cho dữ liệu vào arr. rồi sau đó lọc theo tứ tự tăng dần của ngày tháng, rồi lọc theo thứ tự tên KH để chuẩn hoá dữ liệu phòng dữ liệu chưa chuẩn ngay thì thêm code như nào được ạ !Code:
Rich (BB code):Sub Maika() Dim i&, t&, Lr&, Arr(), KQ() Dim dDate As Date, dTotal#, Key$ With Sheets("Data") Lr = .Cells(1000000, 1).End(3).Row Arr = .Range("A2:E" & Lr + 1).Value ReDim KQ(1 To UBound(Arr), 1 To 4) t = 1: dDate = .Cells(2, 3) For i = 1 To UBound(Arr) - 1 Key = Arr(i, 1) & "|" & Arr(i, 4) If Arr(i + 1, 1) & "|" & Arr(i + 1, 4) = Key Then If Arr(i, 3) <> dDate Then KQ(t, 4) = KQ(t, 4) & Arr(i, 3) & "(" & Arr(i, 3) - dDate & ")" & "-" & Format(Arr(i, 5), "#,##0") & Chr(10) Else KQ(t, 4) = KQ(t, 4) & Arr(i, 3) & "-" & Format(Arr(i, 5), "#,##0") & Chr(10) End If dTotal = dTotal + Arr(i, 5): dDate = Arr(i, 3) Else KQ(t, 1) = Arr(i, 1) KQ(t, 2) = Arr(i, 2) KQ(t, 3) = Arr(i, 4) dTotal = dTotal + Arr(i, 5) KQ(t, 4) = KQ(t, 4) & Arr(i, 3) & "(" & Arr(i, 3) - dDate & ")" & "-" & Format(Arr(i, 5), "#,##0") & Chr(10) & "Tong cong: " & Format(dTotal, "#,##0") t = t + 1: dTotal = 0: dDate = Arr(i + 1, 3) End If Next Sheets("KQ").Range("A2:D90000").ClearContents Sheets("KQ").Range("A2").Resize(t, 4) = KQ End With End Sub




Tôi không rành chuyện sắp xếp trong mảng nên muốn như thế thì tôi dùng VBA sort trên sheet xong mới cho vào mảng.Anh cho em hỏi thêm ạ. Cho dữ liệu vào arr. rồi sau đó lọc theo tứ tự tăng dần của ngày tháng, rồi lọc theo thứ tự tên KH để chuẩn hoá dữ liệu phòng dữ liệu chưa chuẩn ngay thì thêm code như nào được ạ !




Option Explicit
Sub gopHd()
Dim lr&, i&, k&, rng, res(), sp, sum&, st As String
Dim dic As Object, key
Set dic = CreateObject("Scripting.Dictionary")
With Sheets("Data")
    lr = .Cells(Rows.Count, "A").End(xlUp).Row
    rng = .Range("A2:E" & lr).Value
End With
For i = 1 To UBound(rng)
    If Not dic.exists(rng(i, 4)) Then
        dic.Add rng(i, 4), i
    Else
        dic(rng(i, 4)) = dic(rng(i, 4)) & "|" & i
    End If
Next
ReDim res(1 To dic.Count, 1 To 5)
For Each key In dic.keys
    sp = Split(dic(key), "|")
    k = k + 1: res(k, 1) = rng(sp(0), 1): res(k, 2) = rng(sp(0), 2): res(k, 3) = key
    For i = 0 To UBound(sp)
        If i = 0 Then
            st = rng(sp(0), 3) & " - " & Format(rng(sp(0), 5), "#,###") & vbLf
            sum = rng(sp(0), 5)
        Else
            sum = sum + rng(sp(i), 5)
            st = st & rng(sp(0), 3) & " (" & (rng(sp(i), 3) - rng(sp(i - 1), 3)) & ") -" & Format(rng(sp(i), 5), "#,###") & vbLf
        End If
        If i = UBound(sp) Then st = st & "Tong cong: " & Format(sum, "#,###")
    Next
    res(k, 4) = st: res(k, 5) = sum
Next
With Sheets("KQ")
    .Range("A2:E10000").ClearContents
    .Range("A2").Resize(dic.Count, 5).Value = res
End With
Set dic = Nothing
End Sub
	



Cảm ơn anh đã trợ giúp ạ. Em chạy thử kết quả đúng rồi ạ !Thử xài cái này xem nhé:
Mã:Option Explicit Sub gopHd() Dim lr&, i&, k&, rng, res(), sp, sum&, st As String Dim dic As Object, key Set dic = CreateObject("Scripting.Dictionary") With Sheets("Data") lr = .Cells(Rows.Count, "A").End(xlUp).Row rng = .Range("A2:E" & lr).Value End With For i = 1 To UBound(rng) If Not dic.exists(rng(i, 4)) Then dic.Add rng(i, 4), i Else dic(rng(i, 4)) = dic(rng(i, 4)) & "|" & i End If Next ReDim res(1 To dic.Count, 1 To 5) For Each key In dic.keys sp = Split(dic(key), "|") k = k + 1: res(k, 1) = rng(sp(0), 1): res(k, 2) = rng(sp(0), 2): res(k, 3) = key For i = 0 To UBound(sp) If i = 0 Then st = rng(sp(0), 3) & " - " & Format(rng(sp(0), 5), "#,###") & vbLf sum = rng(sp(0), 5) Else sum = sum + rng(sp(i), 5) st = st & rng(sp(0), 3) & " (" & (rng(sp(i), 3) - rng(sp(i - 1), 3)) & ") -" & Format(rng(sp(i), 5), "#,###") & vbLf End If If i = UBound(sp) Then st = st & "Tong cong: " & Format(sum, "#,###") Next res(k, 4) = st: res(k, 5) = sum Next With Sheets("KQ") .Range("A2:E10000").ClearContents .Range("A2").Resize(dic.Count, 5).Value = res End With Set dic = Nothing End Sub
Dạ vâng ạ !Tôi không rành chuyện sắp xếp trong mảng nên muốn như thế thì tôi dùng VBA sort trên sheet xong mới cho vào mảng.
Phần này trên diễn đàn có rồi, chịu khó tìm thôi. Trong đó có một file của mình. Lâu rồi không dùng đến nên cũng không muốn mò lại.Cho dữ liệu vào arr. rồi sau đó lọc theo tứ tự tăng dần của ngày tháng, rồi lọc theo thứ tự tên KH
Hèn gì quý vị không thích nó.Nhiều người ưa báo cáo như thế thì phải làm chứ bác. Mà nói thực, xưa đến nay em chẳng thích cách trình bày của pivot table chút nào, mặc dù nó tuyệt vời về truy vấn.