久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Excel VBA數(shù)組通俗教程(初稿)

 L羅樂 2016-11-19

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吧,。
  1. Sub VBA的方式()
  2.     Range('B2:D6') = 1
  3. End Sub
的確很簡(jiǎn)單,,我們常用這種形式對(duì)單元格或單元格區(qū)域進(jìn)行賦值或者取值。
可是,,數(shù)組又是怎么做的呢,?

二、數(shù)組是這么做的,。

還是上面的任務(wù),,
  1. Sub 數(shù)組的方式()
  2.     Dim arr(1 To 5, 1 To 3) As Integer '聲明一個(gè)數(shù)組
  3.     '---------------------------------------
  4.     arr(1, 1) = 1
  5.     arr(1, 2) = 1
  6.     arr(1, 3) = 1
  7.     arr(2, 1) = 1
  8.     arr(2, 2) = 1
  9.     arr(2, 3) = 1
  10.     arr(3, 1) = 1
  11.     arr(3, 2) = 1
  12.     arr(3, 3) = 1
  13.     arr(4, 1) = 1
  14.     arr(4, 2) = 1
  15.     arr(4, 3) = 1
  16.     arr(5, 1) = 1
  17.     arr(5, 2) = 1
  18.     arr(5, 3) = 1
  19.     '---------------------------------------
  20.     '給數(shù)組的每個(gè)元素賦值
  21.     Range('B2:D6') = arr  '將數(shù)組賦值給單元格區(qū)域
  22. End Sub
我的天!這不是吃飽了撐的嗎,?,!

三、數(shù)組還有用嗎,?

能用,。
原來上面關(guān)于數(shù)組的代碼我們犯了一個(gè)常識(shí)性錯(cuò)誤,就是忘記了循環(huán)語句這個(gè)利器,。怪不得這樣編起來比在單元格里直接輸入還麻煩,!那么修改一下代碼:
  1. Sub 數(shù)組的方式2()
  2.     Dim arr(1 To 5, 1 To 3) As Integer  '聲明一個(gè)數(shù)組
  3.     '---------------------------------------
  4.     For x = 1 To 5
  5.         For y = 1 To 3
  6.             arr(x, y) = 1
  7.         Next y
  8.     Next x
  9.     '---------------------------------------
  10.     '使用循環(huán)語句,,給數(shù)組的每個(gè)元素賦值
  11.     Range('B2:D6') = arr  '將數(shù)組賦值給單元格區(qū)域
  12. End Sub
嗯,這就好多了,!原來數(shù)組也可以使用循環(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)題;
  1. Sub 操作一行數(shù)據(jù)()
  2.     Dim arr(1 To 4) As Integer  '聲明一個(gè)數(shù)組
  3.     '---------------------------------------
  4.     For x = 1 To 4
  5.             arr(x) = 1
  6.     Next x
  7.     '---------------------------------------
  8.     '使用循環(huán)語句,,給數(shù)組的每個(gè)元素賦值
  9.     Range('A1:D1') = arr  '將數(shù)組賦值給單元格區(qū)域
  10. End Sub
2,、操作一列數(shù)據(jù),比如A1:A6填寫行標(biāo)題,;
  1. Sub 操作一列數(shù)據(jù)()
  2.     Dim arr(1 To 6) As Integer  '聲明一個(gè)數(shù)組
  3.     '---------------------------------------
  4.     For x = 1 To 6
  5.             arr(x) = 1
  6.     Next x
  7.     '---------------------------------------
  8.     '使用循環(huán)語句,,給數(shù)組的每個(gè)元素賦值
  9.     Range('A1:A6') = WorksheetFunction.Transpose(arr)  '將數(shù)組賦值給單元格區(qū)域
  10. End Sub
3、操作多行多列數(shù)據(jù),,比如B2:D6填寫一個(gè)塊,。
  1. Sub 操作多行多列數(shù)據(jù)()
  2.     Dim arr(1 To 5, 1 To 3) As Integer  '聲明一個(gè)數(shù)組
  3.     '---------------------------------------
  4.     For x = 1 To 5
  5.         For y = 1 To 3
  6.             arr(x, y) = 1
  7.         Next y
  8.     Next x
  9.     '---------------------------------------
  10.     '使用循環(huán)語句,給數(shù)組的每個(gè)元素賦值
  11.     Range('B2:D6') = arr  '將數(shù)組賦值給單元格區(qū)域
  12. End Sub
三者的不同之處我已經(jīng)用紅色字體標(biāo)識(shí)出來了,。
我們發(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ù)組分為一維的和二維的,,那么就要清楚他們二者的聲明格式具體有什么不同,。我們還看前面的例子:
  
目的
  
類型
聲明格式
  
操作某行或某列
  
一維數(shù)組
arr(1  To x)
  
操作多行多列
  
二維數(shù)組
arr(1  To x, 1 To y)
我們馬上產(chǎn)生疑問:1 To x和1 To y分別表示什么?為了讓大家看的更明白些,,我舉例說明,。
  
目的
  
例子
類型
聲明格式
  
操作某行
  
或某列
  
A1:D1
  
或A1:A6
第一行的1至4單元格
  
或第一列的1至6單元格
一維數(shù)組
arr(1 To 4)
  
或arr(1 To 6)
  
操作多行多列
  
B2:D6
每行有1至3個(gè)單元格,每列有1至5個(gè)單元格的區(qū)域,,也即5行3列的區(qū)域,。
二維數(shù)組
arr(1 To 5, 1 To3)
這下看明白了,原來在一維數(shù)組中,,1 To x的x表示你要操作的行或列中有x個(gè)單元格,;二維數(shù)組中,1 To x和1 To y表示你要操作的數(shù)據(jù)區(qū)域有x行,,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存放前兩列的乘積,。
  1. Sub 直接創(chuàng)建數(shù)組()
  2.     arr = Range('A1:C3')  '直接用單元格區(qū)域創(chuàng)建了一個(gè)3行3列的數(shù)組arr
  3.     For x = 1 To 3
  4.             arr(x, 3) = arr(x, 1) * arr(x, 2)  '把數(shù)組前兩列相乘的結(jié)果賦值給第三列
  5.     Next x
  6.     Range('A1:C3') = arr '將新的數(shù)組結(jié)果賦值給原單元格區(qū)域
  7. End Sub
你看,,藍(lán)色代碼是不是很像傳統(tǒng)VBA那樣簡(jiǎn)潔的操作,?

十一、工具是死的,,人是活的,。

截至目前,相信你已經(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ì)貫通,。

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

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多