• 利用 wordXP 实现自动排班


    许多工作岗位需要每天或每月排一次班,如何用WORD实现自动排班?笔者曾对此做过一些研究,不尽人意.

    在一位网友(chewinggum(口香糖·把减肥列入下一个五年计划) )提供了很不错的代码(http://community.csdn.net/Expert/topic/4304/4304006.xml?temp=.7863428),稍做了一些改动,感觉效果还可以.

    新建WORD文档,ALT+F11进入IDE界面.添加模块1并进行如下操作:

    Thisdocument加入下面代码

    Private Sub Document_Open()
    Main
    End Sub

    模块1加入下面代码:

    Option Explicit

    Dim LunarInfo(0 To 149) As Long
    Dim SolarMonth
    Dim Gan
    Dim Zhi
    Dim Animals
    Dim SolarTerm
    Dim sTermInfo
    Dim nStr1
    Dim nStr2
    Dim nStr3
    Dim MonthName
    Dim sFtv
    Dim lFtv
    Dim wFtv

    Sub Main()

    Application.ScreenUpdating = False
        Selection.WholeStory
        Selection.Delete Unit:=wdCharacter, Count:=1
    Dim member   As String
    Dim m() As String
        Dim InputYear As Integer         '输入年
        Dim InputMonth As Integer        '输入年
       
        Dim intTableRows As Integer     '表格的列数
        Dim intMonthDays As Integer        '该月的天数
        Dim intWeekDay As Integer       '星期几
        Dim intFirstDayWeek As Integer  '第一天是星期几
        Dim i As Integer
       

       
        Initialize  '初始化数据
    member = InputBox("输入年月如" & Format(Date, "yyyy-mm"), "提示", Format(Date, "yyyy-mm"))
       
        InputMonth = CInt(Right(member, 2))
        InputYear = CInt(Left(member, 4))
        member = InputBox("请输入值班者名单", "提示", "赵一伤,钱二败,孙三毁,李四摧,周五输,吴六破,郑七灭,王八衰,鹤笔翁")
        m = Split(member, ",")
        For i = 0 To UBound(m)
        m(i) = i + 1 & " " & m(i)
        Next
        member = InputBox(Join(m, vbCrLf), "请选择上月最后一位值班者编号", "1")
       
        '计算表格的列数
        intMonthDays = SolarDays(InputYear, InputMonth)
        intFirstDayWeek = Weekday(InputYear & "-" & InputMonth & "-1")
        intTableRows = (intMonthDays + intFirstDayWeek - 1)
        If intTableRows / 7 <> Int(intTableRows / 7) Then
            intTableRows = Int(intTableRows / 7) + 1
        Else
            intTableRows = intTableRows / 7
        End If
       
       
        ActiveDocument.PageSetup.PaperSize = wdPaperA4
        ActiveDocument.Tables.Add Range:=Selection.Range, NumRows:=intTableRows * 2 + 2, NumColumns:= _
            7, DefaultTableBehavior:=wdWord9TableBehavior, AutoFitBehavior:= _
            wdAutoFitWindow
           
           
        Selection.Cells.VerticalAlignment = wdCellAlignVerticalCenter
        Selection.Tables(1).Range.ParagraphFormat.Alignment = wdAlignParagraphCenter
        Selection.Tables(1).LeftPadding = CentimetersToPoints(0.05)
        Selection.Tables(1).RightPadding = CentimetersToPoints(0.05)
        Selection.Tables(1).Spacing = 0
      
        '生成表头
        Selection.Tables(1).Cell(1, 1).Select
        Selection.SelectRow
        Selection.Cells.Merge
        Selection.Cells.Shading.BackgroundPatternColor = wdColorIndigo
        Selection.Font.Size = 15
        Selection.Font.Color = wdColorWhite
        Selection.TypeText "公元" & InputYear & "年" & InputMonth & "月  "
        Selection.Font.Color = wdColorYellow
        Selection.TypeText "农历 " & cyclical(InputYear) & Animal(InputYear) & "年"
        For i = 1 To 7
            If i = 1 Or i = 7 Then
                Selection.Tables(1).Cell(2, i).Range.Font.Color = wdColorRed
            Else
                Selection.Tables(1).Cell(2, i).Range.Font.Color = wdColorBlack
            End If
            Selection.Tables(1).Cell(2, i).Range.Font.Size = 15
            Selection.Tables(1).Cell(2, i).Range.Font.Bold = True
            Selection.Tables(1).Cell(2, i).Range.Text = " 星期" & nStr1(i - 1)
            Selection.Tables(1).Cell(2, i).Shading.BackgroundPatternColor = wdColorYellow
        Next
       
        '生成日历
        For i = 1 To intMonthDays
            Dim intRow As Integer
            Dim strDate As String
            intWeekDay = Weekday(InputYear & "-" & InputMonth & "-" & i)
            intRow = ((intFirstDayWeek + i - 2) / 7 + 1) * 2 + 1  '计算行位置

            Dim strTmp As String
            Dim lngColor As Long
            strTmp = Trim(GetDayString(CDate((InputYear & "-" & InputMonth & "-" & i)), lngColor))
           
            Selection.Tables(1).Cell(intRow, intWeekDay).Select
            If intWeekDay = 1 Or intWeekDay = 7 Then
                Selection.Font.Color = wdColorRed
            ElseIf Left(strTmp, 1) = "*" Then
                Selection.Font.Color = wdColorRed
                strTmp = Replace(strTmp, "*", "")
            Else
                Selection.Font.Color = wdColorBlack
            End If
            Selection.Font.Size = 40
            Selection.Font.Name = "Arial narrow"
            Selection.Font.Bold = True
            Selection.TypeText i
            Selection.TypeText Chr(11)
            If Len(strTmp) > 5 Then
                Selection.Font.Size = 8
            Else
                Selection.Font.Size = 10
            End If
            Selection.Font.Name = "宋体"
            Selection.Font.Color = lngColor
            Selection.TypeText strTmp
        Next
    '
    '     With Selection.Tables(1)
    '        .Borders(wdBorderLeft).LineStyle = wdLineStyleNone
    '        .Borders(wdBorderRight).LineStyle = wdLineStyleNone
    '        .Borders(wdBorderTop).LineStyle = wdLineStyleNone
    '        .Borders(wdBorderBottom).LineStyle = wdLineStyleNone
    '        .Borders(wdBorderHorizontal).LineStyle = wdLineStyleNone
    '        .Borders(wdBorderVertical).LineStyle = wdLineStyleNone
    '        .Borders(wdBorderDiagonalDown).LineStyle = wdLineStyleNone
    '        .Borders(wdBorderDiagonalUp).LineStyle = wdLineStyleNone
    '        .Borders.Shadow = False
    '    End With
       
       
        For i = 1 To intMonthDays
            intWeekDay = Weekday(InputYear & "-" & InputMonth & "-" & i)
            intRow = ((intFirstDayWeek + i - 2) / 7 + 1) * 2 + 2  '计算行位置
            Selection.Tables(1).Cell(intRow, intWeekDay).Select
    Selection.Font.Size = 16
            Selection.TypeText Mid(m((CInt(member) + i - 1) Mod (ubound(m)+1) ), 2)
       
        Next
        Application.ScreenUpdating = True
    End Sub

    '数据初始化
    Private Sub Initialize()
    Dim strTmp As String
    LunarInfo(0) = &H4BD8
    LunarInfo(1) = &H4AE0
    LunarInfo(2) = &HA570
    LunarInfo(3) = &H54D5
    LunarInfo(4) = &HD260
    LunarInfo(5) = &HD950
    LunarInfo(6) = &H16554
    LunarInfo(7) = &H56A0
    LunarInfo(8) = &H9AD0
    LunarInfo(9) = &H55D2
    LunarInfo(10) = &H4AE0
    LunarInfo(11) = &HA5B6
    LunarInfo(12) = &HA4D0
    LunarInfo(13) = &HD250
    LunarInfo(14) = &H1D255
    LunarInfo(15) = &HB540
    LunarInfo(16) = &HD6A0
    LunarInfo(17) = &HADA2
    LunarInfo(18) = &H95B0
    LunarInfo(19) = &H14977
    LunarInfo(20) = &H4970
    LunarInfo(21) = &HA4B0
    LunarInfo(22) = &HB4B5
    LunarInfo(23) = &H6A50
    LunarInfo(24) = &H6D40
    LunarInfo(25) = &H1AB54
    LunarInfo(26) = &H2B60
    LunarInfo(27) = &H9570
    LunarInfo(28) = &H52F2
    LunarInfo(29) = &H4970
    LunarInfo(30) = &H6566
    LunarInfo(31) = &HD4A0
    LunarInfo(32) = &HEA50
    LunarInfo(33) = &H6E95
    LunarInfo(34) = &H5AD0
    LunarInfo(35) = &H2B60
    LunarInfo(36) = &H186E3
    LunarInfo(37) = &H92E0
    LunarInfo(38) = &H1C8D7
    LunarInfo(39) = &HC950
    LunarInfo(40) = &HD4A0
    LunarInfo(41) = &H1D8A6
    LunarInfo(42) = &HB550
    LunarInfo(43) = &H56A0
    LunarInfo(44) = &H1A5B4
    LunarInfo(45) = &H25D0
    LunarInfo(46) = &H92D0
    LunarInfo(47) = &HD2B2
    LunarInfo(48) = &HA950
    LunarInfo(49) = &HB557
    LunarInfo(50) = &H6CA0
    LunarInfo(51) = &HB550
    LunarInfo(52) = &H15355
    LunarInfo(53) = &H4DA0
    LunarInfo(54) = &HA5D0
    LunarInfo(55) = &H14573
    LunarInfo(56) = &H52D0
    LunarInfo(57) = &HA9A8
    LunarInfo(58) = &HE950
    LunarInfo(59) = &H6AA0
    LunarInfo(60) = &HAEA6
    LunarInfo(61) = &HAB50
    LunarInfo(62) = &H4B60
    LunarInfo(63) = &HAAE4
    LunarInfo(64) = &HA570
    LunarInfo(65) = &H5260
    LunarInfo(66) = &HF263
    LunarInfo(67) = &HD950
    LunarInfo(68) = &H5B57
    LunarInfo(69) = &H56A0
    LunarInfo(70) = &H96D0
    LunarInfo(71) = &H4DD5
    LunarInfo(72) = &H4AD0
    LunarInfo(73) = &HA4D0
    LunarInfo(74) = &HD4D4
    LunarInfo(75) = &HD250
    LunarInfo(76) = &HD558
    LunarInfo(77) = &HB540
    LunarInfo(78) = &HB5A0
    LunarInfo(79) = &H195A6
    LunarInfo(80) = &H95B0
    LunarInfo(81) = &H49B0
    LunarInfo(82) = &HA974
    LunarInfo(83) = &HA4B0
    LunarInfo(84) = &HB27A
    LunarInfo(85) = &H6A50
    LunarInfo(86) = &H6D40
    LunarInfo(87) = &HAF46
    LunarInfo(88) = &HAB60
    LunarInfo(89) = &H9570
    LunarInfo(90) = &H4AF5
    LunarInfo(91) = &H4970
    LunarInfo(92) = &H64B0
    LunarInfo(93) = &H74A3
    LunarInfo(94) = &HEA50
    LunarInfo(95) = &H6B58
    LunarInfo(96) = &H55C0
    LunarInfo(97) = &HAB60
    LunarInfo(98) = &H96D5
    LunarInfo(99) = &H92E0
    LunarInfo(100) = &HC960
    LunarInfo(101) = &HD954
    LunarInfo(102) = &HD4A0
    LunarInfo(103) = &HDA50
    LunarInfo(104) = &H7552
    LunarInfo(105) = &H56A0
    LunarInfo(106) = &HABB7
    LunarInfo(107) = &H25D0
    LunarInfo(108) = &H92D0
    LunarInfo(109) = &HCAB5
    LunarInfo(110) = &HA950
    LunarInfo(111) = &HB4A0
    LunarInfo(112) = &HBAA4
    LunarInfo(113) = &HAD50
    LunarInfo(114) = &H55D9
    LunarInfo(115) = &H4BA0
    LunarInfo(116) = &HA5B0
    LunarInfo(117) = &H15176
    LunarInfo(118) = &H52B0
    LunarInfo(119) = &HA930
    LunarInfo(120) = &H7954
    LunarInfo(121) = &H6AA0
    LunarInfo(122) = &HAD50
    LunarInfo(123) = &H5B52
    LunarInfo(124) = &H4B60
    LunarInfo(125) = &HA6E6
    LunarInfo(126) = &HA4E0
    LunarInfo(127) = &HD260
    LunarInfo(128) = &HEA65
    LunarInfo(129) = &HD530
    LunarInfo(130) = &H5AA0
    LunarInfo(131) = &H76A3
    LunarInfo(132) = &H96D0
    LunarInfo(133) = &H4BD7
    LunarInfo(134) = &H4AD0
    LunarInfo(135) = &HA4D0
    LunarInfo(136) = &H1D0B6
    LunarInfo(137) = &HD250
    LunarInfo(138) = &HD520
    LunarInfo(139) = &HDD45
    LunarInfo(140) = &HB5A0
    LunarInfo(141) = &H56D0
    LunarInfo(142) = &H55B2
    LunarInfo(143) = &H49B0
    LunarInfo(144) = &HA577
    LunarInfo(145) = &HA4B0
    LunarInfo(146) = &HAA50
    LunarInfo(147) = &H1B255
    LunarInfo(148) = &H6D20
    LunarInfo(149) = &HADA0

    SolarMonth = Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)
    Gan = Array("甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸")
    Zhi = Array("子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥")
    Animals = Array("鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊", "猴", "鸡", "狗", "猪")
    SolarTerm = Array("小寒", "大寒", "立春", "雨水", "惊蛰", "春分", "清明", "谷雨", "立夏", "小满", "芒种", "夏至", "小暑", "大暑", "立秋", "处暑", "白露", "秋分", "寒露", "霜降", "立冬", "小雪", "大雪", "冬至")
    sTermInfo = Array(0, 21208, 42467, 63836, 85337, 107014, 128867, 150921, 173149, 195551, 218072, 240693, 263343, 285989, 308563, 331033, 353350, 375494, 397447, 419210, 440795, 462224, 483532, 504758)
    nStr1 = Array("日", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "十二")
    nStr2 = Array("初", "十", "廿", "卅", " ")
    MonthName = Array("JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC")

    '国历节日 *表示放假日
    strTmp = ""
    strTmp = strTmp + "0101*元旦,"
    strTmp = strTmp + "0214 情人节,"
    strTmp = strTmp + "0305 学雷锋纪念日,"
    strTmp = strTmp + "0308 妇女节,"
    strTmp = strTmp + "0312 植树节,"
    strTmp = strTmp + "0315 消费者权益日,"
    strTmp = strTmp + "0401 愚人节,"
    strTmp = strTmp + "0407 世界卫生日,"
    strTmp = strTmp + "0422 世界地球日,"
    strTmp = strTmp + "0501*劳动节,"
    strTmp = strTmp + "0502*劳动节,"
    strTmp = strTmp + "0503*劳动节,"
    strTmp = strTmp + "0504 青年节,"
    strTmp = strTmp + "0508 世界红十字日,"
    strTmp = strTmp + "0512 国际护士节,"
    strTmp = strTmp + "0515 国际家庭日,"
    strTmp = strTmp + "0517 国际电信日,"
    strTmp = strTmp + "0601 国际儿童节,"
    strTmp = strTmp + "0605 世界环境保护日,"
    strTmp = strTmp + "0606 全国爱眼日,"
    strTmp = strTmp + "0625 全国土地日,"
    strTmp = strTmp + "0626 国际禁毒日,"
    strTmp = strTmp + "0701 香港回归纪念日 中共诞辰,"
    strTmp = strTmp + "0707 抗日战争纪念日,"
    strTmp = strTmp + "0801 建军节,"
    strTmp = strTmp + "0815 抗日战争胜利纪念,"
    strTmp = strTmp + "0909 ***逝世纪念,"
    strTmp = strTmp + "0908 国际扫盲日,"
    strTmp = strTmp + "0910 中国教师节,"
    strTmp = strTmp + "0927 世界旅游日,"
    strTmp = strTmp + "0928 孔子诞辰,"
    strTmp = strTmp + "1001*国庆节,"
    strTmp = strTmp + "1002*国庆节,"
    strTmp = strTmp + "1003*国庆节,"
    strTmp = strTmp + "1006 老人节,"
    strTmp = strTmp + "1009 世界邮政日,"
    strTmp = strTmp + "1014 世界标准日,"
    strTmp = strTmp + "1016 世界粮食日,"
    strTmp = strTmp + "1024 联合国日,"
    strTmp = strTmp + "1112 孙中山诞辰纪念,"
    strTmp = strTmp + "1205 国际志愿人员日,"
    strTmp = strTmp + "1220 澳门回归纪念,"
    strTmp = strTmp + "1225 圣诞节"
    strTmp = strTmp + "1226 ***诞辰纪念"

    sFtv = Split(strTmp, ",")

    '农历节日 *表示放假日
    strTmp = ""

    strTmp = strTmp + "0101*春节,"
    strTmp = strTmp + "0102*春节,"
    strTmp = strTmp + "0103*春节,"
    strTmp = strTmp + "0115 元宵节,"
    strTmp = strTmp + "0505 端午节,"
    strTmp = strTmp + "0624*火把节,"
    strTmp = strTmp + "0625*火把节,"
    strTmp = strTmp + "0626*火把节,"
    strTmp = strTmp + "0707 七夕情人节,"
    strTmp = strTmp + "0715 中元节,"
    strTmp = strTmp + "0815 中秋节,"
    strTmp = strTmp + "0909 重阳节,"
    strTmp = strTmp + "1208 腊八节,"
    strTmp = strTmp + "1224 小年,"
    strTmp = strTmp + "0100 除夕"

    lFtv = Split(strTmp, ",")

    '某月的第几个星期几
    strTmp = ""
    strTmp = strTmp + "0520 母亲节,"
    strTmp = strTmp + "0630 父亲节,"
    strTmp = strTmp + "1144 感恩节"
    wFtv = Split(strTmp, ",")
    End Sub

    '传回农历 y年的总天数

    Private Function lYearDays(ByVal Y As Integer) As Integer
        Dim i, Sum As Double
        Sum = 0
        For i = 1 To 12
        Sum = Sum + lMonthDays(Y, i)
        Next i
        lYearDays = Sum + LeapDays(Y)
    End Function

    '传回农历 y年闰月的天数
    Private Function LeapDays(ByVal Y As Integer) As Integer
        Dim m As Integer
        Dim l As Double
        m = LeapMonth(Y)
        If m = 0 Then
            LeapDays = 0
        Else
            l = LunarInfo(Y - 1900)
            'l = LunarInfo(Y - 1900 + 1)
            If l < 0 Then l = l * (-1)
            l = (l And &H10000)
                If l = 0 Then
                    LeapDays = 29
                Else
                    LeapDays = 30
                End If
        End If
    End Function

    '传回农历 y年闰哪个月 1-12 , 没闰传回 0 OK

    Private Function LeapMonth(ByVal Y As Integer) As Integer
        LeapMonth = 0
        If Y >= 1900 Then LeapMonth = (LunarInfo(Y - 1900) And &HF)
    End Function

    '传回农历 y年m月的总天数 OK-

    Private Function lMonthDays(ByVal Y As Integer, ByVal m As Integer) As Integer
        If Y < 1900 Then Y = 1900
        If (LunarInfo(Y - 1900) And Int(&H10000 / (2 ^ m))) = 0 Then
        'If (LunarInfo(Y - 1900 + 1) And Int(&H10000 / (2 ^ m))) = 0 Then
            lMonthDays = 29
        Else
            lMonthDays = 30
        End If
    End Function

    '根据给定的阳历,返回农历的日期

    Private Function GetLunar(ByVal SolarDate As Date) As String
        Dim DaysOffset As Long
        Dim i As Integer
        Dim Temp As Long
        Dim lyear, lmonth, lday As Integer
        DaysOffset = SolarDate - CDate("1900-1-31")
        i = 1900
        Do While i < 2050 And DaysOffset >= 0
            Temp = lYearDays(i)
            DaysOffset = DaysOffset - Temp
            i = i + 1
        Loop
        If DaysOffset < 0 Then
            DaysOffset = DaysOffset + Temp
            i = i - 1
        End If
        lyear = i
       
        Dim Leap As Integer
        Dim IsLeap As Boolean
        Leap = LeapMonth(i)
        IsLeap = False
        i = 1
        Do While i < 13 And DaysOffset > 0
            If Leap > 0 And i = (Leap + 1) And IsLeap = False Then
                i = i - 1
                IsLeap = True
                Temp = LeapDays(lyear)
            Else
                Temp = lMonthDays(lyear, i)
            End If
            If IsLeap And i = (Leap + 1) Then IsLeap = False
            DaysOffset = DaysOffset - Temp
            i = i + 1
        Loop

        If DaysOffset = 0 And Leap > 0 And i = Leap + 1 Then
            If IsLeap Then
                IsLeap = False
            Else
                IsLeap = True
                i = i - 1
            End If
        End If
        If DaysOffset < 0 Then
            DaysOffset = DaysOffset + Temp
            i = i - 1
        End If
        lmonth = i
        lday = DaysOffset + 1

        '返回特殊标志的字符串

        If IsLeap Then

            'GetLunar = "0000【" & Animal(lyear) & "】" & cyclical(lyear) & "年闰" & Format(lmonth, "00") & "月" & Format(lday, "00") & "日" & GetTerm(SolarDate)
            GetLunar = "1" & lyear & Format(lmonth, "00") & Format(lday, "00")
        Else
            GetLunar = "0" & lyear & Format(lmonth, "00") & Format(lday, "00")
            'GetLunar = Format(lmonth, "00") & Format(lday, "00") & "【" & Animal(lyear) & "】" & cyclical(lyear) & "年" & Format(lmonth, "00") & "月" & Format(lday, "00") & "日 " & GetTerm(SolarDate)
        End If
    End Function

    '传回阳历 y年某m月的天数 OK

    Private Function SolarDays(ByVal Y As Integer, ByVal m As Integer) As Integer
        If m = 2 Then
            If (Y Mod 4 = 0 And Y Mod 100 <> 0) Or (Y Mod 400 = 0) Then
                SolarDays = 29
            Else
                SolarDays = 28
            End If
        Else
            SolarDays = SolarMonth(m - 1)
        End If
    End Function

    '某y年的第n个节气的日期(从0小寒起算)  OK

    Private Function sTerm(ByVal Y, n As Integer) As Date
        Dim D1, D2 As Double
        D1 = (31556925.9747 * (Y - 1900) + sTermInfo(n) * 60#)
        D2 = DateDiff("s", "1970-1-1 0:0", "1900-1-6 2:5") + D1
        D1 = D2 / 2
        sTerm = DateAdd("s", D2 - D1, DateAdd("s", D1, "1970-1-1 0:0"))
        sTerm = Format(sTerm, "yyyy/mm/dd")
    End Function

    '根据年份返回属象 OK
    Private Function Animal(ByVal sYear As Integer) As String
        Animal = Animals((sYear - 1900) Mod 12)
    End Function

    '根据阳历返回其节气,若不是则返回空 OK
    Private Function GetTerm(ByVal sDate As Date) As String
        Dim Y, m As Integer
        Y = Year(sDate)
        m = Month(sDate)
        GetTerm = ""
        If sTerm(Y, m * 2 - 1) = sDate Then
            GetTerm = SolarTerm(m * 2 - 1)
        ElseIf sTerm(Y, m * 2 - 2) = sDate Then
            GetTerm = SolarTerm(m * 2 - 2)
        End If
    End Function

    '根据阳历返回其节日,若不是则返回空 OK
    Private Function GetFeast(ByVal sDate As Date) As String
        Dim i As Integer
        Dim strTmp As String
        strTmp = Format(sDate, "MMDD")
        For i = LBound(sFtv) To UBound(sFtv)
            If Left(sFtv(i), 4) = strTmp Then
                GetFeast = Mid(sFtv(i), 5, Len(sFtv(i)) - 4)
                Exit Function
            End If
        Next
        GetFeast = ""
    End Function

    '根据阴历返回其节日,若不是则返回空 OK
    Private Function GetLunarFeast(ByVal sDate As String) As String
        Dim i As Integer
        Dim strTmp As String
        strTmp = Right(sDate, 4)
        For i = LBound(lFtv) To UBound(lFtv)
            If Left(lFtv(i), 4) = strTmp Then
                GetLunarFeast = Mid(lFtv(i), 5, Len(lFtv(i)) - 4)
                Exit Function
            End If
        Next
        GetLunarFeast = ""
    End Function

    '根据阴历返回其字符串 OK
    Private Function GetLunarString(ByVal sDate As String) As String
        Dim i As Integer
        Dim strTmp As String
        Dim strMonth As String
        Dim strDay As String
       
        strMonth = Left(sDate, 2)
        strDay = Right(sDate, 2)
        If strDay = "01" Then
            GetLunarString = nStr1(Val(strMonth)) & "月"
        ElseIf strDay = "20" Then
            GetLunarString = "二十"
        ElseIf strDay = "30" Then
            GetLunarString = "三十"
        Else
            GetLunarString = nStr2(Val(Left(strDay, 1))) & nStr1(Val(Right(strDay, 1)))
        End If
    End Function

    '返回阳历是该月的第几个星期几的字符串,如:0520表示5月份第2个星期日
    Private Function GetMonthWeek(ByVal sDate As Date) As String
        Dim D0 As Date
        D0 = CDate(Year(sDate) & "-" & Month(sDate) & "-1")
        GetMonthWeek = Format(Month(sDate), "00") & (Int((Day(sDate) - 1 + Weekday(D0) - 1) / 7) + 1) & Weekday(sDate) - 1
    End Function

    '天干地支计算 OK
    Private Function cyclical(num) As String
       cyclical = Gan((num - 1864) Mod 10) + Zhi((num - 1864) Mod 12)
    End Function

    '获取农历或节日说明
    Private Function GetDayString(ByVal sDate As Date, ByRef lngColor As Long) As String
        Dim strLunarDate As String
        Dim strTmp As String
        strTmp = GetTerm(sDate)
        If strTmp <> "" Then GetDayString = strTmp: lngColor = vbGreen: Exit Function
        strTmp = GetFeast(sDate)
        If strTmp <> "" Then GetDayString = strTmp: lngColor = vbBlue: Exit Function
        strLunarDate = GetLunar(sDate)
        strTmp = GetLunarFeast(Right(strLunarDate, 4))
        If strTmp <> "" Then GetDayString = strTmp: lngColor = vbRed: Exit Function
        strTmp = GetLunarString(Right(strLunarDate, 4))
        lngColor = vbBlack:
        GetDayString = strTmp
    End Function

    保存即可.以后打开文档会自动进行排班,效果如下:

    公元20065  农历丙戌狗年
     星期日
     星期一
     星期二
     星期三
     星期四
     星期五
     星期六
     
    1
    劳动节
    2
    劳动节
    3
    劳动节
    4
    青年节
    5
    初八
    6
    立夏
     
     李四摧
     周五输
     吴六破
     郑七灭
     王八衰
     鹤笔翁
    7
    十日
    8
    世界红十字日
    9
    十二
    10
    十三
    11
    十四
    12
    国际护士节
    13
    十六
     赵一伤
     钱二败
     孙三毁
     李四摧
     周五输
     吴六破
     郑七灭
    14
    十七
    15
    国际家庭日
    16
    十九
    17
    国际电信日
    18
    廿一
    19
    廿二
    20
    廿三
     王八衰
     鹤笔翁
     赵一伤
     钱二败
     孙三毁
     李四摧
     周五输
    21
    小满
    22
    廿五
    23
    廿六
    24
    廿七
    25
    廿八
    26
    廿九
    27
    五月
     吴六破
     郑七灭
     王八衰
     鹤笔翁
     赵一伤
     钱二败
     孙三毁
    28
    初二
    29
    初三
    30
    初四
    31
    端午节
     
     
     
     李四摧
     周五输
     吴六破
     郑七灭
     
     
     

  • 相关阅读:
    Java Stream 去重对象
    CentOS7安装JDK8
    CentOS7安装Tomcat9
    MySQL 8.0 安装
    面相对象7大原则
    Spring Boot MyBatis连接MySQL数据库
    win11右键改回win10风格,win10右键改回win11风格,不用重启
    【转载】NetCore 开发实战(目录整理)
    viewState cookie session _VIEWSTATE
    外部JS得到客户端ID
  • 原文地址:https://www.cnblogs.com/fengju/p/6336344.html
Copyright © 2020-2023  润新知