Phuocam
Thành viên mới
- Tham gia
- 16/5/13
- Bài viết
- 4,722
- Được thích
- 7,737
Ví dụ:Vì vậy em thấy xét đến trùng phút là đủ.
01/04/2019 8:35:59
01/04/2019 8:36:00
Nhận xét: Trùng phút chưa chắc đã đủ
Ví dụ:Vì vậy em thấy xét đến trùng phút là đủ.
Vậy hai mốc thời gian 01/04/2019 8:35:59 và 01/04/2019 8:36:00 chả nhẽ lại thành không "cùng thời gian" àCảm ơn các anh / chị
Em chợt nhớ ra 1 vấn đề, cái quên này khá là quan trọng nhưng không rõ là có đơn giản bớt công thức mọi người đang xây dựng để đáp ứng điều kiện của bài này không nữa
Theo logic thì có thể bỏ qua phần xét đến tiêu chí GIÂY (bằng GIÂY hoặc lệch 1 GIÂY cũng không cần xét đến nữa), chỉ cần đáp ứng tiêu chí trùng NAME - trùng START - trùng LOCATION - và cuối cùng là trùng TIME, trong TIME chỉ cần trùng ngày - tháng - năm - giờ - phút là đủ đưa vào diện "2 chuyến nhưng ĐẾM 1 LẦN"
vì thực tế là để thực hiện xong 1 chuyến đã tốn một thời gian nhất định, thế nên không thể có trường hợp đáp ứng đầy đủ những tiêu chí trên trùng đến tận phút mà lại không phải là 1 chuyến đi đôi. Anh / chị hiểu ý em không ạ?
Ví dụ 2 "TYPE 1" (đã đáp ứng trùng NAME - START - LOCATION) có dữ liệu thời gian như sau:
01/04/2019 8:35:03
01/04/2019 8:35:04
vì trong 60 giây của phút thứ 35 này không thể có NAME nào thực hiện được 2 "TYPE 1" riêng biệt được, nên chắc chắn đây là 1 chuyến đi đôi. Vì vậy em thấy xét đến trùng phút là đủ.
Hai ô ra kết quả khác, không biết có hiểu sai chỗ nào không.Chào anh em,
Rất thích chủ đề giờ chênh lệch này, vì hoàn toàn giống với thực tế đang theo dõi sổ sách tại Cty.
Nay, gửi anh em yêu cầu (mà thực tế đang làm) như sau:
Chỉ tạo bằng công thức cho cột F, trả về kết quả là các ký hiệu quy định trong bảng I1:L11, với các điều kiện sau:
1/ Nếu Phát sinh Nợ >0: Đặc điểm trên giao dịch có cùng Ngày-Giờ-Phút-Giây (chỉ lệch đúng 1 giây) thường có 3 dòng:
○ Đối với Thanh toán cho Nhà Cung Cấp (NCC), hoặc các cơ quan hữu quan (BHXH, Thuế...): thường nội dung diễn giải giống nhau
→ Giá trị lớn nhất: là Thanh toán (thường khớp đúng với giá trị đang theo dõi bên sheet "SoKTChitiet")
→ Giá trị lớn nhì: là Phí NH chuyển khoản
→ Giá trị cuối: là VAT Phí NH chuyển khoản
Lưu ý: Có vài NCC cùng chung Ngân hàng, thì chỉ có 1 dòng phát sinh giá trị thanh toán, không có 2 dòng Phí và VAT.
○ Đối với Rút Tiền gửi Ngân hàng:
→ Giá trị lớn nhất: là Rút tiền gửi ngân hàng (TGHN) nhập Qũy Tiền mặt (QTM). Diễn giải thường có chữ RTM
(thường khớp đúng với giá trị đang theo dõi bên sheet "SoKTChitiet")
→ Giá trị lớn nhì: là Phí Rút TGNH
→ Giá trị cuối: là VAT Phí rút TGNH
2/ Nếu Phát sinh Có >0: Được phân ra:
→ Bán Ngoại tệ: khi trong Diễn giải có ghi nội dung "BAN NGOAI TE"
→ Lãi tiền gửi ngân hàng: khi trong Diễn giải có ghi nội dung "Interest"
→ Hoàn tiền: khi trong Diễn giải có ghi nội dung "HOAN NHAP"
→ Số còn lại là Thu tiền
Kết quả mong muốn trả về như đã đánh tay vào cột F file kèm.
Chúc anh em tham khảo vui.
Thân
Theo như phân tích của hai anh trên, bạn không nên không xét đến 1 giây.Cảm ơn các anh / chị
Em chợt nhớ ra 1 vấn đề, cái quên này khá là quan trọng nhưng không rõ là có đơn giản bớt công thức mọi người đang xây dựng để đáp ứng điều kiện của bài này không nữa
Theo logic thì có thể bỏ qua phần xét đến tiêu chí GIÂY (bằng GIÂY hoặc lệch 1 GIÂY cũng không cần xét đến nữa), chỉ cần đáp ứng tiêu chí trùng NAME - trùng START - trùng LOCATION - và cuối cùng là trùng TIME, trong TIME chỉ cần trùng ngày - tháng - năm - giờ - phút là đủ đưa vào diện "2 chuyến nhưng ĐẾM 1 LẦN"
vì thực tế là để thực hiện xong 1 chuyến đã tốn một thời gian nhất định, thế nên không thể có trường hợp đáp ứng đầy đủ những tiêu chí trên trùng đến tận phút mà lại không phải là 1 chuyến đi đôi. Anh / chị hiểu ý em không ạ?
Ví dụ 2 "TYPE 1" (đã đáp ứng trùng NAME - START - LOCATION) có dữ liệu thời gian như sau:
01/04/2019 8:35:03
01/04/2019 8:35:04
vì trong 60 giây của phút thứ 35 này không thể có NAME nào thực hiện được 2 "TYPE 1" riêng biệt được, nên chắc chắn đây là 1 chuyến đi đôi. Vì vậy em thấy xét đến trùng phút là đủ.
Nếu vậy thì sẽ không có trường hợp như dòng 17 và 18 trong file và không cần xét đến START và LOCATION.Ví dụ: có thể các chuyến coi là trùng lắp, sẽ có biên độ chênh lệch nhau trong vòng 10 giây, nhưng giữa hai chuyến khác nhau phát sinh, có thể cách biệt là từ 2 phút trở lên (cái này là tôi giả dụ thôi), thì hai công thức:
Hai dòng đó khác ngày.Nếu vậy thì sẽ không có trường hợp như dòng 17 và 18 trong file và không cần xét đến START và LOCATION.
Chính xác là bị tính sai, và ký hiệu phải là "Pi" và "Pv".Hai ô ra kết quả khác, không biết có hiểu sai chỗ nào không.
View attachment 216753
Nhìn cái đuôi thấy giống tưởng giống hếtHai dòng đó khác ngày.
Ví dụ:
01/04/2019 8:35:59
01/04/2019 8:36:00
Nhận xét: Trùng phút chưa chắc đã đủ
Đúng là em bỏ sót trường hợp nàyVậy hai mốc thời gian 01/04/2019 8:35:59 và 01/04/2019 8:36:00 chả nhẽ lại thành không "cùng thời gian" à
Cảm ơn anh nhiều. Em đã hiểu vấn đềTheo như phân tích của hai anh trên, bạn không nên không xét đến 1 giây.
Trong bài toán này, hoàn toàn phụ thuộc vào bạn biết biên độ thời gian (giây) hạn định để phân biệt sự khác nhau giữa hai giao dịch, bạn phải tự nhận xét lấy qua việc: "thông lệ" nó xảy ra như thế nào.
Ví dụ: có thể các chuyến coi là trùng lắp, sẽ có biên độ chênh lệch nhau trong vòng 10 giây, nhưng giữa hai chuyến khác nhau phát sinh, có thể cách biệt là từ 2 phút trở lên (cái này là tôi giả dụ thôi), thì hai công thức:
"Rất" phù hợp với yêu cầu của bạn rồi.
- Bài #2 của anh @HieuCD, và
- Bài #6 của bạn @dazkangel
Trong file kèm là tôi nâng độ rộng biên của cả hai công thức tùy theo ý bạn (sau khi bạn đã nhận xét và rút ra được cái "thông lệ" phân biệt về thời gian, như trên đã đề cập). Bạn xem thử và tùy nghi áp dụng vào công việc của bạn.
Thân
Vấn đề của thớt xong rồi thì tới vấn đề phát sinhChào anh em,
Rất thích chủ đề giờ chênh lệch này, vì hoàn toàn giống với thực tế đang theo dõi sổ sách tại Cty.
Nay, gửi anh em yêu cầu (mà thực tế đang làm) như sau:
Chỉ tạo bằng công thức cho cột F, trả về kết quả là các ký hiệu quy định trong bảng I1:L11, với các điều kiện sau:
1/ Nếu Phát sinh Nợ >0: Đặc điểm trên giao dịch có cùng Ngày-Giờ-Phút-Giây (chỉ lệch đúng 1 giây) thường có 3 dòng:
○ Đối với Thanh toán cho Nhà Cung Cấp (NCC), hoặc các cơ quan hữu quan (BHXH, Thuế...): thường nội dung diễn giải giống nhau
→ Giá trị lớn nhất: là Thanh toán (thường khớp đúng với giá trị đang theo dõi bên sheet "SoKTChitiet")
→ Giá trị lớn nhì: là Phí NH chuyển khoản
→ Giá trị cuối: là VAT Phí NH chuyển khoản
Lưu ý: Có vài NCC cùng chung Ngân hàng, thì chỉ có 1 dòng phát sinh giá trị thanh toán, không có 2 dòng Phí và VAT.
○ Đối với Rút Tiền gửi Ngân hàng:
→ Giá trị lớn nhất: là Rút tiền gửi ngân hàng (TGHN) nhập Qũy Tiền mặt (QTM). Diễn giải thường có chữ RTM
(thường khớp đúng với giá trị đang theo dõi bên sheet "SoKTChitiet")
→ Giá trị lớn nhì: là Phí Rút TGNH
→ Giá trị cuối: là VAT Phí rút TGNH
2/ Nếu Phát sinh Có >0: Được phân ra:
→ Bán Ngoại tệ: khi trong Diễn giải có ghi nội dung "BAN NGOAI TE"
→ Lãi tiền gửi ngân hàng: khi trong Diễn giải có ghi nội dung "Interest"
→ Hoàn tiền: khi trong Diễn giải có ghi nội dung "HOAN NHAP"
→ Số còn lại là Thu tiền
Kết quả mong muốn trả về như đã đánh tay vào cột F file kèm.
Chúc anh em tham khảo vui.
Thân
Cảm ơn vì đã quan tâm!Vấn đề của thớt xong rồi thì tới vấn đề phát sinh
Thì tôi làm theo quy luật mà bạn mô tả mà. Cứ ráp vô quy luật nó trúng cái nào thì lấy cái đó thôi.Dòng 103 và 104 (Ngày 26/04/2019 18:29:15) thực ra là tiền Phí Rút TGNH và VAT của khoảng rút tiền 20 Triệu (Dòng 90: 26/04/2019 14:13:17).
Trong Diễn giải (Dòng 104) của nó cũng thể hiện.
Thân
Mấy anh I.T thảo chương Internet banking của ngân hàng cũng vui lắm:Thì tôi làm theo quy luật mà bạn mô tả mà. Cứ ráp vô quy luật nó trúng cái nào thì lấy cái đó thôi.
Hai công thức của anh @HieuCD và @dazkangel em đã áp dụng rất ok cho bài test nho nhỏ của em !Theo như phân tích của hai anh trên, bạn không nên không xét đến 1 giây.
Trong bài toán này, hoàn toàn phụ thuộc vào bạn biết biên độ thời gian (giây) hạn định để phân biệt sự khác nhau giữa hai giao dịch, bạn phải tự nhận xét lấy qua việc: "thông lệ" nó xảy ra như thế nào.
Ví dụ: có thể các chuyến coi là trùng lắp, sẽ có biên độ chênh lệch nhau trong vòng 10 giây, nhưng giữa hai chuyến khác nhau phát sinh, có thể cách biệt là từ 2 phút trở lên (cái này là tôi giả dụ thôi), thì hai công thức:
"Rất" phù hợp với yêu cầu của bạn rồi.
- Bài #2 của anh @HieuCD, và
- Bài #6 của bạn @dazkangel
Trong file kèm là tôi nâng độ rộng biên của cả hai công thức tùy theo ý bạn (sau khi bạn đã nhận xét và rút ra được cái "thông lệ" phân biệt về thời gian, như trên đã đề cập). Bạn xem thử và tùy nghi áp dụng vào công việc của bạn.
Thân
10.000 dòng dùng SumIfS khá nặng, còn hàm mảng sẽ đơ máy. Nếu bạn chấp nhận dùng code VBA thì thiết kế tất cả báo cáo cần thiết trên sheet thật để mình viết codeHai công thức của anh @HieuCD và @dazkangel em đã áp dụng rất ok cho bài test nho nhỏ của em !
Nhưng khi áp dụng vào thực tế công việc thì do số lượng dòng dữ liệu rất nhiều, tầm trên dưới 10000 dòng / tháng - khiến công thức rất nặng và chạy rất rất lâu anh / chị ạ.
Vấn đề nữa là trong ~10000 dòng hàng (nghĩa là rất nhiều), đúng như anh nói về biên độ chênh lệch giây, rõ ràng vẫn tồn tại việc chênh nhau nhiều số giây hơn (có thể lên đến vài phút) nhưng thực tế nó đúng rơi vào trường hợp 2 in 1 bởi miễn là cùng 1 người (NAME), lấy cùng loại TYPE 1, xuất phát cùng 1 nơi (START) và đến cùng 1 chỗ (LOCATION)
Trường hợp bằng hoặc chênh nhau 1 giây là chiếm đa số để mình nhận diện 2 in 1, nhưng thực tế vẫn tồn tại 1 vài trường hợp cũng thuộc diện này nhưng lại có thể chênh nhau nhiều giây hoặc lên đến vài phút. Mình không tính nó vào là diện 2 in 1 thì sẽ bị dư chuyến và không chuẩn cho việc tính tiền phải trả
Và em cũng rất mong muốn ngoài thống kê được TỔNG ra thì ta có thể thống kê "đếm" chi tiết được số chuyến TYPE 1 cụ thể cho từng "TUYẾN" (vì điểm đi - điểm đến khác nhau sẽ có giá tiền cũng khác nhau) đếm được bao nhiêu chuyến 1 tuyến bất kỳ của từng cá nhân, sẽ phục vụ cho việc lên báo cáo chi tiết số tiền phải trả cho từng tuyến + cho từng NAME trong 1 khoảng thời gian tùy chọn.
Ví dụ : theo file TEST thì từ 01/04 đến 12/04/2019
01/04/2019 anh KIM đi được 1 chuyến đôi TYPE 1 từ điểm a đến điểm C
03/04/2019 anh KIM đi được 1 chuyến đơn TYPE 1 từ điểm a đến điểm C
11/04/2019 anh KIM đi được 1 chuyến đơn TYPE 1 từ điểm a đến điểm C
Như vậy tuyến a - C đi loại TYPE 1 của anh KIM đếm được tổng cộng là 3 chuyến (trong thực tế sẽ đếm trong 1 khoảng thời gian như tuần, tháng, năm,...), đây chính là cái cần thống kê. Tương tự với các tuyến khác, NAME khác, thời gian khác.
Mong anh / chị có phương án nào tối ưu hơn cho bài toán lắm yêu cầu rắc rối này thì giúp em với Cảm ơn mọi người rất nhiều.
Công thức dưới đây là công thức thực tế đang quản lý trong sổ theo dõi ngân hàng, với mục đích chỉ nhằm trao đổi cho vui về công thức mảng.Vấn đề của thớt xong rồi thì tới vấn đề phát sinh
=IF(--C4>0,CHOOSE(IFERROR(1/(1/SUM(COUNTIF(E4,{"*hoan tien*","*ban ngoai te*","*Interest*"})*{1,2,3})),4),"Ht","Bn","TL","TH"),LOOKUP(B4,AGGREGATE(15,6,$B$4:$B$150/(ABS(A4-$A$4:$A$104)<2/86399),{1,2,3}^(SUMPRODUCT(N(ABS(A4-$A$4:$A$104)<2/86399))>1)),IF(SUM(COUNTIFS($A$4:$A$150,A4+{-1,0,1}/86400+10^-12,$E$4:$E$150,{"*RTM*";"*Rut*"})),{"Rv","Rp","R"},{"Pv","Pi","TC"})))
Vâng, nếu anh giúp được em thì thật tốt quá thực ra nếu dùng hàm thì em còn hiểu được đôi chút, nhưng để đáp ứng bài này thì em cũng biết hàm mảng sẽ không thể chạy nổi.10.000 dòng dùng SumIfS khá nặng, còn hàm mảng sẽ đơ máy. Nếu bạn chấp nhận dùng code VBA thì thiết kế tất cả báo cáo cần thiết trên sheet thật để mình viết code
Không có dữ liệu thật nên công thức dài dòngVâng, nếu anh giúp được em thì thật tốt quá thực ra nếu dùng hàm thì em còn hiểu được đôi chút, nhưng để đáp ứng bài này thì em cũng biết hàm mảng sẽ không thể chạy nổi.
Dùng VBA thì em mù tịt, anh giúp em thì may quá. Em cảm ơn nhiều !
P/S: @Phan Thế Hiệp anh thiết kế cái báo cáo đó sang sheet khác với sheet dữ liệu giúp em nhé, vì sheet dữ liệu của em nó sẽ có tầm 10000 dòng là khá phức tạp rồi! Với thiết kế code tùy chỉnh được biên độ GIÂY để tính độ trùng thời gian được thì tốt quá ạ
Có 1 chút vấn đề em trình bày mong bác thiết kế VBA giúp em là trong bảng TEST cột TYPE em để là 1 hoặc 2 nhưng thực tế trong bảng dữ liệu công việc của em nó sẽ là 1xxx hoặc 2xxx, để xác định TYPE nào thì chỉ cần tách lấy ký tự đầu tiên của "1xxx hoặc 2xxx" sẽ được 1 hoặc 2 ra để thống kê là được ạ, phần xxx đằng sau không quan trọng.
Function CountIfTime(ByVal TimeRng As Range, ByVal NameRng As Range, _
ByVal TypeRng As Range, ByVal StartRng As Range, ByVal LocalRng As Range, _
ByVal dTime As Double, ByVal dk As Variant)
'=CountIfTime(Cot Time, Cot Name, Cot Type, Cot Start, Cot Location, Tieu Chuan Thoi Gian, INDEX((Dieu kien 1)*(Dieu kien 2) … ,))
Dim S, Dic As Object
Dim i As Long, k As Long, q As Long, j As Long, n As Long
Dim iKey As String, tmp, Test As Boolean
Set Dic = CreateObject("scripting.dictionary")
n = TimeRng.Rows.Count
For i = 1 To n
If dk(i, 1) Then
iKey = NameRng(i, 1) & "#" & TypeRng(i, 1) & "#" & StartRng(i, 1) & "#" & LocalRng(i, 1)
If Dic.exists(iKey) = False Then
k = k + 1
Dic.Add iKey, Array(TimeRng(i, 1).Value2)
Else
tmp = TimeRng(i, 1).Value2
Test = True
S = Dic.Item(iKey)
q = UBound(S)
For j = 0 To q
If Abs(tmp - S(j)) < dTime Then Test = False: Exit For
Next j
If Test = True Then
k = k + 1
ReDim Preserve S(0 To q + 1)
S(q + 1) = tmp
Dic.Item(iKey) = S
End If
End If
End If
Next i
CountIfTime = k
Set Dic = Nothing
End Function
Em chào anhKhông có dữ liệu thật nên công thức dài dòng
Xem cách dùng công thức trong FileMã:Function CountIfTime(ByVal TimeRng As Range, ByVal NameRng As Range, _ ByVal TypeRng As Range, ByVal StartRng As Range, ByVal LocalRng As Range, _ ByVal dTime As Double, ByVal dk As Variant) '=CountIfTime(Cot Time, Cot Name, Cot Type, Cot Start, Cot Location, Tieu Chuan Thoi Gian, INDEX((Dieu kien 1)*(Dieu kien 2) … ,)) Dim S, Dic As Object Dim i As Long, k As Long, q As Long, j As Long, n As Long Dim iKey As String, tmp, Test As Boolean Set Dic = CreateObject("scripting.dictionary") n = TimeRng.Rows.Count For i = 1 To n If dk(i, 1) Then iKey = NameRng(i, 1) & "#" & TypeRng(i, 1) & "#" & StartRng(i, 1) & "#" & LocalRng(i, 1) If Dic.exists(iKey) = False Then k = k + 1 Dic.Add iKey, Array(TimeRng(i, 1).Value2) Else tmp = TimeRng(i, 1).Value2 Test = True S = Dic.Item(iKey) q = UBound(S) For j = 0 To q If Abs(tmp - S(j)) < dTime Then Test = False: Exit For Next j If Test = True Then k = k + 1 ReDim Preserve S(0 To q + 1) S(q + 1) = tmp Dic.Item(iKey) = S End If End If End If Next i CountIfTime = k Set Dic = Nothing End Function
Bạn nhập kết quả bằng tay và gởi lại fileEm chào anh
Anh ơi, VBA em thì mù tịt nên em áp dụng đoạn code này của anh hoài mà vẫn chưa được
Cụ thể là em cần áp dụng cho bảng dữ liệu tầm 10000 dòng + bảng dữ liệu nằm ở 1 sheet riêng, bảng báo cáo nằm ở 1 sheet riêng (như file đính kèm), em viết rõ thiết kế và yêu cầu trong file anh giúp em hoàn thiện với nhé.
Em cảm ơn rất nhiều !