Hoàn thiện dùm em code định dạng ngày tháng trên form

Liên hệ QC

ngh_khanh

Thành viên mới
Tham gia
14/2/11
Bài viết
45
Được thích
25
Em có 1 ví dụ này, nhờ AC xem và hoàn thiện thêm dùm cho em code viết:
PHP:
Private Sub CommandButton1_Click()
    Dim i As Long
    With S1
        i = .Range("A65535").End(xlUp).Row
        .Cells(i + 1, 1).Value = Me.txtNgay 'dong nay phai thiet lap ngay the nao cho dung!?
        .Cells(i + 1, 2).Value = Me.txtCtu
        .Cells(i + 1, 3).Value = Me.txtNgayCtu 'dong nay phai thiet lap ngay the nao cho dung!?
        .Cells(i + 1, 4).Value = Me.cbMa
        .Cells(i + 1, 5).Value = Me.txtdiengiai
        .Cells(i + 1, 6).Value = Me.txtTK
        .Cells(i + 1, 7).Value = Me.txtTien 'dong nay phai thiet lap phan biet hang ngan the nao cho dung!?
        Me.txtNgay.Value = ""
        Me.txtCtu.Value = ""
        Me.txtNgayCtu.Value = ""
        Me.cbMa.Value = ""
        Me.txtdiengiai.Value = ""
        Me.txtTK.Value = ""
        Me.txtTien.Value = ""
    End With
    Me.txtNgay.SetFocus
End Sub
 

File đính kèm

Câu 1 và 2: Liên quan đến ngày tháng
Nếu dùng text box và gõ 20/02/2011 thì phải dùng hàm DateSerial(year, month, day) với các tham số lấy bằng hàm xử lý chuỗi
Lời khuyên: Đã dùng Userform thì nên dùng calendar hoặc DateTime Picker cho ngày tháng.
Câu 3: Record macro 1 cái biết liền.
 
Upvote 0
Em xem thử code này xem sao nhé:
PHP:
Private Sub CommandButton1_Click()
    Dim i As Long
    With S1
        i = .Range("A65535").End(xlUp).Row
        .Cells(i + 1, 1).Value = DateSerial(Year(Me.txtNgay.Value), Month(Me.txtNgay.Value), Day(Me.txtNgay.Value))
        .Cells(i + 1, 2).Value = Me.txtCtu.Value
        .Cells(i + 1, 3).Value = DateSerial(Year(Me.txtNgayCtu.Value), Month(Me.txtNgayCtu.Value), Day(Me.txtNgayCtu.Value))
        .Cells(i + 1, 4).Value = Me.cbMa.Value
        .Cells(i + 1, 5).Value = Me.txtdiengiai.Text
        .Cells(i + 1, 6).Value = Me.txtTK.Value
        .Cells(i + 1, 7).Value = Me.txtTien.Value
        Me.txtNgay.Value = ""
        Me.txtCtu.Value = ""
        Me.txtNgayCtu.Value = ""
        Me.cbMa.Value = ""
        Me.txtdiengiai.Value = ""
        Me.txtTK.Value = ""
        Me.txtTien.Value = ""
    End With
    Me.txtNgay.SetFocus
End Sub
Private Sub CommandButton2_Click()
    Unload Me
End Sub
Private Sub cbMa_Change()
    SendKeys ("%{DOWN}")
End Sub
Private Sub txtTien_Change()
    Me.txtTien.Value = Format(Me.txtTien, "#,##0")
End Sub
 
Upvote 0
Em xem thử code này xem sao nhé:
PHP:
Private Sub CommandButton1_Click()
    Dim i As Long
    With S1
        i = .Range("A65535").End(xlUp).Row
        .Cells(i + 1, 1).Value = DateSerial(Year(Me.txtNgay.Value), Month(Me.txtNgay.Value), Day(Me.txtNgay.Value))
        .Cells(i + 1, 2).Value = Me.txtCtu.Value
        .Cells(i + 1, 3).Value = DateSerial(Year(Me.txtNgayCtu.Value), Month(Me.txtNgayCtu.Value), Day(Me.txtNgayCtu.Value))
        .Cells(i + 1, 4).Value = Me.cbMa.Value
        .Cells(i + 1, 5).Value = Me.txtdiengiai.Text
        .Cells(i + 1, 6).Value = Me.txtTK.Value
        .Cells(i + 1, 7).Value = Me.txtTien.Value
        Me.txtNgay.Value = ""
        Me.txtCtu.Value = ""
        Me.txtNgayCtu.Value = ""
        Me.cbMa.Value = ""
        Me.txtdiengiai.Value = ""
        Me.txtTK.Value = ""
        Me.txtTien.Value = ""
    End With
    Me.txtNgay.SetFocus
