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
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 ạ!

Anh Hoang2013 cũng đã nhiệt tình giúp đỡ (Như các bài trên ạ) nhưng vẫn còn bị hiện tượng sau khi chấm phép và tăng ca , cho nhập liệu thì Dòng đầu tiên của nhân viên (Dòng đánh chứ "X" dấu hiển thị có đi làm lại bị tăng thêm ";" thành "X;"
Anh xem giúp ạ
 

File đính kèm

  • UserForm cham cong.rar
    299.5 KB · Đọc: 19
Upvote 0
Code tạm bợ, chắp vá cho yêu cầu của bạn chạy được cái đã. Bạn test kỹ lại nhé.
Thay toàn bộ code trong UserForm1 cũ với code này:
Mã:
Option Explicit

Sub ClearAllTextBoxes()
    Dim ctrl As Control
    For Each ctrl In Me.Controls
        If TypeName(ctrl) Like "TextBox" Then
            ctrl.Text = ""
        End If
    Next
End Sub

Private Sub btnCancel_Click()
    Me.Hide
End Sub

Private Sub btnInsert_Click()
    Dim Rng As Range, sRng As Range
    Dim Cot As Integer, Dg As Integer, iDay As Integer
    Dim strOld As String

    iDay = Val(txtDate.Text)
    If (iDay <= 0) Or (iDay > 31) Then
        MsgBox "Nhap sai ngay", vbCritical Or vbOKOnly
        txtDate.SetFocus
        Exit Sub
    End If
   
    txtCode.Text = Trim$(txtCode.Text)
    If (Len(txtCode.Text) = 0) Then
        MsgBox "Lam on nhap gium em Ma NV nhen dai ca :)", vbCritical
        txtCode.SetFocus
        Exit Sub
    End If
   
    Set Rng = Range([B5], [B9999].End(xlUp))
    Set sRng = Rng.Find(txtCode.Text, , xlFormulas, xlWhole)
    If sRng Is Nothing Then
        MsgBox "Ma NV không hop le, to tim eo thay ;)", vbCritical Or vbOKOnly
        Debug.Print "Code có gì something wrong here :')"
        Debug.Assert False
        Exit Sub
    End If
       
    Cot = 5 + iDay
    Dg = sRng.Row
    With Cells(Dg, Cot)
        strOld = Trim$(.Value)
        txtPhep.Text = UCase$(Trim$(txtPhep.Text))
        If Len(txtPhep.Text) > 0 Then
            If Len(strOld) > 0 Then
                .Value = strOld & ";" & txtPhep.Text
            Else
                .Value = txtPhep.Text
            End If
        Else
            .Value = strOld     ' To rim chim may luon
        End If
       
        .Offset(1).Value = txtTct.Value
        .Offset(2).Value = txtTcd.Value
        .Offset(3).Value = txtTcCN.Value
        .Offset(4).Value = txtDCn.Value
        .Offset(5).Value = txtTcNL.Value
        .Offset(6).Value = txtDNl.Value
   
        ClearAllTextBoxes
    End With
       
    MsgBox "DA NHAP!", vbInformation Or vbOKOnly
End Sub

Private Sub txtCode_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    txtCode.Text = Trim$(txtCode.Text)
    If Len(txtCode.Text) > 0 Then Cancel = Not GPE_COM
End Sub

Private Sub txtName_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    txtName.Text = Trim$(txtName.Text)
    If Len(txtName.Text) > 0 Then Cancel = Not GPE_COM(1)
End Sub

Function GPE_COM(Optional Col As Integer = 0) As Boolean
    Dim Sh As Worksheet
    Dim Rng As Range, sRng As Range
    Dim Rws As Long
    Dim STim As String
   
    GPE_COM = False
   
    Set Sh = ThisWorkbook.Worksheets("DanhSach_NV")
    Rws = Sh.[B7].CurrentRegion.Rows.Count
    Set Rng = Sh.[B7].Resize(Rws).Offset(, Col)
   
    STim = IIf(Col = 0, txtCode.Text, txtName.Text)
   
    Set sRng = Rng.Find(STim, , xlFormulas, xlWhole)
    If sRng Is Nothing Then
        MsgBox IIf(Col = 0, "Tim khong thay Ma NV " & STim, "Tim khong thay HoTen NV " & STim), vbCritical Or vbOKOnly
        ClearAllTextBoxes
    Else
        If Col Then
            txtCode.Text = sRng.Offset(, -1).Value
        Else
            txtName.Text = sRng.Offset(, 1).Value
        End If
        GPE_COM = True
    End If
End Function
 
Lần chỉnh sửa cuối:
Upvote 0
Code tạm bợ, chắp vá cho yêu cầu của bạn chạy được cái đã. Bạn test kỹ lại nhé.
Thay toàn bộ code trong UserForm1 cũ với code này:
Mã:
Option Explicit

Sub ClearAllTextBoxes()
    Dim ctrl As Control
    For Each ctrl In Me.Controls
        If TypeName(ctrl) Like "TextBox" Then
            ctrl.Text = ""
        End If
    Next
End Sub

Private Sub btnCancel_Click()
    Me.Hide
End Sub

Private Sub btnInsert_Click()
    Dim Rng As Range, sRng As Range
    Dim Cot As Integer, Dg As Integer, iDay As Integer
    Dim strOld As String

    iDay = Val(txtDate.Text)
    If (iDay <= 0) Or (iDay > 31) Then
        MsgBox "Nhap sai ngay", vbCritical Or vbOKOnly
        Exit Sub
    End If
  
    Set Rng = Range([B5], [B9999].End(xlUp))
    Set sRng = Rng.Find(txtCode.Text, , xlFormulas, xlWhole)
    If sRng Is Nothing Then
        MsgBox "Ma NV khong hop le, to tim eo thay ;)", vbCritical Or vbOKOnly
        Exit Sub
    End If
      
    Cot = 5 + iDay
    Dg = sRng.Row
    With Cells(Dg, Cot)
        strOld = Trim$(.Value)
        txtPhep.Text = UCase$(Trim$(txtPhep.Text))
        If Len(txtPhep.Text) > 0 Then
            If Len(strOld) > 0 Then
                .Value = strOld & ";" & txtPhep.Text
            Else
                .Value = txtPhep.Text
            End If
        Else
            .Value = strOld     ' To rim chim may luon
        End If
      
        .Offset(1).Value = txtTct.Value
        .Offset(2).Value = txtTcd.Value
        .Offset(3).Value = txtTcCN.Value
        .Offset(4).Value = txtDCn.Value
        .Offset(5).Value = txtTcNL.Value
        .Offset(6).Value = txtDNl.Value
  
        ClearAllTextBoxes
    End With
      
    MsgBox "DA NHAP!", vbInformation Or vbOKOnly
End Sub

Private Sub txtCode_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    txtCode.Text = Trim$(txtCode.Text)
    If Len(txtCode.Text) > 0 Then Cancel = Not GPE_COM
End Sub

Private Sub txtName_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    txtName.Text = Trim$(txtName.Text)
    If Len(txtName.Text) > 0 Then Cancel = Not GPE_COM(1)
End Sub

Function GPE_COM(Optional Col As Integer = 0) As Boolean
    Dim Sh As Worksheet
    Dim Rng As Range, sRng As Range
    Dim Rws As Long
    Dim STim As String
  
    GPE_COM = False
  
    Set Sh = ThisWorkbook.Worksheets("DanhSach_NV")
    Rws = Sh.[B7].CurrentRegion.Rows.Count
    Set Rng = Sh.[B7].Resize(Rws).Offset(, Col)
  
    STim = IIf(Col = 0, txtCode.Text, txtName.Text)
  
    Set sRng = Rng.Find(STim, , xlFormulas, xlWhole)
    If sRng Is Nothing Then
        MsgBox IIf(Col = 0, "Tim khong thay Ma NV " & STim, "Tim khong thay HoTen NV " & STim), vbCritical Or vbOKOnly
        ClearAllTextBoxes
    Else
        If Col Then
            txtCode.Text = sRng.Offset(, -1).Value
        Else
            txtName.Text = sRng.Offset(, 1).Value
        End If
        GPE_COM = True
    End If
End Function
Chào anh, em thử cho chạy được rồi!
Đúng ý em rồi ạ
Nhân tiện cho em hỏi File đính kèm tại bài #21, em nén lại thì chỉ còn 299Kb, nhưng giải nén ra thì lại đến gần 9Mb, mình phải giải quyết sao ạ!, em không hiểu sao từ 9Mb mà nén xuống chỉ còn 299Kb? mà File thì không bao nhiêu dữ liệu nhưng không nén thì đến cả Mb?
Cảm ơn anh!
Ngoài cảm ơn rất nhiều .....thì vẫn là cảm ơn rất nhiều ạk!
Nhân tiện cho em cảm ơn anh "Hoang2013" luôn ạ!
 
Upvote 0
Chào anh, em thử cho chạy được rồi!
Đúng ý em rồi ạ
Nhân tiện cho em hỏi File đính kèm tại bài #21, em nén lại thì chỉ còn 299Kb, nhưng giải nén ra thì lại đến gần 9Mb, mình phải giải quyết sao ạ!, em không hiểu sao từ 9Mb mà nén xuống chỉ còn 299Kb? mà File thì không bao nhiêu dữ liệu nhưng không nén thì đến cả Mb?
Cảm ơn anh!
Ngoài cảm ơn rất nhiều .....thì vẫn là cảm ơn rất nhiều ạk!
Nhân tiện cho em cảm ơn anh "Hoang2013" luôn ạ!
File bạn dữ liệu rác thừa nhiều nên nó độn dung lượng file lên, bạn xóa những ròng rác đi thì file nó sẽ nhẹ đi.
Xử lý tạm bằng cách, qua sheet Chamcong, nhấn phím Ctrl + End, xóa hết mấy dòng thừa đó đi, lưu lại file, thoát và xem kết quả !
 
Upvote 0
............................
Nhân tiện cho em hỏi File đính kèm tại bài #21, em nén lại thì chỉ còn 299Kb, nhưng giải nén ra thì lại đến gần 9Mb, mình phải giải quyết sao ạ!, .........................!
Tôi chỉ xử lý giúp dung lượng File, chứ không đá động gì đến UserForm, code trong sheet ChamCong còn lỗi (nhưng tôi chưa xem lại), bạn nhờ ai giúp thì nhờ tiếp người đó.
 

File đính kèm

  • UserForm cham cong.rar
    146.1 KB · Đọc: 10
Upvote 0
Tôi chỉ xử lý giúp dung lượng File, chứ không đá động gì đến UserForm, code trong sheet ChamCong còn lỗi (nhưng tôi chưa xem lại), bạn nhờ ai giúp thì nhờ tiếp người đó.
Bác chỉ em cách xử lý được không ạ, em còn vài File như thế này dung lượng nặng bất thường, em muốn biết cách để tự xử lý luôn ạ!
Cảm ơn bác
 
Upvote 0
Upvote 0
Upvote 0
Web KT
Back
Top Bottom