Hàm nhập số để ra được ngày tháng năm

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

babytuson

Thành viên mới
Tham gia
5/5/15
Bài viết
35
Được thích
1
Hiện tại, Dùng Format cell nhập số 2 => 2/1/1990

Anh chị em có cách để ra đáp án: nhập số 2 => ra kết quả ngày / tháng /năm hiện tại ( Kết quả: 2/2/2023 )

Em cảm ơn
:unknw::unknw::unknw:
 
Hiện tại, Dùng Format cell nhập số 2 => 2/1/1990

Anh chị em có cách để ra đáp án: nhập số 2 => ra kết quả ngày / tháng /năm hiện tại ( Kết quả: 2/2/2023 )

Em cảm ơn
:unknw::unknw::unknw:
Có 1 cách dùng hàm CONCATENATE để nối các kí tự các ô khác nhau ra " 2" ,"/","1" OK nhưng hàm này thấy hơi lâu tí
 
Hiện tại, Dùng Format cell nhập số 2 => 2/1/1990

Anh chị em có cách để ra đáp án: nhập số 2 => ra kết quả ngày / tháng /năm hiện tại ( Kết quả: 2/2/2023 )

Em cảm ơn
:unknw::unknw::unknw:
Chỉ nhập 2 để ra 2/2/2023? Tức là chỉ ra kết quả các ngày trong tháng 2/2023? Nếu đúng thì chỉnh định dạng cell trong Custom Format, nhưng để nhìn chứ không có giá trị tính toán được.
Các kết quả khác bạn muốn có là gì?
 
Chỉ nhập 2 để ra 2/2/2023? Tức là chỉ ra kết quả các ngày trong tháng 2/2023? Nếu đúng thì chỉnh định dạng cell trong Custom Format, nhưng để nhìn chứ không có giá trị tính toán được.
Các kết quả khác bạn muốn có là gì?
Mình muốn tính toán được ý.
Ví dụ bây giờ tháng 2/2023 => nhập ngày 4 => kết quả 4/2/2023
giá trị phải tính toán được làm như thế nào nhỉ :D
Bài đã được tự động gộp:

Gắng thêm xíu nữa nhập 2/2
hơi lâu :D lười muốn nhập nhanh mỗi 1 số => ra kết quả cả tháng ý hihi
 
Nhập ở ô này & hiện kết quả ở ô nơi khác thì được; Còn muốn hiện tại chổ là khó à nha!
 
Mình muốn tính toán được ý.
Ví dụ bây giờ tháng 2/2023 => nhập ngày 4 => kết quả 4/2/2023
giá trị phải tính toán được làm như thế nào nhỉ :D
Bài đã được tự động gộp:
Quy định trong Excel: Nhập ngày/tháng rồi Enter thì tự động thêm năm hiện tại. Nếu bắt Excel thêm tháng hiện tại thì có thể người viết ra phần mềm Excel sửa Quy định.
Bạn chờ bác SA_DQ cung cấp giải pháp nếu đi theo hướng của bác ấy.
 
. . . . . .
Bạn chờ bác SA_DQ cung cấp giải pháp nếu đi theo hướng của bác ấy.
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Intersect(Target, [s5:S9999]) Is Nothing And _
    Target.Row Mod 9 = 0 And Target.Value > 0 And Target.Value < 32 Then
    [H9999].End(xlUp).Offset(1).Value = DateSerial(Year(Date), Month(Date), Target.Value)
  End If
End Sub
 
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Intersect(Target, [s5:S9999]) Is Nothing And _
    Target.Row Mod 9 = 0 And Target.Value > 0 And Target.Value < 32 Then
    [H9999].End(xlUp).Offset(1).Value = DateSerial(Year(Date), Month(Date), Target.Value)
  End If
End Sub
À thì ra là hàm "sung rụng"
 
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Intersect(Target, [s5:S9999]) Is Nothing And _
    Target.Row Mod 9 = 0 And Target.Value > 0 And Target.Value < 32 Then
    [H9999].End(xlUp).Offset(1).Value = DateSerial(Year(Date), Month(Date), Target.Value)
  End If
End Sub
Oki tks bác . E thử
 
Nếu vùng nhập số là A1:A100
Nếu tháng hiện tại là tháng 3, nếu bạn nhập con số <1 hay >31 (ngày cuối cùng của tháng. tự động thay đổi theo từng tháng hiện hành) thì sẽ báo lỗi và delete con số mới nhập này
Nhập tay vào từng ô, hoặc copy từ vùng khác vào đều được.
Cách dùng:
Chuột phải vào tên sheet, View Code, dán code này vô.
PHP:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim cell As Range
If Intersect(Target, Range("A1:A100")) Is Nothing Then Exit Sub
For Each cell In Target
    Application.EnableEvents = False
    If cell.Value > 0 And cell.Value <= Day(WorksheetFunction.EoMonth(Date, 0)) Then
        cell.Value = Date - Day(Date) + cell.Value
    Else
        MsgBox "Ngay " & cell.Value2 & " khong hop le!"
        cell.Value = ""
    End If
    Application.EnableEvents = True
