? 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

vumian

Mỗi bậc thang là mỗi Cell
Tham gia
12/3/07
Bài viết
267
Được thích
186
Nghề nghiệp
employee only, not a boss
Dear all,

Giả sừ mình có 1 range chứa toàn bộ là ngày tháng năm không liên tục nhau, bao gồm cả những ô trống, Vậy làm sao dùng Fx và VBA để lấy được ngày nào là cũ nhất , ngày nào là gần hiện tại nhất, cũng có nghĩa là min và max của ngày

Cám ơn nhiều
 
Lần chỉnh sửa cuối:
Câu trả lời bạn có rồi thôi, dùng hàm min và max là được.
 
Option Explicit
Function MaxDate(rng As Range) As Date
MaxDate = WorksheetFunction.Max(rng)
MaxDate = DateSerial(Year(MaxDate), Month(MaxDate), Day(MaxDate))
End Function
Chả biết nó có thừa cái gì không hay thiếu cái gì, thấy vẫn chạy tốt.
 
E rằng bạn có gì đó chưa nói rõ... Chứ nếu chỉ đơn giản thế thì ra rồi còn gì:
=MAX(Range) ra ngày mới nhất
=MIN(Range) ra ngày củ nhất
Sao đây?
 
hi, Chưa có ra bác ơi, hic
 

File đính kèm

vumian đã viết:
hi, Chưa có ra bác ơi, hic
Do cột ngày của bạn là text, bạn thừ type(d2) =???
B2=DATEVALUE(D2)
Hay là
B2=DATE(YEAR(D2),MONTH(D2),DAY(D2))
sau đó dùng min, max theo B.
 
Lần chỉnh sửa cuối:
Cột ngày tháng của bạn bị định dạng text rồi, định dạng lại không được ngay. Chắc bạn lấy dữ liệu từ nguồn khác không phải Excel chăng?
 
HIc, hèn chi, vậy bây giờ giải quyết làm sao đây bác, hông lẽ cứ date(left,mid,right), mà nếu vậy thì làm sao lấy duoc max min ?

Éo le thiệt, dữ liệu là text
 
vumian đã viết:
hi, Chưa có ra bác ơi, hic

Do dữ liệu bạn nhập vào dạng ngày/tháng/năm nhưng trong Control Panel lại là tháng/ngày/năm nên Excel hiểu là Text và không tự nhận dạng được (có thể bạn lấy từ nguồn dữ liệu khác vào Excel).

Bạn đóng Excel và vào Control Panel chỉnh Date lại thành dd/mm/yyyy là OK.

FB.
 
To FunnyBoy,
Giải quyết bằng Fx hay VBA thôi, vì máy mình chỉnh hôg có được
 
FunnyBoy đã viết:
Bạn đóng Excel và vào Control Panel chỉnh Date lại thành dd/mm/yyyy là OK.

FB.
không phải, máy mình dd/mm/yy sẵn rồi mà cũng không đọc được. Format lại cũng hông đọc được; phải F2, không làm gì cả rồi enter mới ra ngày. Chịu khó làm từng cell vậy đi:
- Fomat ngày nguyên cột D
- hai tay 2 phím F2 và enter, gõ nhịp như nghe nhạc vậy đó.
 
Lần chỉnh sửa cuối:
ptm0412 đã viết:
không phải, máy mình dd/mm/yy sẵn rồi mà cũng không đọc được. Format lại cũng hông đọc được; phải F2, không làm gì cả rồi enter mới ra ngày. Chịu khó làm từng cell vậy đi:
- Fomat ngày nguyên cột D
- hai tay 2 phím F2 và enter, gõ nhịp như nghe nhạc vậy đó.

Trời , hai tay 2 phím F2 và enter, gõ nhịp như nghe nhạc thì hông được rùi, mình đang đưa chúng vô chương trình mà, hôg lẽ đành bó tay
 
vumian đã viết:
Trời , hai tay 2 phím F2 và enter, gõ nhịp như nghe nhạc thì hông được rùi, mình đang đưa chúng vô chương trình mà, hôg lẽ đành bó tay
Vậy bạn thêm một code sửa ngày, đại lọai
Sub SuaDate()
Dim rng As Range
Dim iR As Long, i As Long
Set rng = Range("D2:D100")
iR = rng.Rows.Count
For i = iR To 1 Step -1
If IsNull(rng(i)) Then rng(i) = 0
If Application.WorksheetFunction.IsText(rng(i)) Then 'MsgBox i
rng(i) = CDate(rng(i))
rng(i).NumberFormat = "dd/mm/yy"
End If
rng(i).NumberFormat = "dd/mm/yy"
Next
Set rng = Nothing
End Sub
 
