Sửa code VBA nhập liệu userform (2 người xem)

  • Thread starter Thread starter antudo
  • Ngày gửi Ngày gửi

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

  • Tôi tuân thủ nội quy khi đăng bài

    antudo

    Thành viên mới
    Tham gia
    22/1/18
    Bài viết
    10
    Được thích
    2
    Giới tính
    Nam
    Dạ Chào Anh chị,
    Em đang gặp lỗi code thêm hình ảnh và ngày tháng đảo lộn trong file nhập liệu nhân sự bằng userform
    Nhờ anh chị hỗ trợ sửa giúp em với ạ
    Em cám ơn ạ,
     

    File đính kèm

    Dạ Chào Anh chị,
    Em đang gặp lỗi code thêm hình ảnh và ngày tháng đảo lộn trong file nhập liệu nhân sự bằng userform
    Nhờ anh chị hỗ trợ sửa giúp em với ạ
    Em cám ơn ạ,
    Để nguyên câu hỏi này, nếu không mô tả thêm cụ thể như thế nào thì chẳng hiểu gì để giúp.
     
    Upvote 0
    Để nguyên câu hỏi này, nếu không mô tả thêm cụ thể như thế nào thì chẳng hiểu gì để giúp.
    Vâng, sorry ạ
    Em xin miêu tả kỹ hơn về 2 lỗi, như sau:
    1- Lỗi 1: Thêm hình ảnh
    Private Sub CMDADDPHOTO_Click()
    Dim x As Integer
    Application.FileDialog(msoFileDialogOpen).AllowMultiSelect = False
    x = Application.FileDialog(msoFileDialogOpen).Show
    If x <> 0 Then
    FPATH = Application.FileDialog(msoFileDialogOpen).SelectedItems(1)
    Image1.Picture = LoadPicture(FPATH)
    Image1.PictureSizeMode = 1
    End If
    End Sub
    2- Lỗi định dạng ngày/tháng/năm
    Ví dụ:
    - Với ngày 19/5/2025 thì sẽ không bị lỗi ở cả userform và excel
    - Nhưng với ngày 3/5/2025 thì userform không lỗi, lỗi hiển thị ở excel (ngược sang tháng/ngày/năm)
    Chi tiết Anh chị xem giúp code nhé ạ
    Tks,
     
    Upvote 0
    Đầu tiên mình muốn lưu ý với bạn là vấn đề thiết kế CSDL;
    1./ Mã số nhân viên
    Hiện bạn đang xài dẫy số vô tri giác;
    Nếu là mình thì xài bộ mã sau:

    1760778873147.png

    2./ Cũng trang CSDL này cần tách ra thành chí ít là 3 trang tính;
    Trang đầu là những gì bất biến trong đời người sẽ lao động ở cơ quan bạn;
    Ví du [Mã NV], [HoTen], [Ngày sinh], [Giới tính], [Địa chỉ], [SĐT],. . . .
    Trang thứ 2 sẽ là
    [Mã NV], [Ngày], Loại HĐLĐ], [Ghi chú]
    Trang thứ 3 sẽ là về BHXH:
    [Mã NV], [Số sổ BHXH], [Hôn nhân], [QH], [Họ tên người QH], [Ghi chú]
    Hai trang này ghi dữ liệu theo chiều dọc; Không phải chiều ngang như bạn đang làm;

    . . . .
     
    Lần chỉnh sửa cuối:
    Upvote 0
    Em đang gặp lỗi code thêm hình ảnh và ngày tháng đảo lộn trong file nhập liệu nhân sự bằng userform
    1. Thêm hình ảnh: Userform chỉ chấp nhận file ảnh với định dạng: jpg, bmp, svg. Do đó nếu bạn chọn khác định dạng (png) sẽ báo lỗi. Để giới hạn chỉ chọn file đúng định dạng thì bạn phải thiết lập thuộc tính Filter (chỉ hiển thị file jpg, bmp) trong hộp thoại chọn file để người dùng dễ lựa chọn.
    2. Ngày tháng: Theo tôi biết VBA xử lý ngày tháng theo dạng mm/dd/yyyy. Do đó bạn phải xử lý ngay ở Textbox nhập liệu.
    - Textbox ngày phải nhập dạng: dd/mm/yyyy. 2 ký tự ngày, 2 ký tự cho tháng và 4 ký tự cho năm. Bạn phải bẫy lỗi nhập liệu này để người dùng nhập cho đúng định dạng.
    - Code chuyển đổi ngày như bên dưới.

    Screenshot at Oct 18 18-48-36.png

    3. Form còn nhiều lỗi nhập liệu:
    - Khi mở form, bấm thêm mới sẽ thêm liên tục mặc dù không có dữ liệu.
    - Sau khi nhập msnv, bấm Search sẽ nạp dữ liệu lên UF. Bấm cập nhật nó sẽ tạo thêm dòng mới giống như vậy --> lỗi trùng dữ liệu.
    - Nói chung khi mở UF lên, bấm lung tung các nút lệnh sẽ thấy lỗi tùm lum.
    - Form cập nhật dữ liệu lâu mặc dùng không có nhiều trường dữ liệu.
    - Form nên thiết kế tách thông tin thành các tab (TabStrip) để dễ nhìn vào nhập liệu. VD: thông tin người phụ thuộc tách ra 1 tab khác.
    - Nên dùng vòng lặp duyệt qua các control (textbox, comboBox...) để cập nhật giá trị từ Userform xuống sheet và ngược lại để code ngắn gọn hơn và cũng dễ điều chỉnh. (Thay vì gán từng textbox xuống từng cell như hiện tại).

    Tham khảo:

    Screenshot 2025-10-18 at 16.56.28.png

    Screenshot 2025-10-18 at 16.56.38.png
     
    Lần chỉnh sửa cuối:
    Upvote 0
    1. Thêm hình ảnh: Userform chỉ chấp nhận file ảnh với định dạng: jpg, bmp, svg. Do đó nếu bạn chọn khác định dạng (png) sẽ báo lỗi. Để giới hạn chỉ chọn file đúng định dạng thì bạn phải thiết lập thuộc tính Filter (chỉ hiển thị file jpg, bmp) trong hộp thoại chọn file để người dùng dễ lựa chọn.
    2. Ngày tháng: Theo tôi biết VBA xử lý ngày tháng theo dạng mm/dd/yyyy. Do đó bạn phải xử lý ngay ở Textbox nhập liệu.
    - Textbox ngày phải nhập dạng: dd/mm/yyyy. 2 ký tự ngày, 2 ký tự cho tháng và 4 ký tự cho năm. Bạn phải bẫy lỗi nhập liệu này để người dùng nhập cho đúng định dạng.
    - Code chuyển đổi ngày như bên dưới.

    View attachment 310073

    3. Form còn nhiều lỗi nhập liệu:
    - Khi mở form, bấm thêm mới sẽ thêm liên tục mặc dù không có dữ liệu.
    - Sau khi nhập msnv, bấm Search sẽ nạp dữ liệu lên UF. Bấm cập nhật nó sẽ tạo thêm dòng mới giống như vậy --> lỗi trùng dữ liệu.
    - Nói chung khi mở UF lên, bấm lung tung các nút lệnh sẽ thấy lỗi tùm lum.
    - Form cập nhật dữ liệu lâu mặc dùng không có nhiều trường dữ liệu.
    - Form nên thiết kế tách thông tin thành các tab (TabStrip) để dễ nhìn vào nhập liệu. VD: thông tin người phụ thuộc tách ra 1 tab khác.
    - Nên dùng vòng lặp duyệt qua các control (textbox, comboBox...) để cập nhật giá trị từ Userform xuống sheet và ngược lại để code ngắn gọn hơn và cũng dễ điều chỉnh. (Thay vì gán từng textbox xuống từng cell như hiện tại).

    Tham khảo:

    View attachment 310074

    View attachment 310075
    Vâng, mình mới đang học VBA, còn gà mờ
    Mình thấy cái tab mà bạn nói hay quá, trông thoáng đãng, dễ nhìn. Mà mình chưa biết cách làm
    Cám ơn bạn nhiều ạ!
    Bài đã được tự động gộp:

    Đầu tiên mình muốn lưu ý với bạn là vấn đề thiết kế CSDL;
    1./ Mã số nhân viên
    Hiện bạn đang xài dẫy số vô tri giác;
    Nếu là mình thì xài bộ mã sau:

    View attachment 310072

    2./ Cũng trang CSDL này cần tách ra thành chí ít là 3 trang tính;
    Trang đầu là những gì bất biến trong đời người sẽ lao động ở cơ quan bạn;
    Ví du [Mã NV], [HoTen], [Ngày sinh], [Giới tính], [Địa chỉ], [SĐT],. . . .
    Trang thứ 2 sẽ là
    [Mã NV], [Ngày], Loại HĐLĐ], [Ghi chú]
    Trang thứ 3 sẽ là về BHXH:
    [Mã NV], [Số sổ BHXH], [Hôn nhân], [QH], [Họ tên người QH], [Ghi chú]
    Hai trang này ghi dữ liệu theo chiều dọc; Không phải chiều ngang như bạn đang làm;

    . . . .
    Vâng ạ, việc phân loại trường dữ liệu ra cũng giúp dễ nhìn, dễ nhập liệu và dễ quản lý hơn
    Cám ơn Anh nhiều về góp ý liên quan đến CSDL nhé ạ
    Tks,
     
    Upvote 0
    Nếu là mình thì sẽ theo đường hướng được phát thảo theo file!
    :D :D
     
    Upvote 0
    Bạn xem thêm file mới & tiếp tục sửa chữa các Controls sao chúng tường minh hơn phần tên gọi
    Các bước thao tác trong file:
    → Bên phải nút lệnh tìm kiếm có TextBox 'tbMa3'
    Bạn thử nhập 3 ký tự của mã của bất kỳ nhân vật nào có trong danh sách & nhấn vô nút lệnh
    Trên listBox sẽ hiện danh sách cô gọn những người có 3 ký tự trùng với Control 'tbMa3'
    → Nếu lấy chuột bấm vô dòng có dữ liệu của ListBox thì các TextBox bên trên sẽ nhận dữ liệu tương ứng mà ta đã bấm chọn;
    Thêm chú ý:
    Cần xử lý khi trong danh sách không có 1 dòng nào trùng với 'tbMa3'; Chuyện này chắc phải là bạn thực hiện rồi!

    [Thêm ghi chú: Hơn 3 giờ nữa mình sẽ tháo file bài trên liền kề của mình, tiết kiệm tài nguyên!]
     

    File đính kèm

    Lần chỉnh sửa cuối:
    Upvote 0
    Bạn xem thêm file mới & tiếp tục sửa chữa các Controls sao chúng tường minh hơn phần tên gọi
    - Gõ chữ thường và nhấn tìm kiếm nó trơ trơ. Hay là thêm cái Ucase?
    - Phải gõ đủ 3 ký tự. Có thể muốn gõ bao nhiêu tùy ý không?
    - Phải nhấn nút tìm kiếm. Có thể gõ đến đâu tìm đến đó mà không cần nhấn nút không?
    - Lê Bé có 2 từ nhưng mã buộc phải 3 ký tự thành ra LJB, chữ J thay cho cái gì, người dùng có thể nhớ chăng? Ngoài J ra còn gì khác phải nhớ nữa? Hay là tìm theo tên cho dễ (tên thì có khi đã thuộc lòng rồi)
    - Textbox STT bị cứng con số 11. Msgbox thì lấy số TT của List sau khi thu gọn. Vậy nếu sửa thông tin và cập nhật xuống sheet thì cập nhật vào dòng 11 hay dòng Msgbox?
     
    Upvote 0
    [Copilot & Hợp đồng lao động]

    Bạn đang đi đúng hướng rồi đó! Việc hiểu Dictionary sẽ giúp bạn xử lý dữ liệu hiệu quả hơn sau này, nhưng nếu chưa quen thì mình có thể hướng dẫn bạn cách nhập mới, sửa, xóa hợp đồng lao động theo cách đơn giản hơn — không cần dùng Dictionary ngay đâu

    Cách xử lý dữ liệu HĐLĐ: Nhập mới, sửa, xóa​

    Giả sử bạn có một sheet tên là HDLD với các cột:
    A: STT
    B: MaNV
    C: NgayHD
    D: LoaiHD
    E: GhiChu

    Trên UserForm, bạn có thể có:
    • Các ô nhập liệu: txtMaNV, dtpNgayHD, cmbLoaiHD, txtGhiChu
    • Một ListBox tên lstHDLD để hiển thị danh sách hợp đồng
    • Các nút: cmdThem, cmdSua, cmdXoa

    ✅ 1. Nhập mới hợp đồng​

    PHP:
    Private Sub cmdThem_Click()
        Dim ws As Worksheet
        Dim nextRow As Long 
        Set ws = ThisWorkbook.Sheets("HDLD")
        nextRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row + 1
       ws.Cells(nextRow, "A").Value = nextRow - 1 ' STT
        ws.Cells(nextRow, "B").Value = txtMaNV.Value
        ws.Cells(nextRow, "C").Value = dtpNgayHD.Value
        ws.Cells(nextRow, "D").Value = cmbLoaiHD.Value
        ws.Cells(nextRow, "E").Value = txtGhiChu.Value
       MsgBox "Đã thêm hợp đồng mới!"
        Call LoadDanhSachHDLD
    End Sub

    ✏️ 2. Sửa hợp đồng đã chọn
    Mã:
    [/HEADING]
    Private Sub cmdSua_Click()
     Dim ws As Worksheet\
     Dim selectedRow As Long
    If lstHDLD.ListIndex = -1 Then
      MsgBox "Bạn chưa chọn dòng để sửa!"
      Exit Sub
    End If
    Set ws = ThisWorkbook.Sheets("HDLD")
    selectedRow = lstHDLD.List(lstHDLD.ListIndex, 0) + 1 ' STT + 1 vì dòng bắt đầu từ 2
    ws.Cells(selectedRow + 1, "B").Value = txtMaNV.Value
    ws.Cells(selectedRow + 1, "C").Value = dtpNgayHD.Value
    ws.Cells(selectedRow + 1, "D").Value = cmbLoaiHD.Value
    ws.Cells(selectedRow + 1, "E").Value = txtGhiChu.Value
    MsgBox "Đã sửa hợp đồng!"
        Call LoadDanhSachHDLD
    End Sub

    ️ 3. Xóa hợp đồng đã chọn​

    PHP:
    Private Sub cmdXoa_Click()
        Dim ws As Worksheet
        Dim selectedRow As Long
       If lstHDLD.ListIndex = -1 Then
           MsgBox "Bạn chưa chọn dòng để xóa!"
           Exit Sub
        End If
        Set ws = ThisWorkbook.Sheets("HDLD")
        selectedRow = lstHDLD.List(lstHDLD.ListIndex, 0) + 1    ws.Rows(selectedRow + 1).Delete
       MsgBox "Đã xóa hợp đồng!"
       Call LoadDanhSachHDLD
    End Sub

    Hàm nạp lại danh sách vào ListBox​

    Mã:
    Sub LoadDanhSachHDLD()
        Dim ws As Worksheet
        Dim i As Long, lastRow As Long
       Set ws = ThisWorkbook.Sheets("HDLD")
        lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
        lstHDLD.Clear
        lstHDLD.ColumnCount = 5
       lstHDLD.ColumnWidths = "40;80;100;100;150" 
        For i = 2 To lastRow
            lstHDLD.AddItem ws.Cells(i, "A").Value
            lstHDLD.List(lstHDLD.ListCount - 1, 1) = ws.Cells(i, "B").Value
            lstHDLD.List(lstHDLD.ListCount - 1, 2) = Format(ws.Cells(i, "C").Value, "dd/mm/yyyy")
            lstHDLD.List(lstHDLD.ListCount - 1, 3) = ws.Cells(i, "D").Value
            lstHDLD.List(lstHDLD.ListCount - 1, 4) = ws.Cells(i, "E").Value
        Next i
    End Sub



    Bạn có thể thử từng phần một, rồi mình sẽ giúp bạn gắn kết lại thành một hệ thống hoàn chỉnh. Nếu bạn muốn mình tạo sơ đồ luồng xử lý hoặc gợi ý cách tổ chức form đẹp hơn, mình làm ngay nhé!​
     
    Upvote 0
    [Copilot & Hợp đồng lao động]

    Bạn đang đi đúng hướng rồi đó! Việc hiểu Dictionary sẽ giúp bạn xử lý dữ liệu hiệu quả hơn sau này, nhưng nếu chưa quen thì mình có thể hướng dẫn bạn cách nhập mới, sửa, xóa hợp đồng lao động theo cách đơn giản hơn — không cần dùng Dictionary ngay đâu

    Cách xử lý dữ liệu HĐLĐ: Nhập mới, sửa, xóa​

    Giả sử bạn có một sheet tên là HDLD với các cột:
    A: STT
    B: MaNV
    C: NgayHD
    D: LoaiHD
    E: GhiChu

    Trên UserForm, bạn có thể có:
    • Các ô nhập liệu: txtMaNV, dtpNgayHD, cmbLoaiHD, txtGhiChu
    • Một ListBox tên lstHDLD để hiển thị danh sách hợp đồng
    • Các nút: cmdThem, cmdSua, cmdXoa

    ✅ 1. Nhập mới hợp đồng​

    PHP:
    Private Sub cmdThem_Click()
        Dim ws As Worksheet
        Dim nextRow As Long
        Set ws = ThisWorkbook.Sheets("HDLD")
        nextRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row + 1
       ws.Cells(nextRow, "A").Value = nextRow - 1 ' STT
        ws.Cells(nextRow, "B").Value = txtMaNV.Value
        ws.Cells(nextRow, "C").Value = dtpNgayHD.Value
        ws.Cells(nextRow, "D").Value = cmbLoaiHD.Value
        ws.Cells(nextRow, "E").Value = txtGhiChu.Value
       MsgBox "Đã thêm hợp đồng mới!"
        Call LoadDanhSachHDLD
    End Sub

    ✏️ 2. Sửa hợp đồng đã chọn​

    Mã:
    [/HEADING][/HEADING]
    [HEADING=2]Private Sub cmdSua_Click()[/HEADING]
    [HEADING=2]Dim ws As Worksheet\[/HEADING]
    [HEADING=2]Dim selectedRow As Long[/HEADING]
    [HEADING=2]If lstHDLD.ListIndex = -1 Then[/HEADING]
    [HEADING=2]  MsgBox "Bạn chưa chọn dòng để sửa!"[/HEADING]
    [HEADING=2]  Exit Sub[/HEADING]
    [HEADING=2]End If[/HEADING]
    [HEADING=2]Set ws = ThisWorkbook.Sheets("HDLD")[/HEADING]
    [HEADING=2]selectedRow = lstHDLD.List(lstHDLD.ListIndex, 0) + 1 ' STT + 1 vì dòng bắt đầu từ 2[/HEADING]
    [HEADING=2]ws.Cells(selectedRow + 1, "B").Value = txtMaNV.Value[/HEADING]
    [HEADING=2]ws.Cells(selectedRow + 1, "C").Value = dtpNgayHD.Value[/HEADING]
    [HEADING=2]ws.Cells(selectedRow + 1, "D").Value = cmbLoaiHD.Value[/HEADING]
    [HEADING=2]ws.Cells(selectedRow + 1, "E").Value = txtGhiChu.Value[/HEADING]
    [HEADING=2]MsgBox "Đã sửa hợp đồng!"[/HEADING]
    [HEADING=2]    Call LoadDanhSachHDLD[/HEADING]
    [HEADING=2]End Sub

    ️ 3. Xóa hợp đồng đã chọn​

    PHP:
    Private Sub cmdXoa_Click()[/HEADING]
    [HEADING=2]    Dim ws As Worksheet[/HEADING]
    [HEADING=2]    Dim selectedRow As Long[/HEADING]
    [HEADING=2]   If lstHDLD.ListIndex = -1 Then[/HEADING]
    [HEADING=2]       MsgBox "Bạn chưa chọn dòng để xóa!"[/HEADING]
    [HEADING=2]       Exit Sub[/HEADING]
    [HEADING=2]    End If[/HEADING]
    [HEADING=2]    Set ws = ThisWorkbook.Sheets("HDLD")[/HEADING]
    [HEADING=2]    selectedRow = lstHDLD.List(lstHDLD.ListIndex, 0) + 1    ws.Rows(selectedRow + 1).Delete[/HEADING]
    [HEADING=2]   MsgBox "Đã xóa hợp đồng!"[/HEADING]
    [HEADING=2]   Call LoadDanhSachHDLD[/HEADING]
    [HEADING=2]End Sub

    Hàm nạp lại danh sách vào ListBox​

    Mã:
    Sub LoadDanhSachHDLD()[/HEADING]
    [HEADING=2]    Dim ws As Worksheet[/HEADING]
    [HEADING=2]    Dim i As Long, lastRow As Long[/HEADING]
    [HEADING=2]   Set ws = ThisWorkbook.Sheets("HDLD")[/HEADING]
    [HEADING=2]    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row[/HEADING]
    [HEADING=2]    lstHDLD.Clear[/HEADING]
    [HEADING=2]    lstHDLD.ColumnCount = 5[/HEADING]
    [HEADING=2]   lstHDLD.ColumnWidths = "40;80;100;100;150"[/HEADING]
    [HEADING=2]    For i = 2 To lastRow[/HEADING]
    [HEADING=2]        lstHDLD.AddItem ws.Cells(i, "A").Value[/HEADING]
    [HEADING=2]        lstHDLD.List(lstHDLD.ListCount - 1, 1) = ws.Cells(i, "B").Value[/HEADING]
    [HEADING=2]        lstHDLD.List(lstHDLD.ListCount - 1, 2) = Format(ws.Cells(i, "C").Value, "dd/mm/yyyy")[/HEADING]
    [HEADING=2]        lstHDLD.List(lstHDLD.ListCount - 1, 3) = ws.Cells(i, "D").Value[/HEADING]
    [HEADING=2]        lstHDLD.List(lstHDLD.ListCount - 1, 4) = ws.Cells(i, "E").Value[/HEADING]
    [HEADING=2]    Next i[/HEADING]
    [HEADING=2]End Sub


    Bạn có thể thử từng phần một, rồi mình sẽ giúp bạn gắn kết lại thành một hệ thống hoàn chỉnh. Nếu bạn muốn mình tạo sơ đồ luồng xử lý hoặc gợi ý cách tổ chức form đẹp hơn, mình làm ngay nhé!​

    Vâng, bác hoàn thiện file giúp em với ạ để em được mở mang tầm mắt và học hỏi từ từng đoạn code đó. Em cảm ơn ạ
     
    Upvote 0
    Bạn phải tổ chức lại bảng dữ liệu, tôi nhìn sơ qua thì thấy bạn phải tách thành 3 bảng mới hợp lý và dễ truy vấn dữ liệu. Nói chung thì việc Thêm xoá sửa sẽ dễ hơn.
     
    Upvote 0
    Copilot & Hợp đồng lao động
    Không đơn giản thế. Khi đã có mục tìm kiếm thì danh sách sẽ rút gọn lại. Thứ tự trên list không còn là thứ tự trên sheet nữa. Tìm kiếm với danh sách ngắn dần là biện pháp chủ yếu để sửa xóa khi list có sẵn rất dài.
    Tất cả các code trên không dành cho việc xóa sửa sau khi tìm kiếm, chỉ có thể thêm mới.
     
    Upvote 0
    Bác có xài qua DeepSeek chưa? Em thấy DSeek nó trả lời và đưa code mẫu nhiều trường hợp, từ code cơ bản đến code nâng cao cho 1 vấn đề mình hỏi.
    Cái AI nào cũng vậy, phải biết cách hỏi, mà muốn hỏi phải biết rõ vấn đề.
    Chẳng hạn hỏi CoPilot:
    q02.png

    Và nó gợi ý code sau:

    q03.png

    Người hiểu biết lập trình chỉ cần như vậy là có thể khai triển thành code hoàn chỉnh theo ý mình.

    Ghi chú:
    Trong tài liệu tôi viết thì dùng cách khác: Lưu thứ tự dòng ngay trong cột đầu tiên của listbox, dù lọc ngắn lại thì chỉ tra cứu cột 0 là ra thứ tự dòng trên sheet. Việc ẩn cột 0 thì quá đơn giản.
     
    Upvote 0
    Vâng, bác hoàn thiện file giúp em với ạ để em được mở mang tầm mắt và học hỏi từ từng đoạn code đó. Em cảm ơn ạ
    Mình cho rằng cần lưu ý mạnh mẽ hơn đến bạn chưa phải là Code như thế nào mà thiết kế lại CSDL;
    Ngay trong file của bạn (Ở #1) cũng chưa chú tâm đến dữ liệu
    → Chỉ có 1 mống & chưa đầy đủ nữa, đến tệ
    Chí ít CQ (cơ quan) của bạn ~100 thì cần chí ít mươi người;
    Chí ít CQ có 7 đơn vị thì mươi người đó rãi đều khắp ở 7 đơn vị;
    Chí ít có 2 loại hợp đồng dài hạn & ngắn hạn (từ 1 đến 3 năm) thì cần 4 loại hợp đồng tương ứng được rãi khắp
    → Một số người thường người ta lập các danh mục, như danh mục các đơn vị/bộ phận
    Danh mục các loại hợp đồng lao động, danh mục các trình độ học thức hay chuyên môn/bậc thợ,. . .
    Các danh mục này chí ít có 2 trường; đó là [Mã danh mục] & [Tên danh mục]
    Trên trang dữ liệu các cột sẽ không thể hiện tên danh mục mà là mã danh mục;

    & cuối cùng đó là nếu bạn không thiết kế lại CSDL thì ai đó giúp bạn trên nền tảng file #1 là vô tính hay hữu ý hại bạn mà thôi!
     
    Upvote 0
    Thấy bài cũng xôm tụ nên tôi cũng góp 1 file demo cho chủ thớt. Chỉ làm mẫu nhập liệu cơ bảng chừng 10 trường (cột) của bảng thôi. Chủ yếu là chức năng:
    - Tìm kiếm trong listbox
    - Lưu, Thêm, Xoá dữ liệu dùng cách lặp qua các control trên userform để lấy dữ liệu lên form hoặc ghi xuống sheet. Chịu khó thêm các tham số trong thuộc tính Tag của control.
    Form chưa bẫy lỗi gì nhiều nên sẽ có phát sinh các hoạt động không như ý muốn. Chủ yếu tham khảo cái qui trình nhập liệu (tôi hay làm theo kiểu này).
    - Tôi có tách cái bảng của chủ thớt thành 3 bảng con để CSDL cho nó chuẩn hoá.
    - Thuộc tính Tag: "2_req": Tôi qui ước số 2 là cột lưu trường [Họ tên], "req" là bắt buộc phải nhập liệu, từ khoá này dùng trong hàm kiểm tra tính hợp lệ của dữ liệu nhập trước khi [Lưu].

    Screenshot at Oct 23 22-43-31.png
    Screenshot at Oct 23 22-50-39.png


     

    File đính kèm

    Lần chỉnh sửa cuối:
    Upvote 0
    Nói vui chút: Cách đây 8 năm khi tạo mục giới tính tôi đã cho tùy chọn 1 trong 3: Nam, Nữ, Khác
    Gần đây nhà nước đã công nhận giới tính khác rồi.

    1761274096991.png
     
    Upvote 0
    Mình cho rằng cần lưu ý mạnh mẽ hơn đến bạn chưa phải là Code như thế nào mà thiết kế lại CSDL;
    Ngay trong file của bạn (Ở #1) cũng chưa chú tâm đến dữ liệu
    → Chỉ có 1 mống & chưa đầy đủ nữa, đến tệ
    Chí ít CQ (cơ quan) của bạn ~100 thì cần chí ít mươi người;
    Chí ít CQ có 7 đơn vị thì mươi người đó rãi đều khắp ở 7 đơn vị;
    Chí ít có 2 loại hợp đồng dài hạn & ngắn hạn (từ 1 đến 3 năm) thì cần 4 loại hợp đồng tương ứng được rãi khắp
    → Một số người thường người ta lập các danh mục, như danh mục các đơn vị/bộ phận
    Danh mục các loại hợp đồng lao động, danh mục các trình độ học thức hay chuyên môn/bậc thợ,. . .
    Các danh mục này chí ít có 2 trường; đó là [Mã danh mục] & [Tên danh mục]
    Trên trang dữ liệu các cột sẽ không thể hiện tên danh mục mà là mã danh mục;

    & cuối cùng đó là nếu bạn không thiết kế lại CSDL thì ai đó giúp bạn trên nền tảng file #1 là vô tính hay hữu ý hại bạn mà thôi!
    Vâng bác, đúng là thiếu sót rồi. Em xin phép gửi lại bản này, đầy đủ hơn chút so với bản #1 ạ
    Bài đã được tự động gộp:

    Thấy bài cũng xôm tụ nên tôi cũng góp 1 file demo cho chủ thớt. Chỉ làm mẫu nhập liệu cơ bảng chừng 10 trường (cột) của bảng thôi. Chủ yếu là chức năng:
    - Tìm kiếm trong listbox
    - Lưu, Thêm, Xoá dữ liệu dùng cách lặp qua các control trên userform để lấy dữ liệu lên form hoặc ghi xuống sheet. Chịu khó thêm các tham số trong thuộc tính Tag của control.
    Form chưa bẫy lỗi gì nhiều nên sẽ có phát sinh các hoạt động không như ý muốn. Chủ yếu tham khảo cái qui trình nhập liệu (tôi hay làm theo kiểu này).
    - Tôi có tách cái bảng của chủ thớt thành 3 bảng con để CSDL cho nó chuẩn hoá.
    - Thuộc tính Tag: "2_req": Tôi qui ước số 2 là cột lưu trường [Họ tên], "req" là bắt buộc phải nhập liệu, từ khoá này dùng trong hàm kiểm tra tính hợp lệ của dữ liệu nhập trước khi [Lưu].

    View attachment 310128
    View attachment 310129


    Hay quá ạ, bác cho em xin contact, e hỏi kỹ hơn đc k?
     
    Upvote 0
    File mới nó fì đại đến cỡ nào mà bạn phải gởi lên đâu đó xa xăm làm vậy;
    Ý mình là sao không gởi trực tiếp lên diễn đàn?
    & trên diễn đàn này lâu nay mình thấy càng ngày càng hiếm những người 'cầm tay chỉ việc ' lắm
    Có nghĩa là bạn phải tự vận động theo gợi ý của những người hướng dẫn
    Những người hướng dẫn sẽ biết rằng bạn có chủ động thực hiện file của mình hay cứ chờ người khác làm thay phần nhiều!
     
    Upvote 0
    1. Thêm hình ảnh: Userform chỉ chấp nhận file ảnh với định dạng: jpg, bmp, svg. Do đó nếu bạn chọn khác định dạng (png) sẽ báo lỗi. Để giới hạn chỉ chọn file đúng định dạng thì bạn phải thiết lập thuộc tính Filter (chỉ hiển thị file jpg, bmp) trong hộp thoại chọn file để người dùng dễ lựa chọn.
    2. Ngày tháng: Theo tôi biết VBA xử lý ngày tháng theo dạng mm/dd/yyyy. Do đó bạn phải xử lý ngay ở Textbox nhập liệu.
    - Textbox ngày phải nhập dạng: dd/mm/yyyy. 2 ký tự ngày, 2 ký tự cho tháng và 4 ký tự cho năm. Bạn phải bẫy lỗi nhập liệu này để người dùng nhập cho đúng định dạng.
    - Code chuyển đổi ngày như bên dưới.

    View attachment 310073

    3. Form còn nhiều lỗi nhập liệu:
    - Khi mở form, bấm thêm mới sẽ thêm liên tục mặc dù không có dữ liệu.
    - Sau khi nhập msnv, bấm Search sẽ nạp dữ liệu lên UF. Bấm cập nhật nó sẽ tạo thêm dòng mới giống như vậy --> lỗi trùng dữ liệu.
    - Nói chung khi mở UF lên, bấm lung tung các nút lệnh sẽ thấy lỗi tùm lum.
    - Form cập nhật dữ liệu lâu mặc dùng không có nhiều trường dữ liệu.
    - Form nên thiết kế tách thông tin thành các tab (TabStrip) để dễ nhìn vào nhập liệu. VD: thông tin người phụ thuộc tách ra 1 tab khác.
    - Nên dùng vòng lặp duyệt qua các control (textbox, comboBox...) để cập nhật giá trị từ Userform xuống sheet và ngược lại để code ngắn gọn hơn và cũng dễ điều chỉnh. (Thay vì gán từng textbox xuống từng cell như hiện tại).

    Tham khảo:

    View attachment 310074View attachment 310075
    cho em xin file đc k ạ
     
    Upvote 0
    Xem comment của bác vui vui xem ở Germini về giới tính mới phát hiện ra giờ từ LGBT nó lên thêm Q I A thậm chí đề phòng cẩn thận hơn thêm cả + nữa rồi ....
    Nói vui chút: Cách đây 8 năm khi tạo mục giới tính tôi đã cho tùy chọn 1 trong 3: Nam, Nữ, Khác
    Gần đây nhà nước đã công nhận giới tính khác rồi.
     
    Upvote 0
    Xem comment của bác vui vui xem ở Germini về giới tính mới phát hiện ra giờ từ LGBT nó lên thêm Q I A thậm chí đề phòng cẩn thận hơn thêm cả + nữa rồi ....
    Cách nay 8 năm thì chưa có xài từ ngữ LGBT thông dụng như bây giờ. Vả lại thời điểm đó thì chỉ có tồn tại nhiều nhất là 2 loại L và G. Loại B thì rất ít và loại T thì chỉ rộ lên sau này. Tôi dùng chữ "khác" là bao gồm nhiều loại không phải nam và nữ, cũng là để vào thuở sơ khai của việc chấp nhận giới tính khác người khai lý lịch hoặc tạo hồ sơ nhân sự không đi quá sâu vào đời tư người khác.
    Ý tưởng thêm 1 tùy chọn này phát sinh từ việc tận mắt thấy 1 vài nhân viên của đối tác mang giới tính "khác", phần mềm cũ chỉ có 2 chọn lựa. Chọn nam bạn này không chịu, chọn nữ thì lại mắc cở. Phòng nhân sự không biết làm thế nào. Nhân dịp bên tôi đang tư vấn triển khai phần mềm ERP nên tôi thiết kế luôn.
     
    Upvote 0

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

    Back
    Top Bottom