End Sub
Private Sub CommandButton2_Click()
    Unload Me
End Sub
Private Sub cbMa_Change()
    SendKeys ("%{DOWN}")
End Sub
Private Sub txtTien_Change()
    Me.txtTien.Value = Format(Me.txtTien, "#,##0")
End Sub
Cái chổ này:
PHP:
DateSerial(Year(Me.txtNgay.Value), Month(Me.txtNgay.Value), Day(Me.txtNgay.Value))
Đã không dám chắc Me.txtNgay đang định dạng đúng theo Control Panel thì sao dùng được hàm MONTHDAY?
Lở như tháng thành ngày và ngược lại thì coi như... toi
Ở trên sư phụ ptm0412 có nói:
Nếu dùng text box và gõ 20/02/2011 thì phải dùng hàm DateSerial(year, month, day) với các tham số lấy bằng hàm xử lý chuỗi
Xử lý chuổi nha... chứ hổng phải chơi bằng hàm MONTH DAY nha
Xử lý chuổi có nhiều cách, tôi thì thích kiểu này:
PHP:
tmp = Split(Me.txtNgay.Value, "/")
.Cells(i + 1, 1).Value = DateSerial(tmp(2), tmp(1), tmp(0))
 
Upvote 0
Có cần nhắc lại "hàm xử lý chuỗi" là Left, Mid, Right, Instr, Split, ... không nhỉ?
 
Lần chỉnh sửa cuối:
Upvote 0
Sư phụ ơi, em làm như thế này rùi mà sao vẫn chưa định dạng đúng ngày/tháng/năm?
PHP:
Option Explicit
Private Sub cbMa_Change()
    SendKeys ("%{DOWN}")
End Sub
Private Sub CommandButton1_Click()
    Dim i As Long
    With S1
        i = .Range("A65535").End(xlUp).Row
        .Cells(i + 1, 1).Value = Format(Me.txtNgay.Value, "dd/MM/yyyy")
        .Cells(i + 1, 2).Value = Me.txtCtu.Value
        .Cells(i + 1, 3).Value = Format(Me.txtNgayCtu.Value, "dd/MM/yyyy")
        .Cells(i + 1, 4).Value = Me.cbMa.Value
        .Cells(i + 1, 5).Value = Me.txtdiengiai.Text
        .Cells(i + 1, 6).Value = Me.txtTK.Value
        .Cells(i + 1, 7).Value = Me.txtTien.Value
        .Cells(i + 1, 8).Value = Me.txttt.Value
        Me.txtNgay.Value = ""
        Me.txtCtu.Value = ""
        Me.txtNgayCtu.Value = ""
        Me.cbMa.Value = ""
        Me.txtdiengiai.Value = ""
        Me.txtTK.Value = ""
        Me.txtTien.Value = ""
        Me.txttt.Value = ""
    End With
    Me.txtNgay.SetFocus
End Sub
Private Sub CommandButton2_Click()
    Unload Me
End Sub
Private Sub txtNgay_AfterUpdate()
    txtNgay = Format(Me.txtNgay.Value, "dd/MM/yyyy")
End Sub
Private Sub txtNgayCtu_AfterUpdate()
    txtNgayCtu = Format(Me.txtNgayCtu.Value, "dd/MM/yyyy")
End Sub
Private Sub txtTien_Change()
    Me.txtTien.Value = Format(Format(txtTien, "0"), "#,##0")
End Sub
Private Sub txttt_Change()
    Me.txttt.Value = Format(Format(txttt, "0"), "#,##0")
End Sub
 

