VBA數(shù)組通俗教程(初稿) 懷英慕者 編寫 序言 關(guān)于寫作理念 相信很多朋友都有這樣的抱怨,微軟的幫助文檔怎么看都看不明白,亂七八糟的!又或者,某某計(jì)算機(jī)教程寫的跟微軟自帶幫助一樣,,看不明白!再或者,,計(jì)算機(jī)根本就沒法學(xué),,教科書全是專業(yè)術(shù)語,全是英文,!當(dāng)然,,會(huì)有另一些朋友站出來辯駁,說學(xué)計(jì)算機(jī)就得硬著頭皮,,就得掉層皮,!或者,你得從基礎(chǔ)學(xué)起,,什么硬件啊,、結(jié)構(gòu)啊、算法??!如此看來,我們想嘗嘗牛肉的滋味,,必須先得宰頭牛,,還得全咽下去!還有一些朋友提倡多動(dòng)手去做,,做得多了就會(huì)了,論據(jù)是原始人最開始是沒有教科書的。 以上朋友的困惑我也遇到過,,抱怨過,,那些出主意的朋友說的也不失為一種學(xué)習(xí)的方法。但是,,我始終認(rèn)為,,學(xué)習(xí)并不一定是件苦差事。我還拿《明朝那些事兒》打比方,,很多朋友都讀過這本書,,沒讀過的百度一下,是本好書,。我自小是喜歡歷史的,,相反,很多同學(xué)卻十分的沒興趣,。為什么,?滿頁滿頁的人物、時(shí)間,、事件,、意義。其實(shí)則不然,,用人大教授毛佩琦的話說“歷史是如此生動(dòng)活潑,,豐富多彩!為什么到了史學(xué)家手里就變得枯燥無味了呢,?歷史學(xué)家就不能把生動(dòng)活潑的歷史呈現(xiàn)給大眾嗎,?是受制于能力、才力,,還是受制于觀念,?” 《明朝那些事兒》就是“以史料為基礎(chǔ),以年代和具體人物為主線,,并加入了小說的筆法和對(duì)人物的心理分析,,以及對(duì)當(dāng)時(shí)政治經(jīng)濟(jì)制度的一些評(píng)價(jià)”,于是我最不喜歡和最不愿讀的明史也變得興趣盎然了,!那么以此類推,,計(jì)算機(jī)是如此生動(dòng)有趣,豐富多彩,!為什么到了計(jì)算機(jī)專家手里就變得枯燥無味了呢,?計(jì)算機(jī)專家就不能把生動(dòng)有趣的知識(shí)呈現(xiàn)給大眾嗎?是受制于能力,、才力,,還是受制于觀念,? 有人就要說了,計(jì)算機(jī)教科書寫的“嬉笑怒罵”,、“俗不可耐”就失去了它的嚴(yán)肅性和權(quán)威性,,就學(xué)不到嚴(yán)謹(jǐn)?shù)闹R(shí)!朋友,,語言形式的通俗生動(dòng)就不能清楚的表達(dá)正確內(nèi)涵了嗎,?就一定要操著一口標(biāo)準(zhǔn)的普通話說“是誰啊,?是我?。「墒裁??上廁所,。”你才能明白,?,!如果變成“誰?我,!抓,?(河南方言:意為干什么)尿?!蹦憔吐牪欢??就影響理解了?,!我們自問,,現(xiàn)實(shí)生活中,自己也是這么一本正經(jīng)的說話嗎,? 由此看來,,知識(shí)并非就是晦澀難懂的,難就難在編著者寫書的“觀念”,。 因此,,凡是以書面形式的東西就要它“書面”,就要把它包裝成“權(quán)威”的模樣,,就要讓你望而生畏,,就要讓你看不懂!不然你這位“學(xué)究”就貽笑大方了,! 我很敬佩唐代詩人白居易,,他的詩向來通俗易懂,傳說他每次寫完詩總要先念給一位不識(shí)字的老婆婆去聽,,聽不懂的他就修改,,直到能聽懂為止,。白居易就是這樣做了,難道他的詩人地位受到了挑戰(zhàn),? 又有人說,,《陽春白雪》(高雅音樂)和《下里巴人》(通俗音樂)都應(yīng)該受到重視。這點(diǎn)我不否認(rèn),,但是,你不能把所有的東西都做成《陽春白雪》的標(biāo)準(zhǔn)吧,!如果是那樣,,還有幾個(gè)人有能力去接受它?很難接受或不能接受的東西,,就失去了好的意義,,也就失去了存在的價(jià)值。 計(jì)算機(jī)教程的讀者并不一定都是科班出身,,十成里面有一成系統(tǒng)學(xué)過計(jì)算機(jī)就不錯(cuò)了,!面對(duì)他們,教程的編寫者也要板著臉之乎者也嗎,?話說回來,,真是計(jì)算機(jī)科班出身的朋友,自問從零開始就是面對(duì)那些枯燥無味的教科書,,你們沒受過煎熬,?你們真正掌握了多少?你們中最后學(xué)有所成的十成里又有幾成,?,! 我寫這篇文章無意質(zhì)疑教育制度,只想向朋友們交流我的一種理念,,教科書要么不寫,,要么就要寫的通俗易懂。不要想當(dāng)然的把你的讀者進(jìn)行層次劃分,,如果一定要定位,,那么就定位成你的讀者都只有一個(gè)基本閱讀水平。當(dāng)然,,你可以說你的這本書必須有一定計(jì)算機(jī)水平的人來讀,,但也完全沒必要就又換成了“學(xué)究”的嘴臉,須知,,任何高深的知識(shí)與高深的講授語言是不成正比的,! 關(guān)于這篇教程 為什么要寫這篇關(guān)于數(shù)組的教程,我沒有什么太多要說的,。只是感覺數(shù)組在Excel VBA中作用很大,!在讀了一些老師們的教程之后,,有這么個(gè)沖動(dòng)想用更通俗的語言描述出來。關(guān)于數(shù)組的學(xué)習(xí)我只是剛起步,,甚至還談不上入門,!但我還是要寫,用我的語言寫出我對(duì)數(shù)組的理解,,里面肯定有很多東西沒有講述到,,有些是我自己還沒搞清楚,有些則是覺得實(shí)際意義不大,。但是,,隨著進(jìn)一步的學(xué)習(xí),我會(huì)對(duì)這篇文章進(jìn)行再加工,,最后拿出個(gè)成品獻(xiàn)給大家,,幫助那些曾經(jīng)和一直困惑著的朋友們!如果我精力有余,,我也會(huì)再次系統(tǒng)地學(xué)習(xí)Excel的其他知識(shí),,寫出一本真正通俗易懂的Excel教科書,讓朋友們從此逃出枯燥學(xué)習(xí)的夢(mèng)魘,! 正文 一,、什么是數(shù)組? 數(shù)組就是對(duì)單元格區(qū)域的另一種操作方式,。 我們知道,,VBA是這樣做的: 例如我們要對(duì)區(qū)域B2:D6進(jìn)行賦值,簡(jiǎn)單點(diǎn)都填充成1吧,。
可是,,數(shù)組又是怎么做的呢,? 二、數(shù)組是這么做的,。 還是上面的任務(wù),,
三、數(shù)組還有用嗎,? 能用,。 原來上面關(guān)于數(shù)組的代碼我們犯了一個(gè)常識(shí)性錯(cuò)誤,就是忘記了循環(huán)語句這個(gè)利器,。怪不得這樣編起來比在單元格里直接輸入還麻煩,!那么修改一下代碼:
可是比起VBA常用方式,,這還是麻煩了啊,! 四,、黑匣子的秘密。 你知道VBA的運(yùn)算原理嗎,? VBA的運(yùn)算原理涉及到計(jì)算機(jī)的運(yùn)算原理,這是計(jì)算機(jī)系專業(yè)學(xué)生要知道的,,我們不需要知道,,此處略去N本書。但為了讓你明白數(shù)組的真正有用之處,,我又略去N句話,,最后用一句話來說明。 原來,,VBA中的數(shù)據(jù)運(yùn)算最終是在計(jì)算機(jī)的內(nèi)存中進(jìn)行的,,假定數(shù)據(jù)已經(jīng)存放在內(nèi)存中,那么就直接進(jìn)行運(yùn)算,,但如果數(shù)據(jù)是存放在單元格里的,,那就先得把第一個(gè)數(shù)據(jù)從單元格里調(diào)入到內(nèi)存中,然后再在內(nèi)存中對(duì)這個(gè)數(shù)據(jù)進(jìn)行運(yùn)算,,接下來是第二個(gè)一直到第N個(gè),。 看出端倪了吧!如果你處理的數(shù)據(jù)量越來越大的話,,VBA執(zhí)行速度就越來越慢,,怪不得有些朋友編的代碼能運(yùn)行幾十分鐘甚至幾個(gè)小時(shí)! 而數(shù)組就好像是一個(gè)黑匣子,,VBA執(zhí)行時(shí),,先把要處理的所有單元格數(shù)據(jù)全部放在這個(gè)匣子里,再把匣子放進(jìn)內(nèi)存,,從而避免了反復(fù)操作單元格的麻煩,。 現(xiàn)在,你還說數(shù)組沒用嗎,?不僅能用,,而且作用無法估量,! 五、我們平時(shí)操作單元格數(shù)據(jù)一般有三種情況: 1,、操作一行數(shù)據(jù),,比如A1:D1填寫列標(biāo)題; 2,、操作一列數(shù)據(jù),,比如A1:A6填寫行標(biāo)題; 3,、操作多行多列數(shù)據(jù),,比如B2:D6填寫一個(gè)塊。 VBA常用的操作方式我們都會(huì),,也都很簡(jiǎn)單,,不分情況,常用格式都一樣,,比如Range('A1:D1'),、Range('A1:A6')或Range('B2:D6')。 六,、用數(shù)組操作卻是要分情況的,。 我們還是用最簡(jiǎn)單的例子,就是填充區(qū)域?yàn)?,,看看不同情況,,數(shù)組的格式有什么不同。 1,、操作一行數(shù)據(jù),,比如A1:D1填寫列標(biāo)題;
我們發(fā)現(xiàn),,前兩者的不同在于最后一句多了一個(gè)“WorksheetFunction.Transpose()”函數(shù),熟悉函數(shù)的朋友都知道,這是一個(gè)行列轉(zhuǎn)置函數(shù),。那為什么一定要用到轉(zhuǎn)置呢,?因?yàn)椋瑪?shù)組不能直接操作一列的數(shù)據(jù),,或者說數(shù)組只能直接操作一行的數(shù)據(jù),。不要太糾結(jié),你硬記下來好了,,凡是打算操作一列數(shù)據(jù)時(shí),,記著使用WorksheetFunction.Transpose()就可以了! 如果把前兩種情況歸成一類的話,,那么他們和第三種情況的主要區(qū)別在于第一句話,。前兩者是arr(1 To x)這種格式,而第三者是arr(1 To x, 1 To y)這種格式,。我們把第一種格式的數(shù)組稱之為一維數(shù)組,,而后一種稱之為二維數(shù)組。 七,、數(shù)組的維,?? 我們看動(dòng)畫玩游戲,,都喜歡3D動(dòng)畫的,為什么,?因?yàn)槿宋飯?chǎng)景都是立體的,,也就是說人物不像紙片一樣貼在屏幕上而是具有縱深感。相反,,以前的動(dòng)畫,、游戲都是2D的,就是一個(gè)平面,。3D,、2D其實(shí)是一種英語簡(jiǎn)稱,全稱分別是Three Dimensions和Two Dimensions,,翻譯成中文就是三維,、三個(gè)維度、三個(gè)坐標(biāo)或者二維,、二個(gè)維度,、二個(gè)坐標(biāo)。這樣就明白了,,原來幾維就代表幾個(gè)坐標(biāo),,終于和我們初中學(xué)過的數(shù)學(xué)聯(lián)系上了!三維就是x、y,、z三個(gè)坐標(biāo)表示一個(gè)立體的點(diǎn),,二維就是x、y兩個(gè)坐標(biāo)表示一個(gè)平面的點(diǎn),,同理,,一維就是x或者y表示水平方向或者垂直方向的一個(gè)點(diǎn)。我們學(xué)習(xí)Excel,,知道每張工作表都是由行和列做成的,,因此,如果我們單獨(dú)操作某行或某列數(shù)據(jù),,就是面對(duì)一維的數(shù)據(jù),;操作多行多列就是面對(duì)二維的數(shù)據(jù)。你見過Excel能表示三維的數(shù)據(jù)嗎,?起碼我沒見過,。所以,我們只用記住數(shù)組分成兩類:一維數(shù)組和二維數(shù)組就可以了,。 八,、數(shù)組維數(shù)的聲明。 既然我們知道了數(shù)組分為一維的和二維的,,那么就要清楚他們二者的聲明格式具體有什么不同,。我們還看前面的例子:
我們馬上產(chǎn)生疑問:1 To x和1 To y分別表示什么?為了讓大家看的更明白些,,我舉例說明,。
九、數(shù)組聲明還應(yīng)該注意一點(diǎn),。 如果大家留心會(huì)發(fā)現(xiàn),,我前面的所有例子代碼中聲明數(shù)組時(shí)都在后面加了句“As Integer”,加這句話有兩層意思: 1、說明數(shù)組也和VBA中其它變量一樣是可以自由定義數(shù)據(jù)類型的,,所不同的是,,數(shù)組定義數(shù)據(jù)類型后,數(shù)組里面的所有單元格數(shù)據(jù)都被定義成了同一種類型,。 2,、我們要養(yǎng)成良好的代碼編寫習(xí)慣,你使用一個(gè)變量時(shí)一定要先聲明數(shù)據(jù)類型,,要根據(jù)自己的需要聲明合適的數(shù)據(jù)類型,。前面的例子如果把As Integer這句全去掉的話,完全可以正確運(yùn)行,,可是每個(gè)數(shù)組就被系統(tǒng)默認(rèn)定義為Variant類型,,Integer和Variant區(qū)別很大,消耗的內(nèi)存也大不相同,,我們既然使用數(shù)組目的就是要使代碼運(yùn)行的快一點(diǎn),,可是圖省事不定義數(shù)據(jù)類型反而會(huì)使代碼達(dá)不到快的運(yùn)行效果。這一點(diǎn)也需要大家謹(jǐn)記,! 十,、另一種創(chuàng)建數(shù)組的方法 剛才所有的例子都是先創(chuàng)建一個(gè)數(shù)組,再利用數(shù)組對(duì)單元格區(qū)域進(jìn)行賦值,。實(shí)際應(yīng)用中,,我們還可以利用單元格區(qū)域直接創(chuàng)建數(shù)組,這樣做可以省去上面聲明數(shù)組的麻煩,,而且也能更方便,、直觀地使用數(shù)組進(jìn)行復(fù)雜的運(yùn)算。 下面的例子我們假定A1:B3區(qū)域是有數(shù)據(jù)的,,用C1:C3存放前兩列的乘積,。
十一、工具是死的,,人是活的,。 截至目前,相信你已經(jīng)對(duì)數(shù)組有了大致的認(rèn)識(shí),,也能使用它進(jìn)行日常的工作了,。可是遇到復(fù)雜的工作,,也還是覺得無從下手,,你又會(huì)求助高手幫忙,他們也會(huì)用到數(shù)組??僧?dāng)看到人家那密密麻麻的代碼時(shí)你傻眼了,!你看到里面確實(shí)用了數(shù)組,可就是弄不明白你眼前的數(shù)組和你學(xué)的數(shù)組怎么就聯(lián)系不上,!我告訴你原因,,并非你學(xué)了《九陰假經(jīng)》,你的和他的一樣,,所不同的是人家運(yùn)用了巧妙的算法在里面,,工具是一樣的,人家把工具用活了,! 十二,、最后的話。 其實(shí)計(jì)算機(jī)編程里面有門很重要的學(xué)科就是算法,,我沒學(xué)過算法,,但我的理解就是解決問題的辦法,打個(gè)比方就好像你打算去公園,,可以騎自行車去,,也可以坐公交或者打的,甚至你也可以步行,,交通工具就如同函數(shù),、VBA、數(shù)組等等,,但只有交通工具也并不能很好地解決問題,,南轅北轍的故事就說明了一切,所以,,除了要有合適的工具,,恰當(dāng)?shù)穆肪€也是至關(guān)重要的,路線就是方法,,就是算法,。我們首先要努力熟練掌握各種工具的特性,然后根據(jù)實(shí)際問題認(rèn)真分析制定出合適的算法,,這樣才能達(dá)到事半功倍的效果,。算法的提高我覺得一要多動(dòng)腦筋自己思考,二要多參考經(jīng)典問題的經(jīng)典解決辦法,,學(xué)會(huì)融會(huì)貫通,。 |
|