Gõ ngày Tự động tạo ngày tháng năm vùng cột F của Sheet , tên tháng chạy theo tên Sheet

Liên hệ QC

Excel my love_1

Thành viên thường trực
Tham gia
12/11/19
Bài viết
330
Được thích
183
Em chào các anh chị và các bạn của GPE. Ngày hè oi bức, ngồi văn phòng làm công việc nhập số liệu mà cũng toát mồ hôi
Em có 1 file theo dõi hóa đơn theo tháng, mỗi tháng 1 sheet riêng (có 12 sheet tương ứng từ tháng 1 đến tháng 12) của 1 năm. Cấu trúc các cột đều giống nhau ở 12 sheet
Em muốn
Tại mỗi sheet; Cột ngày tháng , cột F vùng từ F5:F500; Nếu gõ số ngày sẽ hiện đủ ra ngày/tháng/năm của kỳ theo tên sheet
Ví dụ: ở sheet Thang 1 ô F5 nhập 5 sẽ tự động thành 5/1/2020. Tương tự nếu ở các sheet khác thì sẽ tự động thành ngày /tháng / năm tương ứng tên Sheet (ví dụ sheet Thang 6!F10, gõ 15 sẽ thành 15/6/2020)
Lưu ý: ngày nhập vào ô phải nhỏ hơn số ngày theo chuẩn của các tháng. Ví dụ tháng 1 chỉ tối đa 31 ngày, tháng 2 là 28 ngày., tháng 4 30 ngày.....
ở mỗi sheet em có làm 1 code nhưng mà không ra kết quả
Mã:
Sub autodate_month1()
' Ap dụng cho Sheet Thang 1'
If Not Intersect(Target, [F3:F500]) Is Nothing _
And Target <> "" And Target.Value <= 31 Then
Buf = Target.Value
    Target = DateSerial(2020, 1, Target) 'MONTH follow name of Sheet
Else
            MsgBox "Thang 1 khong co ngay " & Buf
            Target = ""
End If
End Sub
Em gửi file mong các anh chị và các bạn giúp đỡ để ra kết quả mong muốn
Em cảm ơn các anh chị và các bạn đã quan tâm đến bài này
 

File đính kèm

  • BAN RA 2020.xlsb
    127.4 KB · Đọc: 14
Xóa toàn bộ code của bạn, copy code sau vào ThisWorkbook.
Mã:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Const lYear As Long = 2020
Dim lMonth As Long, Cll As Range, CllVal As Variant, dDate As Date, sMsg As String
Set Target = Intersect(Target, Sh.[F3:F500])
If Not Target Is Nothing Then
    lMonth = CLng(Right(Sh.Name, 2))
    Application.EnableEvents = False
    For Each Cll In Target.Cells
        CllVal = Cll.Value2
        If IsNumeric(CllVal) Then
            CllVal = CLng(CllVal)
            If CllVal > 0 And CllVal <= 31 Then
                dDate = VBA.DateSerial(lYear, lMonth, CllVal)
                If Day(dDate) <> CllVal Then
                    sMsg = "Thang " & lMonth & " khong co ngay " & CllVal
                Else
                    Cll.Value2 = dDate
                End If
            ElseIf Year(CllVal) <> lYear Or Month(CllVal) <> lMonth Then
                sMsg = "Du lieu khong hop le"
            End If
        Else
            sMsg = "Chi duoc nhap so hoac ngay thang o day"
        End If
        If sMsg <> "" Then
            MsgBox sMsg
            Cll.ClearContents
            sMsg = ""
        End If
    Next
    Application.EnableEvents = True
End If
End Sub
 
Upvote 0
Xóa toàn bộ code của bạn, copy code sau vào ThisWorkbook.
Mã:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Const lYear As Long = 2020
Dim lMonth As Long, Cll As Range, CllVal As Variant, dDate As Date, sMsg As String
Set Target = Intersect(Target, Sh.[F3:F500])
If Not Target Is Nothing Then
    lMonth = CLng(Right(Sh.Name, 2))
    Application.EnableEvents = False
    For Each Cll In Target.Cells
        CllVal = Cll.Value2
        If IsNumeric(CllVal) Then
            CllVal = CLng(CllVal)
            If CllVal > 0 And CllVal <= 31 Then
                dDate = VBA.DateSerial(lYear, lMonth, CllVal)
                If Day(dDate) <> CllVal Then
                    sMsg = "Thang " & lMonth & " khong co ngay " & CllVal
                Else
                    Cll.Value2 = dDate
                End If
            ElseIf Year(CllVal) <> lYear Or Month(CllVal) <> lMonth Then
                sMsg = "Du lieu khong hop le"
            End If
        Else
            sMsg = "Chi duoc nhap so hoac ngay thang o day"
        End If
        If sMsg <> "" Then
            MsgBox sMsg
            Cll.ClearContents
            sMsg = ""
        End If
    Next
    Application.EnableEvents = True
