[TẶNG] File quản lý ngày sinh nhật.

Hoàng Trọng Nghĩa

Chuyên gia GPE
Thành viên BQT
Moderator
Tham gia ngày
17 Tháng tám 2008
Bài viết
7,738
Được thích
15,374
Điểm
1,910
Tuổi
44
Nơi ở
TPHCM
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:\Users\Administrator\Desktop\DanhsachSN.txt"

'# Run sub'
notify_birthday(source_file)

Sub notify_birthday(byval file_path)
Dim obj_fso, text_stream, next_days
Dim stext, i, str_line
Set obj_fso = CreateObject("Scripting.FileSystemObject")
Set text_stream = obj_fso_OpenTextFile(file_path,,,-2)
next_days = 0 'Hôm nay là sinh nhật'
'next_days = 1 'Ngày mai là sinh nhật'
'next_days = 2 'Ngày kia là sinh nhật'
stext = "Danh s" & ChrW(225) & "ch sinh nh" & ChrW(7853) & "t ng" & ChrW(224) & "y [" & Date + next_days & "]:"
Do while not text_stream.AtEndOfStream
line = text_stream.ReadLine
str_line = split(line, vbTab)
x = Date + next_days
If Trim(str_line(1)) = day(x) & "/" & month(x) & "/" & year(x) Then
i = i + 1
stext = stext & Chr(10) & i & ". " & str_line(0)
End If
Loop
Set obj_fso = Nothing
msgbox stext,, "Th" & ChrW(244) & "ng b" & ChrW(225) & "o sinh nh" & ChrW(7853) & "t"
End Sub
Mặc dù code của Thầy có hiển thị Unicode, nhưng không cho ra danh sách ạ! Sẳn tiện làm luôn một cái thông báo chứa thông tin 3 danh sách, sinh nhật hôm nay, sinh nhật ngày mai, sinh nhật ngày mốt luôn được không Thầy?

2020-10-18_150732.png
 
Lần chỉnh sửa cuối:

batman1

Thành viên gạo cội
Tham gia ngày
8 Tháng chín 2014
Bài viết
3,562
Được thích
5,445
Điểm
560
Mặc dù code của Thầy có hiển thị Unicode, nhưng không cho ra danh sách ạ! Sẳn tiện làm luôn một cái thông báo chứa thông tin 3 danh sách, sinh nhật hôm nay, sinh nhật ngày mai, sinh nhật ngày mốt luôn được không Thầy?

View attachment 247641
Đã 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
'# Change with your file'
source_file = "C:\Users\Administrator\Desktop\DanhsachSN.txt"

'# Run sub'
notify_birthday(source_file)

Sub notify_birthday(byval file_path)
Dim obj_fso, text_stream, next_days, ngaythang
Dim stext, i, str_line
Set obj_fso = CreateObject("Scripting.FileSystemObject")
Set text_stream = obj_fso_OpenTextFile(file_path,,,-2)
next_days = 0 'Hôm nay là sinh nhật'
'next_days = 1 'Ngày mai là sinh nhật'
'next_days = 2 'Ngày kia là sinh nhật'
stext = "Danh s" & ChrW(225) & "ch sinh nh" & ChrW(7853) & "t ng" & ChrW(224) & "y [" & Date + next_days & "]:"
Do while not text_stream.AtEndOfStream
line = text_stream.ReadLine
str_line = split(line, vbTab)
x = Date + next_days
ngaythang = split(Trim(str_line(1)), "/")
if ubound(ngaythang) = 2 then
If ngaythang(0) & "/" & ngaythang(1) = day(x) & "/" & month(x) Then
i = i + 1
stext = stext & Chr(10) & i & ". " & str_line(0)
End If
End If
Loop
Set obj_fso = Nothing
msgbox stext,, "Th" & ChrW(244) & "ng b" & ChrW(225) & "o sinh nh" & ChrW(7853) & "t"
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:

Hoàng Trọng Nghĩa

Chuyên gia GPE
Thành viên BQT
Moderator
Tham gia ngày
17 Tháng tám 2008
Bài viết
7,738
Được thích
15,374
Điểm
1,910
Tuổi
44
Nơi ở
TPHCM
Đã 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
'# Change with your file'
source_file = "C:\Users\Administrator\Desktop\DanhsachSN.txt"

'# Run sub'
notify_birthday(source_file)

