[TẶNG] File quản lý ngày sinh nhật.
Qua nay rảnh rỗi ngồi thiết kế file quản lý ngày sinh nhật cho nhân viên, thấy cũng thú vị nên chia sẻ file này lên đây cho mọi người, ai có hứng thú thì tải về dùng thử.
File chỉ đơn giản là những công thức kết hợp với định dạng có điều kiện (conditional formatting), nên ai có thêm thắt, chỉnh sửa gì cũng dễ dàng.
2035
www.giaiphapexcel.com/diendan/threads/t%E1%BA%B6ng-file-qu%E1%BA%A3n-l%C3%BD-ng%C3%A0y-sinh-nh%E1%BA%ADt.152499/
Khóa học SprinGO phù hợp
Khoá học Trưởng phòng nhân sự
Nguồn nhân lực là một trong Tứ trụ kinh doanh của doanh nghiệp, có tác động tới sự tồn tại và phát triển bền...
Xem khóa học
Cái đó cũng không khó phải không, nhưng đây là một file dạng đơn giản, mình chưa nghĩ là phải lập trình. Mr.Thắng tiếp sức phần VBA cho mọi người đi hihihi.
Đâu cần tới Excel.
Lập danh sách vào 1 file.txt, viết một đoạn VBScript + task scheduler của Windows là có thông báo tự động.
Đang nói về cái thông báo kia mà. Thông báo chỉ cần họ tên + bộ phận (hay gì đó thôi).
Còn quản lý dữ liệu là việc khác, và vẫn dùng file Excel như sở thích.
Sao bạn lại biến tấu nội dung ở bài #7 xoắn xít loạn xạ lên vậy.
File.txt chứa dữ liệu: Danh sách họ tên, ngày sinh, các thông tin… Có thể tạo danh sách này bằng cách chép dữ liệu đã có trong file Excel (copy/ paste 1 cái là được).
VBScript là code dạng script mà trên hệ điều hành Windows có sẵn ứng dụng để thực thi được nó. File.vbs này đọc dữ liệu trong file.txt, xử lý trả về kết quả mong muốn.
20362037
Task Scheduler: Là một ứng dụng của Windows để thực hiện một nhiệm vụ nào đó do người dùng thiết lập. Ở đây, áp dụng để thực hiện chạy tự động file.vbs ở trên.
2038
Bạn lập file.txt cỡ 5 dòng, mỗi dòng gồm thông tin:
[ngay sinh dd/mm/yyyy]
gửi lên đây.
Bạn thử nhé .
Code có thể ngắn gọn hơn nhiều.
1. DanhsachSN.txt, mỗi dòng có dạng: <Họ tên><phím TAB><ngày, tháng, năm sinh>
Doãn Minh Hòa 25/10/1984
Nguyễn Đình Vân 19/11/1988
Chu Thị Minh 2/10/2020
Vũ Diệu Hồng 2/10/2020
Hàn Huy Hiên 13/12/1997
Tức ngày không có "0" ở trước nếu ngày < 10. Họ tên nhập các dấu thanh bình thường – tập tin ghi lại ở dạng Unicode. Thông báo bằng tiếng Việt.
2. Code trong nofify birthday.vbs
'# Change with your file'
source_file = "C:UsersAdministratorDesktopDanhsachSN.txt"
…
End Sub
——-
Đã nhìn thấy chỗ sai. Khi kiểm tra ngày sinh nhật thì tôi kiểm tra cả năm. Rõ ràng năm hiện tại không thể như năm sinh được. Lỗi này người ta g̣ọi là lỗi sơ đẳng. Có người gọi đó là lỗi ngớ ngẩn. Chỉ cần đúng ngày và tháng thôi. Để tôi sửa lại.
Tôi viết còn thiếu. Cả ngày và tháng đều không thể nhập với "0" ở đằng trước khi chúng < 10. Tức 5/8/2020 là đúng, còn 05/08/2020, 05/8/2020 và 5/08/2020 đều không chấp nhận.
Tôi đã sửa cả bài #38
Có 4 điểm cần chú ý:
– giữa Họ tên và ngày tháng chỉ có 1 phím TAB.
– cả ngày và tháng nếu < 10 thì đều không nhập "0" ở trước.
– sau mỗi dòng họ tên – ngày tháng thì nhấn Enter.
– tập tin ghi với encoding = Unicode.
Tập tin VBS
Từ đâu bạn có "ngày mốt" là "ng" & ChrW(224) & "y m" & ChrW(63) & "t"?
Rõ ràng 63 là code của ký tự "?".
Code của "ố" là 7889 = &H1ED1
2045
Theo tôi phải là "ng" & ChrW(224) & "y m" & ChrW(7889) & "t".
Hãy thử xem.
Lưu ý: ở Encoding (như trong hình bài #44) không chọn UTF-8. Chọn UTF-16 LE (thường dùng). LE có nghĩa là "Little Endian", BE là "Big Endian"
—————-
"ố" ở trên kia là "ố" dựng sẵn, có code = 7889 = &H1ED1
"ố" tổ hợp là sự tổ hợp, sự ghép của 2 ký tự: ký tự "ô" có điểm mã = 244 = &H00F4, và ký tự dấu thanh – dấu sắc có điểm mã = 769 = &H0301 – xem hình dưới. Vì thế cũng có thể dùng "ng" & ChrW(224) & "y m" & ChrW(244) & ChrW(769) & "t".
Ký tự "ô"
2044
Dấu sắc
2043
Trong tập tin Excel thì có thể viện lý do qui định này nọ, nhưng cái việc xác định sinh nhật nó không phải là văn bản gì quan trọng. Cái tập tin TXT kia là ta làm cho "mình" thôi. Qui định theo một cấu trúc nhất định chẳng qua để làm dễ mình – dễ code thôi. Cố gắng viết cho nó chuẩn để khỏi bẫy lỗi lên bẫy lỗi xuống. Một danh sách thậm chí 100, 1000 nhân viên thì cũng chỉ làm 1 lần. Sau đó cùng lắm là thỉnh thoảng sửa – thêm vào (nhân viên mới) hoặc xóa (sa thải). Cái "thỉnh thoảng" kia không phải thường xuyên, còn cái sửa kia không phải là nhiều cho mỗi lần.
Có một tập tin txt để dùng "ngoài giờ" thì bầy đặt văn bản, qui định để mà làm gì? Vẽ chuyện. Ngồi rỗi bày đặt này nọ. Rồi đến thời cái giấy nháp, cái giấy đi ngoài cũng phải theo qui định, hướng dẫn của Bộ, Ngành, Chính phủ? Đâu có phải đơn từ, văn bản hành chính gì mà phải theo qui định? Bó tay toàn tâp.
Riêng cái việc CODE trả về cho "à" và "ô" đều là 244 đủ để đá đít CODE. Để hiện "à" hay "ô" bạn đều dùng ChrW(244)?
Bạn nên lưu ý:
1. CODE trả về mã cho ký tự đầu tiên cho dù parameter có nhiều ký tự. "ồ" nếu gõ trong notepad, Excel bằng bàn phím Vietnamese sẽ cho ra unicode tổ hợp mà Len trong Excel trả về 2. Như thế chưa biết code của ký tự 1 có đúng không thì việc trả về code của ký tự đầu mà "ồ" lại có 2 ký tự đủ để loại CODE không được phép dùng.
2. Nếu tôi nhớ thì CODE trả về mã tương ứng với bộ ký tự được sử dụng bởi máy tính hiện hành. Tôi hiểu là như vậy thì cùng 1 ký tự nhưng CODE có thể trả về những kết quả khác nhau trên những máy khác nhau. ***
3. Nếu bạn đọc kỹ help thì sẽ thấy rằng bộ ký tự được sử dụng là ANSI, không phải UNICODE. Vì điểm 2 và 3 nên thực chất chỉ được dùng CODE cho bộ ký tự ASCII có mã từ 0 tới 127.
4. Không bao giờ được dùng CODE để lấy mã của ký tự unicode có điểm mã > 127. Về tiếng Việt nếu tra "tay" thì có thể dùng Tiêu chuẩn Việt Nam TCVN 6909-2001. Nhưng tra tay thì khổ nên thường người ta viết code – viết 1 lần dùng muôn đời.
***
help
2047
Trên máy tôi
2046
Tôi và bạn cùng đọc help, và tôi nghĩ là bạn giỏi tiếng Anh hơn tôi.
Theo tôi help đã nói rõ và tôi đã trích
Tức theo tôi có thể mỗi máy sẽ dùng bộ ký tự (character set) khác nhau. Bạn không biết CODE tính toán như thế nào và dùng bộ ký tự nào, tôi cũng không biết. Ta chỉ có thể đoán thôi. Gì chứ system của tôi chắc chắn 200% khác system của bạn. Tôi có Windows phiên bản Ba Lan. Vì vậy nếu nói về trang mã được dùng trong một vài trường hợp nào đó thì đó là trang mã mà Ba Lan dùng – Windows-1250 (Windows-1250 có các ký tự của Ba Lan, Windows-1258 – vietnamese có các ký tự của Việt Nam). Nếu Windows của bạn phiên bản tiếng Anh thì chắc chắn "cái trang mã kia" sẽ khác. Bộ ký tự của nó sẽ khác.
Có những cái ta phải chấp nhận nó như thế như thế, y như help nói rõ. Còn tại sao nó thế thì do không ai có code của bác Bill nên không ai rõ 100% là bác ấy làm thế nào. Riêng việc này thì tôi chấp nhận là system của bạn và của tôi không như nhau, do vậy bộ ký tự mà CODE dùng cũng không như nhau, kết quả là giá trị trả về không như nhau. Còn vặn vẹo tại sao thì chịu.
Nếu bạn đọc kỹ các bài của tôi thì bạn sẽ có hướng đi. Ít nhất thì bạn cũng sẽ có gợi ý, sẽ ngờ ngợ và chủ tâm kiểm tra.
Có thể hiểu được là "với các ký tự có điểm mã > 127" thì phải kiểm tra. Vì chỉ có các ký tự có điểm mã <= 127 mới bất di bất dịch. Vì thế phải có trong code If AscW(…) > 127 Then chứ không thể dùng If AscW(…) > 255 Then
Code sau sẽ trả về
"Ho" & ChrW(224) & "ng Tr" & ChrW(7885) & "ng Ngh" & ChrW(297) & "a"
và
"S" & ChrW(244) & "ng c" & ChrW(243) & " kh" & ChrW(250) & "c, ng" & ChrW(432) & ChrW(7901) & "i c" & ChrW(243) & " l" & ChrW(250) & "c"
Với những file thực thi (command) thì without BOM mới chạy được anh nhé (nhiều trường hợp phải là ANSI mới được).
2049
Em chỉnh lại code trong file một số chỗ..
Nguyên tắc là thế này. Tập tin dữ liệu thì dĩ nhiên phải chọn encoding đúng. Vd. văn bản tiếng Việt phải chọn ghi là unicode, hoặc UTF-8 tùy theo cách dùng sau đó. Tập tin chứa code luôn là tập tin chứa các ký tự có mã < 128. Vì thế các tập tin đó chọn encoding = ANSI. Chọn UTF-8 không có BOM được không? Được, nhưng UTF-8 để làm gì? Tổng quát thì mỗi ký tự trong bảng mã Unicode (vd. "a" cũng là ký tự trong bảng mã Unicode) sẽ được encoding = UTF-8 bằng 1 bai, 2 bai hoặc 3 bai. Các ký tự có mã < 128 chắc chắn 200% được mã bằng 1 bai, tức y như khi dùng ANSI. Tức cùng 1 tập tin mà dùng ANSI hay UTF-8 không có BOM thì xét về mặt bai thì 2 kiểu thực ra là như nhau tới "từng dấu chấm dấu phẩy". Tất nhiên nếu bạn chọn ANSI cho tập tin đính kèm của bạn thì bạn sẽ được cảnh báo là tập tin có unicode, nếu dùng ANSI sẽ bị mất, bla bla. Yên tâm đi, tập tin code thì làm gì có unicode. Nhưng notepad cảnh báo vì trong nội dung có comment 'Hôm nay là sinh nhật', 'Ngày mai là sinh nhật', 'Ngày mốt là sinh nhật'. Ngoài những comment này thì mọi chuỗi tiếng Việt đã được biến thành ChrW rồi. Nếu không được biến thành ChrW thì khi hiển thị trong cửa sổ msgbox chúng sẽ là "đầu trâu mặt ngựa" nên lúc đó nếu dùng ANSI để ghi thì hậu quả cũng y hệt thế. Nhưng nếu bạn muốn giữ những comment này bằng tiếng Việt thì lúc đó bạn dùng UTF-8 không có BOM.
Trong VBScript, để truyền tham số thì dùng:
WScript.Arguments (0)
WScript.Arguments (1)
…
Truyền tham số trong VBA thì tôi biết. Chưa làm thử trong Task Schudler.
Lỗi kìa anh .
2053
VBScript có hàm FormatDateTime(date,format)
2055
Kết quả trả về theo theo lập trong hệ thống của Windows.
2054
Vậy chỉnh như này đi anh.
2056
Thế thì bạn phải nói rõ ra, nói nửa câu thì ai biết kết quả "cho ra" ở đâu. Bạn đọc bài #110 bạn có hiểu là phải như bài #112 không?
Khi xuống dòng trong ô trên sheet thì Excel chỉ chèn 1 ký tự vbLf. Bình thường xuống dòng trong vd. notepad là 2 ký tự vbCr và vbLf, tức vbCrLf.
100 người thì 100 mong muốn, hàm thì là hàm tổng quát. Không có chuyện sửa theo ý từng người được. Tự xoay xở thôi.
Nếu tôi hiểu ý thì
Công thức cho B1
-> copy B1 và dán vào sau MsgBox …, vào chỗ …
Tôi muốn nói tới nguyên tắc của tôi. Nếu tôi sửa cho 1 người rồi sẽ có người thứ 2 thứ 3. Mỗi người tự sửa thôi. Hoặc bạn làm hộ họ.
Tôi có nguyên tắc chứ không phải cứ hô là tôi phải làm. Tôi không "phải" cái gì cả. Nếu hứng lên thì có thể tôi cũng làm. Nhưng không bắt buộc, không phải là ai đó muốn là tôi phải giúp.
Mục Action làm như hình
2059
Không đúng rồi anh ơi.
Bạn ở bài #34 làm lèo cái được luôn, chẳng nhẽ anh Nghĩa đẹp dzai không mần được. :p
2062
—–
Anh đổi lại program thành
wscript.exe
để không hiện cửa sổ terminal.
Hồi trước có vọc file vbs này (để ghi lại lịch sử người dùng gõ gì chủ yếu là phá đám tụi nhỏ chơi đó mà) nhưng chưa đụng tới cái Task Schedule bao giờ. Cám ơn befaint nhiều nhé, giờ nó đã hiện hình rồi! Kakaka.
Thêm chữ W vào: wscript.exe
Bạn cũng có thể tạo 1 shortcut trong thư mục
C:UsersUsernameAppDataRoamingMicrosoftWindowsMenu StartProgramyStartup
Ví dụ về cách tạo shortcut: phải chuột trên tập tin VBS -> "Send to" -> Desktop (create shortcut) -> mở thư mục có đường dẫn ở trên -> kéo shortcut từ Desktop vào thư mục -> khởi động lại máy tính -> xong phim.
Từ lúc này mỗi lần đăng nhập Windows thì VBS sẽ được thực thi.