? Tìm Min và Max của range ngày tháng

  • Thread starter Thread starter vumian
  • Ngày gửi Ngày gửi
Liên hệ QC
Theo tôi bạn nên xử lý từ khi trích dữ liệu ra, nên lấy ngày theo dạng dateserial(year,m,d) luôn. Tránh có những code edit, thà làm từ đầu vẫn hơn. Tóm lại nên đồng nhất. Dữ liệu này bạn trích cũng từ Excel luôn mà.
Sao bạn không nhấn thanks mọi người nhỉ. Hàm của Tigertiger hay lắm.
 
Bac ThuNghi ơi, Đây là dữ liệu từ nguồn khác, nó được thiết lập lúc còn Excel95, mà khi lấy dữ liệu thì read-only thôi, sao mà định dạng được bác
 
hi ThuNghi, khi lấy dữ liệu, thì chạy query mà, nó duoc định đạng nhu vậy, không xử lý được trước khi lấy ra,
Giờ mình có ý này, dùng For để chuyển sang dạng Date của Excel hết, rùi Sort, thế là mình lấy được đầu và cuối range
 
Dear all, mình đã lấy duoc Max-Min rùi
Mã:
Sub cvt_Date()
Dim iR As Long, i As Long
Dim col, longest_row As Integer
With Sheet5
    longest_col = .Range("F1").Column
    longest_row = .Cells(.Rows.Count, longest_col).End(xlUp).Row
End With
For i = 2 To longest_row Step 1
    If Application.WorksheetFunction.IsText(Cells(i, 7)) Then 'MsgBox i
Cells(i, 7) = CDate(Cells(i, 7))
Cells(i, 7).NumberFormat = "dd/mm/yy"
End If
Cells(i, 7).NumberFormat = "dd/mm/yy"
Next
Dim rng, maxDate As Range
Set rng = Range("G2:G" & longest_row)
MsgBox "Max " & Application.WorksheetFunction.Max(rng)
MsgBox "Min " & Application.WorksheetFunction.Min(rng)
End Sub
Cám ơn bác nhiều lắm
 
Lần chỉnh sửa cuối:
Dear all, mình đã lấy duoc Max-Min rùi
oh, sub của bạn k tổng quan nhỉ vì: nó đặc thù cho sheet 5, rồi nữa max phải chép ra từ msgbox lun, hơn nữa hình như chưa chính xác - bạn ktra lại với trường hợp ngày "8/11/2007" nhưng lại chuyển thành 11/8/2007 (??? )

bạn tham khảo file tigertiger gửi kèm nhé

tigertiger đã làm tổng quát chắc là vừa ý bạn:

+ bấm nút Định dạng ngày
+ xuất hiện hộp thoại chọn vùng dữ liệu ngày dạng text định đổi
+ xuất hiện tiếp hộp thoại chọn ô sẽ đặt KQ max/min
+ chạy sẽ định dạng ngày tháng và đồng thời cho kết quả max / min dạng công thức lun tại vị trí chọn ở hộp thoại 2

xem ở trong file gửi kèm (có nút bấm), hoặc copy code sau:

Public Sub DinhdangDate()

Dim Rgn As Range
Dim Rgn2 As Range
Dim dd As Date
Dim st, sd, sm, sy As String
Dim i As Integer

On Error GoTo Thoat
Set Rgn = Application.InputBox("Chon vung muon doi ngay!", "Chon vung", Selection.Address, , , , , 8)

On Error GoTo Thoat
Set Rgn2 = Application.InputBox("Chon vi tri o KQ max min!", "Chon o", Selection.Address, , , , , 8)
If Rgn2.Cells.Count > 1 Then Set Rgn2 = Cells(Rgn2.Row, Rgn2.Column)

i = 0
For Each st In Rgn
i = i + 1
If st <> "" Then
sd = Left(st, InStr(st, "/") - 1)
sm = Mid(st, InStr(st, "/") + 1, InStr(InStr(st, "/") + 1, st, "/") - InStr(st, "/") - 1)
sy = Right(st, Len(st) - InStrRev(st, "/"))
dd = DateSerial(Int(Val(sy)), Int(Val(sm)), Int(Val(sd)))
Rgn(i, 1) = dd
End If
Next

With Rgn
.NumberFormat = "dd/mm/yyyy"
.HorizontalAlignment = xlGeneral
.VerticalAlignment = xlCenter
End With

Rgn2 = "Max:": Rgn2.Offset(1, 0) = "Min:"

With Rgn2.Offset(0, 1)
.Offset(0, 1).NumberFormat = "dd/mm/yyyy"
.Font.Bold = True
.Formula = "=MAX(" + Rgn.Address + ")"
End With

With Rgn2.Offset(1, 1)
.Offset(0, 1).NumberFormat = "dd/mm/yyyy"
.Font.Bold = True
.Formula = "=MIN(" + Rgn.Address + ")"
End With

Thoat:

End Sub
chúc thành công,

có nhiều tiện ích hay - trong sub trên đáng bàn và tham khảo - mong TV góp ý
 

File đính kèm

