01-01、Excel VBA簡介
1.VBA是什么,能干什么
VBA可以說是一種編程語言,是VB的分支
VBA的作用,可以將重復的Excel工作簡單化
2.VBA具備的基礎知識
2.1基礎操作,能發(fā)現(xiàn)Excel軟件的局限性
2.2有一定的函數(shù)功底
2.3會VB語言(會VB語言更好,不一定一定需要)
3.保存
Excel啟用宏工作簿,可以防止代碼丟失
01-02、宏在工作中的運用
1.宏的定義
宏:macro 形容詞:巨大的,大量的,宏觀的 名詞:【電腦】巨(宏)指令
定義:椅子可以自動執(zhí)行的代碼(VBA)
錄制宏相當于攝像機的功能
2.錄制宏
在開發(fā)工具中的錄制宏中進行宏的錄制
重復執(zhí)行相同的操作??梢钥紤]用宏
總結:
優(yōu)點:重復執(zhí)行相同操作,提高工作效率
確定:不夠智能化,無法交互工作,代碼冗余
解決方法:VBA 即是用寫代碼的方法代替錄制宏
3.宏在Excel中的地位
雖然宏看起來不夠靈活,但對于學習VBA編程是非常重要的。
3.1提高代碼編寫效率
3.2幫助學習VBA知識
01-03、VBA基礎知識
1.VBA概念
Visual Basic for Applications(VBA)是一種Visual Basic的一種宏語言,主要能用來擴展Windows的應用程式功能
VBA是寄生于VB應用程序的版本,必須依賴于父程序,如EXCEL,CAD,CORELDRAW
2.VBA和VB的區(qū)別
2.1. VB是編寫應用程序,而VBA是使已有的應用程序(EXCEL、CAD)自動化
2.2.VB具有自己的開發(fā)環(huán)境,而VBA必須寄生于已有的應用程序.
2.3.運行VB開發(fā)的應用程序,不必安裝VB,而VBA開發(fā)的程序必須依賴于它的父應用程序
3.VBA的用途
3.1.規(guī)范用戶的操作,控制用戶的操作行為
3.2.操作界面人性化,方便用戶操作
3.3.多步驟,重復步驟可以通過執(zhí)行VBA代碼來迅速實現(xiàn)
3.4.實現(xiàn)一些無法實現(xiàn)的功能
4.VBA功能展示
01-04、Excel VAB窗口介紹
1.VBE就是VBA的編輯窗口
1.1按住ALT+F11快捷鍵
1.2開發(fā)工具-Visual Basic
2.VBE窗口簡介
2.1立即窗口:即使可以看到結果
2.2本地窗口:按F8鍵可以看到程序運行的步驟和每一步的結果
3.過程(子過程和函數(shù)過程)
3.1一般過程
Sub aaa()
End Sub
3.2自定義函數(shù)過程
Function ff()
End Functiom
4.第一個VBA程序
Sub 我的第一個程序()
MsgBox "我會VBA啦!"
End Sub
5.運行宏的方法,直接運行和圖像運行
圖像運行:在Excel菜單中點插入--圖形--畫一個圖形--點擊圖形右鍵--指定宏--確定即可
01-05、Excel VBA代碼編寫規(guī)則
1.VBE常見的設置
1.1工具--選項 里面可以修改編寫代碼時的字體顏色和字號等
1.2注釋 不會參與運行,開發(fā)自己看的,需要在代碼前加單引號(’)
統(tǒng)一加上解除注釋塊:選上工具欄的工具--右鍵--調(diào)出編輯窗口,上面有一個解除注釋塊和一個設置注釋塊。
1.3代碼的運行
上面的符號分別代表運行,暫停和終止運行的命令F8可以一步一步的運行代碼,可以檢查代碼的問題所在
1.4代碼的幫助
將代碼選中(抹黑),按F1即可以出來代碼的使用方法
2.代碼的編寫規(guī)則
2.1子過程
2.2函數(shù)過程
3.代碼的換行(下劃線+空格+換行)
01-06對象
1對象:現(xiàn)實中的對象,是真實存在的物體
在Excel中的對象指:工作薄、工作表、單元格、圖表、透視表之類的
2.集合:也是一種特殊的對象,不過沒有指定的哪個對象,知識一種統(tǒng)稱,如“人”就是一個集合的叫法,在Excel中的集合如:workbooks,worksheets,cells等等
3.常用的代碼操作對象
3.1工作薄(Workbooks)
workbooks(N)第N個工作薄
workbooks(“工作薄名”)
ActiveWorkbooks活動工作薄
ThisWorkbook代碼所在的工作薄
3.2工作表(Worksheets)
Sheets(N) 第N個工作表
Sheets("工作表名")
SheetN 第N個工作表
ActiveSheet 活動工作表
worksheets 與 Sheets的區(qū)別
3.3單元格(cells)
Range ("單元格地址")
Cells(行號,列號)
[A1]單元格簡寫
Activecell 活動單元格
Selection 當前被選取的區(qū)域
01-07、屬性
VBA屬性:指對象所具有的特征
人的屬性:姓名,年齡,身份證號,住址等
例:sub 屬性()
Debug.Print sheet1.Name '.name即為工作表sheet1的屬性
Debug.Print Sheet1.Range("a1").Value '.value即為工作表sheet1的屬性
End Sub
例:Sub 屬性賦值()
Sheet2.Name = "改變自己"
Sheet2.Range("a1") = "學習VBA"
End Sub
01-08、方法
方法:實際上是對對象的一種操作,他是一種動作,一種行為
例:
Sub 選擇方法()
Range("a1:a10").Select ‘選擇了a1:a10單元格,沒有指定工作表就默認為當前活動工作表’
End Sub
Sub 復制方法()
Sheet1.Range("a1:a10") = 1 '將1寫入表一的a1:a10區(qū)域
Sheet1.Range("a1:a10").Copy Sheet2.Range("a1") '將表一的a1:a10區(qū)域的值復制到表2的a1
End Sub
Sub 刪除方法()
Sheets(3).Delete
End Sub
01-09、常量和變量
1.常量:常量是定義了之后不會變化的量
常量定義格式:Const 常量名=常量表達式
Sub 常量()
Const pi=3.1415926
End Sub
2.變量:在定義之后還能再次賦值的量
變量定義格式:Dim 變量 As 變量類型
Sub 變量()
Dim a As Integer
a=344 '此時a=344
a=3455 ‘再次賦值a=3455
End Sub
3.常量和變量的應用
Sub 應用()
Const pi=3.1415926
Dim a As Integer
a-200
Debug.print pi*a
End Sub
4.注意事項
4.1.VBA允許使用未定義的變量,默認是變體變量
4.2.變量強制性聲明Option Explicit 或者在工具-編輯中設置每個程序都必須有變量聲明
5.變量的命名規(guī)則
5.1以字母開頭
5.2不能用保留字 如if end等
5.3字符個數(shù)不能超過255
5.4統(tǒng)一范圍內(nèi)必須是唯一的
01-10、數(shù)據(jù)類型
1.VBA中常見的數(shù)據(jù)類型
' 類型 注釋 簡寫 占用內(nèi)存
' Integer 整型 % 2Byte
' Single 單精度 ! 4Byte
' Double 雙精度 # 8Byte
' Long 長整型 & 4Byte
' String 字符型 $ 定長或變長( 變長字符串最多可包含大約 20 億 ( 2^31)個字符。 定長字符串可包含 1 到大約 64K ( 2^16 ) 個字符。)
' Currency 貨幣型 @ 8Byte
例:
Sub 數(shù)據(jù)類型()
Dim a As Integer
Dim b%
End Sub
Sub 多數(shù)據(jù)類型聲明()
Dim a As Integer, b As Single, c As String
Dim d%, e!, f$
End Sub ‘中間用,隔開
01-11、判斷語句之if
VBA中的IF條件判斷語句,就像函數(shù)中的IF一樣,可以單條件也可以多條件
例1:
Sub 判斷語句()
Dim a As Integer, b As Integer
a = 2
b = 2
If a = b Then MsgBox "相等"
End Sub
例2:
'if判斷語句有換行的話,就需要end if來結束
Sub 判斷語句2()
Dim a As Integer, b As Integer
a = 2
b = 2
If a = b Then
MsgBox "相等"
End If
End Sub
例3:
'if……then……else……end if
Sub 判斷語句3()
Dim a As Integer, b As Integer
a = 2
b = 3
If a = b Then
MsgBox "相等"
Else
MsgBox "不相等"
End If
End Sub
01-12、判斷語句if的多條件
例:
Sub 多條件判斷()
‘if 條件 then 結果 elseif 條件 then 結果 elseif 條件 then 結果elseif 條件 then 結果……else 結果……end if
If Sheet1.Range("b1") >= 90 Then
Sheet1.Range("b2") = "優(yōu)秀"
ElseIf Sheet1.Range("b1") >= 80 Then
Sheet1.Range("b2") = "良好"
ElseIf Sheet1.Range("b1") >= 60 Then
Sheet1.Range("b2") = "中等"
Else
Sheet1.Range("b2") = "較差"
End If
End Sub
VBA中的IIF函數(shù)與工作表函數(shù)if的語法結構是一致的
例單條件:
Sub IIF函數(shù)應用()
Cells(2, 3) = IIf(Cells(1, 2) > 80, "優(yōu)秀", "不優(yōu)秀")
End Sub
例多條件:
Sub IIF函數(shù)應用2()
Cells(2, 3) = IIf(Cells(1, 2) >= 90, "優(yōu)秀", _
IIf(Cells(1, 2) >= 80, "良好", IIf(Cells(1, 2) >= 60, "中等", "較差")))
End Sub
01-12B、if條件判斷小結
1.單行形式1(If...Then)
If 條件判斷 Then 條件成立結果
注意 在單行形式中,按照 If...Then 判斷的結果也可以執(zhí)行多條語句。
所有語句必須在同一行上并且以冒號(:)分開。
Sub test()
If 1 > 10 Then a = a + 1: b = 1 + a: c = 1 + b
End Sub
2. 單行形式1(If 條件判斷 Then 條件成立 Else 條件不成立)
Sub test2()
If 1 > 1 Then MsgBox "yes" Else MsgBox "no"
End Sub
3.塊形式(If...Then…End)
If 條件判斷 Then
條件成立結果
End If
Sub test3()
If 11 > 10 Then
a = 1 + a
b = 1 + a
c = 1 + b
End If
End Sub
4.塊形式的If嵌套
If 條件判斷 Then
成立時的結果
ElseIf 條件判斷 Then
成立時的結果
……
Else
不成立時的結果
End If
例:
If Sheet1.Range("b1") >= 90 Then
Sheet1.Range("b2") = "優(yōu)秀"
ElseIf Sheet1.Range("b1") >= 80 Then
Sheet1.Range("b2") = "良好"
ElseIf Sheet1.Range("b1") >= 60 Then
Sheet1.Range("b2") = "中等"
Else
Sheet1.Range("b2") = "較差"
End If
End Sub
01-13、判斷語句之SELECT
Select Case 語句 根據(jù)表達式的值來決定執(zhí)行幾組語句中的一種
例1:
Sub select多條件判斷1()
i = 1
Select Case i
Case Is > 0
MsgBox "正數(shù)"
Case Else
MsgBox "負數(shù)"
End Select
End Sub
例2:
Sub select多條件判斷()
Select Case Sheet1.[d1].Value
Case "A"
Sheet1.[a3] = "A型血的你,不是一個怎么樣的人"
Case "B"
Sheet1.[a3] = "B型血的你,更不是一個怎么樣的人"
Case "AB"
Sheet1.[a3] = "AB型血的你,更不是一個怎么樣的人"
Case "O"
Sheet1.[a3] = "O型血的你,是個不做的人"
End Select
End Sub
01-14、循環(huán)語句之do……loop
do……loop 循環(huán)語句,直到循環(huán)到滿足某個條件
Sub 循環(huán)()
Dim a As Integer
Do
a = a + 1
If a > 10 Then
MsgBox "終于大于10"
Exit Do
End If
Loop
End Sub
01-15、循環(huán)語句之do……loop實例
例:
程序:
Sub 等級()
Dim rs As Integer
rs = 1
Do
rs = rs + 1
If rs > 10 Then
Exit Do
Else
If Cells(rs, 2) > 90 Then Cells(rs, 3) = "√"
End If
Loop
End Sub
01-16、循環(huán)語句之do while……loop
do while 當……的時候,里面包含一個if函數(shù)的判斷
根據(jù)上面的例子進行改寫:
Sub 循環(huán)while()
Dim rs As Integer
rs = 1
Do While Cells(rs, 2) <>"" '當單元格不等于空的時候
rs = rs + 1
If Cells(rs, 2) > 90 Then Cells(rs, 3) = "√"
Loop
End Sub
01-17、循環(huán)語句之do until……loop
do until 直到什么的時候結束
根據(jù)上面的例子進行改寫:
Sub 循環(huán)until()
Dim rs As Integer
rs = 1
Do Until Cells(rs, 2) = "" '該單元格為空嗎,為空的話就執(zhí)行l(wèi)oop,否則就繼續(xù)
rs = rs + 1
If Cells(rs, 2) > 90 Then Cells(rs, 3) = "√"
Loop
End Sub
例1:隔行填色
代碼:
Sub 隔行填色()
Dim rs As Integer
rs = 2
Do Until Sheet1.Range("a" & rs) = ""
Sheet1.Range("a" & rs & ":" & "g" & rs).Interior.ColorIndex = 7
rs = rs + 2
Loop
End Sub
01-18、循環(huán)語句之while和until位置變化
while和until不但可以放在do后面,也可以放在loop后面
事實上有時候循環(huán)在最后一行進行判斷,更具有意義
Sub doloop的最后判斷循環(huán)()
Dim pss As String, i As Single
Do
i = i + 1
If i > 3 Then Exit Do '輸入3次后就退出循環(huán),只有3次機會
pss = InputBox("請輸入密碼")
Loop Until pss = "123" '當密碼為123的時候結束循環(huán)
End Sub
Sub doloop的最后判斷循環(huán)()
Dim pss As String, i As Single
Do
i = i + 1
If i > 3 Then Exit Do '輸入3次后就退出循環(huán),只有3次機會
pss = InputBox("請輸入密碼")
Loop while pss = "123" '當密碼不是123的時候結束循環(huán)
End Sub
01-18B、循環(huán)語句do……loop小結
Do [{While | Until} 表達式] ‘while 和 until二選一
[執(zhí)行的一條或多條語句]
[Exit Do]
[[執(zhí)行的一條或多條語句]
Loop
while:當這個條件為True時就 循環(huán)
until:直到這個條件為True時就 跳出循環(huán)
或者可以使用下面這種語法:
Do
[執(zhí)行的一條或多條語句]
[Exit Do]
[執(zhí)行的一條或多條語句]
Loop [{While| Until}表達式]
用Do…Loop循環(huán)要注意的幾點:
1. While與Until是放在Do后面還是Loop后面,取決于是先判斷再循環(huán),還是先循環(huán)再判斷。前者則在Do后面,后者則在Loop后面。
2. 可以在Do...Loop中的任何位置放置任意個數(shù)的 Exit Do 語句,隨時跳出 Do...Loop 循環(huán)。
3. Exit Do ,Do...Loop,If...Then通常結合使用.
4. 如果 Exit Do 使用在嵌套的 Do...Loop 語句中,則 Exit Do 會將控制權轉(zhuǎn)移到 Exit Do 所在位置的外層循環(huán)。
例:
Sub test()
Dim a%
Do
a = a + 1
If a > 10 Then
MsgBox a & "終于大于10"
Exit Do
End If
Loop
End Sub
Sub Test2()'注意這是一個死循環(huán),按F8運行(中止死循環(huán):ctrl+暫停鍵)
Do
b = b + 1
Do
a = a + 1
If a > 3 Then MsgBox "即將跳出內(nèi)層循環(huán)": Exit Do
Loop
MsgBox "即將進行外層循環(huán)"
Loop
End Sub
01-19、循環(huán)語句for each ……next
當需要處理集合成員時,一般會用for each……next,實際上就是處理對象
例子:在a2:a10單元格中,A1的全部標記為紅色
Sub foreach循環(huán)1()
Dim rng As Range, n As Integer
For Each rng In Sheet1.Range("a2:a10") '取出a2:a10中的內(nèi)容
If rng = "A1" Then rng.Interior.ColorIndex = 3 '填充顏色
Next
End Sub
例2:取出工作表的名稱
Sub foreach循環(huán)2()
Dim wsh As Worksheet, a As Byte
For Each wsh In Worksheets '取出工作表中的每個sheet表
n = n + 1
Sheet1.Cells(n, 3) = wsh.Name '將取出的工作表名稱放入第3 列
Next
End Sub
01-20、循環(huán)語句之for……next
for……next也是循環(huán)語句,與之前的do……loop不同的是for……next含有一個內(nèi)置的計數(shù)器
例:從1一直加到100
Sub fornext循環(huán)()
Dim i As Integer, j As Integer
For i = 1 To 100
j = j + i
Next
MsgBox j
End Sub
例:知道單價和數(shù)量計算金額
Sub fornext循環(huán)2()
Dim rng As Integer
For rng = 2 To 21
Sheet2.Cells(rng, 4) = Sheet2.Cells(rng, 2) * Sheet2.Cells(rng, 3)
Next
End Sub
01-20B、For...NEXT小結與實例
For...Next 語句
以指定次數(shù)來重復執(zhí)行一組語句
語法
For 計數(shù)變量 = 初始值 To 終止值 [Step 步長值]
[執(zhí)行的一條或多條語句]
[Exit For]
[執(zhí)行的一條或多條語句]
Next [計數(shù)變量]可以忽略不寫
注意:1.循環(huán)中可以在任何位置放置任意個 Exit For 語句,隨時退出循環(huán)。
2.Exit For與 If...Then經(jīng)常一起使用,目的是:找到符合條件后,跳出循環(huán),而不必再進行不必要的循環(huán)。
例:
Sub fornext示例()
Dim i As Integer, j As Integer
For i = 2 To 16 Step 1
If Sheet3.Cells(i, 1) = "2班" Then Exit For
Next i
'計算出第一次出現(xiàn)2班人數(shù)的位置
For j = 2 To 16 Step 1
If Sheet3.Cells(j, 1) = "3班" Then Exit For
Next j
'計算出第一次出現(xiàn)3班人數(shù)的位置
MsgBox "2班的人數(shù)是" & j - i
'用第一次出現(xiàn)3班的位置減去2班出現(xiàn)的位置即為2班的人數(shù)
End Sub
3.可以將一個 For...Next 循環(huán)放置在另一個 For...Next 循環(huán)中,組成嵌套循環(huán)。
For I = 1 To 10
For J = 1 To 10
For K = 1 To 10
...
Next K
Next J
Next I
例:
01-21、用語句for……next制作九九乘法表
01-22、exit與end語句
exit 是退出當前語句
1、exit do 2、exit for 3、exit function 4、exit sub
例:找第一次出現(xiàn)田七的位置
Sub 田七位置()
Dim n As Integer
For n = 2 To 7
If Sheet1.Cells(n, 1) = "田七" Then Exit For
Next
MsgBox "田七首次出現(xiàn)的位置為" & n & "行"
End Sub
end結束一個過程或者塊
1、end 2、end if 3、end select 4、end sub
01-23、跳轉(zhuǎn)語句
GoTo line無條件的轉(zhuǎn)移到過程中指定的行
注意 太多的GoTo語句,會是程序代碼不容易月底及調(diào)試
盡可能使用結構化的控制語句(Do……loop,for……next,if then……else)
例:
Sub dotoline()
Dim str As String, k As Integer
123:
k = k + 1
If k > 3 Then Exit Sub
ste = InputBox("請登錄用戶名:")
If str <> "admin" Then GoTo 123
End Sub
例2:判斷是否遲到
1/3是時間里面的8:00
01-24、錯誤分支語句
計算總分:
需要知道錯誤發(fā)生在第幾行:
01-25、with語句
with語句,當對某個對象執(zhí)行一系列語句時,不用重復指出對象的名稱。
with的嵌套使用
01-26、VBA與公式
01-27、VBA與函數(shù)1
Sub 帶工作表函數(shù)的計算()
Dim i As Integer
For i = 1 To 10
Sheet4.Cells(i, 4) = "=sum(a" & i & ":b" & i & ")"
Next
End Sub
Sub 公式帶引號的計算()
Cells(12, 1) = "=countif(a1:a10,"">9"")"
'當公式中含有引號的時候,就要將原來的引號再加上引號,及雙引號
Cells(13, 1) = "=sum(indirect(""a1:a10""))"
End Sub
01-28、VBA與函數(shù)2
借用工作表函數(shù)
Application.WorksheetFunction. 在VBA編輯窗口中輸入這樣的代碼,可以調(diào)用工作表函數(shù)
例如:Application.WorksheetFunction.Sum
Sub 調(diào)用工作表函數(shù)()
MsgBox Application.WorksheetFunction.CountIf(Range("a1:a10"), "鋼筆")
MsgBox Application.CountIf(Range("a1:a10"), "鋼筆")
MsgBox WorksheetFunction.CountIf(Range("a1:a10"), "鋼筆")
End Sub
上面的例子說明Application和WorksheetFunction在調(diào)用函數(shù)的時候可以省略其中之一
Sub VBA函數(shù)()
MsgBox VBA.Format(Range("b1"), "yyyy年m月d日")
MsgBox Format(Range("b1"), "yyyy年m月d日")
End Sub
當VBA和工作表函數(shù)不夠用的時候,就需要用到自定義函數(shù)了,下面看從身份證中提取性別
'自定義函數(shù)()
Function sex(rng As Range)
sex = IIf(Mid(rng, 15, 3) Mod 2, "男", "女")
End Function
01-29、VBA與運算符
1)賦值運算符 :=
2)數(shù)學運算符: &(字符連接符)、+(加)、-(減)、Mod(取余)、\(整除)、*(乘)、/(除)、-(負號)、^(指數(shù))
3)邏輯運算符:Not(非)、And(與)、Or(或)、Xor(異或)、Eqv(相等)、Imp(隱含)
4)關系運算符: = (相同)、<>(不等)、>(大于)、<(小于)、>=(不小于)、<=(不大于)、Like
like用來比較兩個字符串?
Print 任何單一字符
* 零個或多個字符。
# 任何一個數(shù)字 (0–9)。
[charlist] charlist.中的任何單一字符?
[!charlist] 不在 charlist 中的任何單一字符。
例:
Sub likess()
a = 1 Like "[!2]" '1不是非2中的任意一個
End Sub '按F8可以看到結果為True
01-30、like的運算符
01-31、like運算符的運用
例子:
代碼:
Sub 運用()
Dim i As Integer, j As Integer, n As Integer
For i = 2 To 6
For j = 2 To 14
If Cells(j, "a") Like Cells(i, "e") Then n = n + 1
Cells(i, "f") = n
Next
n = 0
Next
End Sub
01-32、綜合運用
以上例子中,找出未盤點的編碼
代碼
第一章結束
聯(lián)系客服