Làm thế nào để tìm thông tin bằng combobox thay vì dùng thanh navil??? (1 người xem)

Người dùng đang xem chủ đề này

rivulet

Hope...
Tham gia
19/2/13
Bài viết
235
Được thích
717
Nghề nghiệp
Tuyển dụng và đào tạo
Em đang loay hoay để làm một form nhập liệu thông tin nhân viên.
Em đã tham khảo ở một số bài viết của các anh, chị trong GPE mình và chỉnh sửa lại cho phù hợp với thông tin em cần.
Tuy nhiên, do lụm lặt, chắp vá code nên giờ em không biết nên đăng ở topic nào nên em mở một topic mới luôn ạ.
Trong file đính kèm,
1. em muốn tìm nhân viên bằng combobox thay vì nhấn nút tới, lui hoặc kéo thanh trượt. Combobox của em nó "điếc" luôn rồi :(
2. khi nhấn mũi tên để chọn trong combobox sẽ hiển thị 2 cột: Mã nhân viên, và tên nhân viên; chọn xong thì trong thông tin của combobox chỉ hiện lại mã nhân viên thôi.
3. khi nhập mới thì combobox tự động cập nhật thông tin vừa ghi.

Thông tin cần nhập rất nhiều cột nên em đã cắt bớt để khỏi rối mắt rồi ạ.

Xin cảm ơn
 

File đính kèm

Em đang loay hoay để làm một form nhập liệu thông tin nhân viên.
Em đã tham khảo ở một số bài viết của các anh, chị trong GPE mình và chỉnh sửa lại cho phù hợp với thông tin em cần.
Tuy nhiên, do lụm lặt, chắp vá code nên giờ em không biết nên đăng ở topic nào nên em mở một topic mới luôn ạ.
Trong file đính kèm,
1. em muốn tìm nhân viên bằng combobox thay vì nhấn nút tới, lui hoặc kéo thanh trượt. Combobox của em nó "điếc" luôn rồi :(
2. khi nhấn mũi tên để chọn trong combobox sẽ hiển thị 2 cột: Mã nhân viên, và tên nhân viên; chọn xong thì trong thông tin của combobox chỉ hiện lại mã nhân viên thôi.
3. khi nhập mới thì combobox tự động cập nhật thông tin vừa ghi.

Thông tin cần nhập rất nhiều cột nên em đã cắt bớt để khỏi rối mắt rồi ạ.

Xin cảm ơn
Trong code Private Sub UserForm_Initialize() bạn bổ sung câu lệnh
[GPECODE=vb].Ma.List() = HS.Range("B5:F" & HS.[b65500].End(3).Row).Value[/GPECODE]Kích chọn Combobox "Ma", nhấn F4. Tại ColumnCount, nhập số 2 và tại ColumnWidths bạn nhập 50 v.v. nói chung bạn cứ thử
Code của Combobox "Ma" là
[GPECODE=vb]Private Sub Ma_Change()
If Ma = "" Then Exit Sub
With Me.Ma
Me.txtEIN.Text = .List(.ListIndex, 0)
Me.txtName.Text = .List(.ListIndex, 1)
Me.txtcontractdate.Text = .List(.ListIndex, 2)
Me.txtcontractexp.Text = .List(.ListIndex, 3)
End With
End Sub[/GPECODE]
 
Lần chỉnh sửa cuối:
Upvote 0
Em đang loay hoay để làm một form nhập liệu thông tin nhân viên.
Em đã tham khảo ở một số bài viết của các anh, chị trong GPE mình và chỉnh sửa lại cho phù hợp với thông tin em cần.
Tuy nhiên, do lụm lặt, chắp vá code nên giờ em không biết nên đăng ở topic nào nên em mở một topic mới luôn ạ.
Trong file đính kèm,
1. em muốn tìm nhân viên bằng combobox thay vì nhấn nút tới, lui hoặc kéo thanh trượt. Combobox của em nó "điếc" luôn rồi :(
2. khi nhấn mũi tên để chọn trong combobox sẽ hiển thị 2 cột: Mã nhân viên, và tên nhân viên; chọn xong thì trong thông tin của combobox chỉ hiện lại mã nhân viên thôi.
3. khi nhập mới thì combobox tự động cập nhật thông tin vừa ghi.

Thông tin cần nhập rất nhiều cột nên em đã cắt bớt để khỏi rối mắt rồi ạ.

Xin cảm ơn
Với CSDL trên cái file này, để cho dễ theo dõi việc nhập cũng như việc chỉnh sửa hoặc xóa các mục đã nhập, anh làm cho em 1 cái UserForm như sau:

attachment.php



Với ô Mã số NV, khi nhập vô nếu MS đã tồn tại sẽ thông báo:

Mã:
Private Sub txtEIN_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
    ''Kiem tra su ton tai cua Ma so:
    With txtEIN
        .Text = Trim(.Text)
        If .Text = "" Or (IsEdit And MaSo = .Text) Then Exit Sub
        Dim r As Long
        r = HS.Range("B" & Rows.Count).End(xlUp).Row
        If Not HS.Range("B4:B" & r).Find(What:=.Text, LookIn:=xlFormulas, LookAt:=xlWhole) Is Nothing Then
            Cancel = True
            MsgBox "Ma so nay da ton tai trong danh sach!"
            .SetFocus
            .SelStart = 0
            .SelLength = Len(.Text)
        End If
    End With
End Sub

Khi em double click vào mục nào đó trong ListBox thì sẽ có một thông báo để em chọn chỉnh sửa hay xóa. Code như sau:

Mã:
Private Sub lbxData_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    With lbxData
        If .ListCount = 0 Then Exit Sub
        Dim Msg As Long
        Msg = MsgBox("Ban se lam gi voi nhan vien ma ban dang chon?" & vbLf & _
                  "- Neu muon chinh sua, chon Yes" & vbLf & _
                  "- Neu muon xoa, chon No" & vbLf & _
                  "- De huy thao tac nay, chon Cancel", vbQuestion + vbYesNoCancel, "Thong bao")
        If Msg = vbYes Then ''Chinh sua:
            IsEdit = True
            lstIdx = .ListIndex
            txtEIN = .Value
            txtName = .List(, 1)
            txtcontractdate = .List(, 2)
            txtcontractexp = .List(, 3)
            TxtLastWrkDate = .List(, 4)
            With txtEIN
                .SetFocus
                .SelStart = 0
                .SelLength = Len(.Text)
                MaSo = .Text
            End With
            cmdEdit.Enabled = True
            cmdNew.Enabled = False
        ElseIf Msg = vbNo Then ''Xoa:
            If MsgBox("Ban co chac xoa muc nay hay khong?", vbQuestion + vbYesNo, "Thong bao") = vbYes Then
                IsUpdate = True
                Dim r As Long
                r = HS.Range("B" & Rows.Count).End(xlUp).Row
                HS.Range("B4:B" & r).Find(What:=.Value, LookIn:=xlFormulas, LookAt:=xlWhole) _
                .Offset(, -1).Resize(, 6).Delete 2
                .RemoveItem .ListIndex
            End If
        End If
    End With
End Sub

Khi nhập mới hoặc nhập chỉnh sửa, đều dùng chung một thủ tục:

Mã:
Private Sub DataUpdate()
    If txtEIN = "" Then
        MsgBox "Ban phai nhap Ma Nhan vien!"
        txtEIN.SetFocus
        Exit Sub
    ElseIf Trim(txtName) = "" Then
        MsgBox "Ban phai nhap Ho va ten!"
        txtName.SetFocus
        Exit Sub
    ElseIf Trim(txtcontractdate) = "" Then
        MsgBox "Ban phai nhap Ngay ky HD!"
        txtcontractdate.SetFocus
        Exit Sub
    ElseIf Trim(txtcontractexp) = "" Then
        MsgBox "Ban phai nhap Ngay het han HD!"
        txtcontractexp.SetFocus
        Exit Sub
    ElseIf Trim(TxtLastWrkDate) = "" Then
        MsgBox "Ban phai nhap Ngay ket thuc HD!"
        TxtLastWrkDate.SetFocus
        Exit Sub
    End If
    IsUpdate = True
    Dim r As Long
    r = HS.Range("B" & Rows.Count).End(xlUp).Row + 1
    If IsEdit Then
        IsEdit = False
        cmdEdit.Enabled = False
        cmdNew.Enabled = True
        If MsgBox("Ban co chac nhap lai nhung chinh sua nay hay khong?", _
            vbQuestion + vbYesNo, "Thong bao") = vbNo Then
            GoTo NextStep
        End If
        r = HS.Range("B4:B" & r).Find(What:=MaSo, LookIn:=xlFormulas, LookAt:=xlWhole).Row
    Else
        lstIdx = 0
    End If
    Dim ArrData(4)
    ArrData(0) = txtEIN
    ArrData(1) = Trim(txtName)
    ArrData(2) = CDate(txtcontractdate)
    ArrData(3) = CDate(txtcontractexp)
    ArrData(4) = CDate(TxtLastWrkDate)
    HS.Range("B" & r & ":F" & r) = ArrData
    With lbxData
        .AddItem ArrData(0), lstIdx
        For r = 1 To 4
            .List(lstIdx, r) = ArrData(r)
        Next
        .ListIndex = lstIdx
    End With
NextStep:
    txtEIN = ""
    txtName = ""
    txtcontractdate = ""
    txtcontractexp = ""
    TxtLastWrkDate = ""
    txtEIN.SetFocus
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
@ anh viethoai: dạ cảm ơn anh, em sẽ thử cách này xem sao
@ anh Nghĩa đập chai: cảm ơn anh nhiều nghen /-*+/. File anh tạo rất là tiện trong việc chỉnh sửa và nhập liệu, tuy nhiên, cái form anh tạo cho em mất mất phần tìm nhân viên rồi. Vậy thay vì tìm bằng nút thì em sẽ tìm bằng filter heng ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
Upvote 0
@ anh viethoai: dạ cảm ơn anh, em sẽ thử cách này xem sao
@ anh Nghĩa đập chai: cảm ơn anh nhiều nghen /-*+/. File anh tạo rất là tiện trong việc chỉnh sửa và nhập liệu, tuy nhiên, cái form anh tạo cho em mất mất phần tìm nhân viên rồi. Vậy thay vì tìm bằng nút thì em sẽ tìm bằng filter heng ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Cho hỏi khi tìm nhân viên thì chọn ngay cái tên nào đó trong một ComboBox, rồi nó tìm trong sheet hả?
 
Upvote 0
À, em hiểu rồi, form anh làm lúc chỉnh sửa thì nó sửa luôn trong sheet nhưng trong phần thông tin trên form cập nhật chưa kịp. Phải thoát ra nó mới cập nhật. Tóm lại là hoàn thiện rồi ạ, còn thêm phần tìm bằng combo nữa là xong
 

File đính kèm

  • 1122.jpg
    1122.jpg
    23.1 KB · Đọc: 7
  • 1133.jpg
    1133.jpg
    25 KB · Đọc: 7
Lần chỉnh sửa cuối:
Upvote 0
À, em hiểu rồi, form anh làm lúc chỉnh sửa thì nó sửa luôn trong sheet nhưng trong phần thông tin trên form cập nhật chưa kịp. Phải thoát ra nó mới cập nhật. Tóm lại là hoàn thiện rồi ạ, còn thêm phần tìm bằng combo nữa là xong
Em coi lại xem, file anh cái nút NHAP LIEU viet HOA chứ đâu viết thường đâu?

Còn khi thêm vào, để thuận tiện theo dõi cho người nhập, nó luôn luôn ở hàng đầu tiên sau khi nhập liệu.
 
Upvote 0
Dạ đúng rồi anh ơi, em tét trên form của anh mà.
Trong sheet đã cập nhật nhưng trên form thì thêm mới. Ngac nhiên là em nhấn nút thoát thì nó mới cập nhật trên cả 2.

1144.jpg
 
Upvote 0
Dạ đúng rồi anh ơi, em tét trên form của anh mà.
Trong sheet đã cập nhật nhưng trên form thì thêm mới. Ngac nhiên là em nhấn nút thoát thì nó mới cập nhật trên cả 2.

View attachment 132448

Cái đó là do câu lệnh Application.ScreenUpdating = False nó ngăn không cho cập nhật nhằm lúc nhập vào thôi. Để file sau sẽ làm luôn vấn đề này.
 
Lần chỉnh sửa cuối:
Upvote 0
Dạ cảm ơn anh nhiều, giờ em tự bơi xem sao, hy vọng sẽ làm được file tốt tốt đưa anh chấm điểm /-*+//-*+//-*+/
 
Upvote 0
Dạ cảm ơn anh nhiều, giờ em tự bơi xem sao, hy vọng sẽ làm được file tốt tốt đưa anh chấm điểm /-* //-* //-* /

Anh thêm một nút lệnh để em tìm kiếm, chỉ cần chọn một mục trong listbox rồi bấm nút là OK, cái form nó tự thu mình vào một góc. Khi muốn nó trở lại dáng vẻ mỹ miều ban đầu thì cứ click vào nó.

Mã:
Private Sub cmdFind_Click()
    On Error Resume Next
    Dim r As Long, rng As Range
    r = HS.Range(
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Anh thêm một nút lệnh để em tìm kiếm, chỉ cần chọn một mục trong listbox rồi bấm nút là OK, cái form nó tự thu mình vào một góc. Khi muốn nó trở lại dáng vẻ mỹ miều ban đầu thì cứ click vào nó.

Mã:
Private Sub cmdFind_Click()
    On Error Resume Next
    Dim r As Long, rng As Range
    r = HS.Range("B" & Rows.Count).End(xlUp).Row
    Set rng = HS.Range("B4:B" & r).Find(What:=lbxData.Value, _
                 LookIn:=xlFormulas, LookAt:=xlWhole)
    If Not rng Is Nothing Then
        Me.Height = 63
        Me.Top = 0
        Me.Left = 0
        rng.Offset(, -1).Resize(, 6).Select
    End If
End Sub

Dạ, em chạy thấy ổn rồi anh. Em áp vào file chính để làm đây ạ.
Cảm ơn anh Nghĩa lần nữa nghen ^^
P/S: Tùng xèng nó có ý định gầy độ kìa anh, có tin gì ới em với nghen, lâu quá trời lâu rồi ko hẹn hò gì với ai. Nhớ!
 
Upvote 0
AnhHoàng Trọng Nghĩa xem dùm khi xóa hết nhân viên và tiến hành tạo nhân viên mới sẽ bị lỗi ở đoạn mã
Private Sub UserForm_Terminate()
If IsUpdate Then
''Tao day so thu tu:
Dim r As Long
With HS
r = .Range("B" & Rows.Count).End(xlUp).Row
.Range("A5") = "1"
.Range("A6") = "2"
.Range("A5:A6").AutoFill Destination:=.Range("A5:A" & r), Type:=xlFillDefault (Đoạn mã bị lỗi)
End With
End If
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
Anh cho em hỏi luôn em đã thêm được dữ liệu vào DSHS nhưng chưa biết cho hiện dữ liệu đó vào listBox trong Form nhập liệu
 
Lần chỉnh sửa cuối:
Upvote 0

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

Back
Top Bottom