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

Thảo luận trong 'Excel và Kế Toán' bắt đầu bởi kylanbac, 15 Tháng tám 2007.

  1. kylanbac

    kylanbac New Member

    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.-=.,,
     
  2. chibi

    chibi Thành viên danh dự

    Bạn thử dùng sự kiện Worksheet_Change
    Mã:
    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
    
     
  3. LikeIt

    LikeIt New Member

    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é
     

    Các file đính kèm:

    • VD.xls
      Kích thước:
      17.5 KB
      Đọc:
      205
  4. chibi

    chibi Thành viên danh dự

    Đơn giản bạn chỉ cần thay
    Mã:
    gt = Left(gt, 2) & "/" & Mid(gt, 3, 2) & "/20" & Right(gt, 2)
    
     
  5. Mr Okebab

    Mr Okebab Ngon Ngất Ngây

    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!
     
  6. voda

    voda Thành viên danh dự

    -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ả.
     
  7. Nguyễn Xuân Sơn

    Nguyễn Xuân Sơn Active Member

    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.
     
  8. ThuNghi

    ThuNghi Hãy cho rồi sẽ nhận!

    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.
     
  9. Mr Okebab

    Mr Okebab Ngon Ngất Ngây

    Đú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!
     
  10. voda

    voda Thành viên danh dự

    -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.
     
  11. anhtuan1066

    anhtuan1066 Well-Known Member

    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
     
  12. Thien

    Thien Active Member

    Mr anhtuan1066 có tét chưa nhỉ.
    Nếu gõ 1 con số thui thì báo lỗi nè.
    Mã:
    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.
     
  13. anhtuan1066

    anhtuan1066 Well-Known Member

    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
     

Chia sẻ trang này