Nhập dữ liệu trên form

  • Thread starter Thread starter ditimdl
  • Ngày gửi Ngày gửi
Liên hệ QC

ditimdl

Thành viên thường trực
Tham gia
11/10/06
Bài viết
378
Được thích
107
Giới tính
Nam
Nghề nghiệp
Pharmacist
Em tạo ra 1 form để nhập dữ liệu vào bảng tính nhưng không biết xử lý những vấn đề sau:
1. Làm sao để quy định dữ liệu nhập vào là kiểu số?
2. Nhập theo 1 danh sách cho trước?(Giống như dùng validation data kiểu list để kiểm soát nhập dữ liệu)
 
1. Để quy định nhập dữ liệu kiểu số thì có thể quản lý bằng 2 cách.
- Kiểm tra dữ liệu hợp lệ trước khi xử lý nó, cái này thì đơn giản rồi, vì để kiểm tra dữ liệu nhập vào có phải kiểu số hay không thì chắc không vấn đề gì.
- Kiểm soát thao tác nhập từ bán phím của người dùng, chỉ cho nhập nếu ký tự nhập hợp lệ(0->9, ., ,), cách này nếu trên Form có 1 điều khiển nhập số thôi thì có thể viết event cho điều khiển đó luôn, trong trường hợp có nhiều điều khiển thì nên viết riêng 1 cái Class Module.
2. Nhấp theo 1 danh sách cho trước thì có thể dùng ComboBox hoặc ListBox, vấn đề là nguồn danh sách đó ở đâu thôi.
 
Upvote 0
Gửi các bạn và anh chị!
Trong file đính kèm theo ở phần năm sinh của nam và nữ em muốn dữ liệu nhập vào là số nếu sai thì báo lỗi cho người dùng biết. Tương tự ở phần ngày khám: dữ liệu nhập vào là kiểu dữ liệu ngày tháng.
Ở phần textbox No. sau khi nhập dữ liệu xong click vào command NEW thì nó sẽ cho tạo ra số thứ mới lớn hơn 1đơn vị so với dãy số trong cột A em đã làm được nhưng khi mở file và show form lên thì nó không tự hiện lên số thứ tự mới lớn hơn 1đơn vị so với dãy số trong cột A?
Nhờ các anh chị và các bạn giúp em viết thêm code.
 

File đính kèm

Upvote 0
1. Để ràng buộc năm sinh là số và là 4 chữ số:
PHP:
Private Sub Nam_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
If Len(Nam) <> 0 And (IsNumeric(Nam) = False Or Len(Nam) <> 4) Then
Cancel = True
MsgBox "Nam sinh phai la so va 4 chu so"
End If
End Sub
PHP:
Private Sub Nu_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
If Len(Nu) <> 0 And (IsNumeric(Nu) = False Or Len(Nu) <> 4) Then
Cancel = True
MsgBox "Nam sinh phai la so va 4 chu so"
End If
End Sub
2. Để khi load form có sẵn số thứ tự mong muốn, gán vào textbox Num khi form Activate hoặc form initialize
PHP:
Private Sub UserForm_Initialize()
Num = WorksheetFunction.Max(Sheet1.Range("A2:A14000")) + 1
End Sub
3. Để ràng buộc ngày khám là dữ liệu kiểu ngày:
PHP:
Private Sub Ngaykham_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
If IsDate(Ngaykham) = False Then
Cancel = True
MsgBox "Ngay phai du ngay thang nam dang dd/mm/yy"
End If
End Sub
 
Upvote 0
Cho em hỏi thêm tí nữa. Khi dùng excel để nhập liệu em thường dùng chức năng autocorrect kết hợp với validation data để nhập những từ thường lặp đi lặp lại nhanh và chính xác. Nếu làm việc trên form thì có thể dùng được chức năng AutoCorrect không? (Nếu dùng combo box để chọn thì lâu hơn là dùng autocorrect)
Khi nhập dữ liệu của một bệnh nhân xong thì dữ liệu được chuyển sang các ô trong excel. Viết code như thế nào để chỉnh sửa một bệnh nhân đã được nhập rồi trên form và cập nhật đè lên dữ liệu cũ?
 
