小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Excel萬年歷的制作

 武則天在線 2010-08-13

<!--[if !supportLists]-->1.   <!--[endif]-->概述

Office 2007是微軟Office產(chǎn)品史上最具創(chuàng)新與革命性的一個版本。全新設計的用戶界面、穩(wěn)定安全的文件格式、無縫高效的溝通協(xié)作。
ExcelOffice套件中的一個重要組件之一。直觀的界面、出色的計算功能和圖表工具,再加上成功的市場營銷,使Excel成為最流行的微機數(shù)據(jù)處理軟件。
日歷分為陰歷和陽歷。陽歷的歷年為一個回歸年,現(xiàn)時國際通用的公歷(格里高歷)即為太陽歷的一種,亦簡稱為陽歷;陰歷亦稱月亮歷,或稱太陰歷,其歷月是一個朔望月,歷年為12個朔望月,其大月30天,小月29 天;中國的農(nóng)歷就是陰陽歷的一種。
如何在Excel實現(xiàn)萬年歷是對Office能力的綜合運用,又是分析問題并進行求解的一系列過程。

<!--[if !supportLists]-->2.   <!--[endif]-->分析

<!--[if !supportLists]-->2.1         整體構(gòu)思

在進行整體構(gòu)思之前,不妨我們先看看多數(shù)日歷是怎樣的情形,其中:
<!--[if !supportLists]-->1、   <!--[endif]-->上面居中為當前年份。
<!--[if !supportLists]-->2、   <!--[endif]-->然后為當年的12個月份,至于每行為3個月還是4個月取決于可見界面的大小和美觀。
<!--[if !supportLists]-->3、   <!--[endif]-->總所周知,一周則為7天,每個月最大31天,最小28天;如果1號為周六或周日的話,則該月可能要跨越6周;因此每個月最大的跨越為六周,事實上我們找一下其它日歷的模板,就會發(fā)現(xiàn)一般都是六周。所以我們可以把每個月視為一個7*6的單元格集合。

<!--[if !supportLists]-->2.2       <!--[endif]-->算法問題

當我們確定了每個月事實上為7*6的單元格集合后,我們接下來要做以下幾件事情:
<!--[if !supportLists]-->1、   <!--[endif]-->如何定位和填充相應的每月的7*6單元格
在單純的Excel表中,我們很難采用邏輯判斷和循環(huán)的方式獲取在7*6單元格集合中的第一個星期一應該是哪一天;但我們知道這個7*6單元格所在月的第一天即1號卻是固定的,同樣當日期固定后,該日期所在的星期幾也是固定的,假設2010-01-01為星期五,那星期一是幾號呢?很顯然,為201011號向前推4天即20091228號,星期二則為11號向前推3天,以此類推,可以推到整個42個單元格中,只不過超過當月第一天的日期則向后推了。
如果我們換個思路可能更好些,在第一個7*6單元格集合中的首個星期一為201011號向前推5天即星期五,然后加1天,這也是理所當然的求法,那么星期二則為11號向前推5天,然后加2天,以此類推,推倒第42個單元格中則為11號向前推5天,然后加42天了,從142則為一個整數(shù)的序列;這樣就變成Excel更擅長的計算方式了。
<!--[if !supportLists]-->2、   <!--[endif]-->如何屏蔽非當月的日期
大家也許會注意到在這個7*6的單元格集合中,一定會混入不屬于這個月的日期,怎么把這些不屬于本月的日期去除呢?如果我們用函數(shù)來實現(xiàn)的話,也不是不可能,只不過過于復雜。
幸好Excel提供了條件格式,條件格式的目的就是為符合或不符合相應條件的單元格提供該單元格的格式化需求,如果我們將小于當月第一天,或者大于等于下個月第一天值的單元格字符設置為白色字體,同時將這些單元格的背景色也置為白色,豈不是看不到了嘛。
<!--[if !supportLists]-->3、   <!--[endif]-->農(nóng)歷問題
農(nóng)歷問題是屬于典型的算法問題,我還從未見到在單純的Excel表格中使用函數(shù)和表達式就能實現(xiàn)農(nóng)歷算法的。很幸運的是,Office提供了強大的編程語言VBA,再加上強大的互聯(lián)網(wǎng)搜索引擎,我們很容易就能找到并實現(xiàn)農(nóng)歷的功能。
關(guān)于如何對不在當月的農(nóng)歷日期進行屏蔽,詳情見步驟。

<!--[if !supportLists]-->2.3         <!--[endif]-->顯示和實際數(shù)據(jù)存儲的關(guān)系

如果僅看以上最終版本,我們很可能認為“2010年日歷”為字符串,“1月份”也為字符串,而月份中的日期為數(shù)字,實際上除了“一、二、三、四、五、六、日”為字符串外,年份、月份均為數(shù)字類型,而日期則為日期類型;在Excel表中數(shù)據(jù)的展現(xiàn)方式與存儲可以表現(xiàn)迥異,當然展現(xiàn)方式也不能完全孤立于其存儲數(shù)據(jù)的類型和內(nèi)容。
只有理解了以上困惑和難點,我們才知道如何下手開始工作。

<!--[if !supportLists]-->3.   <!--[endif]-->步驟

<!--[if !supportLists]-->3.1        <!--[endif]-->填充7*6日期單元格