File đính kèm

Upvote 0
Sư phụ ơi, em làm như thế này rùi mà sao vẫn chưa định dạng đúng ngày/tháng/năm?
Như thầy ptm0412 đã khuyên ở trên, bạn nên dùng Calendar cho ngày tháng, còn ngày tháng hiển thị trên Form chỉ để... xem cho vui thôi.
Mình sửa lại một chút về cấu trúc trên Form của bạn: Thay Textbox txtNgay bởi Label LblNgay, thay Textbox txtNgayCtu bởi Label LblNgayCtu, thêm 2 Calendar 1 và 2. Khi đó, toàn bộ code cho Form này sẽ được sửa như sau:
PHP:
Option Explicit
Dim Ngay1 As Date, Ngay2 As Date
Private Sub cbMa_Change()
    SendKeys ("%{DOWN}")
End Sub
Private Sub CommandButton1_Click()
    Dim i As Long
    With S1
        i = .Range("A65535").End(xlUp).Row
        .Cells(i + 1, 1).Value = Ngay1
        .Cells(i + 1, 2).Value = Me.txtCtu.Value
        .Cells(i + 1, 3).Value = Ngay2
        .Cells(i + 1, 4).Value = Me.cbMa.Value
        .Cells(i + 1, 5).Value = Me.txtdiengiai.Text
        .Cells(i + 1, 6).Value = Me.txtTK.Value
        .Cells(i + 1, 7).Value = Me.txtTien.Value
        .Cells(i + 1, 8).Value = Me.txttt.Value
        Me.txtCtu.Value = ""
        Me.cbMa.Value = ""
        Me.txtdiengiai.Value = ""
        Me.txtTK.Value = ""
        Me.txtTien.Value = ""
        Me.txttt.Value = ""
    End With
End Sub
Private Sub CommandButton2_Click()
    Unload Me
End Sub
Private Sub LblNgay_Click()
    Calendar1 = Ngay1: Calendar1.Visible = True
End Sub
Private Sub Calendar1_Click()
    Ngay1 = Calendar1: LblNgay.Caption = Format(Calendar1, "dd/MM/yyyy"): Calendar1.Visible = False
End Sub
Private Sub LblNgayCtu_Click()
    Calendar2 = Ngay2: Calendar2.Visible = True
End Sub
Private Sub Calendar2_Click()
    Ngay2 = Calendar2: LblNgayCtu.Caption = Format(Calendar2, "dd/MM/yyyy"): Calendar2.Visible = False
End Sub
Private Sub txtTien_Change()
    Me.txtTien.Value = Format(Format(txtTien, "0"), "#,##0")
End Sub
Private Sub txttt_Change()
    Me.txttt.Value = Format(Format(txttt, "0"), "#,##0")
End Sub
Private Sub UserForm_Initialize()
    Ngay1 = Date: Ngay2 = Date
    LblNgay.Caption = Format(Ngay1, "dd/MM/yyyy")
    LblNgayCtu.Caption = Format(Ngay2, "dd/MM/yyyy")
End Sub
Private Sub UserForm_Click()
    Calendar1.Visible = False: Calendar2.Visible = False
End Sub
 

File đính kèm

Upvote 0
Như thầy ptm0412 đã khuyên ở trên, bạn nên dùng Calendar cho ngày tháng, còn ngày tháng hiển thị trên Form chỉ để... xem cho vui thôi.
Mình sửa lại một chút về cấu trúc trên Form của bạn: Thay Textbox txtNgay bởi Label LblNgay, thay Textbox txtNgayCtu bởi Label LblNgayCtu, thêm 2 Calendar 1 và 2. Khi đó, toàn bộ code cho Form này sẽ được sửa như sau:

Đúng là em cũng biết các sư phụ đó đã nói mà em vẫn không làm được. Thú thật cái đó em chưa biết! Giờ em sẽ tham khảo bài của anh!
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Em xin hỏi thêm: Nếu Textbox nào mà để trống thì nó sẽ tự động điền "//" vào cell. Vậy code em phải sửa lại như thế nào?
 
Upvote 0
Sư phụ ơi, em làm như thế này rùi mà sao vẫn chưa định dạng đúng ngày/tháng/năm?

