tangoctuan
Thành viên hoạt động
- Tham gia
- 22/4/08
- Bài viết
- 153
- Được thích
- 19
Muốn tính số phút giữa 2 thời điểm thì lấy (thời gian sau - thời gian trước) x 1440 sẽ ra số phútEm có 3 khoảng thời gian (có thể trùng hoặc khác nhau) như trong file gửi kèm, và muốn tìm khoảng giao trùng nhau giữa 3 cặp này là bao nhiêu lâu (theo đơn vị phút).
Kính nhờ các bác hỗ trợ giúp. Em xin cảm ơn!
Dữ liệu trong file không phải là Date, không làm được.Em có 3 khoảng thời gian (có thể trùng hoặc khác nhau) như trong file gửi kèm, và muốn tìm khoảng giao trùng nhau giữa 3 cặp này là bao nhiêu lâu (theo đơn vị phút).
Kính nhờ các bác hỗ trợ giúp. Em xin cảm ơn!
vâng cái đó thì em cũng biết, nhưng cái chính là tìm khoảng thời gian trùng giao nhau giữa 3 cặp thời điểm thì mới là khó với em ấy bác.Muốn tính số phút giữa 2 thời điểm thì lấy (thời gian sau - thời gian trước) x 1440 sẽ ra số phút
dữ liệu hệ thống xuất ra theo định dạng như vậy rồiDữ liệu trong file không phải là Date, không làm được.
Thử code này, chưa kiểm tra kỹ:vâng cái đó thì em cũng biết, nhưng cái chính là tìm khoảng thời gian trùng giao nhau giữa 3 cặp thời điểm thì mới là khó với em ấy bác.
dữ liệu hệ thống xuất ra theo định dạng như vậy rồi
Option Explicit
Sub NT()
Dim Arr(), Res(), fMax As Double, tMin As Double, I As Long, U1 As Long, U2 As Long, J As Long
Dim fDate As Double, tDate As Double
Arr = Sheets("Sheet1").Range("A2:F" & Sheets("Sheet1").Cells(Rows.Count, "A").End(xlUp).Row).Value
U1 = UBound(Arr, 1): U2 = UBound(Arr, 2)
ReDim Res(1 To U1, 1 To 1)
For I = 1 To U1
tMin = 10 ^ 10: fMax = 0
For J = 1 To U2 Step 2
fDate = CDbl(CDate(Arr(I, J))): tDate = CDbl(CDate(Arr(I, J + 1)))
If fDate > 0 And tDate > 0 Then
If fDate > fMax Then fMax = fDate
If tDate < tMin Then tMin = tDate
End If
Next
If tMin > fMax And fMax > 0 Then
Res(I, 1) = (tMin - fMax) * 1440
End If
Next
Sheets("Sheet1").Range("G2").Resize(U1, 1) = Res
End Sub
Không dùng được hàm này, bởi nó sẽ phụ thuộc định dạng DateTime của hệ thống.
Em thử trên máy em thấy ra kết quả bình thường, em không rõ máy khác định dạng khác nó sẽ thế nào nữaKhông dùng được hàm này, bởi nó sẽ phụ thuộc định dạng DateTime của hệ thống.
Ví dụ: 12/04/2021 16:23:00 làm sao biết là tháng 12 hay tháng 04?Em thử trên máy em thấy ra kết quả bình thường, em không rõ máy khác định dạng khác nó sẽ thế nào nữa
Đoạn này em vẫn chưa hình dung được, nếu nhìn bằng mắt không biết được text xuất ra từ phần mềm dạng nào, thì làm sao đưa nó về giá trị double được . Anh gợi ý em thuật toán vớiViết một function getDateTime(byval strDateTime as String) as Double xem nào.
Cái DateTime trong file của họ là chuỗi mà: mm/dd/yyyy hh:MM:ss (xác nhận lại với chủ thớt).Đoạn này em vẫn chưa hình dung được, nếu nhìn bằng mắt không biết được text xuất ra từ phần mềm dạng nào, thì làm sao đưa nó về giá trị double được . Anh gợi ý em thuật toán với
Cái này thì chắc chắn rồi không cần xác nhận đâu anhCái DateTime trong file của họ là chuỗi mà: mm/dd/yyyy hh:MM:ss (xác nhận lại với chủ thớt).
3 khoảng tức là có tất cả 3 cặp (6) thời điểm. Giải theo kiểu giản đồ Venn thì ra chỗ giao giữa 2 cái chứ gì.Em có 3 khoảng thời gian (có thể trùng hoặc khác nhau) như trong file gửi kèm, và muốn tìm khoảng giao trùng nhau giữa 3 cặp này là bao nhiêu lâu (theo đơn vị phút).
Kính nhờ các bác hỗ trợ giúp. Em xin cảm ơn!
Trường hợp không giao nhau, kết quả là số âm, bẫy thêm hàm max: = MAX(0,...)Nếu ra số thập phân:
=(MIN(B2+0,D2+0,F2+0)-MAX(A2+0,C2+0,E2+0))*1440
Định dạng General
vâng, định dạng trong này theo dạng mm/dd/yyyy hh:MM:ss bác ạ. Em chạy thử code của bác Nhattanktnn và kiểm tra thủ công thử một vài trường hợp thì chưa thấy có sai sót. Còn bác bảo chưa kiểm tra kỹ thì em cũng không biết phải kiểm tra lại như nào vì em chỉ biết copy code để chạy thôi ạ.Thử code này, chưa kiểm tra kỹ:
Mã:Option Explicit Sub NT() Dim Arr(), Res(), fMax As Double, tMin As Double, I As Long, U1 As Long, U2 As Long, J As Long Dim fDate As Double, tDate As Double Arr = Sheets("Sheet1").Range("A2:F" & Sheets("Sheet1").Cells(Rows.Count, "A").End(xlUp).Row).Value U1 = UBound(Arr, 1): U2 = UBound(Arr, 2) ReDim Res(1 To U1, 1 To 1) For I = 1 To U1 tMin = 10 ^ 10: fMax = 0 For J = 1 To U2 Step 2 fDate = CDbl(CDate(Arr(I, J))): tDate = CDbl(CDate(Arr(I, J + 1))) If fDate > 0 And tDate > 0 Then If fDate > fMax Then fMax = fDate If tDate < tMin Then tMin = tDate End If Next If tMin > fMax And fMax > 0 Then Res(I, 1) = (tMin - fMax) * 1440 End If Next Sheets("Sheet1").Range("G2").Resize(U1, 1) = Res End Sub
Định dạng dữ liệu (format cell) không ảnh hưởng đến kết quả vì dữ liệu dạng text, các máy khai báo ngày tháng hệ thống khác nhau sẽ có kết quả khác nhauvâng, định dạng trong này theo dạng mm/dd/yyyy hh:MM:ss bác ạ. Em chạy thử code của bác Nhattanktnn và kiểm tra thủ công thử một vài trường hợp thì chưa thấy có sai sót. Còn bác bảo chưa kiểm tra kỹ thì em cũng không biết phải kiểm tra lại như nào vì em chỉ biết copy code để chạy thôi ạ.
Sub NT()
Dim Arr(), Res() As Date, fMax As Double, tMin As Double, i As Long, U1 As Long, U2 As Long, J As Long
Dim tmp, fDate As Double, tDate As Double
Arr = Sheets("Sheet1").Range("A2:F" & Sheets("Sheet1").Cells(Rows.Count, "A").End(xlUp).Row).Value
U1 = UBound(Arr, 1): U2 = UBound(Arr, 2)
ReDim Res(1 To U1, 1 To 1)
For i = 1 To U1
tMin = 10 ^ 10: fMax = 0
For J = 1 To U2 Step 2
tmp = Arr(i, J)
If tmp <> 0 Then
fDate = DateSerial(Mid(tmp, 7, 4), Mid(tmp, 4, 2), Mid(tmp, 1, 2)) + TimeValue(Mid(tmp, 12, 8))
Else
fDate = 0
End If
tmp = Arr(i, J + 1)
If tmp <> 0 Then
tDate = DateSerial(Mid(tmp, 7, 4), Mid(tmp, 4, 2), Mid(tmp, 1, 2)) + TimeValue(Mid(tmp, 12, 8))
Else
tDate = 0
End If
If fDate > fMax Then fMax = fDate
If tDate < tMin Then tMin = tDate
Next
If tMin > fMax And fMax > 0 Then
Res(i, 1) = (tMin - fMax) * 1440
End If
Next
Sheets("Sheet1").Range("G2").Resize(U1, 1) = Res
End Sub