一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Excel VBA 學(xué)習(xí)總結(jié)

 Excel實(shí)用知識(shí) 2021-11-20

  VBA的對(duì)象是有很多共性的,拋開它們所在層次的不同,它們的很多操作特征是一樣的,比如它們都包括子對(duì)象集合,都包括某些激活操作,刪除操作等等。像簡(jiǎn)單的Activate,Delete,Cut類似的操作我就不詳細(xì)說了。下面我先總結(jié)一下這些共性中出鏡率最多的類型:Collection,然后分析一下與之類似的兩種常用類型,總結(jié)它們的不同。選擇集合的時(shí)候,要充分考慮它們的特性和實(shí)際的問題,采用合適的集合解決問題。

1. 集合

定義集合的方法:Dim col as New Collection

  • Add:往集合中添加一個(gè)元素,需要提供添加到集合中的元素,也可以提供一些其它可選的參數(shù),比如鍵值、位置等。
  • Remove:移除集合中的一個(gè)元素,需要提供該元素的Index值。
  • Count功能:返回集合中元素的數(shù)目。
  • Item功能:獲取集合中的一個(gè)元素,由于Item是集合的默認(rèn)屬性,所以可以直接拿集合對(duì)象獲取元素。參數(shù):提供Index值(基本都是從1開始),Name都是可以的(使用Name時(shí)要注意,必須給元素的Name賦過值)。例如:Workbooks(1),Worksheets(“Name”),Workbooks.Item(1)是等價(jià)的。

小例子如下: 

復(fù)制代碼
Sub TestCollection()
   
Dim col As New Collection
   
With col
     .Add (
0)
     .Add (
1)
     .Add (
2)
   
End With
   
   col.Remove (
1)
   
MsgBox col.Count
   
   
Dim i As Variant
   
For Each i In col
     
MsgBox i
   
Next
   
   
Dim j As Integer
   
For j = 1 To col.Count
    
MsgBox col.Item(j)
   
Next
End Sub
復(fù)制代碼

VBA的很多對(duì)象中都包括集合,但是這些集合中的對(duì)應(yīng)方法已經(jīng)做出了修改,使用時(shí)要注意參數(shù)和返回值。例如Workbooks集合Add方法就返回新添加的Workbook;Worksheets集合Add方法返回新添加的Worksheet?;旧蟽?nèi)置對(duì)象的集合屬性(Application.Workbooks, Workbook.Worksheets等等),Add方法都是用于添加一個(gè)新的成員并返回這個(gè)成員,你可以使用這個(gè)引用繼續(xù)完成相關(guān)的操作。

集合的索引值都是從1開始的。

集合中的元素并不要求類型一樣,但是為了方便處理,通常要求是一樣的。

可以用With減少代碼輸入。

可以用For Each遍歷集合,但是VBA要求元素必須定義成Variant、Object或者自定義的Class類型;而使用For和Item枚舉也很方便。

2. 數(shù)組

看完了集合,我們?cè)倏纯磾?shù)組與集合的對(duì)比。數(shù)組其實(shí)也應(yīng)該算是一個(gè)'集合',那么它與集合有什么不同呢?

先來看看數(shù)組的特性:

  • 數(shù)組是一個(gè)數(shù)據(jù)表,數(shù)組的元素類型通常都是一致的(別忘了Variant,Object),在定義時(shí)聲明。
  • 數(shù)組的下界默認(rèn)為0,可以通過在模塊開頭加上“Option Base 1”強(qiáng)行改為1;當(dāng)然也可以在定義時(shí)指定。
  • 數(shù)組可以通過ReDim和Preserve改變大小。
  • 數(shù)組可以使用Erase重新初始化固定大小數(shù)組中的元素(如清0,全部設(shè)為空串'',Variant類型全部設(shè)為Empty),或者釋放動(dòng)態(tài)數(shù)組的空間。
  • 數(shù)組支持多維的。
  • 數(shù)組是快速,高效的數(shù)據(jù)'集合'(內(nèi)存中順序存貯的,所以每個(gè)元素訪問都很快)。
  • 數(shù)組通常用于存儲(chǔ)單元格的值,處理完畢后再返回給單元格。

從上面其實(shí)已經(jīng)看到了它與集合最主要的不同了:元素類型,長度,下界,維度,效率。 