Bản chất của textbox là text, thì dù có dùng hàm Format() để định dạng số hay ngày nó cũng là text. Chỉ có dùng hàm chuyển đổi như DateSerial cho ngày và Val cho số mới được.

Không cần txtngay AfterUpdate gì cả. Dùng hàm xử lý chuỗi là dùng hàm split của ndu hoặc là vầy:

PHP:
i = .Range("A65535").End(xlUp).Row
Ngay1 =Me.txtNgay.Value
        .Cells(i + 1, 1).Value = DateSerial(Right(Ngay1, 4), Mid(Ngay1, 4, 2), Left(Ngay1, 2))
Và nhớ là có chữ nếu: Nếu gõ trong textbox dạng đầy đủ 20/02/2011.

Và có cả chữ nên, nên làm như nghiaphuc: gắn calendar.
 
Lần chỉnh sửa cuối:
Upvote 0
Bản chất của textbox là text, thì dù có dùng hàm Format() để định dạng số hay ngày nó cũng là text. Chỉ có dùng hàm chuyển đổi như DateSerial cho ngày và Val cho số mới được.

Không cần txtngay AfterUpdate gì cả. Dùng hàm xử lý chuỗi là dùng hàm split của ndu hoặc là vầy:

PHP:
i = .Range("A65535").End(xlUp).Row
Ngay1 =Me.txtNgay.Value
.Cells(i + 1, 1).Value = DateSerial(Right(Ngay1, 4), Mid(Ngay1, 4, 2), Left(Ngay1, 2))
Và nhớ là có chữ nếu: Nếu gõ trong textbox dạng đầy đủ 20/02/2011.

Và có cả chữ nên, nên làm như nghiaphuc: gắn calendar.

Em xin hỏi thêm: Nếu Textbox nào mà để trống thì nó sẽ tự động điền "//" vào cell. Vậy code em phải sửa lại như thế nào?
 
Upvote 0
Em xin hỏi thêm: Nếu Textbox nào mà để trống thì nó sẽ tự động điền "//" vào cell. Vậy code em phải sửa lại như thế nào?

Xem file đính kèm có 1 form nhập liệu vừa nhập kho vừa xuất kho ở đây:
http://www.giaiphapexcel.com/forum/showthread.php?7358-External-Database-Query-nhi%E1%BB%81u-tables-v%E1%BB%9Bi-relations&p=55016#post55016

Dùng textbox chứ không dùng Calendar, nhưng ràng buộc gõ dd/mm/yyyy với input mask __/__/____, không cho gõ ký tự chữ cái. (Tuyệt phẩm VBA của MrOkeBab)

Nếu làm thì làm vậy,chứ // chả có ý nghĩa quái quỷ gì. Còn điền "//" xuống cell thì quá dễ: Nếu len(...) = 0 thì cells() = "//". TUy vậy, đối với tổ chức CSDL mà nói, ngày tháng không có thà để trống, chứ không điền text vào. Sau này không xử lý được.
 
Lần chỉnh sửa cuối:
Upvote 0
Em xin hỏi thêm: Nếu Textbox nào mà để trống thì nó sẽ tự động điền "//" vào cell. Vậy code em phải sửa lại như thế nào?
Khuyên bạn nên dùng Calendar hoặc DTPicker ---> Ai biết dùng form thì chẳng bao giờ lại đi dùng TextBox để nhập ngày tháng cả bạn à
Nói chung là: Dùng đúng công cụ ----> Dùng kềm để đóng đinh? Cũng được nhưng mà... cực
 
Upvote 0
Code tại bài #7 của mình có thể sửa lại như vầy cho gọn:
- Bỏ 2 biến Ngay1, Ngay2 vì thực tế không dùng đến 2 biến này để tính toán.
- Bỏ bớt những chỗ Me. hoặc .Value vì không cần thiết.
PHP:
Option Explicit
Private Sub cbMa_Change()
    SendKeys ("%{DOWN}")