為了簡化問題,便于說明問題,讓我們首先從完成第一個月開始
假設當前為2010年的1月份。
那么20101月份首日則為2010-01-01。我們把B5設置為2010-01-01,同時將其設置單元格格式為 m""""。
同時2010-01-01所在的星期=weekday(B5,2),則為5即星期五
既然2010-01-01是星期五,那本7*6單元格集合的第一個星期一應該是幾號呢?
顯然為=B5-4,也即=B5-WEEKDAY(B5,2)+1,然后依次加2得到周二的日期,加3得到周三的日期,加8得到下周一的日期;既然從142是個數(shù)字序列,為了快捷的緣由,我們直接構(gòu)造了一個從1~42的數(shù)字序列,因此用我們把B5-J6+1替換為B5-J6+K6;然后把拷貝公式到之后的行列中,但這樣問題又來了,拷貝公式是相對引用的,我們想變的是K6即數(shù)字序列而不是B5J6,因此我們要把B5J6改為絕對引用,即$B$5,$J$6,=$B$5-$J$6+K6
當我們完成公式,并復制到7*6剩余的單元格后,就會發(fā)現(xiàn)1月份已填充完畢了,再與本機的日歷比較一下,發(fā)現(xiàn)是沒問題的

<!--[if !supportLists]-->3.2      條件格式隱藏不符合條件的數(shù)據(jù)

接下來我們來考慮如何隱藏非本月的日期,實際上算法很簡單:
20101月份的日歷中,將日期<2010-01-01 或者 日期>=2010-02-01的單元格的字體顏色和背景色設置為白色即可。
在這里我們首先選中1月份的42個單元格,然后找到條件格式,點擊管理規(guī)則。
     在條件格式規(guī)則管理器中,點擊新建規(guī)則。
在新建格式規(guī)則中,選擇規(guī)則類型為,選擇規(guī)則類型為“只為包含以下內(nèi)容的單元格設置格式”。
設置單元格值 小于 $B$5,即201011日所在的單元格,然后點擊格式按鈕
在設置單元格格式窗口中,將字體顏色設置為白色,將填充背景色設置為白色。
確定后回到條件格式規(guī)則管理器,再次新建規(guī)則 —>只為包含以下內(nèi)容的單元格設置格式。
設置單元格值 大于或等于 $S$5,即201021日所在的單元格,然后點擊格式按鈕。
在設置單元格格式窗口中,將字體顏色設置為白色,將填充背景色設置為白色。
最終,條件格式規(guī)則管理器結(jié)果如下
              然后返回Excel表,發(fā)現(xiàn)20101月份的日期已經(jīng)正常顯示。

<!--[if !supportLists]-->3.3       <!--[endif]-->套用表格格式進行美化

為了讓界面好看點,我們在點擊套用表格格式(選中包括標題欄的7*7單元格集合),選擇自己所喜歡的表格樣式。
但是,套用表格格式會導致另外一個不想要的結(jié)果,即自動對所謂的標題欄進行了篩選。
接下來,我們在這個7*7的單元格集合任意地方點擊右鍵—>表格—>轉(zhuǎn)換為區(qū)域即可。

<!--[if !supportLists]-->3.4      進一步美工

我們還可以進一步進行美化處理,這個取決于你自己的想象力了,而非技術(shù)。

<!--[if !supportLists]-->3.5        添加農(nóng)歷

首先點擊開發(fā)工具—>點擊Visual Basic。
然后插入模塊,將GetYLDate()函數(shù)拷貝到右邊的工作區(qū)域。
關(guān)閉Visual Basic窗口,回到Excel界面中,在每行日期下面增加一空行。
在對應的空行下輸入以下公式,例如在C7下,輸入=GetYLDate(C6)。
很不幸,我們并沒有看到如期的效果,這個時侯,需要選中所有新增的農(nóng)歷行,然后點擊條件格式—>清除規(guī)則—>清除所選單元格的規(guī)則。
很明顯,這個也并非我們想要的,因為所有非本月的農(nóng)歷日期也全部顯示出來了,再應用條件格式的話,恐怕技術(shù)上會有問題,我們不妨換一種思路,如果其上面的公歷日期在本月范圍內(nèi),則輸出陰歷,否則則輸出空格。
=IF(AND(C6>=$B$5,C6<$S$5),GetYLDate(C6)," ")  最終結(jié)果如下:

<!--[if !supportLists]-->3.6         持續(xù)改進

首先需要把每個月的日歷完善起來。
其次需要把年份動態(tài)加入到相應的月份和日期中來。
再次需要添加數(shù)值調(diào)節(jié)鈕(表單控件和ActiveX控件均可)

<!--[if !supportLists]-->4.   <!--[endif]-->總結(jié)

Excel的萬年歷制作涉及到Excel的函數(shù)、相對引用、絕對引用、數(shù)據(jù)的物理存儲和展現(xiàn)、條件格式、套用表格格式、控件、VBA。
如果把萬年歷看做是一個小型項目的話,從需求分析、系統(tǒng)設計、實現(xiàn)、測試,直至不斷優(yōu)化是個反復迭代的過程。
總之通過Excel萬年歷的制作收益匪淺。

本文出自 “不勝人生一場醉” 博客,請務必保留此出處http://baoqiangwang.blog.51cto.com/1554549/324573

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多