Lỗi nhập liệu userform khi trong excel có tạo table

Liên hệ QC

TuyetNguyen02

Thành viên mới
Tham gia
26/11/18
Bài viết
9
Được thích
2
Chào các anh chị, em đang làm một sheet nhập liệu sử dụng userform nhưng trong sheet đó em có tạo một table 297 dòng. Khi xuất dữ liệu userform ra excel thì dữ liệu không hiện ở dòng dưới liền kề dòng có ký tự (dòng cuối có ký tự là dòng 44) mà hiện ở dòng 298. Mã code của em như sau:
Private Sub CommandButton1_Click()
Dim Endr As Long
With Sheets("Nhaplieu")
Endr = .Range("B" & Rows.Count).End(xlUp).Row
.Range("B" & Endr + 1) = TxtMaNV.Text
.Range("C" & Endr + 1) = TxtName.Text
.Range("D" & Endr + 1) = TxtSex.Text
.Range("E" & Endr + 1) = TxtBirthday.Text
End With
End Sub

Có cách nào vẩn giữ table đó mà ký tự hiện ra ngay sau dòng cuối có ký tự không ạ.
Em cảm ơn.
 
Chào các anh chị, em đang làm một sheet nhập liệu sử dụng userform nhưng trong sheet đó em có tạo một table 297 dòng. Khi xuất dữ liệu userform ra excel thì dữ liệu không hiện ở dòng dưới liền kề dòng có ký tự (dòng cuối có ký tự là dòng 44) mà hiện ở dòng 298. Mã code của em như sau:
Private Sub CommandButton1_Click()
Dim Endr As Long
With Sheets("Nhaplieu")
Endr = .Range("B" & Rows.Count).End(xlUp).Row
.Range("B" & Endr + 1) = TxtMaNV.Text
.Range("C" & Endr + 1) = TxtName.Text
.Range("D" & Endr + 1) = TxtSex.Text
.Range("E" & Endr + 1) = TxtBirthday.Text
End With
End Sub

Có cách nào vẩn giữ table đó mà ký tự hiện ra ngay sau dòng cuối có ký tự không ạ.
Em cảm ơn.
Bạn sửa chỗ này.
Endr = .Range("B296").End(xlUp).Row
 
Upvote 0
Câu lệnh này không hoàn toàn tốt cho lắm:
PHP:
Private Sub CommandButton1_Click()
 Dim Endr As Long
With Sheets("Nhaplieu")
   Endr = .Range("B" & Rows.Count).End(xlUp).Row +1
'   ' ' ' ' '      '
   .Range("E" & Endr ) = TxtBirthday.Text  '<=|   '
End With
End Sub
Bạn nên viết 1 hàm người dùng để chuyển chuỗi số liệu ngày sinh thành số liệu mm/dd/yyyy hay dd/mm/yyyy để còn hữu dụng về sau.
Mình ví dụ:
PHP:
Function TxtToDate(StrC As String) As Date
 Dim VTr As Integer, Nm As Integer, Th As Byte, Ng As Byte
 Const FC As String = "/"
 
 Nm = CInt(Right(StrC, 4)):                     VTr = InStr(StrC, FC)
 Ng = CByte(Left(StrC, VTr - 1)):           StrC = Mid(StrC, VTr + 1, 3)
 VTr = InStr(StrC, FC):                          Th = CByte(Left(StrC, VTr - 1))
 TxtToDate = DateSerial(Nm, Th, Ng)
End Function
 
Upvote 0
Câu lệnh này không hoàn toàn tốt cho lắm:
PHP:
Private Sub CommandButton1_Click()
Dim Endr As Long
With Sheets("Nhaplieu")
   Endr = .Range("B" & Rows.Count).End(xlUp).Row +1
'   ' ' ' ' '      '
   .Range("E" & Endr ) = TxtBirthday.Text  '<=|   '
End With
End Sub
Bạn nên viết 1 hàm người dùng để chuyển chuỗi số liệu ngày sinh thành số liệu mm/dd/yyyy hay dd/mm/yyyy để còn hữu dụng về sau.
Mình ví dụ:
PHP:
Function TxtToDate(StrC As String) As Date
Dim VTr As Integer, Nm As Integer, Th As Byte, Ng As Byte
Const FC As String = "/"

Nm = CInt(Right(StrC, 4)):                     VTr = InStr(StrC, FC)
Ng = CByte(Left(StrC, VTr - 1)):           StrC = Mid(StrC, VTr + 1, 3)
VTr = InStr(StrC, FC):                          Th = CByte(Left(StrC, VTr - 1))
TxtToDate = DateSerial(Nm, Th, Ng)
End Function
Đúng rồi mình bị lỗi hiển thị dữ liệu ngày tháng khi tạo userform tra cứu dữ liệu.
Mình chỉ mới học VBA thôi nên gặp đâu cũng lỗi hết. Hàm bạn đưa là mình chỉ cần gán vào là được hay có thay đổi gì trong hàm sẵn có không bạn.
 