Sub notify_birthday(byval file_path)
Dim obj_fso, text_stream, next_days, ngaythang
Dim stext, i, str_line
Set obj_fso = CreateObject("Scripting.FileSystemObject")
Set text_stream = obj_fso_OpenTextFile(file_path,,,-2)
next_days = 0 'Hôm nay là sinh nhật'
'next_days = 1 'Ngày mai là sinh nhật'
'next_days = 2 'Ngày kia là sinh nhật'
stext = "Danh s" & ChrW(225) & "ch sinh nh" & ChrW(7853) & "t ng" & ChrW(224) & "y [" & Date + next_days & "]:"
Do while not text_stream.AtEndOfStream
line = text_stream.ReadLine
str_line = split(line, vbTab)
x = Date + next_days
ngaythang = split(Trim(str_line(1)), "/")
if ubound(ngaythang) = 2 then
If ngaythang(0) & "/" & ngaythang(1) = day(x) & "/" & month(x) Then
i = i + 1
stext = stext & Chr(10) & i & ". " & str_line(0)
End If
End If
Loop
Set obj_fso = Nothing
msgbox stext,, "Th" & ChrW(244) & "ng b" & ChrW(225) & "o sinh nh" & ChrW(7853) & "t"
End Sub
Thưa Thầy, nhưng mình có thể làm sao để hiển thị được danh sách là Unicode ạ?

Tính ghi "Sinh nhật vào ngày mốt" không hiển thị được chữ "mốt", mặc dù có ghi như vầy:
"ng" & ChrW(224) & "y m" & ChrW(63) & "t"

Khó hiểu cái này thật đó!

2020-10-18_150732.png

unicode.png
 
Lần chỉnh sửa cuối:

batman1

Thành viên gạo cội
Tham gia ngày
8 Tháng chín 2014
Bài viết
3,562
Được thích
5,445
Điểm
560
Thưa Thầy, nhưng mình có thể làm sao để hiển thị được danh sách là Unicode ạ?
Tính ghi "Sinh nhật vào ngày mốt" không hiển thị được chữ "mốt", mặc dù có ghi như vầy:
"ng" & ChrW(224) & "y m" & ChrW(63) & "t"

Khó hiểu cái này thật đó!
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

cho o.jpg

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ự "ô"

cho o1.jpg

Dấu sắc

cho o2.jpg
 
Lần chỉnh sửa cuối:

SA_DQ

