XIN GIÚP TẠO USERFORM NHẬP DỮ LIỆU

Liên hệ QC

tommybull

Thành viên hoạt động
Tham gia
21/7/08
Bài viết
191
Được thích
29
Giới tính
Nam
Kính chào anh chị trên diễn đàn,
Nay em lại có một File nhờ anh chị giúp ạ
Nhờ anh chị viết Code UserForm nhập liệu như sau giúp em!
1. Nhập dữ liệu theo thứ tự ưu tiên như sau: "Mã_NV" hoặc "Họ Tên" - "Ngày" - "Tăng ca thường" - "Tăng ca chủ nhật" - "Loại phép" - "Tăng ca đêm" - Tăng ca đêm chủ nhật" - "Tăng ca ngày lễ" - "Tăng ca đêm ngày lễ"
2. Tại "Mã N_V" khi nhập mã số nhân viên vào thì sẽ thực hiện lệnh tìm kiếm và Ô "Họ Tên" sẽ hiển thị đúng tên Nhân viên trong Sheet "Chamcong" hoặc ngược lại.
3. Tại "Ngày" chỉ nhập với định dạng là "DD" không cần nhập tháng và năm, căn cứ ngày tháng hiện tại được đặt ở Sheet "Chamcong"
4. Các ô ghi giờ tăng ca, chỉ nhập số giờ thực tế, sau đó căn cứ vào ô "Ngày" và "Mã_NV" hoặc "Họ Tên" trên UserForm và sau khi Click vào nút lệnh "Nhập-Enter" dữ liệu sẽ ghi vào đúng ngày trong tháng đó và đúng theo tên của nhân viên đó trên Sheet "ChamCong"
5. Ô "Loại phép" gồm có các ký tự như "P" "C" "S" "B" "T" "M" "V" "K" Tại Sheet "Chamcong" sau khi UpdateList" thì các ô từ ngày 1 đến ngày 31 đã mặc định dấu "X" (dấu đi làm) đánh sẵn (Phần UpdateList" em đã nhờ các anh chị trên diễn đàn làm OK rồi ạ), em muốn sau khi nhập vào ô "Loại phép" ở UserForm ví dụ "P8"(Nghỉ phép năm 8 tiếng) hoặc "V4" (Nghỉ việc riêng 4 tiếng) và ô "Ngày" đã nhập số ngày "DD" của tháng đó sau đó nhấn nút lệnh "Nhập_Enter" thì sẽ được ghi vào ô tương ứng của ngày đó và đúng vào dòng tương ứng của nhân viên đó trong Sheet "ChamCong" (Ví dụ tại ô "L6" và "AG6" với dạng là "X;P8 và "X;V4")
*** Em mới chỉ tạo được mẫu USerForm và nút lệnh "Mở Form dữ liệu" theo yêu cầu sử dụng của em, còn lại phần Code, em nhờ các anh chị trên diễn đàn làm giúp ạ. Em không biết diễn tả sao cho xúc tích cụ thể và ngắn gọn, anh chị thông cảm và nhiệt tình giúp đỡ với ạ!

Trân trọng và mong sớm nhận được sự giúp đỡ của mọi người
 

File đính kèm

  • UserForm cham cong.rar
    296.7 KB · Đọc: 14
Bạn tham khảo macro cho câu (1)
1. Nhập dữ liệu theo thứ tự ưu tiên như sau: "Mã_NV" hoặc "Họ Tên" - "Ngày" - "Tăng ca thường" - "Tăng ca chủ nhật" - "Loại phép" - "Tăng ca đêm" - Tăng ca đêm chủ nhật" - "Tăng ca ngày lễ" - "Tăng ca đêm ngày lễ"
PHP:
Private Sub btnInsert_Click()
 Dim Rng As Range, sRng As Range
 Dim Cot As Byte, Dg As Integer

 Set Rng = Range([B5], [B9999].End(xlUp))
 Set sRng = Rng.Find(Me!txtCode.Text, , xlFormulas, xlWhole)
 If sRng Is Nothing Then
    MsgBox "Nothing"
 Else
    Cot = Me!txtDate.Value:                     Dg = sRng.Row
    With Cells(Dg, Cot)
        .Value = Me!txtPhep.Text:               Me!txtPhep.Text = ""
        .Offset(1).Value = Me!txtTct.Value:     Me!txtTct.Value = 0
        .Offset(2).Value = Me!txtTcd.Value:     Me!txtTcd.Value = 0
        .Offset(3).Value = Me!txtTcCN.Value:    Me!txtTcCN.Value = 0
        .Offset(4).Value = Me!txtDCn.Value:     Me!txtDCn.Value = 0
        .Offset(5).Value = Me!txtTcNL.Value:    Me!txtTcNL.Value = 0
        .Offset(6).Value = Me!txtDNl.Value:     Me!txtTcNL.Value = 0
    End With
    MsgBox "Nhâp Xong Ròi!"
 End If
End Sub
 
Upvote 0
Bạn tham khảo macro cho câu (1)

PHP:
Private Sub btnInsert_Click()
 Dim Rng As Range, sRng As Range
 Dim Cot As Byte, Dg As Integer

 Set Rng = Range([B5], [B9999].End(xlUp))
 Set sRng = Rng.Find(Me!txtCode.Text, , xlFormulas, xlWhole)
 If sRng Is Nothing Then
    MsgBox "Nothing"
 Else
    Cot = Me!txtDate.Value:                     Dg = sRng.Row
    With Cells(Dg, Cot)
        .Value = Me!txtPhep.Text:               Me!txtPhep.Text = ""
        .Offset(1).Value = Me!txtTct.Value:     Me!txtTct.Value = 0
        .Offset(2).Value = Me!txtTcd.Value:     Me!txtTcd.Value = 0
        .Offset(3).Value = Me!txtTcCN.Value:    Me!txtTcCN.Value = 0
        .Offset(4).Value = Me!txtDCn.Value:     Me!txtDCn.Value = 0
        .Offset(5).Value = Me!txtTcNL.Value:    Me!txtTcNL.Value = 0
        .Offset(6).Value = Me!txtDNl.Value:     Me!txtTcNL.Value = 0
    End With
    MsgBox "Nhâp Xong Ròi!"
 End If
End Sub
Em thử rồi mà chưa được anh à!
Sau khi cho chạy thử, thì các Cell từ "C6:C12' bị xóa trắng, nghĩa là tên và các nội dung tăng ca của nhân viên đó bị xóa hết
Ngoài ra, các ngày tăng ca khác, em nhập nhưng đều không chạy đúng ý ạ
Anh xem lại giúp em với, đồng thời các phần còn lại nhờ anh và các anh chị khác cùng xem và làm giúp với ạ!
Cảm ơn anh chị
 
Upvote 0
Đúng là còn sai địa chỉ;
Bạn sửa lại vầy & xin lỗi bạn về chuyện này:
PHP:
Cot = 5 + Me!txtDate.Value
 
Upvote 0
Tiếp tục bạn xài các macro sau:
Mã:
Private Sub btnCancel_Click()
 UserForm1.Hide
End Sub
PHP:
Private Sub txtName_Exit(ByVal Cancel As MSForms.ReturnBoolean)
 GPE_COM 1
End Sub
PHP:
Private Sub txtCode_Exit(ByVal Cancel As MSForms.ReturnBoolean)
 GPE_COM
End Sub
Mã:
Sub GPE_COM(Optional Col As Integer = 0)
 Dim Sh As Worksheet, Rng As Range, sRng As Range
 Dim Rws As Long
 Dim STim As String
 Set Sh = ThisWorkbook.Worksheets("DanhSach_NV")
 Rws = Sh.[B7].CurrentRegion.Rows.Count
 Set Rng = Sh.[B7].Resize(Rws).Offset(, Col)
 If Col Then
    STim = Me!txtName.Text
 Else
    STim = Me!txtCode.Text
 End If
 Set sRng = Rng.Find(STim, , xlFormulas, xlWhole)
 If sRng Is Nothing Then
    MsgBox "Nothing!"
 Else
    If Col Then
        Me!txtCode.Text = sRng.Offset(, -1)
    Else
        Me!txtName.Text = sRng.Offset(, 1).Value
    End If
 End If
End Sub

Cách xài: Nhập các chuỗi vô 1 trong 2 TextBox & nhấn fím {Tab}
 
Upvote 0
Tiếp tục bạn xài các macro sau:
Mã:
Private Sub btnCancel_Click()
 UserForm1.Hide
End Sub
PHP:
Private Sub txtName_Exit(ByVal Cancel As MSForms.ReturnBoolean)
 GPE_COM 1
End Sub
PHP:
Private Sub txtCode_Exit(ByVal Cancel As MSForms.ReturnBoolean)
 GPE_COM
End Sub
Mã:
Sub GPE_COM(Optional Col As Integer = 0)
 Dim Sh As Worksheet, Rng As Range, sRng As Range
 Dim Rws As Long
 Dim STim As String
 Set Sh = ThisWorkbook.Worksheets("DanhSach_NV")
 Rws = Sh.[B7].CurrentRegion.Rows.Count
 Set Rng = Sh.[B7].Resize(Rws).Offset(, Col)
 If Col Then
    STim = Me!txtName.Text
 Else
    STim = Me!txtCode.Text
 End If
 Set sRng = Rng.Find(STim, , xlFormulas, xlWhole)
 If sRng Is Nothing Then
    MsgBox "Nothing!"
 Else
    If Col Then
        Me!txtCode.Text = sRng.Offset(, -1)
    Else
        Me!txtName.Text = sRng.Offset(, 1).Value
    End If
 End If
End Sub

Cách xài: Nhập các chuỗi vô 1 trong 2 TextBox & nhấn fím {Tab}
Xin lỗi anh, em đọc phần "Nhập các chuỗi vô 1 trong 2 TextBox & nhấn fím {Tab}" chưa hiểu ạ!
và sau khi cho chạy các các code thì báo lỗi như hình đính kèm ạ
Anh xem lại và hướng dẫn cụ thể giúp em với ạ
Cảm ơn anh!
 

File đính kèm

  • LỖI1.png
    LỖI1.png
    266.5 KB · Đọc: 9
Upvote 0
Có fải chạy macro nào đâu kia chứ!
Bạn thực hiện như điều bạn iêu cầu nè:
2. Tại "Mã N_V" khi nhập mã số nhân viên vào thì sẽ thực hiện lệnh tìm kiếm và Ô "Họ Tên" sẽ hiển thị đúng tên Nhân viên trong Sheet "Chamcong" hoặc ngược lại.
Nhập xong chuỗi thích hợp vô 1 trong 2 TextBox đó & bấm fím {Tab} thay vì {ENTER}
mà.
 
Upvote 0
Có fải chạy macro nào đâu kia chứ!
Bạn thực hiện như điều bạn iêu cầu nè:

Nhập xong chuỗi thích hợp vô 1 trong 2 TextBox đó & bấm fím {Tab} thay vì {ENTER}
mà.
Chào anh, em làm được rồi, nhưng khi em nhập dữ liệu và cho nhập vào bảng chấm công, thì Cell "Ngày đi làm (Đánh dấu "X") bị xóa mất dấu "X" như Cell "F6", hoặc khi em chấm nghỉ thì dấu X cũng bị xóa và chỉ còn ký hiệu "V4" (như "G6"), em muốn khi chấm phép và nhập liệu xong thì vẫn còn các ký "X;V4" như ví dụ tại "L6" (Nghĩa là dấu "X" không bị xóa, tiếp đến là dấu ";" rồi đến ký hiệu nghỉ phép ạ)
Anh xem lại giúp em với ạ!

Cảm ơn anh!
 

File đính kèm

  • LOI2.png
    LOI2.png
    246.4 KB · Đọc: 12
Upvote 0
Thứ nhất: Dấu 'X' đánh cho cả tháng là không thực tế;
Nếu bạn thuyết minh rằng như vậy là thực tế nơi cơ quan bạn, thì sẽ có cách thôi.

Nhưng hiện giờ (ở macro đầu) để đạt những gì ở hàng đầu tiên của 1 nhân viên thì nhập hết vô TextBox 'Nghỉ fép' tạm đi.
 
Upvote 0
Thứ nhất: Dấu 'X' đánh cho cả tháng là không thực tế;
Nếu bạn thuyết minh rằng như vậy là thực tế nơi cơ quan bạn, thì sẽ có cách thôi.

Nhưng hiện giờ (ở macro đầu) để đạt những gì ở hàng đầu tiên của 1 nhân viên thì nhập hết vô TextBox 'Nghỉ fép' tạm đi.
Dạ, vì nguyên tắc chấm công của em là: sau khi "UpdateList" sẽ tự động chấm công cho cả tháng cho từng nhân viên, em chọn chỉ chấm tăng ca và nghỉ phép vì tỉ lệ tăng ca và nghỉ phép sẽ ít hơn tỉ lệ người lao động đi làm (tiết kiệm thời gian khi chấm công), thứ Code UpdateList em cũng nhờ các anh chị trên GPE làm giúp, nên đã mặc định như vậy rồi ạ!
Nói chung là anh cố gắng giúp em giữ nguyên nguyên tắc chấm công của em và giúp em giữ lại ký hiệu "X" bằng phương pháp của anh để không ảnh hưởng đến Code UpdateList ạ!
Chân thành cảm ơn anh!
 
Upvote 0
Vậy thì sửa lại câu lệnh của #2
Mã:
       .Value = Me!txtPhep.Text:
thành:
PHP:
       .Value = .Value & "; " &  Me!txtPhep.Text:
 
Upvote 0
Vậy thì sửa lại câu lệnh của #2
Mã:
       .Value = Me!txtPhep.Text:
thành:
PHP:
       .Value = .Value & "; " &  Me!txtPhep.Text:
Anh có cách nào mà nếu khi chỉ chấm tăng ca mà nhân viên đó không nghỉ phép, thì dòng đầu tiên của nhân viên đó chỉ hiển thị "X" mà không phải "X;" không
Chỉ khi nhân viên đó nghỉ phép thì mới xuất hiện "X;loạiphép" (về phần sửa lại câu lệnh đã chạy đúng, lệnh tính công chạy chính xác, em muốn nhân viên khi không nghỉ phép thì Cell chứa dấu "X" không xuất hiện thêm ";" anh giúp với ạ!
Trân trọng
 
Upvote 0
Thì thêm điều kiện cho dòng lệnh vừa sửa đó, như:

If Me!txtPhep.Text<>"" then .Value = .Value & "; " & Me!txtPhep.Text

Bạn thử xem sao?
 
Upvote 0
Úp lại file đi bạn
 
Upvote 0
Web KT
Back
Top Bottom