Lần chỉnh sửa cuối:
tigertiger đã viết:
oh, sub của bạn k tổng quan nhỉ vì: nó đặc thù cho sheet 5, rồi nữa max phải chép ra từ msgbox lun, hơn nữa hình như chưa chính xác - bạn ktra lại với trường hợp ngày "8/11/2007" nhưng lại chuyển thành 11/8/2007 (??? )

bạn tham khảo file tigertiger gửi kèm nhé

tigertiger đã làm tổng quát chắc là vừa ý bạn:

+ bấm nút Định dạng ngày
+ xuất hiện hộp thoại chọn vùng dữ liệu ngày dạng text định đổi
+ xuất hiện tiếp hộp thoại chọn ô sẽ đặt KQ max/min
+ chạy sẽ định dạng ngày tháng và đồng thời cho kết quả max / min dạng công thức lun tại vị trí chọn ở hộp thoại 2

xem ở trong file gửi kèm (có nút bấm), hoặc copy code sau:


chúc thành công,

có nhiều tiện ích hay - trong sub trên đáng bàn và tham khảo - mong TV góp ý
Phức tạp nhỉ.
Em góp thêm 1 hàm UF tính ngày Min Max nhé :
PHP:
Function NgayMinMax(Mang As Range, Loai As String) As Date
    'Tim Ngay Lon Nhat va Ngay nho nhat
    Application.Volatile (False)
    Dim i1 As Byte, i2 As Byte
    Dim NgayMin As Date, NgayMax As Date, TempNgay As Date
    Dim Ngay As Range
    NgayMin = 100000
    For Each Ngay In Mang
        i1 = InStr(1, Ngay, "/")
        i2 = InStr(i1 + 1, Ngay, "/")
        If i1 > 0 And i2 > 0 Then
            TempNgay = DateSerial(Val(Mid$(Ngay, i2 + 1, 4)), Val(Mid$(Ngay, i1 + 1, i2)), Val(Left(Ngay, i1 - 1)))
            If TempNgay < NgayMin Then
                NgayMin = TempNgay
            ElseIf TempNgay > NgayMax Then
                NgayMax = TempNgay
        End If: End If
    Next
    If Loai = "Min" Then
        NgayMinMax = NgayMin
    ElseIf Loai = "Max" Then
        NgayMinMax = NgayMax
    End If
    Set Ngay = Nothing
End Function

Thân!
 

File đính kèm

Hi,

Đúng là cái VBA mình chưa chính xác, vì cái range date này lộn xộn theo cách nhìn và hiểu thì nó là dd/mm/yyyy

Thành thật cám ơn bác và diễn đàn nhiều, mình làm xong rồi,
Bác dễ thương quá, hehe
 
Lần chỉnh sửa cuối:
vumian đã viết:
Hi,

Thành thật cám ơn bác và diễn đàn nhiều, mình làm xong rồi,
Bác dễ thương quá, hehe

oh, sao bạn k chia sẻ code của bạn cho mọi ng - như thế mới là học hỏi, và bàn luận chứ,..
 
Lần chỉnh sửa cuối:
Bạ̣n làm như sau : Chọn vùng ghi thời gian(D2:D62)
Edit----->repplace----> thay thế các gạch cheó (/)bằng gạch ngang (-) . Sau đó format cells thành date .
Quay lại ô chứa hàm . =MIN(D2:D62)
=Max(D2:D62)
Ok
 
tigertiger đã viết:
oh, sao bạn k chia sẻ code của bạn cho mọi ng - như thế mới là học hỏi, và bàn luận chứ,..

Hihi, nói mình share mắc cỡ quá, mình chỉnh lại tí tẹo code của bác thôi mà
Mã:
Sub cvt_Date()
Dim col, longest_row, i As Integer
Dim Rgn As Range
Dim dd As Date
Dim st, sd, sm, sy As String
Sheet5.Select
With Sheet5
longest_col = .Range("I1").Column
longest_row = .Cells(.Rows.Count, longest_col).End(xlUp).Row
End With
Set Rgn = Range("G2:G" & longest_row)
 
Application.Calculation = xlCalculationManual
 
i = 0
For Each st In Rgn
i = i + 1
If st <> "" Then
sd = Left(st, InStr(st, "/") - 1)
sm = Mid(st, InStr(st, "/") + 1, InStr(InStr(st, "/") + 1, st, "/") - InStr(st, "/") - 1)
sy = Right(st, Len(st) - InStrRev(st, "/"))
dd = DateSerial(Int(Val(sy)), Int(Val(sm)), Int(Val(sd)))
Rgn(i, 1) = dd
End If
Next
With Rgn
.NumberFormat = "dd/mm/yyyy"
.HorizontalAlignment = xlGeneral
.VerticalAlignment = xlCenter
End With
Application.Calculation = xlCalculationAutomatic
Sheet3.Range("E2").Value = Application.WorksheetFunction.Min(Rgn)
Sheet3.Range("H2").Value = Application.WorksheetFunction.max(Rgn)
 
Web KT

Bài viết mới nhất

Back
Top Bottom