既然說到數(shù)組,那我也總結(jié)一下數(shù)組常用的方式和函數(shù):

賦值的方式

對(duì)于直接定義成數(shù)組的變量,循環(huán)賦值就可以了,但是除了這種方式,還有其它的方式動(dòng)態(tài)生成數(shù)組,那就是可以把變量定義成Variant類型的,然后用這幾種方式動(dòng)態(tài)生成數(shù)組:arr = Array(1,2,3),arr = [A1:A10],或者arr = Split('a,b,c',',')。

Split函數(shù)生成的數(shù)組下標(biāo)始終從0開始,即使是使用了Option Base強(qiáng)制從1開始了也如此。

Array函數(shù)生成的數(shù)組的下標(biāo)是從Option Base定義的下標(biāo)開始。

直接使用單元格賦值這種方式生成的數(shù)組的下標(biāo)是從1開始的,即使是使用了Option Base強(qiáng)制從0開始了也如此。

數(shù)組生成字符串

使用Join函數(shù)就可以了:s = Join(Array('a','b','c'),',');如果數(shù)組類型不是String,則需要先轉(zhuǎn)換一下。

獲取上下界

使用UBound(arr), LBound(arr)獲得上下界。

篩選數(shù)據(jù)

使用Filter(arr,match,include,compare)方法獲得符合條件的數(shù)據(jù),后面兩個(gè)參數(shù)并不是必須的。下面的小例子返回“不”包含“A“字符串的結(jié)果“D E”:

復(fù)制代碼
Sub testArr()
Dim a1 As Variant
Dim i As Integer

a1 
= Array('A''BA''CA''D''E')
a1 
= Filter(a1, 'A'False)
MsgBox Join(a1)
End Sub
復(fù)制代碼

Filter過濾是模糊過濾,注意這個(gè)特點(diǎn)。如果需要精確過濾,需要自己寫方法解決。

排序

可以利用內(nèi)置的Large,Small方法實(shí)現(xiàn)數(shù)值類型的排序。非數(shù)值類型,可以使用Worksheet中的Rank輔助排序,也可以自己寫冒泡,快速,選擇,希爾,桶排序等算法。 

復(fù)制代碼
Sub testArr()
    
