PDA

View Full Version : Nhập dữ liệu trên form



ditimdl
29-09-08, 07:05 PM
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)

rollover79
29-09-08, 07:13 PM
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.

ditimdl
29-09-08, 07:56 PM
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.

ptm0412
29-09-08, 08:57 PM
1. Để ràng buộc năm sinh là số và là 4 chữ số:


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



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


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:


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

ditimdl
29-09-08, 09:11 PM
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ũ?

ptm0412
29-09-08, 09:20 PM
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.

ditimdl
29-09-08, 09:31 PM
3. Để ràng buộc ngày khám là dữ liệu kiểu ngày:


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 à.


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.

ptm0412
29-09-08, 09:37 PM
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.

ptm0412
29-09-08, 09:42 PM
Đ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

ditimdl
29-09-08, 09:43 PM
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.

ptm0412
30-09-08, 12:41 AM
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 :


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.

ditimdl
30-09-08, 12:56 PM
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.

ptm0412
30-09-08, 03:34 PM
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=""

ditimdl
30-09-08, 03:45 PM
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?

nghiemkhactienkbnn
21-10-08, 07:09 PM
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!

cadafi
21-10-08, 07:28 PM
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:


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

nghiemkhactienkbnn
21-10-08, 07:42 PM
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:


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!

Lệnh Hồ Đại Hiệp
21-10-08, 08:47 PM
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:


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!

cadafi
21-10-08, 08:54 PM
Mượn code của bác Ca_Dafi:


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!? +-+-+-+

Lệnh Hồ Đại Hiệp
21-10-08, 10:41 PM
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é :


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 SubTôi không được phép tải file lên, vì vậy thông cảm.

nghiemkhactienkbnn
22-10-08, 06:08 PM
Mượn code của bác Ca_Dafi:


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!
Bác ơi! Chỉ thực hiện được 6 số thôi, còn 7 số có kết quả là! 1233 455

Lệnh Hồ Đại Hiệp
22-10-08, 08:37 PM
Bác ơi! Chỉ thực hiện được 6 số thôi, còn 7 số có kết quả là! 1233 455

Bác hãy làm theo Code của bài trên:


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 File VD (http://www.mediafire.com/?e2wxezemgeb)

Chúc vui.

ptm0412
22-10-08, 08:54 PM
Nếu là dấu "," thì chỉ cần:

Private Sub TextBox1_Change()
TextBox1 = Format(TextBox1.Value, "#,##0")
End Sub
còn dấu " ", chỉ đẹp mắt theo kiểu nào đó, nhưng chả hữu dụng tí nào. Vì để tính toán lại hoặc gán cho cell nào đó, phải replace() trả lại số.