參照J(rèn)ohn Walkenbach書中的方法,,制作了一個日歷,,效果如下: 這個日歷可以實(shí)現(xiàn)從1900年開始至9999年的日期的顯示,實(shí)現(xiàn)方法主要是基于時間日期函數(shù)和數(shù)組公式的應(yīng)用,。 D2單元格用于選擇月份,,在數(shù)據(jù)有效性中選擇序列,輸入January,Febury,March,April,May,June,July,August,September,October,November,December: F2用于調(diào)整年份,,插入“數(shù)值調(diào)整鈕”控件 設(shè)置控件格式如下: 現(xiàn)對實(shí)現(xiàn)過程解釋如下: 第一步,、首先定義如下幾個名稱 1.MonthNames:
用于月份下拉列表中的序列。 2.TheMonth:記錄所選擇的月份,。 =MATCH 3.TheYear:記錄所選擇的年份,。指向了G2 4.week ={0;1;2;3;4;5}注意這里的數(shù)組常量中由分號分隔,這是一個六維的數(shù)組,,之所以是六個,,是因為一個月中最多橫跨六個周。 5.weekday ={0,1,2,3,4,5,6}注意此處的數(shù)組常量由逗號分隔,,這是一個一維的七元數(shù)組,,表示一周的七天(更確切的講是七天的位置)。 6.StartDate =DATE(TheYear,TheMonth,1)表示在選定的年份,、選定的月份條件下,,該月第一天。使用這個值是為了之后區(qū)分是否是本月的數(shù)據(jù)方便,。 7.StartDow =WEEKDAY(StartDate,3)表示StartDate在一個星期中的位置,,即在weekday中的某一個數(shù)組,。。此處WEEKDAY是EXCEL中的一個時間日期函數(shù),,需關(guān)注輸入?yún)?shù)3,,按照星期一—星期日的順序依次顯示0-6,返回參數(shù)代表日期的星期數(shù),。StartDow的取值為0-6,,剛好與weekday(數(shù)組常量)中的數(shù)值相一致。 第二步,、分析 可以確定,,一個月中最大是星期跨度為6,因此每月的日期必然能夠放在一個6*7的區(qū)域內(nèi),,在本文中即為"C6:I11",。下面我們要解決的是如下兩個問題: 問題2:如何區(qū)分出該區(qū)域中哪些是在本月的,,哪些不是在本月的,,不在本月份的應(yīng)不予顯示。 第三步,、實(shí)現(xiàn): 1.問題1的解決: 我們可以利用兩個數(shù)組常量week={0;1;2;3;4;5}和weekday={0,1,2,3,4,5,6}進(jìn)行數(shù)組公式運(yùn)算,、借助StartDate,StartDow,、使用其他時間日期函數(shù)來實(shí)現(xiàn),,具體方法為 選定單元格區(qū)域"C6:I11",輸入公式“=StartDate-StartDow+week*7+Weekday ”,,并按下“Ctrl+Shift+Enter”組合鍵,,輸入此數(shù)組公式。結(jié)果如下:(以2011/03月為例)
其中week*7+weekday會得到如下二位數(shù)組:
而-StartDow+week*7+weekday則表示每一天相對于本月第一天(用StartDate表示)的相對距離,,結(jié)果如下
所以StartDate-StartDow+week*7+Weekday就可以得到這個表格中的每一個單元格中代表的日期的真實(shí)日期值,。如果我們把這個單元格的格式調(diào)成日期時間格式,結(jié)果如下:
至此,,問題1已經(jīng)得到了解決,,我們得到了這個6*7的單元格 2.問題2的解決。 我們使用If函數(shù)和Month函數(shù)的混合搭配即可過濾掉非當(dāng)前月份的數(shù)據(jù),,具體如下: 選定該單元格區(qū)域,,輸入如下公式 “=IF(MONTH(StartDate-StartDow+week*7+Weekday)<>TheMonth,"",DAY(StartDate-StartDow+week*7+Weekday))”,按下“Ctrl+Shift+Enter”組合鍵,。 該公式通過判斷每一個單元格區(qū)域代表日期所在的月份值與所選定的月份值是否相等,,如不相等,則不顯示任何數(shù)據(jù),如相等,,也就是確實(shí)是選定月份的日期數(shù)據(jù),,則顯示出該日期的日數(shù)(有DAY函數(shù)給出)。注意,,這樣需將該區(qū)域的單元格格式調(diào)為“數(shù)值”或“常規(guī)”,,而不能是“時間日期”。 |
|