Dim a(1 To 5As Integer
    
Dim b(1 To 5As String
    
Dim i As Integer
    a(
1= 111
    a(
2= 121
    a(
3= 234
    a(
4= 11
    a(
5= 9

    
For i = 1 To 5
     b(i) 
= Application.WorksheetFunction.Large(a, i)
    
Next

    
MsgBox Join(b, ',')
End Sub
復(fù)制代碼

經(jīng)典排序的實(shí)現(xiàn)可參看:http://www./cdb/viewthread.php?tid=13706&fpage=1

取得最大值最小值

 使用WorksheetFunction內(nèi)置的最大,最小值函數(shù)即可。

復(fù)制代碼
MsgBox Application.WorksheetFunction.Max(arr)
復(fù)制代碼

數(shù)組置換

使用內(nèi)置的WorksheetFunction.Transpose函數(shù)。

復(fù)制代碼
Public Sub TestTranspose()
Dim d(1 To 3As String
d(
1= 'a'
d(
2= 'b'
d(
3= 'c'

[a1].Resize(
1UBound(d)) = d
[d1].Resize(
UBound(d), 1= WorksheetFunction.Transpose(d)

End Sub
復(fù)制代碼

Transpose方法用于將一組單元格的行列置換,輸入的參數(shù)要求是數(shù)組格式的。

Transpose方法可以用于將數(shù)組的數(shù)組(數(shù)組的元素是數(shù)組,要求元素?cái)?shù)組長度一致)轉(zhuǎn)換成二維數(shù)組。

Transpose方法返回的類型為Variant,返回的數(shù)組的下界始終為1,即使是使用了Option Base強(qiáng)制定義為其它值也如此。

3. 字典

在很多Collection的不方便處理的情況下,字典常常作為擴(kuò)展手段來使用。字典的含義就不啰嗦了,下面總結(jié)一下字典。

字典的創(chuàng)建方式:

方式一:“后期綁定”,定義一個(gè)Object變量,直接賦值 - Set d = CreateObject('Scripting.Dictionary')。

方式二:“前期綁定”,加入c:\windows\system32\scrrun.dll 引用,然后明確創(chuàng)建類型 - Dim d as New Dictionary

字典的四個(gè)屬性:

  • CompareMode - 決定key的比較方法,BinaryCompare(默認(rèn))是采用二進(jìn)制方式比較:即a,A是不同字符;TextCompare采用文本方式比較:即a,A是相同字符。其它的比較方式可以參考相關(guān)的文檔。
  • Count - 計(jì)算字典中的條目數(shù)量,返回Long值。
  • Key - 鍵值,通常是整數(shù)或字符串;可以是除數(shù)組外的任何類型;Key具有唯一性。
  • Item - 可以是任何對(duì)象(不含自定義數(shù)據(jù))。

字典的六個(gè)方法:

  •  Add - 向字典添加內(nèi)容(添加的內(nèi)容是對(duì)象時(shí)注意不要忘記使用Set)。
  •  Exists - 判斷keys中有沒有要找的key,返回 true 或 false。
  •  Keys - 返回字典的Key數(shù)組,數(shù)組下標(biāo)始終從0開始,無視Option Base強(qiáng)制定義的值。
  •  Items - 返回字典的Item數(shù)組,數(shù)組下標(biāo)始終從0開始,無視Option Base強(qiáng)制定義的值。
  •  Remove - 按照key從字典中刪除一個(gè)項(xiàng)目。
  •  RemoveAll - 清空字典。

簡(jiǎn)單的看一個(gè)小例子:

復(fù)制代碼
Public Sub TestDic()
    
Dim d As Object
    
Set d = CreateObject('Scripting.Dictionary')
    d(
'A'= 1
    d(
'B'= 2
    d(
'C'= 3
    
'Change Key
    d.Key('A'= 'D'
    
'Change Value
    d('D'= 5
    
MsgBox d('D')
    
MsgBox d.Count
End Sub
復(fù)制代碼

VBA中字典具有以下的優(yōu)點(diǎn):添加、刪除元素的速度比Collection要快,避免了大量的循環(huán)與邏輯判斷,可使用的方法也比較多、比較方便。字典的使用也基本上是圍繞這些優(yōu)點(diǎn)展開的,比如:利用Key的唯一性,快速去除重復(fù)的數(shù)據(jù),通常配合Transpose方法可以完成許多這種任務(wù)。

關(guān)于字典的知識(shí),可以參看牛人的詳細(xì)解釋和常用示例:http://www./forum.php?mod=viewthread&tid=145901&highlight=%D7%D6%B5%E4。

快速引用單元格的值使用'[]',例如:arr = [A1]。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(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)論公約

    類似文章 更多

    高中女厕偷拍一区二区三区| 欧美日韩成人在线一区| 91一区国产中文字幕| 亚洲国产一级片在线观看| 日韩蜜桃一区二区三区| 好吊妞在线免费观看视频| 深夜视频成人在线观看| 免费一区二区三区少妇| 日韩美成人免费在线视频| 91在线国内在线中文字幕| 国产在线日韩精品欧美| 国产老熟女乱子人伦视频| 精品国自产拍天天青青草原| 国产精品第一香蕉视频| 欧美国产精品区一区二区三区| 欧美日韩欧美国产另类| 国产成人精品视频一二区| 青青草草免费在线视频| 国产麻豆精品福利在线| 麻豆国产精品一区二区| 九九热这里只有精品视频| 免费特黄一级一区二区三区| 人妻中文一区二区三区| 极品少妇一区二区三区精品视频| 欧美一级日韩中文字幕| 亚洲熟妇中文字幕五十路| 日韩三级黄色大片免费观看| 免费福利午夜在线观看| 久久热九九这里只有精品| 成人精品视频一区二区在线观看| 亚洲综合色婷婷七月丁香| 国产精品乱子伦一区二区三区| 亚洲欧洲在线一区二区三区| 亚洲品质一区二区三区| 日韩人妻毛片中文字幕| 欧美日韩高清不卡在线播放| 中文字幕不卡欧美在线| 亚洲精品黄色片中文字幕| 九九热精品视频免费观看| 国产成人精品一区二三区在线观看 | 成人日韩在线播放视频|