PDA

View Full Version : Hỏi về cách đánh ngày tháng năm



kylanbac
15-08-07, 11:25 PM
Các bạn cho mình hỏi làm thế nào để đánh thoải mái với kiểu ngày tháng năm trong excel như sau:
ví dụ mình đánh 150807 thì khi đó trong ô excel sẽ hiện là 15/08/2007 hoặc 15/08/07
chứ nếu đánh trực tiếp 15/08/2007 thì mất công quá.Vả lại số liệu của mình rất nhiều.
Mong các anh chị giúp đỡ.Thành thật cám ơn.-=.,,

chibi
15-08-07, 11:44 PM
Bạn thử dùng sự kiện Worksheet_Change


Private Sub Worksheet_Change(ByVal Target As Range)
Dim gt
If Target.Column = 1 Then
If Len(Target.Value) = 6 Then
gt = Target.Value
gt = Left(gt, 2) & "/" & Mid(gt, 3, 2) & "/" & Right(gt, 2)
Target.Value = gt
End If
End If
End Sub

LikeIt
15-08-07, 11:55 PM
Bạn thử dùng sự kiện Worksheet_Change


Private Sub Worksheet_Change(ByVal Target As Range)
Dim gt
If Target.Column = 1 Then
If Len(Target.Value) = 6 Then
gt = Target.Value
gt = Left(gt, 2) & "/" & Mid(gt, 3, 2) & "/" & Right(gt, 2)
Target.Value = gt
End If
End If
End Sub


Chibi ơi, mình đã copy cái code của bạn vào excel, nhưng làm thế nào để ra KQ 15/08/2007. Bạn xem file gửi kèm nhé

chibi
16-08-07, 12:45 AM
Đơn giản bạn chỉ cần thay


gt = Left(gt, 2) & "/" & Mid(gt, 3, 2) & "/20" & Right(gt, 2)

Mr Okebab
16-08-07, 04:47 AM
Các bác nên cho thêm hàm value và hàm date để kết quả trả về đúng là date.
Tránh tình trạng nhìn là ngày nhưng thực ra là chuỗi. Trong một số tính toán về date, nếu là chuỗi thì sẽ bị sai.

Thân!

voda
16-08-07, 06:37 AM
Nguyên văn bởi Nguyễn Hương Thơm
Chibi ơi, mình đã copy cái code của bạn vào excel, nhưng làm thế nào để ra KQ 15/08/2007

-Với sự kiện Worksheet_Change, code phải được viết vào cửa sổ code của sheet.
-Theo đoạn code trên, bạn nhập số vào cột A mới có kết quả.

Nguyễn Xuân Sơn
16-08-07, 10:15 AM
Mã của bạn Vosa còn thiếu:
- Trước hết phải định dạng cột dạng text để nếu ngày nhỏ hơn 10 đọan mã có tác dụng.
- Sau cùng là đổi định dạng cột sang dạng date với đủ ngày tháng năm để còn tính toán ( nếu có ).
( Chắc thêm những mã này các bạn biết cả rồi, không bàn ở đây nữa)
Như vậy sẽ hoàn hảo.

ThuNghi
16-08-07, 10:20 AM
Vấn đề nhập liệu cũng nên có giới hạn sự làm biếng. Chỉ cần nhập ngày-tháng or ngày/tháng, tất cả nằm ở bàn phím bên phải. Trừ khi nhập trong form. Excel khác Access.
Theo tôi dữ liệu này bạn import từ CSDL nào khác nên mới cần.

Mr Okebab
16-08-07, 11:16 AM
Đúng đấy, sự kiện Worksheet_Change thực ra phải hạn chế dùng vì nó sẽ có tác động nên toàn bộ bảng tính. (sheet)

Tất nhiên, dùng cũng không sao cả, tuy nhiên việc tách này theo mình nghĩ chỉ cần dùng công thức, sau đó paste ngược trở lại là được.

Dùng sự kiện này thì đao to búa lớn quá.


Thân!

voda
16-08-07, 02:54 PM
-Mình nghĩ đơn giản hoá việc nhập liệu như yêu cầu của bạn kylanbac không do làm biếng đâu. Với một khối lượng dữ liệu lớn thì rất cần phải như thế. Làm biếng là làm bớt việc, còn bớt công sức trong công việc không thể gọi là làm biếng được.
-Đoạn mã của Chibi đã giải quyết rất tốt yêu cầu trên. Dùng cách thủ công cũng được nhưng hơi phiền hà vì dữ liệu ngày nào cũng nhập, cứ phải dùng công thức biến đổi và paste ngược. Một đoạn mã VBA ngắn giải quyết được vấn đề, tại sao không dùng?
-Nếu dùng VBA, sự kiện Worksheet_Change là thích hợp nhất. Ở đây chỉ có một vấn đề như Mr Okebab đã nêu: định dạng của dữ liệu chỉ là text không thể dùng để tính toán. Nếu bạn kylanbac không có nhu cầu này thì
đoạn mã trên là ổn rồi.
-Trong trường hợp này, định dạng ô và cột của dữ liệu không có tác dụng gì. Phải dùng hàm date để biến đổi dữ liệu thôi.

anhtuan1066
26-08-07, 11:09 PM
Chạy code này xem:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim StrVal As String
Dim dDate As Date
If Target.Cells.Count > 1 Then Exit Sub
If Intersect(Target, Range("A1:A100")) Is Nothing Then Exit Sub

With Target
StrVal = Format(.Text, "000000")
If IsNumeric(StrVal) And Len(StrVal) = 6 Then
Application.EnableEvents = False

If Application.International(xlDateOrder) = 1 Then 'dd/mm/yy
dDate = DateValue(Left(StrVal, 2) & "/" & Mid(StrVal, 3, 2) & "/" & Right(StrVal, 2))
Else 'mm/dd/yy
dDate = DateValue(Mid(StrVal, 3, 2) & "/" & Left(StrVal, 2) & "/" & Right(StrVal, 2))
End If

.NumberFormat = "dd/mm/yyyy"
.Value = CDate(DateSerial(Year(dDate), Month(dDate), Day(dDate)))

End If
End With

Application.EnableEvents = True
End Sub

Chắc chắn nó sẽ tạo ngày tháng năm theo đúng định dạng DATE nên có thể tính toán dc... Tuy nhiên, theo tôi thì chẳng nhanh tí nào... Này nhé: Bạn gõ 010107 là 6 lần thao tác, tôi gỏ 01-01 chỉ có 5 thao tác, vẫn ra ngày 1 tháng 1 năm 2007... Làm vậy thôi chứ chưa thấy dc lợi ích cũa nó... hi... hi..
ANH TUẤN

Thien
27-08-07, 10:02 AM
Mr anhtuan1066 có tét chưa nhỉ.
Nếu gõ 1 con số thui thì báo lỗi nè.

dDate = DateValue(Left(StrVal, 2) & "/" & Mid(StrVal, 3, 2) & "/" & Right(StrVal, 2))
Bẫy lỗi sao cho nếu người dùng gõ số vào thì thông báo lỗi nhen.
À sao khi bị báo lỗi rùi nó trơ ra luôn, ra kết quả kỳ quá hà.
Xem lại nhen.
TC.

anhtuan1066
27-08-07, 09:21 PM
Uh... đúng là gõ 1 số sẽ bị lỗi... nhưng rõ ràng tác giả cần gõ 6 số cơ mà... Nếu gõ từ 5 số trở xuống thì thôi, gõ theo cách bình thường giống ThuNghi đã nói, cần gì đến VBA cho phiền phức
ANH TUẤN