1. Bản V2 của anh khi mở ra đã bị lỗi này là sao ạ ? Em đang dùng Office 2016 (x64)
Do máy tui cùi bắp đời cũ nên chỉ có 32bit à, chưa bò lên được 64 bit nên bạn tự sửa lại khai báo các hàm theo 64bit nhé.
Bạn xem bài hướng dẫn của Hesanbi ở đây.
Link:
https://www.giaiphapexcel.com/diend...ền-tảng-và-lập-trình-tương-tác-window.142800/
a/ Khi mở hộp thoại chọn đường dẫn file txt để import, lúc này người dùng hủy việc chọn file thì bị báo lỗi. Em đã thử Google cách bẫy lỗi mà không thành công? Anh có cách gì không ?
Chỉ cần thêm dòng này vô:
sFullPath = BrowseFile
--> If Len(sFullPath) = 0 Then Exit Sub
b/ Em chưa biết cái Function createDynamicNamedRange để làm gì? Ngoài ra cái lệnh lngLastColRng = .Find(What:="*" trong cái Function này có kết quả như thế nào ?
Cái phiên bản này nó lằng nhằng vì như tôi nói phải import vô Excel rồi mới dùng ADO xử lý nên phải thiết lập Named range (NRg) cho khối dữ liệu text vừa Import rồi mới đưa nó vào câu lệnh SQL được. Khi dùng "QueryTables.Add..." thì nó có tạo Namee range rồi ("VungLV" trong file của bạn) nhưng tầm vực của NRg này chỉ có trong Sheet chứ không phải Workbook nên không gọi được vào SQL khi nằm ở sheet khác. Giải pháp có thể là:
- Chuyển Scope thành Workbook. Cách này tôi đã thử nhưng nó cũng phát sinh lỗi nếu người dùng bấm nút [Get Data] liên tục. Tôi cũng đã test việc xoá Nrg nhưng không bẫy được cái lỗi thao tác trên nên mới chọn cách thứ 2 bên dưới.
- Tạo Nrg động riêng co giãn tuỳ theo số dòng, cột dữ liệu import.
Cái lệnh
lngLastColRng là tìm cột có dữ liệu cuối cùng để đưa vô Range. Nên sửa lại chút: LookIn:=xlValues (chứ không phải xlFormula).
c/ Em muốn hỏi lại là Query chỉ lấy thời gian sớm nhất cho cùng lượt I hoặc O thuộc cùng ngày phải không ? Trường hợp nhân viên bấm cùng I hoặc O cho cả lượt vào và lượt ra thì dữ liệu bị mất phải không anh? Nếu đúng thế thì cần xem xét lại cái này
d/ Nếu sheet TongHop đang trong trạng thái được Filter mà người dùng tiến hành Get Data thì code vẫn chạy nhưng dữ liệu bị thiếu mà người dùng không biết
Cái vụ này mới phải thảo luận nhiều đây.
Cái query của anh phải sửa lại chút để: lấy Giờ vào Sớm nhất và giờ ra Trễ nhất.
"SELECT A.F1, IIF([F6]='I',First(A.F2),Last(A.F2)) AS GioInOut, A.F3,...
Cái vụ lấy dữ liệu từ MCC để xử lý thì tôi chắc chắc sẽ phải có xử lý thủ công ở một số trường hợp mà mình không thể lập trình để nó đủ thông minh nhận ra trường hợp nào với trường hợp nào. Có thể tôi không đủ khả năng để code cho nó nhưng đảm bảo là sẽ phức tạp ở nhiều trường hợp thò ngón tay bấm trong thực tế.
- Trường hợp như bạn nói: NV quên đổi sang chế độ O khi bấm ra và ngược lại.
- NV thò vô 1 cái, chưa chắc ăn, thò tiếp lần 2 lần 3, nghe "chít"... "chít" vài lần cho chắc ăn.
- NV kênh thị trường, đi ra vào nhiều lần trong ngày.quên bấm in out, in out lẫn lộn.
- NV quên bấm In, hoặc out, có dữ liệu vào mà không có ra và ngược lại.
- Máy bị lỗi
Từ nguyên nhân trên dẫn đến dữ liệu IN OUT của nhân viên sẽ lộn xộn, mức độ tin cậy giảm 50%
Tôi thấy mấy cty có làm là gửi dữ liệu chấm công cho từng nhân viên trước ngày chốt công để họ tự kiểm tra ngày công, nếu phát hiện sai thì sẽ la làng lên khi đó nhân sự sẽ kiểm tra và sửa dữ liệu công của người đó thay vì phải kiểm tra hết toàn bộ nhân viên. Còn giải pháp nào khác nữa thì tôi chưa biết

Mình chỉ có thể lường trước vài trường hợp để hệ thống highlight lên các dòng nghi ngờ rồi sửa thủ công.
- Giờ IN, OUT có mấy dòng trùng nhau thì chọn 1 như y/c của bạn.
- Thiếu giờ IN hoặc OUT trong cùng 1 ngày.
- Dựa trên các giấy xin phép ra/vào cty của từng NV để đối chiếu dữ liệu chấm công.
- ...
Nói chung vụ này tôi cũng lùng bùng lắm hehe..
Vụ Sheet đang Filter thì buộc bạn phải "Clear Filter" rồi mới ghi dữ liệu xuống thôi, chứ không dữ liệu sẽ bị sai.