Upvote 0
Hàm bạn đưa là mình chỉ cần gán vào là được hay có thay đổi gì trong hàm sẵn có không bạn.
Khi xài hàm này có vài lưu ý nhỏ:
1./ Khi nhập liệu vô TextBox có tên TxtBirthday ta fải nhập chuỗi có dạng "dd/mm/yyyy", hay "D/M/yyyy", hoặc . . .
Ta không thể nhập mm/dd/yyyy, hay dd-mm-yyyy,. . . .
Chuyện này ta nên nhắc người dùng trong mục ControlTipText để nhập cho chuẩn
2./ Thay vì câu lệnh của bạn là
Mã:
 .Range("E" & Endr ) = TxtBirthday.Text
Ta cần nhập
PHP:
  .Range("E" & Endr ) = TxtToDate(Me!TxtBirthday.Text)

3./ Nếu bạn có thói quen nhập chuỗi ngày tháng năm theo dạng mm/dd/yyyy thì ta fải đổi lại nội dung chút xíu trong hàm
 
Upvote 0
.Range("E" & Endr ) = TxtBirthday.Text '<=| '
...
Bạn nên viết 1 hàm người dùng để chuyển chuỗi số liệu ngày sinh thành số liệu mm/dd/yyyy hay dd/mm/yyyy để còn hữu dụng về sau.
PHP:
Function TxtToDate(StrC As String) As Date
Dim VTr As Integer, Nm As Integer, Th As Byte, Ng As Byte
Const FC As String = "/"

Nm = CInt(Right(StrC, 4)):                     VTr = InStr(StrC, FC)
Ng = CByte(Left(StrC, VTr - 1)):           StrC = Mid(StrC, VTr + 1, 3)
VTr = InStr(StrC, FC):                          Th = CByte(Left(StrC, VTr - 1))
TxtToDate = DateSerial(Nm, Th, Ng)
End Function
Tôi không thử với thiết lập của Việt Nam nhưng có lẽ không cần thiết hàm convert.

Ta có 2 trường hợp:

1. Người nhập liệu luôn luôn nhập ngày tháng theo đúng như thiết lập trong CP. Tức nhập ngày tháng chuẩn trên sheet ngày trước hay tháng trước thì nhập ở TextBox cũng theo thứ tự đó. Trong trường hợp này thì theo tôi không cần bất cứ hàm convert nào mà chỉ cần lồng Textbox.Text vào CDate.

2. Người nhập làm bừa. Lúc nhập ngày trước lúc nhập tháng trước. Hoặc luôn luôn nhập ngày trước nhưng đối tác, đồng nghiệp (làm việc nhóm?) luôn luôn nhập tháng trước. Trong trường hợp này mọi hàm convert đều vô dụng. Bởi nếu người nhập gõ 11/12/2018 thì đó là 11 tháng Mười Hai năm 2018 hay 12 tháng Mười Một 2018? Trong trường hợp này hàm TxtToDate trả về 11 tháng Mười Hai năm 2018 nhưng rất có thể đồng nghiệp đã muốn 12 tháng Mười Một 2018. Làm sao hàm TxtToDate đoán được ý người hiện đang nhập dữ liệu?

Tóm lại trong cả 2 trường hợp thì mọi hàm convert đều vô dụng.

Chỉ còn 1 cách là khi gõ thì luôn gõ y như đang gõ ngày tháng chuẩn trên sheet, và dùng CDate(textbox.Text).

Tôi không thử nên chỉ là ý kiến chủ quan thôi.
 
Upvote 0
Khi xài hàm này có vài lưu ý nhỏ:
1./ Khi nhập liệu vô TextBox có tên TxtBirthday ta fải nhập chuỗi có dạng "dd/mm/yyyy", hay "D/M/yyyy", hoặc . . .
Ta không thể nhập mm/dd/yyyy, hay dd-mm-yyyy,. . . .
Chuyện này ta nên nhắc người dùng trong mục ControlTipText để nhập cho chuẩn
2./ Thay vì câu lệnh của bạn là
Mã:
 .Range("E" & Endr ) = TxtBirthday.Text
Ta cần nhập
PHP:
  .Range("E" & Endr ) = TxtToDate(Me!TxtBirthday.Text)

3./ Nếu bạn có thói quen nhập chuỗi ngày tháng năm theo dạng mm/dd/yyyy thì ta fải đổi lại nội dung chút xíu trong hàm
Mình cảm ơn nhé.
Cho mình hỏi giờ mình muốn textbox txtbirthday có sẵn dấu / để ngăn cách luôn hoặc lúc nhập tự hiện ra dấu / để đỡ mất công nhập thì phải làm sao ạ.
 
Upvote 0
Web KT

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

Back
Top Bottom