Bạn xem file đính kèm, file này mình mới làm xong tương tự như yêu cầu của bạn.
Tham khảo các code từ hai Bác Ndu và Leo.
Tôi đã mở file để xem nó ra sao, nhưng chả thấy có tí dữ liệu nào.
Vậy thì mình cũng trả lời theo dạng "chay" vậy.
1/Trên Form nên đặt 1 listbox có cột mã và tên Học sinh để chọn và XEM-SỬA-XOÁ.
2/Đặt 1 OptionButton để chọn tìm theo mã HS hay Ten HS
3/1Textbox để nhập điều kiện tìm kiếm
4/Các ô DK để thể hiện thông tin và cũng sửa luôn.
Form có các chế độ:
-Xem tìm: Các ô DK không sửa được, chỉ có nut lệnh Thêm-Sưa-Xóa-Thoát
-Sửa: Các ô DK thể hiện thông tin của HS cần sửa. Chỉ tồn tại 2 nút Chấp Nhận-Hủy Bỏ.
-Thêm mới: Tương tự sửa nhưng các Ô ĐK rỗng.
Mã HS Tên HS
FJT00 Đặng Thiên
FJV00 Đinh Văn
FNN00 Đặng Nguyễn Như
HJV00 Hồ Viết
KTM00 Kiều Châu Thủy Mai
LHA00 Lê Hữu Ánh
LNH00 Lê Ngọc Hải
NJQ00 Nguyễn Quốc
NJV00 Nguyễn Văn
NJV01 Ngô Vân
NLA00 Nguyễn Lê Ân
NNT00 Nguyễn Ngọc Trâm
PJK00 Phan Khắc
TJG00 Trần Gia
VJN00 Vy Nhật
VJT00 Võ Thiên
. . . . . .
Rất cảm ơn bạn đã quan tâm và góp ý cho mình. Vấn đề bạn nêu trên mình thấy rất hay, nếu được mong bạn giúp mình với.Nếu là mình thì:
(1) Thêm 1 cột (trường) [Mã HS] theo dạng:
Ưu điểm của bộ mã này là dễ tìm kiếm những em HS mà ta cần (nhất là trong việc chỉnh/sửa hồ sơ HSPHP:Mã HS Tên HS FJT00 Đặng Thiên FJV00 Đinh Văn FNN00 Đặng Nguyễn Như HJV00 Hồ Viết KTM00 Kiều Châu Thủy Mai LHA00 Lê Hữu Ánh LNH00 Lê Ngọc Hải NJQ00 Nguyễn Quốc NJV00 Nguyễn Văn NJV01 Ngô Vân NLA00 Nguyễn Lê Ân NNT00 Nguyễn Ngọc Trâm PJK00 Phan Khắc TJG00 Trần Gia VJN00 Vy Nhật VJT00 Võ Thiên . . . . . .
(2) Tách ra 2 nhiệm vụ (1: Thêm mới & 2: Bổ sung (BS) hay sửa đổi (SC)) lên 2 Page khác nhau
Lí do là 2 nhiệm vụ này là hoàn toàn khác nhau khi viết Code
Ở nhiệm vụ đầu, ta chỉ việc tạo cho em HS này 1 mã HS duy nhất & nhập liệu đã có lên các Control & lưu lên trang tính
Ở nhiệm vụ 2 ta cần tìm theo mã HS; Khi ấy sẽ có 1 danh sách các em trùng 3 chữ cái đầu của mã ( ví dụ trong bảng trên là 2 em Nguyễn Văn & Ngô Vân); Danh sách này hiện trên ListBox để từ đó ta chọn ra em duy nhất cần SC hay BS
Sau khi ta chọn trên ListBox 1 em HS, thì dữ liệu sẽ hiện trên các TextBox để ta SC hay BS
Rốt cuộc sẽ là chuyện bấm nút lưu
Với (1) Sẽ là lưu mới vô dòng cuối của CSDL
Với (2) Sẽ là tìm theo mã HS để đến được dòng dữ liệu của em có mã HS đó (trong TextBox hiễn nhiên rồi) & lưu đè lên dữ liệu cũ.
Vấn đề ở đây là:
A./ Với mã như trên ta chỉ cần biết tên em HS ta sẽ tìm ra mã duy nhất của em đó là gì 1 cách nhanh chòng (1 khi thuộc cách tạo bộ mã)
B./ Của bạn sẽ có rất nhiều Control trên Form; Nên í tưởng tạo 2 Pages là hay hơn do đỡ sai sót ngớ ngẫn.
Còn chuyện nữa là: Các trường [Cha], [Mẹ], [Mối QH] ta có thể tách riêng thành Table hay trang tính riêng; Chuyện này sẽ cải thiện tốc độ khi xử lý trang tính dữ liệu chính; & có khi đảm bảo sự tồn vong của CSDL của chúng ta.
(Nhưng chuyện này có thể để sau & fải chấp nhận với mã HS mình đề xuất mới tiếp tục)
Rất vui nếu được trao đổi tiếp cùng bạn;
À mà hỏi thêm: Trường bạn có 157 em HS hay hơn 245 em vậy?
Cảm ơn thật nhiều.Bước đầu chỉ là vầy; Bạn thao tác thử
Form bạn giúp đã đúng với ý mình.Bước đầu chỉ là vầy; Bạn thao tác thử
Xin cảm ơn bạn đã nhiệt tình giúp mình.File này sắp hoàn chỉnh rồi đây:
File này đã giảm gần nữa các Control rồi đây; Thao tác thử xem & chúc vui!
Còn chuyện tách ra làm 2 bảng (Table) còn tùy thuộc vô công dụng, như sẽ là vầy để bạn mường tượng:
Bảng thứ 2 gồm các trường (cột):
[Mã HS], [Họ & Tên], [Mối QH]
Bảng thứ nhất gồm tất cả các trường, trừ 2 trường cuối của bảng thứ nhì.
Hai bảng này liên hệ với nhau thông qua 2 cột [Mã HS] của mỗi bảng.
Trường [Họ & Tên] của bảng 2 là họ tên cha hay mẹ hoặc chủ hộ,. . . (Là toàn bộ f ụ huynh cần ghi trong hồ sơ HS)
Như vậy, ứng với 1 dòng của bàng 1, ta sẽ có từ 1 đến 3 dòng ở bảng 2
& chuyện còn lại là bạn suy ngẫm xem có lợi cho bạn khi vận hành CSDL hay không.
[Mình sẽ tháo file bài trên sau 6 giờ]
Bài viết của bạn hay quá!File này đã giảm gần nữa các Control rồi đây; Thao tác thử xem & chúc vui!
Còn chuyện tách ra làm 2 bảng (Table) còn tùy thuộc vô công dụng, như sẽ là vầy để bạn mường tượng:
Bảng thứ 2 gồm các trường (cột):
[Mã HS], [Họ & Tên], [Mối QH]
Bảng thứ nhất gồm tất cả các trường, trừ 2 trường cuối của bảng thứ nhì.
Hai bảng này liên hệ với nhau thông qua 2 cột [Mã HS] của mỗi bảng.
Trường [Họ & Tên] của bảng 2 là họ tên cha hay mẹ hoặc chủ hộ,. . . (Là toàn bộ f ụ huynh cần ghi trong hồ sơ HS)
Như vậy, ứng với 1 dòng của bàng 1, ta sẽ có từ 1 đến 3 dòng ở bảng 2
& chuyện còn lại là bạn suy ngẫm xem có lợi cho bạn khi vận hành CSDL hay không.
[Mình sẽ tháo file bài trên sau 6 giờ]
Bạn thử kiểu này xem . Mình mới làm phần sản xuất phần tiếp bạn vọc nhé (Tôi có sắp xếp lại Form và phần lưu trữ dữ liệu cho dễ goi)Bài viết của bạn hay quá!
Mình cũng đang đau đầu, chưa biết phải làm sao để viết đuợc code cho: tìm kiếm để chỉnh sửa và lưu lại. File mình đơn giản thôi.
Mong bạn giúp mình chia sẻ code để hoàn thiện file quản lý này.
Cám ơn bạn rất nhiều!!!
Bạn thêm if vào thôi. Ví dụ:Trong Form của bài #18 mình có bổ sung thêm textbox Ngày vào lớp ( với định dạng ngày tháng ). Mình nhập mới hoặc sửa bổ sung nếu không nhập ngày tháng vào textbox này thì bị báo lỗi khi cập nhật dữ liệu. Vậy có thể chỉnh trong code thế nào để không báo lỗi ( nếu không nhập ngày tháng vào textbob này ).
NHờ các anh chị chỉ giúp.
Xin cảm ơn.
Cảm ơn bạn đã giúp.Bạn thêm if vào thôi. Ví dụ:
if tbNgVao.Text <>"" then .Cells(lRs, "G").Value = CDate(Me!tbNgVao.Text)
Function TxtToDate(StrC As String) As Date
Dim VTr As Integer, Nm As Integer, Th As Byte, Ng As Byte
Const FC As String = "/"
If Len(StrC) < 7 Or Len(StrC) > 10 Then
MsgBox "Nhâp Ngày Không Chính Xác!", , "GPE.COM Xin Chào!"
Else
1 Nm = CInt(Right(StrC, 4)): VTr = InStr(StrC, FC)
If VTr Then
2 Ng = CByte(Left(StrC, VTr - 1)): StrC = Mid(StrC, VTr + 1, 3)
3 VTr = InStr(StrC, FC): Th = CByte(Left(StrC, VTr - 1))
TxtToDate = DateSerial(Nm, Th, Ng)
End If
End If
End Function
Cells(lRs, "E").Value = Me!tbTHS.Text: Cells(lRs, "F").Value = TxtToDate(Me!tbNS.Text)
If Me!tbNgVao.Text <> "" Then 'Thêm Mói '
Cells(lRs, "G").Value = TxtToDate(Me!tbNgVao.Text): Me!tbNgVao.Text = ""
End If 'Thêm Mói '
Me!tbTHS.Text = "": tbNS.Text = Space(0)
Xin Cảm ơn SA_DQ thật nhiều trong giúp đỡ Form và giải thích code.Bạn nên dựa vô hàm người dùng này mà nhập [Ngày Vô Lớp] cho thích hợp:
Hàm này đang được dùng để nhập ngày sinh tháng đẻ của HS (học sinh)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 = "/" If Len(StrC) < 7 Or Len(StrC) > 10 Then MsgBox "Nhâp Ngày Không Chính Xác!", , "GPE.COM Xin Chào!" Else 1 Nm = CInt(Right(StrC, 4)): VTr = InStr(StrC, FC) If VTr Then 2 Ng = CByte(Left(StrC, VTr - 1)): StrC = Mid(StrC, VTr + 1, 3) 3 VTr = InStr(StrC, FC): Th = CByte(Left(StrC, VTr - 1)) TxtToDate = DateSerial(Nm, Th, Ng) End If End If End Function
Hàm này sẽ chuyển chuỗi nhập vô TextBox tbNS (được khuyến cáo fải nhập chuỗi "DD/MM/yyyy") sang số liệu ngày tại cột [F:F] của CSDL của bạn.
Trên trang CSDL cột [F:F] này đang thể hiện (định dạng) là DD/MM/yyyy
[Nói thêm: Bạn có thể định dạng cột [F:F] này khác đi cũng không ảnh hưởng đến hòa bình thế giới.
Có nghĩa là lúc nào đó bạn muốn cột này thể hiện chỉ là MM/DD không thôi, chúng nó sẽ chìu bạn ngay tấp lự!]
Nói thể để thấy rằng hàm tự tạo trên sẽ chuyễn chuỗi nhập theo qui ước 'DD/MM/yyyy' sang số liệu ngày-tháng-năm
Nên để thống nhất trong nhập liệu vô 2 cột [F:G], ta nên nhập vô TextBox mới thêm của bạn là 'DD/MM/yyyy' hay để trống
Trong macro 'Lưu Nhập Mới' ta cần thêm 3 dòng lệnh sau:
PHP:Cells(lRs, "E").Value = Me!tbTHS.Text: Cells(lRs, "F").Value = TxtToDate(Me!tbNS.Text) If Me!tbNgVao.Text <> "" Then 'Thêm Mói ' Cells(lRs, "G").Value = TxtToDate(Me!tbNgVao.Text): Me!tbNgVao.Text = "" End If 'Thêm Mói ' Me!tbTHS.Text = "": tbNS.Text = Space(0)
Tương tự như vậy, bạn thử với nút lệnh còn lại trước xem sao & chúc thành công!
Giải thích thêm về 3 dòng lệnh mới này:
D1: Nếu trong TextBox có tên tbNgVao khác rỗng thì thực hiện dòng lệnh kế tiếp
D2:
Mệnh đề trước: Ô thuộc dòng có trị chứa trong tham biến lRs thuộc cột "G" được nhập trị (ngày-tháng-năm) từ hàm TxtToDate với đối số được cung cấp từ TextBox có tên 'tbNgVao'
Mệnh đề sau: Ấn định TextBox 'tbNgVao' chứa chuỗi rỗng
D3: (Miễn bàn)
Còn chuyện bạn muốn trên cột [G] của CSDL của bạn thể hiện chỉ là 'DD/MM' hay chỉ là 'MM/DD' là chuyện của bạn hoàn toàn tự quyết.
Chúc vui!
Tại sheet2 thêm các dòng code sau, phần msgbox bạn có thể thay đổi theo mục đích của mìnhXin chào các bạn
Tôi đang tìm hiểu vba trong excel và đã sử dụng code trên diễn đàn cho file gửi kèm , nhưng gặp phải vấn đề không tìm kiếm được dữ liệu trong textbox và listbox tại ô E2 của sheet 2.Nhờ các bạn giúp đỡ, xin cảm ơn.
Private Sub ListBox1_Click()
MsgBox (ListBox1.Text)
End Sub
Private Sub TextBox1_Change()
loc
End Sub
Tại sheet2 thêm các dòng code sau, phần msgbox bạn có thể thay đổi theo mục đích của mình
Mã:Private Sub ListBox1_Click() MsgBox (ListBox1.Text) End Sub Private Sub TextBox1_Change() loc End Sub