Rất mong các anh em trên GPE xem và hướng dẩn giúp xử lý trong trường hợp năm sinh không có ngày tháng.
Yêu cầu cụ thể trong file đính kèm.
Xin được cám ơn trước
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Cll As Range
If Intersect(Target, [B:B]) Is Nothing Then Exit Sub
For Each Cll In Target
If Cll = "" Then
Cll.Offset(, 1) = ""
ElseIf Len(Cll) = 4 Then
Cll.NumberFormat = "0000"
Cll.Offset(, 1).FormulaR1C1 = "=DATE(RC[-1],1,1)"
Else
Cll.NumberFormat = "dd/mm/yyyy"
Cll.Offset(, 1).FormulaR1C1 = "=RC[-1]"
End If
Next Cll
End Sub
---Cách làm:
Lấy các ngày đại lễ của dân tộc mà gán vô cho nhân vật ấy;
Nếu bạn ấy thích mùa thu thì sinh vào 2/9;
Nếu là hè thì 30/04 hay 01/05 hoặc 19/05;
Nếu là phụ nữ thì lấy ngày 08/03 hay 20/10 mà áp vô;
. . . . .
Nếu có ai vặn vẹo thì chỉ vô giấy chứng minh nhân dân, hay . . . mà chạy tội của mình, dễ mà!
Option Explicit
Function ConvertYear(Dat As Variant) As Date
If IsNumeric(Dat) Then Dat = DateSerial(Dat, 1, 1)
ConvertYear = Format(Dat, "DD/MM/YYYY")
End Function
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Cll As Range
If Intersect(Target, [B:B]) Is Nothing Then Exit Sub
For Each Cll In Target
If Cll = "" Then
Cll.Offset(, 1) = ""
ElseIf Len(Cll) = 4 Then
Cll.NumberFormat = "0000"
Cll.Offset(, 1).FormulaR1C1 = "=DATE(RC[-1],1,1)"
Else
Cll.NumberFormat = "dd/mm/yyyy"
Cll.Offset(, 1).FormulaR1C1 = "=RC[-1]"
End If
Next Cll
End Sub
Đơn giản vì Excel nó chỉ "chơi" với ngày tháng có thời điểm > 1/1/1900 mà thôi ---> Những ngày trước đó nó không biếtMọi người giải thích giùm mình cái này, không hiểu sao code của mình chỉ đúng khi năm sinh >=1900, còn năm sinh <1900 thì sai. Về mặt lý thuyết, mình không hiểu code sai chỗ nào???
Bạn thử 2 công thức này thử xem sao:Rất mong các anh em trên GPE xem và hướng dẩn giúp xử lý trong trường hợp năm sinh không có ngày tháng.
Yêu cầu cụ thể trong file đính kèm.
Xin được cám ơn trước
=IF(B3<2010,DATE(B3,1,1),B3)
=IF(B3<2010,B3,TEXT(B3,"dd/mm/yyyy"))
---Dùng code sau :
Bạn chú ý thao tác :PHP:Private Sub Worksheet_Change(ByVal Target As Range) Dim Cll As Range If Intersect(Target, [B:B]) Is Nothing Then Exit Sub For Each Cll In Target If Cll = "" Then Cll.Offset(, 1) = "" ElseIf Len(Cll) = 4 Then Cll.NumberFormat = "0000" Cll.Offset(, 1).FormulaR1C1 = "=DATE(RC[-1],1,1)" Else Cll.NumberFormat = "dd/mm/yyyy" Cll.Offset(, 1).FormulaR1C1 = "=RC[-1]" End If Next Cll End Sub
1. Chọn toàn bộ cột B rồi định dạng là General.
2. Paste dữ liệu vào cột B --> công thức cột C sẽ tự động điền vào.
Mình đã Test thử, code chỉ đúng khi năm sinh >=1900, không hiểu tại sao???
=IF(B3>2009,B3,"_/_/"&B3)
---
Nhưng mà bạn ptlong04x1 cho tôi hỏi thêm vấn đề mới phát sinh thì sửa code như thế nào ?
- Vd:1990 => 01/01/1990 kết quả sửa lại : _/_/1990 (gạch thấp/,gạch thấp/,năm sinh)
( ý tôi là có sao để vậy )
Thân chào
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Cll As Range
If Intersect(Target, [B:B]) Is Nothing Then Exit Sub
For Each Cll In Target
If Cll = "" Then
Cll.Offset(, 1) = ""
ElseIf Len(Cll) = 4 Then
Cll.NumberFormat = "0000"
Cll.Offset(, 1) = "_/_/" & Cll
Else
Cll.NumberFormat = "dd/mm/yyyy"
Cll.Offset(, 1).FormulaR1C1 = "=RC[-1]"
End If
Next Cll
End Sub
Hình như có gì đó chưa ổn ---> Bạn thử Format cell B4 theo dạng "dd/mm/yyyy" sau đó gõ vào số 1990 xem C4 nó ra cái gì?Anh paste lại đoạn code này nhé, như trên các bạn cũng đưa ra nhiều cách rồi, tuỳ anh thấy cách nào tiện lợi thì sử dụng.
PHP:Private Sub Worksheet_Change(ByVal Target As Range) Dim Cll As Range If Intersect(Target, [B:B]) Is Nothing Then Exit Sub For Each Cll In Target If Cll = "" Then Cll.Offset(, 1) = "" ElseIf Len(Cll) = 4 Then Cll.NumberFormat = "0000" Cll.Offset(, 1) = "_/_/" & Cll Else Cll.NumberFormat = "dd/mm/yyyy" Cll.Offset(, 1).FormulaR1C1 = "=RC[-1]" End If Next Cll End Sub
---Hình như có gì đó chưa ổn ---> Bạn thử Format cell B4 theo dạng "dd/mm/yyyy" sau đó gõ vào số 1990 xem C4 nó ra cái gì?
Nói chung làm việc với DATE không phải chuyện dể ---> Dùng WorkSheet_Change rất dể bị "sa bẫy" ---> Tôi ủng hộ cách dùng Sub hơn
Bạn chú ý thao tác :
1. Chọn toàn bộ cột B rồi định dạng là General.
Chính vì vậy em mới bảo rằng WorkSheet_Change rất mệt mỏi ---> Sao anh chắc được rằng anh đã Format toàn bộ là General---
Bạn ptlong04x1 có nhắc nhở chú ơi:
Nếu chuyển về định dạng "dd/mm/yyyy" thì nó trật chứ sao
Code này nó "ngộ ngộ" thế nào ấy? nhờ chú xem và giải thích :
- Nhập 1890 => _/_/1890
- Nhập 0000 => 00/01/1900
Còn về dùng sub thì ...anh không biết
---Chính vì vậy em mới bảo rằng WorkSheet_Change rất mệt mỏi ---> Sao anh chắc được rằng anh đã Format toàn bộ là General
Dùng Sub có nghĩa là: Anh nhập cái gì thì cứ việc nhập thoải mái, sau khi xong việc, anh bấm nút 1 nhát nó sẽ chỉnh lại dử liệu theo đúng yêu cầu cho anh!
Theo kinh nghiệm thì em cho rằng dùng Sub cho kết quả chính xác hơn là WorkSheet_Change (nhập đến đâu chỉnh đến nấy)
Cái khó khăn khi viết code là: Làm sao nhận biết được 1 cell là DATE thật sự ---> Vì DATE thật sự nhưng đang được Format General thì nó vẫn là DATE thôi
Vâng! Em hiểu! Và em cũng đang tìm cách nào đó hoàn hảo nhất cho anh đây---
Nguyên nhân 1 phần do anh chủ quan, khi làm lý lịch trích ngang cho công nhân đã kiểm soát khâu nhập liệu phần ngày tháng năm sinh theo đúng định dạng dd/mm/yyyy, đâu có nghĩ rằng lại có trường hợp không có ngày tháng => người nhập liệu vô tư chuyển thành General để nhập năm sinh => Kết quả cột này : TỔNG HỢP CÁC LOẠI ĐỊNH DẠNG ( vì thế anh mới nghĩ ra cột phụ là thế, mong chú cảm thông chứ anh khắt khe khâu nhập liệu để làm gì ? )