End If
End Sub
Anh ơi! em đã chèn các code này vào các sheet. Nhưng mà khi nhập số vào vùng cột F ở các sheet thì kết quả lại không như mong muốn anh à. Ví dụ ở sheet Thang 3 em nhập 15 vào ô F5 , ấn Enter thì nó nhảy ra là 15/01/1900 chứ không phải là 15/03/2020. Em gửi lại file đã chứa code của anh. Anh xem giúp em với ạ. Em cảm ơn anh nhiều nhiềuUntitled.png
 

File đính kèm

  • BAN RA 2020-.xlsb
    127.7 KB · Đọc: 5
Upvote 0
Anh ơi! em đã chèn các code này vào các sheet. Nhưng mà khi nhập số vào vùng cột F ở các sheet thì kết quả lại không như mong muốn anh à. Ví dụ ở sheet Thang 3 em nhập 15 vào ô F5 , ấn Enter thì nó nhảy ra là 15/01/1900 chứ không phải là 15/03/2020. Em gửi lại file đã chứa code của anh. Anh xem giúp em với ạ. Em cảm ơn anh nhiều nhiềuView attachment 239463
Bạn không làm đúng hướng dẫn của bài #3.
Xóa toàn bộ code của bạn, copy code sau vào ThisWorkbook.
Xóa toàn bộ code trong các (12) sheet của bạn. (tránh gây lỗi)
Thực hiện lại theo hướng dẫn:" copy code sau vào ThisWorkbook."
 
Upvote 0
Bạn không làm đúng hướng dẫn của bài #3.

Xóa toàn bộ code trong các (12) sheet của bạn. (tránh gây lỗi)
Thực hiện lại theo hướng dẫn.
Em cảm ơn anh, em hiểu rồi ạ.
Bài đã được tự động gộp:

Xóa toàn bộ code của bạn, copy code sau vào ThisWorkbook.
Mã:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Const lYear As Long = 2020
Dim lMonth As Long, Cll As Range, CllVal As Variant, dDate As Date, sMsg As String
Set Target = Intersect(Target, Sh.[F3:F500])
If Not Target Is Nothing Then
    lMonth = CLng(Right(Sh.Name, 2))
    Application.EnableEvents = False
    For Each Cll In Target.Cells
        CllVal = Cll.Value2
        If IsNumeric(CllVal) Then
            CllVal = CLng(CllVal)
            If CllVal > 0 And CllVal <= 31 Then
                dDate = VBA.DateSerial(lYear, lMonth, CllVal)
                If Day(dDate) <> CllVal Then
                    sMsg = "Thang " & lMonth & " khong co ngay " & CllVal
                Else
                    Cll.Value2 = dDate
                End If
            ElseIf Year(CllVal) <> lYear Or Month(CllVal) <> lMonth Then
                sMsg = "Du lieu khong hop le"
            End If
        Else
            sMsg = "Chi duoc nhap so hoac ngay thang o day"
        End If
        If sMsg <> "" Then
            MsgBox sMsg
            Cll.ClearContents
            sMsg = ""
        End If
    Next
    Application.EnableEvents = True
End If
End Sub
Em làm được rồi ạ. Em cảm ơn anh nhiều
 