Lần chỉnh sửa cuối:
Upvote 0
Combobox cũng auto nhưng không phải autocorrect mà là autoWordSelect: chỉ cần gõ 1 ký tự đầu, combo sẽ hiện phần tử đầu tiên có ký tự đó. Gõ tiếp ký tự thứ 2, nó chọn tiếp, ...
Hoặc gõ 1, 2 ký tự xong nhấn F4, danh sách xổ xuống ngay khúc có ký tự đó. Tốt nhất là Row Source của combobox được sort trước.
 
Upvote 0
3. Để ràng buộc ngày khám là dữ liệu kiểu ngày:
PHP:
Private Sub Ngaykham_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
If IsDate(Ngaykham) = False Then
Cancel = True
MsgBox "Ngay phai du ngay thang nam dang dd/mm/yy"
End If
End Sub
Đoạn code này không có tác dụng anh à.
PHP:
Private Sub UserForm_Initialize()

Num = WorksheetFunction.Max(Sheet1.Range("A2:A14000")) + 1
Me.Hoten.SetFocus
End Sub
Đoạn code này để lấy số thứ tự được rồi. Sau khi lấy số thứ tự xong em muốn vị trí chọn nhập dữ liệu nằm ở txtbox Hoten. Em thêm vào Me.Hoten.SetFocus nhưng nó chẳng có tác dụng? Sửa giúp em.
 
Upvote 0
Muốn chỉnh sửa 1 record, tốt nhất là dùng 1 form khác, có đầy đủ các field như form nhập, kèm theo là 1 listbox liệt kê mọi record cósẵn. Khi chọn 1 record trong list box xong:
- hiển thị các ô nhập liêu của form bằng giátrịc của dòng chọn =listbox1.column(i) với i từ 0 đến hết
- dùng hàm tìm kiếm xácđịnh dòng chứa dữ liệu của dòng chọn trên listbox
- sửa chữa
- nhấn nút ghi đè lên dòng mới tìm được.
 
Upvote 0
Đoạn code này không có tác dụng anh à.
Em thêm vào Me.Hoten.SetFocus nhưng nó chẳng có tác dụng
Tôi thử cótác dụng mà? Nhưng Excel cho phép chỉ gõ ngày tháng, không cần gõ năm, tự hiểu 2008 (năm hiện hành). Thậm chí gõ ngắn như vầy cũng được: 12/5 hoặc 4/12 hoặc 3/9
 
Upvote 0
Em chỉ mới tập làm dựa trên các đoạn code đọc trên diễn đàn này nên những điều anh nói em chưa làm được. Anh dựa trên file em đính kèm giúp em với.
Sau khi load form xong, số thứ tự đã được nhảy nhưng vị trí con nháy nó chẳng nằm trên txtbox Hoten mà nó nằm ở đâu cũng chẳng thấy luôn. (Khi nhập 1 bệnh nhân rồi click command NEW thì nó hiểu còn khi mới load thì chẳng hiểu)
Excel cho phép gõ ngày tháng vào nếu ko có năm thì nó hiểu là năm hiện hành theo hệ thống nhưng em thử gõ 12/150 nó vẫn nhận luôn.
 
Lần chỉnh sửa cuối:
Upvote 0
gõ 12/150 nó vẫn nhận luôn
12/150 là 12/01/0150 nên nó nhận. 13/15 không nhận.
Vậy sửa lại :
PHP:
Private Sub Ngaykham_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
If IsDate(Ngaykham) = False Or Len(Ngaykham) < 8 Then 
Cancel = True
MsgBox "Ngay phai du ngay thang nam dang dd/mm/yy"
End If
End Sub
điều kiện <8 nên cần gõ năm ít nhất 2 con, và phải gõ đủ ngày 2 con, tháng 2 con.
 
Upvote 0
PHP:
Private Sub Ngaykham_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
If IsDate(Ngaykham) = False Or Len(Ngaykham) < 8 Then 
Cancel = True
MsgBox "Ngay phai du ngay thang nam dang dd/mm/yy"
End If
End Sub
Khi dữ liệu nhập vào bị sai, Enter xong để sửa lại nhưng xóa thì được còn muốn sửa lại thì phải nháy chuột vào txtbox Ngaykham mới sửa lại được. Làm sao để khi enter xong thì có thể sửa lại dữ liệu luôn mà ko cần phải nháy chuột vào txtbox không?
Em Dùng setfocus cũng ko có tác dụng.
 
