簡明Excel VBA
本文集同步于GitHub倉庫:# bluetata/concise-excel-vba
0x01 語法說明
都知道學(xué)會了英語語法,再加上大量的詞匯基礎(chǔ)您旁,就算基本掌握了英語了烙常。
類似的要使用vba,也要入鄉(xiāng)隨俗被冒,了解他的構(gòu)成坪仇,簡單的說vba包含數(shù)據(jù)類型
公浪、
變量
/常量
、對象
和常用的語句結(jié)構(gòu)
妓灌。
不過呢在量和復(fù)雜度上遠(yuǎn)低于英語跃洛,不用那么痛苦的記單詞了率触,所以vba其實很簡單的。
熟悉了規(guī)則之后剩下就是查官方函數(shù)啦汇竭,查Excel提供的可操作對象啦葱蝗。
順帶一提的是,函數(shù)其實也很容易理解细燎,方便使用两曼。拿到一個函數(shù),例如Sum
玻驻,
只要知道它是求多個數(shù)的和就夠了悼凑,剩下的就是用了。例如Sum(1000,9)
結(jié)果就是1009
了璧瞬。
函數(shù)的一大好處就是隱藏具體實現(xiàn)細(xì)節(jié)户辫,提供簡潔的使用方法。
1.1 數(shù)據(jù)和數(shù)據(jù)類型
Excel里的每一個單元格都是一個數(shù)據(jù)
嗤锉,無論是數(shù)字渔欢、字母或標(biāo)點都是數(shù)據(jù)。
對數(shù)據(jù)排排隊瘟忱,吃果果奥额,對不同的數(shù)據(jù)扔到不同的籃子里歸類,籃子就是數(shù)據(jù)類型
了访诱。
在Excel-vba中披坏,數(shù)據(jù)類型
只有數(shù)值
、文本
盐数、日期
棒拂、邏輯
或錯誤
五種類型。
前四種最為常用。具體描述參見下表:
類型 | 類型名稱 | 范圍 | 占用空間 | 聲明符號 | 備注 |
---|---|---|---|---|---|
邏輯型 | |||||
布爾 | Boolean | 邏輯值True或False | 2 | ||
數(shù)值型 | |||||
字節(jié) | Byte | 0~255的整數(shù) | 1 | ||
整數(shù) | Integer | -32768~32767 | 2 | % | |
長整數(shù) | Long | -2147483648~2147483647 | 4 | & | |
單精度浮點 | Single | 4 | ! | ||
雙精度浮點 | Double | 4 | # | ||
貨幣 | Currency | 8 | @ | ||
小數(shù) | Decimal | 14 | |||
日期型 | |||||
日期 | Date | 日期范圍:100/1/1~9999/12/31 | 8 | ||
文本型 | |||||
變長字符串 | String | 0~20億 | $ | ||
定長字符串 | String | 1~65400 | |||
其他 | |||||
變體型 | Variant(數(shù)值) | 保存任意數(shù)值帚屉,也可以存儲Error,Empty,Nothing,Null等特殊數(shù)值 | |||
對象 | Object | 引用對象 | 4 |
表1.1 VBA數(shù)據(jù)類型
補充一點是谜诫,數(shù)組就像一筐水果,里面可以存不止一個數(shù)據(jù)攻旦。
他不是一個具體的數(shù)據(jù)類型喻旷,叫數(shù)據(jù)結(jié)構(gòu)更合適些。
1.2 常量和變量
定義后不能被改變的量牢屋,就是常量
且预;相反的變量
就能修改具體值。
在vba里烙无,使用一個 變量/常量 要先聲明锋谐。
常量
聲明方法如下:</br>
Const 常量名稱 As 數(shù)據(jù)類型 = 存儲在常量中的數(shù)據(jù)
例如:
Const PI As Single = 3.14 ' 定義一個浮點常量為PI,值為3.14
變量
聲明方法如下:</br>
Dim 變量名 As 數(shù)據(jù)類型
變量名截酷,必須字母或漢字開頭涮拗,不能 包含空格、句號迂苛、感嘆號等三热。
數(shù)據(jù)類型,對應(yīng)上面 ↑ 表1.1里的那些
更多的聲明方法三幻,跟Dim
聲明的區(qū)別是作用范圍不同:
Private v1 As Integer ' v1為私有整形變量
Public v2 As String ' v2為共有字符串變量
Static v3 As Integer ' v3為靜態(tài)變量就漾,程序結(jié)束后值不變
' 變量聲明之后,就可以賦值和使用了
v1 = 1009
v2 = "1009"
v3 = 1009
' 使用類型聲明符念搬,可以達到跟上面同樣的效果
public v2$ ' 與 Public v2 As String 效果一樣
' 聲明變量時从藤,不指定具體的類型就變成了Variant類型,根據(jù)需要轉(zhuǎn)換數(shù)據(jù)類型
Dim v4
1.3 數(shù)組
使用數(shù)組和對象時锁蠕,也要聲明夷野,這里說下數(shù)組的聲明:
' 確定范圍的數(shù)組,可以存儲b - a + 1個數(shù)荣倾,a悯搔、b為整數(shù)
Dim 數(shù)組名稱(a To b) As 數(shù)據(jù)類型
Dim arr(1 TO 100) As Integer ' 表示arr可以存儲100個整數(shù)
arr(100) '表示arr中第100個數(shù)據(jù)
' 不指定a,直接聲明時舌仍,默認(rèn)a為0
Dim arr2(100) As Integer ' 表示arr可以存儲101個整數(shù),從0數(shù)
arr2(100) '表示arr2中第101個數(shù)據(jù)
' 多維數(shù)組
Dim arr3(1 To 3,1 To 3,1 To 3) As Integer ' 定義了一個三維數(shù)組妒貌,可以存儲3*3*3=27個整數(shù)
' 動態(tài)數(shù)組,不確定數(shù)組大小時使用
Dim arr4() As Integer ' 定義arr4為整形動態(tài)數(shù)組
ReDim arr4(1 To v1) ' 設(shè)定arr4的大小铸豁,不能重新設(shè)定arr4的類型
除了用Dim
做常規(guī)的數(shù)組的聲明灌曙,還有下面這些聲明數(shù)組的方式:
' 使用Array函數(shù)將已知的數(shù)據(jù)常量放到數(shù)組里
Dim arr As Variant ' 定義arr為變體類型
arr = Array(1, 1, 2, 3, 5, 8, 13, 21) ' 將整數(shù)存儲到arr中,索引默認(rèn)從0開始
' 使用Split函數(shù)分隔字符串創(chuàng)建數(shù)組
Dim arr2 As Variant
arr2 = Split("hello, world", ", ") ' 按,分隔字符串 hello,world 并賦值給arr2
' 使用Excel單元格區(qū)域創(chuàng)建數(shù)組
' 這種方式創(chuàng)建的數(shù)組,索引默認(rèn)從1開始
Dim arr3 As Variant
arr3 = Range("A1:C3").Value ' 將A1:C3中的數(shù)組存儲到arr3中
Range("A4:C6").Value= arr3 ' 將arr3中的數(shù)據(jù)寫入到A4:C6中的區(qū)域
數(shù)組常用的函數(shù)
函數(shù) | 函數(shù)說明 | 參數(shù)說明 | 示例 |
---|---|---|---|
UBound(Array arr, [Integer i]) |
數(shù)組最大的索引值 |
arr :數(shù)組节芥;i :整形在刺,數(shù)組維數(shù) |
|
LBound(Array arr, [Integer i]) |
數(shù)組最小的索引值 | 同上 | |
Join(Array arr, [String s]) |
合并字符串 |
arr :數(shù)組逆害;s :合并的分隔符 |
|
Split(String str, [String s]) |
分割字符串 |
str :待分割的字符串;s :分割字符串的分隔符 |
函數(shù)說明
UBound(Array arr,[Integer i]);</br>
UBound為函數(shù)名</br>
arr和i 為UBound的的參數(shù)蚣驼,用中括號括起來的表示i為非必填參數(shù)</br>
arr和i 之前的Array魄幕,Integer表示對應(yīng)參數(shù)的數(shù)據(jù)類型</br>
1.4 運算符
運算符的作用是對數(shù)據(jù)進行操作,像加減乘除等颖杏。這塊不再具體說明纯陨,列一下vba中常用的運算符。
運算符 | 作用 | 示例 |
---|---|---|
算術(shù)運算符 | ||
+ | 求兩個數(shù)的和 | |
- | 求兩個數(shù)的差 | |
* | 求兩個數(shù)的乘積 | |
/ | 求兩個數(shù)的商 | |
\ |
求兩個數(shù)相除后所得商的整數(shù) | |
^ | 求一個數(shù)的某次方 | |
Mod | 求兩個數(shù)相除后所得的余數(shù) | 10 Mod 9=3 |
比較運算符 | ||
= | 比較兩個數(shù)據(jù)是否相等 | 相等返回 True;否則返回False |
<> | 不相等 | |
< | 小于 | |
> | 大于 | |
<= | 不大于 | |
>= | 不小于 | |
Is | 比較連個對象的引用關(guān)系 | |
Like | 比較兩個字符串是否匹配 | String1 Like String2 |
文本運算符 | ||
+ | 連接兩個字符串 | |
& | 連接兩個字符串 | |
邏輯運算符 | ||
And | 邏輯與 | |
Or | 邏輯或 | |
Not | 邏輯非 | |
Xor | 邏輯抑或 |
表達式1 Xor 表達式2 兩個表達式返回的值不相等時為True |
Eqv | 邏輯等價 |
表達式1 Eqv 表達式2 兩個表達式返回的值相等時為True |
Imp | 邏輯蘊含 |
' Like是個比較有用的運算符留储,常用來做匹配或模糊匹配翼抠。
' 在模糊匹配的時候,有一些通配符能方便模糊匹配規(guī)則的書寫
"這是一個demo1" Like "*demo1" = True ' * 號表示匹配任意多個字符
"這是一個demo2" Like "????demo2" = True ' ? 號表示匹配任意單個字符
"這是一個demo3" Like "*demo#" = True ' # 號表示匹配任意數(shù)字