/(hông là gì!
Thành viên danh dự
Tham gia ngày
8 Tháng sáu 2006
Bài viết
11,849
Được thích
17,778
Điểm
1,860
Theo văn bản của Bộ Nội vụ thì cách ghi ngày tháng qui định như sau
Về trị ngày: Với những ngày (X) nhỏ hơn 10 phải ghi là 0X
Với tháng thì những tháng bé hơn 3 phải ghi là 0X,
(Nên hiểu là ta không bao giờ có tháng 13, mà chỉ có tiền thưởng tháng 13 mà thôi - vui nha các bạn)
Như vậy trong giấy tờ sổ sách ta khó lòng viết thêm hay chỉnh sửa các văn bản mang tính pháp lý. Đó là mục đích mà Bộ này hướng tới

[Mình hiểu rằng văn bản này không cấm viết 13/07/1234]
 

batman1

Thành viên gạo cội
Tham gia ngày
8 Tháng chín 2014
Bài viết
3,562
Được thích
5,445
Điểm
560
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.
 
Lần chỉnh sửa cuối:

ongke0711

Thành viên tiêu biểu
Tham gia ngày
7 Tháng chín 2006
Bài viết
733
Được thích
838
Điểm
860
Nơi ở
HCM
Qui định ghi 01, 02 không phải để cho dễ nhìn mà là để tránh bị sai, sửa thông tin. Tôi ghi giấy tờ bằng tay cũng ghi là “Quận 01” chứ không ghi “Quận 1”, lỡ gặp người gian nó thêm số 1, 2 thành quận 11, 12 thì hoá ra sai địa chỉ, không hợp lệ giấy tờ.
 

SA_DQ

/(hông là gì!
Thành viên danh dự
Tham gia ngày
8 Tháng sáu 2006
Bài viết
11,849
Được thích
17,778
Điểm
1,860
Tôi nêu cách ghi ngày tháng như trên để mọi người dân trên lãnh thổ có thêm í thức luật pháp về vấn đề đó như thế nào; Nghĩ rằng đó là 1 tham khảo không thừa!
 

Cá ngừ F1

Thành viên gắn bó
Thành viên BQT
Moderator
Tham gia ngày
1 Tháng một 2008
Bài viết
2,098
Được thích
3,217
Điểm
910
Tuổi
37
Nơi ở
Đảo Đào Hoa
Cái file của anh chỉ đơn giản là sếp hỏi tháng này bao nhiêu người sinh nhật, thuộc phòng ban nào, thế là filter theo tháng (hoặc filter theo màu xanh ngọc) và phòng ban là có thể in danh sách ra được rồi. Nếu làm file thông báo tùm lum thì chỉ có báo được đúng ngày sinh nhật là ngày hiện hành thôi, chứ yêu cầu báo tổng hợp theo tháng thì ngày nào trong tháng nó cũng thông báo nguyên cái danh sách sinh nhật trong tháng chắc tức cười dữ!
Vâng, e thấy thực tế thì mọi người cũng ngại mở file excel chỉ để xem ngày SN, thường thì hay mở web hơn, nên có ý tưởng vậy ạ.
 

ptm0412

Bad Excel Member
Thành viên BQT
Super Moderator
Tham gia ngày
4 Tháng mười một 2007
Bài viết
9,924
Được thích
29,653
Điểm
1,910
Tuổi
58
Nơi ở
Gò Vấp
Tôi nêu cách ghi ngày tháng như trên để mọi người dân trên lãnh thổ có thêm í thức luật pháp về vấn đề đó như thế nào; Nghĩ rằng đó là 1 tham khảo không thừa!
Nhưng có trường hợp không cần vì cái quy định đó không áp dụng, cụ thể là trường hợp riêng tư. Quy định chỉ áp dụng đối với văn bản giao dịch qua lại với nhau giữa các pháp nhân, văn bản giữa pháp nhân và nhà nước. Cho nên trong trường hợp này là thừa. Thừa chắc luôn
 

Hoàng Trọng Nghĩa

Chuyên gia GPE
Thành viên BQT
Moderator
Tham gia ngày
17 Tháng tám 2008
Bài viết
7,738
Được thích
15,374
Điểm
1,910
Tuổi
44
Nơi ở
TPHCM
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

View attachment 247655

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ự "ô"

View attachment 247656

Dấu sắc

View attachment 247657
2020-10-18_150732.png

Cái này Excel có hàm mà Thầy? Chữ à là 224, chữ ô là 244 y chang như Thầy viết thôi chứ có gì khác đâu.
 

ptm0412

Bad Excel Member
Thành viên BQT
Super Moderator
Tham gia ngày
4 Tháng mười một 2007
Bài viết
9,924
Được thích
29,653
Điểm
1,910
Tuổi
58
Nơi ở
Gò Vấp

Hoàng Trọng Nghĩa

Chuyên gia GPE
Thành viên BQT
Moderator
Tham gia ngày
17 Tháng tám 2008
Bài viết
7,738
Được thích
15,374
Điểm
1,910
Tuổi
44
Nơi ở
TPHCM

befaint

|||||||||||||
Tham gia ngày
6 Tháng một 2011
Bài viết
10,028
Được thích
11,793
Điểm
1,560
VBScript có hàm FormatDateTime(date,format)

Kết quả trả về theo theo lập trong hệ thống của Windows.
1603082098228.png


Nếu muốn định dạng khác theo ý muốn nào đó thì có thể viết function đại khái như này.

1603082328551.png
 

ptm0412

Bad Excel Member
Thành viên BQT
Super Moderator
Tham gia ngày
4 Tháng mười một 2007
Bài viết
9,924
Được thích
29,653
Điểm
1,910
Tuổi
58
Nơi ở
Gò Vấp

Hoàng Trọng Nghĩa

Chuyên gia GPE
Thành viên BQT
Moderator
Tham gia ngày
17 Tháng tám 2008
Bài viết
7,738
Được thích
15,374
Điểm
1,910
Tuổi
44
Nơi ở
TPHCM
Về lý thuyết thì sau khi ngạc nhiên ố ồ thì có câu cám ơn
Cả ở đây nữa
Về lý thuyết thì sau khi ngạc nhiên ố ồ thì có câu cám ơn
Cả ở đây nữa
Về nguyên tắc trong diễn đàn thì bấm LIKE cũng đã thay chữ Cảm ơn rồi hen. Mà thôi, 2 bài lão chết tiệt muốn cám ơn thì mình cám ơn, ghi thêm vài chữ chết lão nào đâu!
Cám ơn cho bài đầu và cám ơn cho bài giữa luôn cả cám ơn cho bài này nha! kakakkaa
Bài đã được tự động gộp:

VBScript có hàm FormatDateTime(date,format)

Kết quả trả về theo theo lập trong hệ thống của Windows.
View attachment 247685


Nếu muốn định dạng khác theo ý muốn nào đó thì có thể viết function đại khái như này.

View attachment 247688
Nó cũng có hàm FormatNumber, nhưng làm sao để định dạng những con số dưới 10 thành 01, 02,..., 09 được bạn?
 
Lần chỉnh sửa cuối:
Top Bottom