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

Chia sẻ bởi:hands
★★★★★
Quảng cáo

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/

Khoá học Trưởng phòng nhân sự
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
★★★★★ 5 ★ 1 👤 6 ▥ 0
Quảng cáo

Bạn nên đọc

6 Responses

  1. hands says:

    Làm dạng addin có thông báo khi sắp đến ngày sinh nhật của ai đó sẽ hay hơn.

    Đúng rồi nếu có được cái tính năng này thì tuyệt quá anh, không phải mở file quản lý sinh nhật lên để kiểm tra ạ.

    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.

    không phải mở file quản lý sinh nhật lên để kiểm tra

    Đâ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.

    Xin chào befaint
    File txt khó xem hơn file excel nhiều ạ, OT vẫn thích excel hơn vì muốn thêm thông tin các trường gì vào nó cũng dễ nhìn hơn là txt ạ.

    Đ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.

    Hic, OT chưa hiểu nguyên lý hoạt động liên kết giữa excel và file txt để tạo ra file VBScript tự động đó thế nào hihi.
    Cảm ơn bạn.

    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

    Hic OT nhìn vào những file dạng này thì không hiểu gì luôn rồi và cũng không có tham vọng muốn tìm hiểu dạng file này nữa.
    Cảm ơn befaint đã chỉ dẫn.

    Cái này kiến thức mới (với mình) – befaint có thể demo xem thử 1 đoạn code script để mình học hỏi được không?
    Cách thông báo này cũng thú vị, mấy chị nhân sự lười mở file excel để xem.

    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.

    Mình gửi befaint – cảm ơn bạn.

    Bạn thử nhé .

    Cảm ơn Befaint.
    Change soure file "source_file = "C:UsersuserDesktoptask SDanhsachSN.txt" trong "notify birthday.vbs" sau đó add vào Task scheduler và mình đã làm được. Sang tuần qua cài cho chị nhân sự ở công ty, hihi.
    2040

  2. hands says:

    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
    ——-

    Yêu cầu về tập tin DanhsachSN.txt còn thiếu. Yêu cầu đọc thêm bài dưới

    Đã 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

    [COLOR=rgb(0, 0, 255)]'# Change with your file'
    source_file = "C:UsersAdministratorDesktopDanhsachSN.txt"[/COLOR]
    
    '# 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
  3. hands says:

    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 đó!
    2042

    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

    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]

    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.

    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.

    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

    Cám ơn Thầy đã cung cấp nhiều thông tin, nhưng sao máy em cho ra kết quả khác đó Thầy!

    2048

    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

    The returned code corresponds to the character set used by your computer.

    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.

    Trước có sưu tầm một cái hàm chuyển văn bản trả về một chuỗi có chứa các code như ta có chuỗi Hoàng Trọng Nghĩa cho ra kết quả "Hoàng Tr" & ChrW(7885) & "ng Ngh" & ChrW(297) & "a", tuy nhiên các chữ à, á, ô, … nó vẫn để nguyên mà không mã hóa, nên như Thầy nói, một số máy nó không đọc được, cụ thể là trong dạng .vbs này.
    Vậy nhờ Thầy cho em cái hàm nào mà nó đầy đủ tất cả các trường hợp dấu tiếng Việt đi ạ. Xin trân trọng cảm ơn.

    phải cái này không Anh.

    "Hoàng Tr" & ChrW(7885) & "ng Ngh" & ChrW(297) & "a"

    Function UniVba(TxtUni As String) As String
    If TxtUni = "" Then
      UniVba = """"""
    Else
      TxtUni = TxtUni & " "
      If AscW(Left(TxtUni, 1)) < 256 Then UniVba = """"
      For n = 1 To Len(TxtUni) - 1
        uni1 = Mid(TxtUni, n, 1)
        uni2 = AscW(Mid(TxtUni, n + 1, 1))
        If AscW(uni1) > 255 And uni2 > 255 Then
          UniVba = UniVba & "ChrW(" & AscW(uni1) & ") & "
        ElseIf AscW(uni1) > 255 And uni2 < 256 Then
          UniVba = UniVba & "ChrW(" & AscW(uni1) & ") & """
        ElseIf AscW(uni1) < 256 And uni2 > 255 Then
          UniVba = UniVba & uni1 & """ & "
        Else
          UniVba = UniVba & uni1
        End If
      Next
      If Right(UniVba, 4) = " & """ Then
        UniVba = Mid(UniVba, 1, Len(UniVba) - 4)
      Else
        UniVba = UniVba & """"
      End If
    End If
    End Function

    Đúng là cái hàm này đó em, nhưng em thấy đó chữ à nó vẫn để nguyên chữ à chứ nó không mã hóa thành ChrW(224).
    Chuỗi: Hoàng Trọng Nghĩa
    Mã hóa toàn bộ: "Ho" & ChrW(224) & "ng Tr" & ChrW(7885) & "ng Ngh" & ChrW(297) & "a"
    Còn hàm này nó cho ra kết quả: "Hoàng Tr" & ChrW(7885) & "ng Ngh" & ChrW(297) & "a"
    Sông có khúc, người có lúc
    Kết quả: "Sông có khúc, ng" & ChrW(432) & ChrW(7901) & "i có lúc"

    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"

    Function TaoChuoiMa(ByVal text As String) As String
    Dim k As Long, start As Long, kytu As String, s As String, result As String
        s = text
        start = 1
        For k = 1 To Len(s)
            kytu = Mid(s, k, 1)
            If AscW(kytu) > 127 Then
                If start < k Then
                    result = result & " & " & Chr(34) & Mid(s, start, k - start) & Chr(34) & " & ChrW(" & AscW(kytu) & ")"
                Else
                    result = result & " & ChrW(" & AscW(kytu) & ")"
                End If
                start = k + 1
            End If
        Next k
        If start < k Then result = result & " & " & Chr(34) & Mid(s, start, k - start) & Chr(34)
        If Left(result, 2) = " &" Then result = Mid(result, 4)
        TaoChuoiMa = result
    End Function
  4. hands says:

    2051

    Lạ kỳ thiệt đó mọi người ơi, hôm qua click vô chạy bình thường, thế mà hôm nay lại báo lỗi. Tại dòng 1 ký tự 1 là một dấu nháy (') thôi mà?! Ai biết tại sao chỉ mình với, mình không quen sử dụng cái vụ này!
    Code của nó:

    source_file = "D:NhacSinhNhatDanhsachSN.txt"
    
    '# Run sub'
    notify_birthday(source_file)
    
    Sub notify_birthday(byval file_path)
        file_path = source_file
        Dim obj_fso, text_stream, next_days1, next_days2, next_days3, ngaythang
        Dim stext1, str_line, str_line2, stext2, stext3, stext
        Dim i, j, k, x, y, z
        Set obj_fso = CreateObject("Scripting.FileSystemObject")
        Set text_stream = obj_fso.OpenTextFile(file_path, , , -2)
        next_days1 = 0 'Hôm nay là sinh nhật'
        next_days2 = 1 'Ngày mai là sinh nhật'
        next_days3 = 2 'Ngày mốt là sinh nhật'
    
    stext1 = "Danh s" & ChrW(225) & "ch sinh nh" & ChrW(7853) & "t h" & ChrW(244) & "m nay [" & Date + next_days1 & "]:"
        stext2 = "Danh s" & ChrW(225) & "ch sinh nh" & ChrW(7853) & "t ng" & ChrW(224) & "y mai [" & Date + next_days2 & "]:"
        stext3 = "Danh s" & ChrW(225) & "ch sinh nh" & ChrW(7853) & "t ng" & ChrW(224) & "y m" & ChrW(7889) & "t [" & Date + next_days3 & "]:"
    
    Do While Not text_stream.AtEndOfStream
            Line = text_stream.ReadLine
            str_line = Split(Line, vbTab)
            x = Date + next_days1
            y = Date + next_days2
            z = Date + next_days3
            ngaythang = Split(Trim(str_line(1)), "/")
            If UBound(ngaythang) = 2 Then
                If ngaythang(0) & "/" & ngaythang(1) = Day(x) & "/" & Month(x) Then
                    i = i + 1
                    stext1 = stext1 & Chr(10) & i & ". " & str_line(0)
                End If
                If ngaythang(0) & "/" & ngaythang(1) = Day(y) & "/" & Month(y) Then
                    j = j + 1
                    stext2 = stext2 & Chr(10) & j & ". " & str_line(0)
                End If
                If ngaythang(0) & "/" & ngaythang(1) = Day(z) & "/" & Month(z) Then
                    k = k + 1
                    stext3 = stext3 & Chr(10) & k & ". " & str_line(0)
                End If
            End If
        Loop
        Set obj_fso = Nothing
        If i + j + k > 0 Then
            If i > 0 And j > 0 And k > 0 Then
                stext = stext1 & Chr(10) & Chr(10) & stext2 & Chr(10) & Chr(10) & stext3
            ElseIf i > 0 And j > 0 And k = 0 Then
                stext = stext1 & Chr(10) & Chr(10) & stext2
            ElseIf i > 0 And j = 0 And k > 0 Then
                stext = stext1 & Chr(10) & Chr(10) & stext3
            ElseIf i = 0 And j > 0 And k > 0 Then
                stext = stext2 & Chr(10) & Chr(10) & stext3
            ElseIf i > 0 And j = 0 And k = 0 Then
                stext = stext1
            ElseIf i = 0 And j > 0 And k = 0 Then
                stext = stext2
            ElseIf i = 0 And j = 0 And k > 0 Then
                stext = stext3
            End If
            MsgBox stext, , "TH" & ChrW(212) & "NG B" & ChrW(193) & "O SINH NH" & ChrW(7852) & "T"
        End If
    End Sub

    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.

    Cám ơn em, tuy nhiên em thêm cái hàm GetDate vào, cơ bản nó không so sánh được nhé:

    2052

    Một cái theo năm hiện hành, cái theo ngày sinh thực tế sao so sánh được em ơi.

    Cái hàm đó nên sửa như vầy là ổn:

    Function GetDate(ByVal str_date)
        Const sdeli = "/"
        Dim dd, mm, yy, tmp
        tmp = Split(str_date, sdeli)
        GetDate = DateSerial(1900, 1, 0)
        If UBound(tmp) >= 2 Then
            dd = tmp(0)
            mm = tmp(1)
            yy = Year(Date) '<= sửa chỗ này'
            If IsNumeric(mm) = True And IsNumeric(dd) = True And IsNumeric(yy) = True Then
                GetDate = DateSerial(yy, mm, dd)
            End If
        End If
    End Function

    Sẵn tiện bài này, cho mình hỏi, thay vì ghi source_file = đường dẫn, ta thay đổi kiểu giống như ThisWorkbook.Path & tên file, mình phải làm thế nào để có đường dẫn giống như thế vậy anh em?

    Trong VBScript, để truyền tham số thì dùng:
    WScript.Arguments (0)
    WScript.Arguments (1)

    Dim source_file
    
    'source_file = "D:NhacSinhNhatDanhsachSN.txt"
    source_file= WScript.Arguments(0)

    Truyền tham số trong VBA thì tôi biết. Chưa làm thử trong Task Schudler.

    Dim path As String
        path = "C:TempDSSN.txt"
    
    Shell "WScript """ & CurrentProject.Path & ""notify_birthday.vbs"" """ & _
                      path & """ """, vbHide

    Anh thử vầy xem:

    Dim WshShell, currentFolder
    Set WshShell = WScript.CreateObject("WScript.Shell")
    currentFolder = WshShell.CurrentDirectory
    msgbox currentFolder

    Hoặc

    Dim fso, currentFolder
    Set fso = CreateObject("Scripting.FileSystemObject")
    currentFolder = fso.GetParentFolderName(WScript.ScriptFullName)
    msgbox currentFolder

    Sao cũng làm như bạn hướng dẫn mà máy báo lỗi ta?

    Sub notify_birthday()
        Dim obj_fso, text_stream, next_days1, next_days2, next_days3, ngaythang
        Dim stext1, str_line, stext2, stext3, stext,currentFolder
        Dim i, j, k, x, y, z
        Set obj_fso = CreateObject("Scripting.FileSystemObject")
        currentFolder = obj_fso.GetParentFolderName(WScript.ScriptFullName) & DanhsachSN.txt"
    
    Set text_stream = obj_fso.OpenTextFile(currentFolder, , , -2)
    
    next_days1 = 0 'Hom nay sinh nhat'
        next_days2 = 1 'Ngay mai sinh nhat'
        next_days3 = 2 'Ngay mot sinh nhat'
    
    stext1 = "Danh s" & ChrW(225) & "ch sinh nh" & ChrW(7853) & "t h" & ChrW(244) & "m nay [" & Date + next_days1 & "]:"
        stext2 = "Danh s" & ChrW(225) & "ch sinh nh" & ChrW(7853) & "t ng" & ChrW(224) & "y mai [" & Date + next_days2 & "]:"
        stext3 = "Danh s" & ChrW(225) & "ch sinh nh" & ChrW(7853) & "t ng" & ChrW(224) & "y m" & ChrW(7889) & "t [" & Date + next_days3 & "]:"
    
    'cho ra ngoai vong lap'
        x = Date + next_days1
        y = Date + next_days2
        z = Date + next_days3
    
    Do While Not text_stream.AtEndOfStream
            Line = text_stream.ReadLine
            str_line = Split(Line, vbTab)
    
    ngaythang = GetDate(Trim(str_line(1)))
            If ngaythang = x Then
                i = i + 1
                stext1 = stext1 & Chr(10) & i & ". " & str_line(0)
            ElseIf ngaythang = y Then
                j = j + 1
                stext2 = stext2 & Chr(10) & j & ". " & str_line(0)
            ElseIf ngaythang = z Then
                k = k + 1
                stext3 = stext3 & Chr(10) & k & ". " & str_line(0)
            End If
        Loop
    
    Set obj_fso = Nothing
        If i + j + k > 0 Then
            If i > 0 And j > 0 And k > 0 Then
                stext = stext1 & Chr(10) & Chr(10) & stext2 & Chr(10) & Chr(10) & stext3
            ElseIf i > 0 And j > 0 And k = 0 Then
                stext = stext1 & Chr(10) & Chr(10) & stext2
            ElseIf i > 0 And j = 0 And k > 0 Then
                stext = stext1 & Chr(10) & Chr(10) & stext3
            ElseIf i = 0 And j > 0 And k > 0 Then
                stext = stext2 & Chr(10) & Chr(10) & stext3
            ElseIf i > 0 And j = 0 And k = 0 Then
                stext = stext1
            ElseIf i = 0 And j > 0 And k = 0 Then
                stext = stext2
            ElseIf i = 0 And j = 0 And k > 0 Then
                stext = stext3
            End If
            MsgBox stext, , "TH" & ChrW(212) & "NG B" & ChrW(193) & "O SINH NH" & ChrW(7852) & "T"
        End If
    End Sub

    Lỗi kìa anh .
    2053

    Uh, cám ơn em, thấy rồi, do viết luôn trên đó nên không phát hiện được lỗi, chứ viết trên VBE của Excel là biết ngay rồi.

    Mình đâu có định dạng trong file .vbs theo kiểu Format(Date,"dd/mm/yyyy") được phải không Thầy Batman1? Vậy có thể dùng hàm gì thì được ạ?

    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

    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?

    Vậy chỉnh như này đi anh.
    2056

  5. hands says:

    Nếu như ô A1 em nhập chuỗi có xuống dòng thì công thức tại ô B1 =TaoChuoiMa(A1)
    Sau đó em copy cái kết quả đó vào VBA chứ có định dạng gì ở ô B1 đâu bác? Cái đó em làm nguồn cho MsgBox chứ có làm gì ở trên sheet đâu mà cho nó Wrap text? Vì thế em mới nhờ bác hiệu chỉnh lại nếu gặp chuỗi có AscW(…) =10 thì đổi thành vbLf giúp em.
    Cám ơn bác.

    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

    =TaoChuoiMa(SUBSTITUTE(A1;CHAR(10);""" & vbCrLf & """))
    
    hoặc thử
    
    =TaoChuoiMa(SUBSTITUTE(A1;CHAR(10);""" & vbLf & """))

    -> copy B1 và dán vào sau MsgBox …, vào chỗ …

    Như vậy cái hàm đó cũng xử lý theo kiểu này là OK nè:

    TaoChuoiMa = Replace(result, Chr(10), """ & vbLf & """)

    Đơn giản rồi Thầy nhỉ? Khỏi phức tạp vụ.

    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.

  6. hands says:

    Anh @Hoàng Trọng Nghĩa ơi, anh [URL='www.giaiphapexcel.com/diendan/goto/post?id=997440']befaint ơi….
    em làm giống như các hướng dẫn :
    1/ file DanhsachSN.txt: <tên><Tab><ngày/tháng/năm> và save với UTF-16 LE
    2/ file notify birthday.vbs lấy từ bài #43 của Bác Batnam1.
    3/ để vào task schedule:
    2058

    mà sao em không thấy "hiện thông báo gì hết vậy anh?

    ————

    Em thử chạy code trên Excel thì khi bỏ kết quả trên Cell thì OK nhưng hiện ra trên msgbox thì không ra Unicode được…
    2057
    hic mò hoài mà hổng ra luôn… anh chỉ dđiểm giúp em với.
    Cám ơn anh nhiều….

    Mục Action làm như hình
    2059

    Làm y rang trong hình, nhưng nó vẫn không chạy bạn ơi, còn thiếu gì nữa nhỉ?

    2061

    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.

    hic.. không biết có sai gì không mà task schedule nó vẫn im re… anh ơi
    vì nhìn không rõ nên không biết là dấu " hay ' nên em làm thử 2 cái luôn nó vẫn im re….
    2060
    Cám ơn anh

    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.

    hic… của em vẫn chưa hiện hình được…. sai gì nữa ta?
    —————————–
    Edit:
    Dạ, cám ơn các anh nhiều lắm!
    Em đã làm được rồi.
    Nguyên nhân là lúc đầu em làm bằng "Create Task", sau đó em xóa làm lại bằng "Create Basic Task" thì lại OK
    Không hiểu tại sao luôn….

    Thêm chữ W vào: wscript.exe

    hic… của em vẫn chưa hiện hình được…. sai gì nữa ta?
    —————————–
    Edit:
    Dạ, cám ơn các anh nhiều lắm!
    Em đã làm được rồi.
    Nguyên nhân là lúc đầu em làm bằng "Create Task", sau đó em xóa làm lại bằng "Create Basic Task" thì lại OK
    Không hiểu tại sao luôn….

    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.

Leave a Reply

Your email address will not be published. Required fields are marked *

Quảng cáo

Cũ vẫn chất

Xem thêm