Upvote 0
Em chào các anh chị và các bạn của GPE. Ngày hè oi bức, ngồi văn phòng làm công việc nhập số liệu mà cũng toát mồ hôi
Em có 1 file theo dõi hóa đơn theo tháng, mỗi tháng 1 sheet riêng (có 12 sheet tương ứng từ tháng 1 đến tháng 12) của 1 năm. Cấu trúc các cột đều giống nhau ở 12 sheet
Em muốn
Tại mỗi sheet; Cột ngày tháng , cột F vùng từ F5:F500; Nếu gõ số ngày sẽ hiện đủ ra ngày/tháng/năm của kỳ theo tên sheet
Ví dụ: ở sheet Thang 1 ô F5 nhập 5 sẽ tự động thành 5/1/2020. Tương tự nếu ở các sheet khác thì sẽ tự động thành ngày /tháng / năm tương ứng tên Sheet (ví dụ sheet Thang 6!F10, gõ 15 sẽ thành 15/6/2020)
Lưu ý: ngày nhập vào ô phải nhỏ hơn số ngày theo chuẩn của các tháng. Ví dụ tháng 1 chỉ tối đa 31 ngày, tháng 2 là 28 ngày., tháng 4 30 ngày.....
ở mỗi sheet em có làm 1 code nhưng mà không ra kết quả
Mã:
Sub autodate_month1()
' Ap dụng cho Sheet Thang 1'
If Not Intersect(Target, [F3:F500]) Is Nothing _
And Target <> "" And Target.Value <= 31 Then
Buf = Target.Value
    Target = DateSerial(2020, 1, Target) 'MONTH follow name of Sheet
Else
            MsgBox "Thang 1 khong co ngay " & Buf
            Target = ""
End If
End Sub
Em gửi file mong các anh chị và các bạn giúp đỡ để ra kết quả mong muốn
Em cảm ơn các anh chị và các bạn đã quan tâm đến bài này
À Anh ơi trong quá trình sử dụng , em thấy có cái này hơi kỳ kỳ, đó là khi em nhập ngày xong ở 1 ô cột F của sheet. Nếu em ấn Delete cái ngày đó ở ô đó thì lại hiện cảnh báo "Du lieu khong hop le"
Có cách nào khắc phục tình trạng này không anh?Untitled.png
 

File đính kèm

  • BAN RA 2020- - Copy.xlsb
    130.7 KB · Đọc: 7
Upvote 0
Bạn dùng code này.
Mã:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Const lYear As Long = 2020
Dim lMonth As Long, Cll As Range, CllVal As Variant, dDate As Date, sMsg As String
Set Target = Intersect(Target, Sh.[F3:F500])
If Not Target Is Nothing Then
    lMonth = CLng(Right(Sh.Name, 2))
    Application.EnableEvents = False
    For Each Cll In Target.Cells
        CllVal = Cll.Value2
        If Not IsEmpty(CllVal) Then
            If IsNumeric(CllVal) Then
                CllVal = CLng(CllVal)
                If CllVal > 0 And CllVal <= 31 Then
                    dDate = VBA.DateSerial(lYear, lMonth, CllVal)
                    If Day(dDate) <> CllVal Then
                        sMsg = "Thang " & lMonth & " khong co ngay " & CllVal
                    Else
                        Cll.Value2 = dDate
                    End If
                ElseIf Year(CllVal) <> lYear Or Month(CllVal) <> lMonth Then
                    sMsg = "Du lieu khong hop le"
                End If
            Else
                sMsg = "Chi duoc nhap so hoac ngay thang o day"
            End If
        End If
        If sMsg <> "" Then
            MsgBox sMsg
            Cll.ClearContents
            sMsg = ""
        End If
    Next
    Application.EnableEvents = True
End If
End Sub
 
Upvote 0
Bạn dùng code này.
Mã:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Const lYear As Long = 2020
Dim lMonth As Long, Cll As Range, CllVal As Variant, dDate As Date, sMsg As String
Set Target = Intersect(Target, Sh.[F3:F500])
If Not Target Is Nothing Then
    lMonth = CLng(Right(Sh.Name, 2))
    Application.EnableEvents = False
    For Each Cll In Target.Cells
        CllVal = Cll.Value2
        If Not IsEmpty(CllVal) Then
            If IsNumeric(CllVal) Then
                CllVal = CLng(CllVal)
                If CllVal > 0 And CllVal <= 31 Then
                    dDate = VBA.DateSerial(lYear, lMonth, CllVal)
                    If Day(dDate) <> CllVal Then
                        sMsg = "Thang " & lMonth & " khong co ngay " & CllVal
                    Else
                        Cll.Value2 = dDate
                    End If
                ElseIf Year(CllVal) <> lYear Or Month(CllVal) <> lMonth Then
                    sMsg = "Du lieu khong hop le"
                End If
            Else
                sMsg = "Chi duoc nhap so hoac ngay thang o day"
            End If
        End If
        If sMsg <> "" Then
            MsgBox sMsg
            Cll.ClearContents
            sMsg = ""
        End If
    Next
    Application.EnableEvents = True
End If
End Sub
Code đã khắc phục được tình trạng trên rồi ạ. Em cảm ơn anh
 
Upvote 0
Web KT

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

Back
Top Bottom