Ngocminh19
Thành viên chính thức


- Tham gia
- 30/5/15
- Bài viết
- 87
- Được thích
- 11
Mình làm vội. bạn tham khảo nhé.Xin chào anh chị
Em có file excell muốn gộp dữ liệu ở 2 sheet Thu,chi vào sheet Tong Hop
Mong muốn hiển thị cùng ngày,các khoản chi,số tiền còn lại
Kết quả mong muốn em có điền ở Sheet "TONG HOP"
Mong anh chị giúp đỡ .Em cảm ơn ạ
Mình gửi bạn nhé.Cảm ơn bạn. Có thời gian mong bạn xem tiếp giúp mình
-Ngày tháng theo thứ tự tăng dần
- Cột còn lại tiền thì điện giúp mình 1 giá trị cuối cùng còn lại (Thu-chi)
Mình cảm ơn
View attachment 302283
Bạn ơi
Đây bạn nhé. Mình vẫn dùng Power Query thôi.Bạn ơi
Khi phát sinh nhập thêm sự kiện,mình refesh query thì mất cột còn lại tiền
Bạn có thể giúp nó hiện cùng được không
Đây là M code, có sắn trong file attach mà...Cảm ơn 2 bạn đã chỉ giúp nhé.
Nếu được mọi người viết giúp mình code chạy ra kết quả như mong muốn thì tốt ạ
Chúc mọi người sức khỏe
let
// Chú thích: Source là kết hợp 2 table Thu, Chi vào thành 1 table
Source = Table.Combine({Thu, Chi}),
// Sort table theo cột Ngày a--> z, cột Thu lớn --> nhỏ
Sorted = Table.Sort(Source,{{"Ngay", Order.Ascending},{"Thu", Order.Descending}}),
// Thêm cột STT để tạo running total ( cộng dồn Thu - Cộng dồn Chi )
CotIndex = Table.AddIndexColumn(Sorted, "Index",1,1),
CotTon = Table.AddColumn(CotIndex, "TonQuy", each List.Sum(List.FirstN(CotIndex[Thu],[Index]))- List.Sum(List.FirstN(CotIndex[Chi],[Index]))),
//Khi có kết quả tồn quĩ mỗi dòng rồi thì delete cột này đi
RemovedIndex = Table.RemoveColumns(CotTon,{"Index"})
in
RemovedIndex
Cảm ơn bạnĐây là M code, có sắn trong file attach mà...
Click phải vùng xanh lá , chọn Query / Edit ...
Mã:let // Chú thích: Source là kết hợp 2 table Thu, Chi vào thành 1 table Source = Table.Combine({Thu, Chi}), // Sort table theo cột Ngày a--> z, cột Thu lớn --> nhỏ Sorted = Table.Sort(Source,{{"Ngay", Order.Ascending},{"Thu", Order.Descending}}), // Thêm cột STT để tạo running total ( cộng dồn Thu - Cộng dồn Chi ) CotIndex = Table.AddIndexColumn(Sorted, "Index",1,1), CotTon = Table.AddColumn(CotIndex, "TonQuy", each List.Sum(List.FirstN(CotIndex[Thu],[Index]))- List.Sum(List.FirstN(CotIndex[Chi],[Index]))), //Khi có kết quả tồn quĩ mỗi dòng rồi thì delete cột này đi RemovedIndex = Table.RemoveColumns(CotTon,{"Index"}) in RemovedIndex
Khi mở sheet TongHop tự động chạy codeXin chào anh chị
Em có file excell muốn gộp dữ liệu ở 2 sheet Thu,chi vào sheet Tong Hop
Mong muốn hiển thị cùng ngày,các khoản chi,số tiền còn lại
Kết quả mong muốn em có điền ở Sheet "TONG HOP"
Mong anh chị giúp đỡ .Em cảm ơn ạ
Private Sub Worksheet_Activate()
Call ThuChi
End Sub
Sub ThuChi()
Dim aThu(), aChi(), res()
Dim sRow&, T&, C&, k&, ton#
With Sheets("Thu ")
aThu = .Range("B4:F" & .Range("B" & Rows.Count).End(xlUp).Row + 1).Value
End With
With Sheets("CHI")
aChi = .Range("B3:F" & .Range("B" & Rows.Count).End(xlUp).Row + 1).Value
End With
aThu(UBound(aThu), 1) = 100000
aChi(UBound(aChi), 1) = 100000
sRow = UBound(aThu) + UBound(aChi) - 2
ReDim res(1 To sRow, 1 To 6)
T = 1: C = 1
Do
k = k + 1
If aChi(C, 1) < aThu(T, 1) Then
Call AddRes(res, aChi, C, k, ton, 5, -1)
Else
Call AddRes(res, aThu, T, k, ton, 4, -1)
End If
Loop Until k = sRow
With Sheets("TONG HOP")
sRow = .Range("A" & Rows.Count).End(xlUp).Row
If sRow > 2 Then .Range("A3:G" & sRow).ClearContents
.Range("A3").Resize(k, 6) = res
End With
End Sub
Sub AddRes(res, arr, i, k, ton, ByVal col&, ByVal dau&)
res(k, 1) = k
res(k, 2) = arr(i, 1)
res(k, 3) = arr(i, 2)
res(k, col) = arr(i, 5)
If col = 4 Then ton = ton + arr(i, 5) Else ton = ton - arr(i, 5)
res(k, 6) = ton
i = i + 1
End Sub
Ha ha, đi mô rồi cũng trở về code tĩnh, nhớ nút "nhấn 1 phát", nhứ dòng vê bê a....
Người ta đã hỏi code là vba, chắc chắn không chấp nhận giải pháp khác. Vòng qua vòng lại chỉ là vuốt đuôi trước khi vòi thẳng thừng.
Lỡ rồi thì chịu khó viết vba đi
Cảm ơn bác ạ.Khi mở sheet TongHop tự động chạy codeMã:Private Sub Worksheet_Activate() Call ThuChi End Sub
Mã:Sub ThuChi() Dim aThu(), aChi(), res() Dim sRow&, T&, C&, k&, ton# With Sheets("Thu ") aThu = .Range("B4:F" & .Range("B" & Rows.Count).End(xlUp).Row + 1).Value End With With Sheets("CHI") aChi = .Range("B3:F" & .Range("B" & Rows.Count).End(xlUp).Row + 1).Value End With aThu(UBound(aThu), 1) = 100000 aChi(UBound(aChi), 1) = 100000 sRow = UBound(aThu) + UBound(aChi) - 2 ReDim res(1 To sRow, 1 To 6) T = 1: C = 1 Do k = k + 1 If aChi(C, 1) < aThu(T, 1) Then Call AddRes(res, aChi, C, k, ton, 5, -1) Else Call AddRes(res, aThu, T, k, ton, 4, -1) End If Loop Until k = sRow With Sheets("TONG HOP") sRow = .Range("A" & Rows.Count).End(xlUp).Row If sRow > 2 Then .Range("A3:G" & sRow).ClearContents .Range("A3").Resize(k, 6) = res End With End Sub Sub AddRes(res, arr, i, k, ton, ByVal col&, ByVal dau&) res(k, 1) = k res(k, 2) = arr(i, 1) res(k, 3) = arr(i, 2) res(k, col) = arr(i, 5) If col = 4 Then ton = ton + arr(i, 5) Else ton = ton - arr(i, 5) res(k, 6) = ton i = i + 1 End Sub
Nếu xài query thì không cần quan tâm chuyện này...Nhưng trong trường hợp qua ngày rồi nhập thêm Thu,Chi của ngày cũ ở dòng dưới(do quên chưa nhập ngay) thì bên Sheet "TONG HOP" chưa sắp xếp được ạ
Yêu cầu cơ bản của kiểm soát cơ sở dữ liệu là "phải" nhập liệu theo thứ tự thời gian, bạn nhập không theo trình tự rất dễ sai sót .Cảm ơn bác ạ.
Kết quả thì đúng rồi nếu nhập theo thử tự ngày tử thấp dến cao.
Nhưng trong trường hợp qua ngày rồi nhập thêm Thu,Chi của ngày cũ ở dòng dưới(do quên chưa nhập ngay) thì bên Sheet "TONG HOP" chưa sắp xếp được ạ
Mong bác sửa giúp ạ.
Chúc bác ngày mới vui vẻ
View attachment 302359
Sub ThuChi()
Dim aThu(), aChi(), res()
Dim sRow&, T&, C&, k&, ton#
Application.ScreenUpdating = False
With Sheets("Thu ")
T = .Range("B" & Rows.Count).End(xlUp).Row
res = .Range("B4:F" & T).Value
.Range("B4:F" & T).Sort .Range("B4"), 1, Header:=xlNo
aThu = .Range("B4:F" & .Range("B" & Rows.Count).End(xlUp).Row + 1).Value
.Range("B4:F" & T).Value = res
End With
With Sheets("CHI")
T = .Range("B" & Rows.Count).End(xlUp).Row
res = .Range("B3:F" & T).Value
.Range("B3:F" & T).Sort .Range("B3"), 1, Header:=xlNo
aChi = .Range("B3:F" & .Range("B" & Rows.Count).End(xlUp).Row + 1).Value
.Range("B3:F" & T).Value = res
End With
aThu(UBound(aThu), 1) = 100000
aChi(UBound(aChi), 1) = 100000
sRow = UBound(aThu) + UBound(aChi) - 2
ReDim res(1 To sRow, 1 To 6)
T = 1: C = 1
Do
k = k + 1
If aChi(C, 1) < aThu(T, 1) Then
Call AddRes(res, aChi, C, k, ton, 5, -1)
Else
Call AddRes(res, aThu, T, k, ton, 4, -1)
End If
Loop Until k = sRow
With Sheets("TONG HOP")
sRow = .Range("A" & Rows.Count).End(xlUp).Row
If sRow > 2 Then .Range("A3:G" & sRow).ClearContents
.Range("A3").Resize(k, 6) = res
End With
Application.ScreenUpdating = True
End Sub
Vâng . Kết quả đúng rồi ạYêu cầu cơ bản của kiểm soát cơ sở dữ liệu là "phải" nhập liệu theo thứ tự thời gian, bạn nhập không theo trình tự rất dễ sai sót .
Thêm lệnh sort dữ liệu
Mã:Sub ThuChi() Dim aThu(), aChi(), res() Dim sRow&, T&, C&, k&, ton# Application.ScreenUpdating = False With Sheets("Thu ") T = .Range("B" & Rows.Count).End(xlUp).Row res = .Range("B4:F" & T).Value .Range("B4:F" & T).Sort .Range("B4"), 1, Header:=xlNo aThu = .Range("B4:F" & .Range("B" & Rows.Count).End(xlUp).Row + 1).Value .Range("B4:F" & T).Value = res End With With Sheets("CHI") T = .Range("B" & Rows.Count).End(xlUp).Row res = .Range("B3:F" & T).Value .Range("B3:F" & T).Sort .Range("B3"), 1, Header:=xlNo aChi = .Range("B3:F" & .Range("B" & Rows.Count).End(xlUp).Row + 1).Value .Range("B3:F" & T).Value = res End With aThu(UBound(aThu), 1) = 100000 aChi(UBound(aChi), 1) = 100000 sRow = UBound(aThu) + UBound(aChi) - 2 ReDim res(1 To sRow, 1 To 6) T = 1: C = 1 Do k = k + 1 If aChi(C, 1) < aThu(T, 1) Then Call AddRes(res, aChi, C, k, ton, 5, -1) Else Call AddRes(res, aThu, T, k, ton, 4, -1) End If Loop Until k = sRow With Sheets("TONG HOP") sRow = .Range("A" & Rows.Count).End(xlUp).Row If sRow > 2 Then .Range("A3:G" & sRow).ClearContents .Range("A3").Resize(k, 6) = res End With Application.ScreenUpdating = True End Sub