• Thứ Sáu, 19/12/2003 10:15 (GMT+7)

    Câu hỏi :
    Trong Excel làm cách nào đếm đươc tháng hiện tại có bao nhiêu ngày thứ hai, thứ ba,. .?

    Trả lời :

    Bất kỳ ngôn ngữ lập trình nào cũng có thể giúp bạn giải quyết vấn đề này, ở  đây là đếm số ngày thứ hai, thứ ba,... chủ nhật trong tháng hiện tại. Điều cốt lõi là giải thuật đếm ngày trong tháng, nếu bạn đã biết giải thuật thì chỉ cần miêu tả giải thuật bằng ngôn ngữ ưa thích. Trong Excel, bạn có thể dùng VBA để viết macro giải quyết vấn đề nào đó. Thí dụ đoạn macro sau sẽ giải quyết vấn đề của bạn:

    Option Explicit

    ‘ Khai báo kiểu chứa thông tin thời gian

    Private Type SYSTEMTIME

        wYear As Integer

        wMonth As Integer

        wDayOfWeek As Integer

        wDay As Integer

        wHour As Integer

        wMinute As Integer

        wSecond As Integer

        wMilliseconds As Integer

    End Type

    ‘ Khai báo hàm API của Windows

    Private Declare Sub GetLocalTime Lib “kernel32” (lpSystemTime As SYSTEMTIME)

    ‘ Khai báo biến cần dùng

    Dim Days(0 To 6) As Integer

    Dim MinDay As Integer

    Dim MaxDay As Integer

    ‘ Macro đếm ngày

    Sub DayCount()

    Dim lpSystemTime As SYSTEMTIME

    Dim iday As Integer

    Dim idayofweek As Integer

        ‘ Khởi động counter ban đầu

        For idayofweek = 0 To 6

            Days(idayofweek) = 0

        Next

        ‘ đọc thông tin ngày hiện tại

        GetLocalTime lpSystemTime

        ‘ Tìm ngày nhỏ nhất và lớn nhất trong tháng

        MinDay = 1

        If (lpSystemTime.wMonth = 2) Then

            MaxDay = 28

            ‘ Nên kiểm tra thêm năm nhuần, có 29 ngày

        ElseIf (lpSystemTime.wMonth < 8 And lpSystemTime.wMonth Mod 2) Then

            MaxDay = 31

        ElseIf (lpSystemTime.wMonth > 7 And (lpSystemTime.wMonth Mod 2) = 0) Then

            MaxDay = 31

        Else

            MaxDay = 30

        End If

        ‘ Tính số ngày trong tuần của tháng hiện tại

        iday = lpSystemTime.wDay

        idayofweek = lpSystemTime.wDayOfWeek

        While (iday <= MaxDay)

            Days(idayofweek) = Days(idayofweek) + 1

            iday = iday + 1

            idayofweek = (idayofweek + 1) Mod 7

        Wend

        iday = lpSystemTime.wDay

        idayofweek = lpSystemTime.wDayOfWeek

        Days(idayofweek) = Days(idayofweek) - 1

        While (iday >= MinDay)

            Days(idayofweek) = Days(idayofweek) + 1

            iday = iday - 1

            If (idayofweek = 0) Then

                idayofweek = 6

            Else

                idayofweek = idayofweek - 1

            End If

        Wend

        ‘ Hiển thị kết quả

        MsgBox (“C.Nhat:” & Days(0) & “, T.Hai:” & Days(1) & “, T.Ba:” & Days(2) & “, T.Tu:” & Days(3) & “, T.Nam:” & Days(4) & “, T.Sau:” & Days(5) & “, T.Bay:” & Days(6))

    End Sub
    Chuyên mục: Ứng dụng văn phòng