Món này nếu dùng công thức cũng ko phải là khó...Dùng Left, Right, Mid tách ngày tháng năm ra cột phụ... Ráp lại bằng hàm DATE... Tiếp theo copy cột phụ này paste Special\Value vào dử liệu củ... Món này tôi bị hoài khi người ta gữi dử liệu... hi... hi...
ANH TUẤN
 
Nếu là tín đồ của VBA thì dùng 2 hàm sau do tigertiger viết (đôi khi tìm hiểu thêm VBA cũng rất hay)

Public Function maxNgay(rgn As Range) As Date

Dim dd As Date

Dim ddm As Date
Dim st, sd, sm, sy As String
Dim k As Integer
k = 0
For Each st In rgn
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)))
k = k + 1
If (k = 1) Or ((k > 1) And (ddm < dd)) Then ddm = dd
End If
Next

maxNgay = ddm
End Function


Public Function minNgay(rgn As Range) As Date


Dim dd, ddm As Date
Dim st, sd, sm, sy As String
Dim k As Integer
k = 0
For Each st In rgn
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)))
k = k + 1
If (k = 1) Or ((k > 1) And (ddm > dd)) Then ddm = dd

End If
Next
minNgay = ddm

End Function
lưu ý:
chỉ lưu ý là bạn để nguyên ô dữ liệu gốc (đừng bấm phím F2 - vì khi đó sẽ trở thành date của excel hi hi) - nhưng có cách: nó là text rui thì cho nó là text lun chắc chắn luôn bằng cách chọn vùng dữ liệu -> rồi format cell \ number \ chọn text lun - khi đó sửa chỉnh thỏa mãi vẫn là text


chúc thành công
 
Lần chỉnh sửa cuối:
Thế sao bạn ko đưa luôn đoạn code Format toàn bộ thành Text.. như vậy có phải là thuận tiện hơn ko?
và trong trường hợp cụ thể này tôi nghĩ dùng Sub hay hơn Function.. Đàng nào thì nó chỉ dùng 1 lần trong những lúc cần thiết, đúng ko? Ko làm gì cả.. Bấm nút và.. xong..
 
Dùng sub thì nó k thay đổi khi dữ liệu thay đổi, atuan... ah,
thường trả về 1 giá trị thì ng ta dùng hàm hay hơn

chỉ khi thực hiện 1 loạt động tác như format, filter chẳng hạn thì dùng sub

Ok tôi gửi file kèm lên đây - nhưng tigertiger nghĩ việc format text cho ô đơn giản mà
 

File đính kèm

Ý tôi là như vầy nè:
-Vì dử liệu vô ý bị format là text nên ta mới cần chạy code này đễ convert tất cả thành dạng DATE... Và nó chỉ dùng 1 lần duy nhất
-Sau khi dử liệu đã trở thành DATE thì việc tìm MAX và MIN ko cần dùng code làm gì... Giao cho hàm Excel có phải là hay nhất ko?
Nói chung khi Convert xong thì huỷ bỏ luôn code (ko cần thiết nữa)... Ta có thể lưu code thành file .txt dự phòng mai này cần đến
Bạn hiểu ý tôi nói chứ
ANH TUẤN
 
Ý tôi là như vầy nè:
-Vì dử liệu vô ý bị format là text nên ta mới cần chạy code này đễ convert tất cả thành dạng DATE... Và nó chỉ dùng 1 lần duy nhất
-Sau khi dử liệu đã trở thành DATE thì việc tìm MAX và MIN ko cần dùng code làm gì... Giao cho hàm Excel có phải là hay nhất ko?


Nói chung khi Convert xong thì huỷ bỏ luôn code (ko cần thiết nữa)... Ta có thể lưu code thành file .txt dự phòng mai này cần đến
Bạn hiểu ý tôi nói chứ
ANH TUẤN
y, hiểu ý atuan... rui, cám ơn atuan...,
nhưng hàm tigertiger viết là tính max và min về ngày cho dữ liệu text lun , ko cần chuyển đổi, - vì tigertiger hiểu ý vumian là : cần hàm xử lý ->KQ k quan tâm đổi dữ liệu kia hi hi hi / không rõ có phải ý vumian đúng thế k?
 
hi tigertiger,

Hàm bạn ra kết quả mình muốn, nhưng vùng dữ liệu của mình không số định khi lấy tư nguon khác, nên hàm bác sẽ hôg tự động chọn vùng động được

hi ThuNGhi,

Code của bác gần ok rồi, phải thêm vào cái for cho nó chạy từ đầu đến cuối, và chuyển sang dạng date của excel luôn, rùi mình sẽ dùng max - min trong VBA luôn, chà chà

Cám ơn các bác nhiều
 
Web KT

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

Back
Top Bottom