Next
End Sub
 

File đính kèm

babytuson
Bạn thử tham khảo mã dưới đây với hàm DateSet

=DateSet(3)
=DateSet(4, 5)
=DateSet(4, 5, 2023)

JavaScript:
'                    _,
' ___   _   _  _ ___(_)
'/ __| / \ | \| | _ | |
'\__ \/ \ \| \\ | _ \ |
'|___/_/ \_|_|\_|___/_|
'

Option Explicit

Private Type TypeArguments
  Action As Long
  Timer As Single
  Caller As Range
  Formula As String
  Target As Range
  parameters As Variant
  address As String
  value As Date
End Type
#If VBA7 Then
  Private Declare PtrSafe Function SetTimer Lib "user32" (ByVal hwnd As LongPtr, ByVal nIDEvent As LongPtr, ByVal uElapse As LongPtr, ByVal lpTimerFunc As LongPtr) As Long
  Private Declare PtrSafe Function KillTimer Lib "user32" (ByVal hwnd As LongPtr, ByVal nIDEvent As LongPtr) As Long
#Else
  Private Declare Function SetTimer Lib "user32" (ByVal HWnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
  Private Declare Function KillTimer Lib "user32" (ByVal HWnd As Long, ByVal nIDEvent As Long) As Long
#End If
Private Works() As TypeArguments

Function DateSet(newDate As Integer, Optional newMonth As Integer, Optional newYear As Integer) As String
  On Error Resume Next
  Dim k As Integer, r, t As Range
  Set r = Application.ThisCell
  k = UBound(Works): k = k + 1
  ReDim Preserve Works(1 To k)
  With Works(k)
    .Action = 0
    .address = r.address(0, 0, , 1)
    .Formula = UCase(r.Formula)
    Set .Caller = r
    If newMonth <= 0 Then newMonth = month(Now)
    If newYear <= 0 Then newYear = year(Now)
    .value = DateSerial(newYear, newMonth, newDate)
  End With
  Call SetTimer(Application.hwnd, 555551, 0, AddressOf DateW_callback)
End Function

#If VBA7 And Win64 Then
Private Sub DateW_callback(ByVal hwnd As LongPtr, ByVal wMsg^, ByVal IdEvent As LongPtr, ByVal dwTime^)
#ElseIf VBA7 Then
Private Sub DateW_callback(ByVal hwnd As LongPtr, ByVal wMsg&, ByVal IdEvent As LongPtr, ByVal dwTime&)
#Else
Private Sub DateW_callback(ByVal hwnd&, ByVal wMsg&, ByVal IdEvent&, ByVal dwTime&)
#End If
  On Error Resume Next
  Call KillTimer(hwnd, IdEvent)
  Dim UA%, i%
  Dim a As Object, B As TypeArguments, su As Boolean, ee As Boolean
  UA = UBound(Works)
  If UA = 0 Then Exit Sub
  For i = 1 To UA
    B = Works(i)
    Select Case B.Action
    Case 0
      Works(i).Action = 1
      If a Is Nothing Then
        Set a = Application
        ee = a.EnableEvents: If ee Then a.EnableEvents = False
        su = a.ScreenUpdating: If su Then a.ScreenUpdating = False
      End If
      B.Caller.value = B.value
    End Select
  Next
  Erase Works
  If Not a Is Nothing Then
    If su And a.ScreenUpdating <> su Then a.ScreenUpdating = su
    If ee And a.EnableEvents <> ee Then a.EnableEvents = ee
    Set a = Nothing
  End If
End Sub
 
Em là hơi bị gato với tác giả đấy. Mình đăng bài thì ít người giúp, còn bài nhập 2/2 để ra ngày cũng lười mà lại được các bác nhiệt tâm thế.
Tác giả mà luyện thành nội công thì cố gắng quay lại giúp đỡ đàn em nhé.
 
Nhập 2 thôi nhé, chứ nhập 2/2 thì có gì đáng nói.
Thì nhập 2/2 là ra ngày, nhưng không chịu mất thêm vài giây lại muốn chỉ nhập 2 là xong. Mà hình như là nhập 2 xong không nhấn Enter nữa cơ.
Bác code vẫn phải Enter thì em nghĩ chưa đúng ý tác giả rồi. :wallbash: :wallbash: :wallbash:
 
Rán nhập thêm tí ti nữa cho nó chuẩn bạn ạ. Không ai đi nhập 2 mà muốn ra ngày cả.
Trên thực hành thì là chuyện chẳng những không ích lợi lắm mà còn có hại.
Ví dụ người dùng hôm nay gõ 28 thì nó ra 28/02/2023.; ngày mai quen tay gõ 29 thì nó ra 29/03/2023

Tôi nghĩ là thớt chỉ thử các ý tưởng màu mè để khoe với sếp và đồng nghiệp.
 
Web KT

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

Back
Top Bottom