Upvote 0
Câu Cancel = True có tác dụng giữ con trỏ chuột nằm lại textbox đó đó rồi. Sao máy bạn không giữ nhỉ? Còn 2 ô năm sinh thì sao?
Mà muốn sửa thì phải xoá cũ ghi mới chứ? Thêm câu lệnh xoá cũng được: Ngaykham=""
 
Upvote 0
Khi tab thì nó nhảy sang txbbox kế bên nhưng nó lại ko hiện dấu nháy để ghi mà phải click chuột vào txtbox mới sửa được. Sao máy anh thì được máy em thì không nhỉ??
Các anh chị và các bạn cho em hỏi trong txtbox có thể dùng list để nhập dữ liệu như trong combobox không vậy?
 
Upvote 0
Các báccho em hỏi tí! Làm thế nào nhập số vào textbox để có kết quả như sau:
Khi nhập số 1 thì kết quả là 1, nhập tiếp số 2 và 3 kết quả là 123, nhập tiếp số 4 kết quả là 1 234, tiếp theo kết quả 12 345,tiếp nữa kết quả là 1 234 567! Tức là nó tự tách như thế khi ta nhập số không bị hoa mắt! Cám ơn các bác trước!
 
Upvote 0
Các báccho em hỏi tí! Làm thế nào nhập số vào textbox để có kết quả như sau:
Khi nhập số 1 thì kết quả là 1, nhập tiếp số 2 và 3 kết quả là 123, nhập tiếp số 4 kết quả là 1 234, tiếp theo kết quả 12 345,tiếp nữa kết quả là 1 234 567! Tức là nó tự tách như thế khi ta nhập số không bị hoa mắt! Cám ơn các bác trước!
MÌnh thay khoản trắng bằng dấu "," được không bạn!?
Nếu là TextBox trên Form, bạn xử lý sự kiện TextBox_change như sau:
PHP:
Private Sub TextBox1_Change()
TextBox1 = Format(Replace(TextBox1.Value, ",", Space(0)), "#,##0")
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
MÌnh thay khoản trắng bằng dấu "," được không bạn!?
Nếu là TextBox trên Form, bạn xử lý sự kiện TextBox_change như sau:
PHP:
Private Sub TextBox1_Change()
TextBox1 = Format(Replace(TextBox1.Value, ",", Space(0)), "#,##0")
End Sub
Cám ơn bác! Thật hay, nhưng có thể đổi từ "," sang " " không bác! Nếu vậy thì tốt biết mấy!
 
Upvote 0
Cám ơn bác! Thật hay, nhưng có thể đổi từ "," sang " " không bác! Nếu vậy thì tốt biết mấy!

Mượn code của bác Ca_Dafi:

PHP:
Private Sub TextBox1_Change()
TextBox1 = Format(Replace(TextBox1.Value, " ", ""), "# ##0")
End Sub

Nhưng theo ý của tại hạ thì các hạ nên sử dụng Event AfterUpdate thay cho Change

Kính!
 
Upvote 0
Mượn code của bác Ca_Dafi:

PHP:
Private Sub TextBox1_Change()
TextBox1 = Format(Replace(TextBox1.Value, " ", ""), "# ##0")
End Sub

Nhưng theo ý của tại hạ thì các hạ nên sử dụng Event AfterUpdate thay cho Change

Kính!
Xử lý sự kiện AfterUpdate thì không khó, xử lý sự kiện Change mới khó! Đến giờ mình vẫn chưa hiểu tại sao Format kiểu "# ##0" cho sự kiện change mà excel nó không hiểu!? +-+-+-+
 
Upvote 0
Xử lý sự kiện AfterUpdate thì không khó, xử lý sự kiện Change mới khó! Đến giờ mình vẫn chưa hiểu tại sao Format kiểu "# ##0" cho sự kiện change mà excel nó không hiểu!? +-+-+-+

Bác thử xem sao nhé :

PHP:
Option Explicit
Dim i As Boolean
Private Sub TB1_Change()
    On Error Resume Next
    If i = True Then Exit Sub
    Dim Str As String
    i = True
    Str = Replace(WorksheetFunction.Trim(TB1), " ", "")
    TB1 = Format(Str, "# ### ### ### ### ### ### ###")
    i = False
End Sub
Tôi không được phép tải file lên, vì vậy thông cảm.
 
Upvote 0
Web KT

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

Back
Top Bottom