End Sub
Private Sub CommandButton1_Click()
    Dim i As Long
    With S1
        i = .Range("A65535").End(xlUp).Row
        .Cells(i + 1, 1) = Calendar1
        .Cells(i + 1, 2) = txtCtu
        .Cells(i + 1, 3) = Calendar2
        .Cells(i + 1, 4) = cbMa
        .Cells(i + 1, 5) = txtdiengiai.Text
        .Cells(i + 1, 6) = txtTK
        .Cells(i + 1, 7) = txtTien
        .Cells(i + 1, 8) = txttt
        txtCtu = "": cbMa = "": txtdiengiai = ""
        txtTK = "": txtTien = "": txttt = ""
    End With
End Sub
Private Sub CommandButton2_Click()
    Unload Me 'Co the dung lenh End
End Sub
Private Sub LblNgay_Click()
    Calendar1.Visible = True
End Sub
Private Sub Calendar1_Click()
    LblNgay.Caption = Format(Calendar1, "dd/MM/yyyy"): Calendar1.Visible = False
End Sub
Private Sub LblNgayCtu_Click()
    Calendar2.Visible = True
End Sub
Private Sub Calendar2_Click()
    LblNgayCtu.Caption = Format(Calendar2, "dd/MM/yyyy"): Calendar2.Visible = False
End Sub
Private Sub txtTien_Change()
    txtTien = Format(Format(txtTien, "0"), "#,##0")
End Sub
Private Sub txttt_Change()
    txttt = Format(Format(txttt, "0"), "#,##0")
End Sub
Private Sub UserForm_Initialize()
    Calendar1 = Date: Calendar2 = Date
    LblNgay.Caption = Format(Calendar1, "dd/MM/yyyy")
    LblNgayCtu.Caption = Format(Calendar2, "dd/MM/yyyy")
End Sub
Private Sub UserForm_Click()
    Calendar1.Visible = False: Calendar2.Visible = False
End Sub
 
Upvote 0
Cách tạo textbox nhập ngày tháng

Em có ví dụ này muốn hỏi anh chị. Trong file ví dụ đính kèm em đã tạo Form rùi. Giờ em muốn thiết lập textbox nhập ngày/tháng/năm? Ví dụ như hình dưới:
0125.jpg

Vậy có thể thiết kế được như vậy không ah? Nếu được thì làm bằng cách nào?
AC vui lòng tư vấn cho em nhé!
 

File đính kèm

Upvote 0
Em có ví dụ này muốn hỏi anh chị. Trong file ví dụ đính kèm em đã tạo Form rùi. Giờ em muốn thiết lập textbox nhập ngày/tháng/năm? Ví dụ như hình dưới:

Vậy có thể thiết kế được như vậy không ah? Nếu được thì làm bằng cách nào?
AC vui lòng tư vấn cho em nhé!
Em đọc lại bài #12 đi, thầy Mỹ đã giới thiệu Link rồi đó.
 
Upvote 0
Vấn đề này đã giải quyết tại topic này, sao lại mở topic khác hỏi nữa?
ptm đã viết:
Lời khuyên: Đã dùng Userform thì nên dùng calendar hoặc DateTime Picker cho ngày tháng.
nghiaphuc đã viết:
Như thầy ptm0412 đã khuyên ở trên, bạn nên dùng Calendar cho ngày tháng, còn ngày tháng hiển thị trên Form chỉ để... xem cho vui thôi.
ndu đã viết:
Khuyên bạn nên dùng Calendar hoặc DTPicker ---> Ai biết dùng form thì chẳng bao giờ lại đi dùng TextBox để nhập ngày tháng cả bạn à
Nói chung là: Dùng đúng công cụ ----> Dùng kềm để đóng đinh? Cũng được nhưng mà... cực

ptm đã viết:
Xem file đính kèm có 1 form nhập liệu vừa nhập kho vừa xuất kho ở đây:
http://www.giaiphapexcel.com/forum/s...5016#post55016

Dùng textbox chứ không dùng Calendar, nhưng ràng buộc gõ dd/mm/yyyy với input mask __/__/____, không cho gõ ký tự chữ cái. (Tuyệt phẩm VBA của MrOkeBab)

Phải chịu khó đọc bài chứ?
 
Upvote 0
Web KT

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

Back
Top Bottom