標籤:

VBA其實很簡單——提高你工作效率的利器

最近自己看了一下VBA的使用,由於工作中會用到這個工具,所有抽空學習了一下,不要見笑,現在發現其實它平常可以節省我們一定的工作時間,提升我們工作效率,所有總結了一些學習內容。

3.VBA基礎語法

3.1 VBA里的數據類型

VBA里的數據類型有:

(1)位元組型 (Byte): 0~255的整數,例如:年齡

(2)整數型 (Integer):-2768~32767的整數,例如:學生人數、成績

(3)長整數型 (Long): -2147483648~2147483647的整數,例如:總資產、人口

(4)字元串型 (String): 例如:姓名、住址、職業、學校等

(5)日期型 (Date): 所有時間

(6)單精度浮點型(Single): 例如:圓周率

(7)雙精度浮點型(Double)

(8)貨幣型 (Currency)

(9)小數型 (Decimal)

(10)布爾型 (Boolean): Ture或False

(11)對象變數 (Object): 用來引用對象

(12)變體型 (Variant): 可以包含任何種類的數據

3.2 存儲數據的容器:常量和變數

3.2.1 使用變數

(1)聲明變數:

Dim 變數名 AS 數據類型

例如:

Dim str AS string

Dim nu AS integer

Dim str AS string,nu as integer(也可以同時聲明多個變數)

Dim str AS string*10(10是指長度最多為10)

(2)使用變數類型聲明符

Dim strs$ ($表示將變數strs聲明為string類型)

Dim ints% (%表示將變數ints聲明為integer類型)

Dim longs& (&表示將變數longs聲明為long類型)

Dim singles! (!表示將變數singles聲明為single類型)

Dim doubles# (#表示將變數doubler聲明為double類型)

Dim currencys@(@表示將變數currencys聲明為currenry類型)

(3)強制聲明所有變數

方法一:在模塊第一句輸入代碼:「Option Explicit」,如果有變數未聲明,會報提示.

方法二:設置強制聲明變數,工具->選項->編輯器->勾選要求變數聲明.

(4)其他聲明類型:

public str AS string 變數聲明為公共變數

private str AS string 變數聲明為私有變數

static str AS string 變數聲明為靜態變數,在整個代碼運行期間都會保留該變數

(5)變數的作用域

單個過程:在一個過程中使用Dimstatic語句聲明變數,作用域為本過程,聲明變數的語句所在過程的可使用, 稱為本地變數。例如:

Option Explicit

Sub bdbn()

Dim a As Integer

Static b As Integer

End Sub

單個模塊:在模塊的第一個過程之前使用Dimpivate聲明變數,作用域為聲明變數的語句所在模塊里的所有過程 ,所有過程都可以使用它,稱為模塊級變數。例如:

Option Explicit

Dim a As Integer

Private b As Integer

Sub bdbn()

Range("A1") = "1111111"

End Sub

所有模塊:在模塊的第一個過程之前使用public聲明變數,作用域為所有模塊,即所有模塊都可使用它,成為公 共變數。例如:

Option Explicit

Public b As Integer

Sub bdbn()

Range("A1") = "1111111"

End Sub

(6)變數賦值

如果數據是文本,需用英文雙引號引起;

如果是日期,將日期寫在兩個#號之間,如:d=#2011-01-01#

例如:

Sub szbn()

Dim str As String

Let str = "學習VBA"

Range("A1").Value = str

End Sub

如果給對象變數(Object型,如單元格)賦值:Set 變數名稱=對象(Set一定不能少)

例如:

Sub bdbn()

Dim rng As Range

Set rng = Worksheets("Sheet1").Range("A1")

rng.Value = "學習VBA"

End Sub

3.2.2 使用常量

常量常用來存儲一些固定的、不會被修改的值,例如:圓周率、個人所得稅等。常量聲明不但需要指定常量的名稱及數據類型,還需要在聲明的同時給予賦值,並且在賦值以後不能再重新賦值。

Const 變數名稱 AS 數據類型=數值

Const p AS Single=3.14

3.2.3 使用數組

(1)聲明數組:聲明數組除了要指定數組的名稱及數據類型,還應指定數組的大小.

Public|Dim 數組名 (a to b) AS 數據類型

Dim 七6班 (1 to 50) AS string

Dim arr(49) as string

註:默認數組起始索引是0,除非在模塊第一句標註「OPTion Base 1」 ,那麼數組起始索引是1開始)

(2)聲明多維數組

Dim 數組名 (1 to 3,1 to 20) #(多維數組)

Dim 數組名 (2,19)

(3)聲明動態數組

不能預知數組的大小,可以首次定義數組是括弧為空,寫成:

Dim 數組名稱()

在程序中使用ReDim語句重新指定其大小,例如:

Sub dtsz()

Dim arr() As String

Dim n As Long

n = Application.WorksheetFunction.CountA(Range("A:A")) 統計A列有多少個非空單元格

ReDim arr(1 To n) As String 重新定義數組的大小

End Sub

(4)其他常用的創建數組的方式

變數類型必須定義為Variant型

方法一:使用Array函數創建數組

Sub ArrayTest()

Dim arr As Variant

arr = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

End Sub

方法二:使用Split函數創建數組

Sub ArrayTest()

Dim arr As Variant

arr = Split("張三,李四,王二",",")

End Sub

方法三:通過Range對象直接創建數組

直接將單元格區域的值賦給變數名

Sub ArrayTest()

Dim arr As Variant

arr = Range("A1:C3").value

Range("E1:G3").value=arr

End Sub

(5)使用UBound和LBound函數

使用UBound和LBound函數計算數組的最大和最小索引號。

UBound(arr)、LBound(arr)

例如:

Dim arr(10 To 50)

MsgBox "數組的最大索引號是:" & UBound(arr) & Chr(13) _

& "數組的最大索引號是:" & LBound(arr) & Chr(13) _

& "數組的元素個數是:" & UBound(arr) - LBound(arr) + 1

End Sub

(6)Jion函數

Jion函數將一個一維數組裡的元素使用指定的分隔符連成一個新的字元串。

例如:

Sub jointest()

Dim arr As Variant, txt As String

arr = Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

txt = Join(arr, ",")

MsgBox txt

End Sub

(7)將數組寫入單元格

將一維數組arr里的元素寫入活動工作表中的A1單元格

例如:Range("A1").Value=arr(23)

將數組裡的所有元素批量寫入一個單元格區域:

例如:

Sub arrtorng1()

Dim arr As Variant

arr = Array(1, 2, 3, 4, 5, 6, 7, 8, 9)

Range("A1:A9").Value = Application.WorksheetFunction.Transpose(arr)

End Sub

3.3 集合、對象、屬性和方法

3.3.1 選取集合中的一個對象

ApplicationWorkbooks("Book1").Worksheets("Sheet1").Range("A2")

Application 代表Excel程序

Workbooks 工作薄集合,表示代開的所有工作薄

Worksheets, 工作表集合,表示指定工作薄中的所有工作表

Worksheets("Sheet2").Range("A2")

Range("A2")

3.3.2 對象的屬性

Worksheets("Sheet2").Range("A2").Font.Color

3.3.3 對象的方法

不同級別的對象和方法之間用點,點後面自動顯示的是圖標是綠色的表示它是方法,圖表不是綠色表示它是屬性。

3.4 VBA中的運算符

3.4.1 算術運算符

+; -; *; /(商); (整除); ^;Mod(求模)

3.4.2 比較運算符

=;<;>;<=;>=;<>;IS;Like(比較兩個字元串是否匹配):字元串1 like 字元串2

例如:Range("A2").value Like "*剛*"

VBA中的通配符:

* :代表任意多個字元

?:代表任意的一個字元

# :代表任意的一個數字

[charlist]:代表位於charlist中的任意一個字元

3.4.3 連接運算符

連接運算符用來連接兩個文本字元串,有+和&兩種

3.4.4 邏輯運算符

And;Or;Not;Xor(異或);Eqv(等價)

3.5 VBA的基本語句結構

3.5.1 If...Then語句

(1) If Time<0.5 Then MsgBox "1111!"

(2) If Time<0.5 Then

MsgBox "學習VBA1!"

ElseIf Time>0.75 Then

MsgBox "學習VBA2!"

Else

MsgBox "學習VBA3!"

End If

3.5.2 Select Case語句

Sub sayhello()

Select Case Time

Case Is < 0.5

MsgBox "學習VBA1"

Case 0.5 To 0.75

MsgBox "學習VBA1"

Case Is > 0.75

MsgBox "學習VBA2"

Case Else

MsgBox "學習VBA3"

End Select

End Sub

3.5.3 For...Next語句

Sub xingji()

Dim xj As String, i As Integer

For i = 1 To 4 Step 1

Select Case Cells(i, "D")

Case Is < 85

xj = "不評定"

Case Is < 100

xj = "一星級"

Case Is < 115

xj = "二星級"

Case Is < 130

xj = "三星級"

Case Else

xj = "四星級"

End Select

Cells(i, "E") = xj

Next i

End Sub

3.5.4 Do While語句

開頭判斷式:

Sub xingji1()

Dim xj As String, i As Integer

i = 1

Do While Cells(i, "D") <> ""

Select Case Cells(i, "D")

Case Is < 85

xj = "不評定"

Case Is < 100

xj = "一星級"

Case Is < 115

xj = "二星級"

Case Is < 130

xj = "三星級"

Case Else

xj = "四星級"

End Select

Cells(i, "E") = xj

i = i + 1

Loop

End Sub

結尾判斷式:

Sub xingji11()

Dim xj As String, i As Integer

i = 1

Do

Select Case Cells(i, "D")

Case Is < 85

xj = "不評定"

Case Is < 100

xj = "一星級"

Case Is < 115

xj = "二星級"

Case Is < 130

xj = "三星級"

Case Else

xj = "四星級"

End Select

Cells(i, "E") = xj

i = i + 1

Loop While Cells(i, "D") <> ""

End Sub

3.5.5 Do Until語句

開頭判斷式:

Sub xingji2()

Dim xj As String, i As Integer

i = 1

Do Until Cells(i, "D") = ""

Select Case Cells(i, "D")

Case Is < 85

xj = "不評定"

Case Is < 100

xj = "一星級"

Case Is < 115

xj = "二星級"

Case Is < 130

xj = "三星級"

Case Else

xj = "四星級"

End Select

Cells(i, "E") = xj

i = i + 1

Loop

End Sub

3.5.6 For Each...Next語句

當前活動工作薄中有許多工作表,但不知數量,如果要把所有工作表的名稱按次序寫入活動工作表的A列,就用此循環。(變數必須定義為worksheets工作表類型)

Sub shtname()

Dim sht As Worksheets, i As Integer

i = 1

For Each sht In Worksheets

Cells(i, "G") = sht.Name

i = i + 1

Next sht

End Sub

3.5.7 其他常用語句

(1)Go...To 語句

Sub he()

Dim mysum As Long, i As Integer

i = 1

x: mysum = mysum + i

i = i + 1

If i <= 100 Then GoTo x

MsgBox "1到100的自然數和是:" & mysum

End Sub

(2)With語句

當需要對相同的對象進行多次操作時,用With語句

Sub fontset()

With Worksheets("sheet1").Range("A1").Font

.Name = "仿宋"

.Size = 12

.Bold = True

.ColorIndex = 3

End With

End Sub

3.6 指定顏色的單元格個數

Range("B1").Interior.color=RGB(255,255,0)

(1)統計有顏色的單元格的個數

Function countcolor()

Dim rng As Range

For Each rng In Range("A1:A10")

If rng.Interior.Color = RGB(255, 255, 0) Then

countcolor = countcolor + 1

End If

Next rng

End Function

======================================================

4.常用對象

4.1 最頂層的Application對象

清除表中所有數據

Cells.ClearContents

4.1.1 ScreenUpdating屬性

Range("A2:D10000").ClearContents

Application.ScreenUpdating=False #關閉屏幕更新

Application.ScreenUpdating=Ture #恢復屏幕更新

4.1.2 DisplayAlerts屬性

刪除工作表的小程序

Sub delsht()

Dim sht As Worksheet

Application.DisplayAlerts = False 不顯示警告信息

For Each sht In Worksheets 遍歷所有工作表

If sht.Name <> ActiveSheet.Name Then 判斷sht代表的工作表是不是活動工作表

sht.Delete

End If

Next

Application.DisplayAlerts = Ture 恢復顯示警告信息

End Sub

4.1.3 EnableEvents屬性

Application.EnableEvents=False 』禁用事件

Application.EnableEvents=True 』啟用事件

(1)自動寫入單元格地址

Private Sub worksheet_selectionchange(ByVal Target As Range)

Application.EnableEvents=False 』禁用事件

Target.Value = Target.Address

Application.EnableEvents=True 』啟用事件

End Sub

4.1.4 WorksheetFunction屬性

Sub counttest()

Dim mycount As Integer

mycount = Application.WorksheetFunction.CountIf(Range("A1:A9"), ">3")

MsgBox "大於3的單元格數為:" & mycount

End Sub

4.1.5 Application的常用屬性

ActiveCell 當前活動單元格

ActiveChart 當前活動工作簿中的活動圖表

ActiveSheet 當前活動工作簿中的活動工作表

ActiveWindow 當前活動窗口

ActiveWorkbook 當前活動工作簿

4.2 Workbook對象

4.2.1 Workbooks

(1)引用單個工作表

方法一:Workbooks.Item(3) / Workbooks(3)

方法二:Workbooks("Book1")

4.2.2 獲取Workbook對象的屬性

Sub wbmsg()

Range("B2") = ThisWorkbook.Name

Range("B3") = ThisWorkbook.Path

Range("B4") = ThisWorkbook.FullName

End Sub

4.2.3 Workbook操作

(1)創建一個工作薄文件

Workbooks.Add xlWBATChart

(2)打開工作薄

sub openfile()

Workbooks.Open Filename:="F:Book1.xls"

End Sub

(3)激活工作薄

Sub jhwb()

Workbooks("book1").Activate 激活book1工作薄

End Sub

(4)保存工作薄

Sub savewb()

ThisWorkbook.Save 保存工作薄

End Sub

Sub savetofile()

ThisWorkbook.SaveAs Filename:="F:Book1.xls" 使用SaveAs方法將工作薄另存為新文件,關閉原文件,打開新文件

End Sub

Sub savetofile()

ThisWorkbook.SaveCopyAs Filename:="F:Book1.xls" 保存文件,保留源文件,不打開新文件

End Sub

(5)關閉工作薄

Sub closewb()

Workbook.Close 關閉所有打開的工作薄

End Sub

Sub closewb()

Workbook("Book1").Close 關閉book1工作薄

End Sub

4.2.4 ThisWorkbook 與 ActiveWorkbook

ThisWorkbook 是對程序所在工作簿的引用

ActiveWorkbook 是對活動工作簿的引用

Sub wb()

Workbooks.Add

MsgBox "代碼所在的工作簿為:" & ThisWorkbook.Name 顯示代碼所在工作簿名稱

MsgBox "當前活動工作簿為:" & ActiveWorkbook.Name 顯示當前活動工作簿名稱

ActiveWorkbook.Close savechanges:=False 關閉新建工作簿,不保存修改

End Sub

4.3 Worksheet對象

4.3.1 Worksheets

(1)引用單個工作表

方法一:Worksheets.Item(3) / Worksheets(3)

方法二:Worksheets("Book1")

Sheet1.Range("A1")=100

Sub showshtcode()

MsgBox ActiveSheet.CodeName 獲取工作表的代碼名稱

End Sub

4.3.2 操作工作表

(1)新建工作表

Worksheets.Add

Worksheets.Add before:= Worksheets(1)

Worksheets.Add after:= Worksheets(1)

Worksheets.Add count:= 3 插入3張工作表

Sub shtadd()

Worksheets.Add after:=Worksheets(1), Count:=3

End Sub

(2)更改工作表標籤名稱

Worksheets(1).name=test

Sub shtadd1()

Worksheets.Add before:=Worksheets(1)

ActiveSheet.Name = "test1"

End Sub

(3)刪除工作表

Worksheets("sheet6").Delete

(4)激活工作表

Worksheets(1).Activate

Worksheets(1).Select

(5)複製工作表

Sub shtcopy()

Worksheets("sheet1").Copy before:=Worksheets("sheet6")

End Sub

(6)移動工作表

Sub shtmove()

Worksheets("sheet2").Move before:=Worksheets("sheet1")

Worksheets("sheet1").Move

End Sub

(7)獲取工作表的數目

Sub shtcount()

Dim mycount%

mycount = Worksheets.Count

MsgBox "工作簿里一共有 " & mycount & ""

End Sub

4.4 Range對象

4.4.1 引用Range對象

(1)Range().Select

Sub rng()

Range("A1:A10,A4:E6,C3:D9").Select 選中多個單元格

End Sub

Sub rng1()

Range("B1:B10 A4:D6").Select 選中多個單元格區域的交集

End Sub

(2)Cells屬性

Sub cel()

ActiveSheet.Cells(3, 4).Value = 200000

ActiveSheet.Cells(3, "E").Value = 3000000

End Sub

Sub cle2()

Range("B3:F9").Cells(2, 3) = 1111111

End Sub

Cells屬性還可以用作Range屬性的參數

Range(Cells(1, 1), Cells(10, 5)).Select 選中活動工作表的A1:A10單元格

Range("A1","E10").Select

Range(Range("A1"),Range("E10")).Select

這三種都是等價的方式

Sub cel4()

Range("B3:F9").Cells(8).Value = 100

Range("B3:F9").Cells(20).Value = 100

End Sub

4.4.2 引用單元格

(1)引用整行

ActiveSheets.Rows("3:3").Select

ActiveSheets.Rows(5).Select

Rows("3:10").Rows("1:1").Select 選中第3行到第10區域中的第一行

(2)引用整列

ActiveSheets.Columns("F:G").Select

ActiveSheets.Columns(6).Select

Rows("B:G").Columns("B:B").Select 選中B:G區域中的第2行

(3)Application對象的Union方法

將不連續的多個單元格區域粘在一起,可同時對其進行操做

Sub rngunion()

Application.Union(Range("A1:A10"), Range("D1:D5")).Select

End Sub

(4)Range對象的Offset屬性

Offset可以控制移動的方向和距離,正數表示向下向右,負數表示向上向左

Sub rngoffset()

Range("A1").Offset(2, 3).Value = 500

Range("C5:D6").Offset(-3, 0).Select

End Sub

(5)Range對象的Resize屬性

擴大或縮小指定的單元格區域,得到一個新的單元格

Sub rngresize()

Range("B2").Resize(5, 4).Select

End Sub

Sub rngresize1()

Range("B2:E6").Resize(2, 1).Select

End Sub

(6)Worksheet對象的UsedRange對象

返回工作表中已經使用的單元格圍成的矩形區域,包含空行空列

Sub usedrng()

ActiveSheet.UsedRange.Select

End Sub

(7)Range對象的CurrentRegion對象

CurrentRegion屬性返回當前區域,以空行空列的組合為邊界的區域

Sub rngcurr()

Range("B5").CurrentRegion.Select

End Sub

(8)Range對象的End屬性

End屬性返回當前區域結尾處的單元格

Sub rngend()

Range("C5").End(xlUp).Select

Range("C5").End(xlDown).Select

Range("C5").End(xlToLeft).Select

Range("C5").End(xlToRight).Select

End Sub

選擇第一個非空的單元格

Sub rngend1()

ActiveSheet().Range("A65536").End (xlUp)

End Sub

4.4.3 操作單元格

(1)單元格里的內容,Value屬性

Range("A1:B2").Value="abc"

(2)單元格個數,Count()

Count()屬性返回指定單元格區域中包含的單元格個數

Sub rngcount()

Dim mycount As Integer

mycount = Range("B2:F10").Count

MsgBox "B2:F10區域中一共有:" & mycount & ""

End Sub

(3)單元格地址,Address屬性

Sub engaddress()

MsgBox "當前選中的單元格區域地址為:" & Selection.Address

End Sub

(5)選中單元格,Activate與Select方法

ActivateSheet.Range("A1:B10").Select

ActivateSheet.Range("A1:B10").Activate

=======================================================

5.EXCEL事件

事件是一個能被對象識別的對象

5.1 Worksheet事件

5.1.1 常用的Worksheet事件

(1)Worksheet_Change事件:自動提示更改的內容

Private Sub Worksheet_Change(ByVal Target As Range)

MsgBox Target.Address & "單元格的值更改為:" & Target.Value

End Sub

(2)Worksheet_SelectionChange事件

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

MsgBox "當前選中的單元格區域為:" & Target.Address

End Sub

(3)Worksheet_Activate事件:自動提示工作表名

(4)Worksheet_Deactivate事件:禁止選中其他工作表

5.2 Workbook事件

5.2.1 常用的Workbook事件

(1)Workbook_Open事件

Workbook_Open事件,當打開工作簿時自動運行程序

(2)Workbook_BeforeClose事件

(3)Workbook_SheetChange事件

5.3 其他事件方法

(1)Application對象的OnKey方法

OnKey方法作用:當鍵盤上按下指定鍵或組合鍵是自動運行程序

(2)Application對象的OnTime方法

OnTime方法,到指定的時間時自動運行程序

後面我將會更新窗體的設計方面和幾個實例應用。


推薦閱讀:

【20170727】VBA宏:根據達成率分紅藍綠三種進度條(不同數據顯示不同顏色)
對經濟管理系學生學習編程知識有哪些建議?
【20170929】- 你會使用VB封裝自定義函數嗎?
PowerPoint怎樣用VBA?

TAG:VBA |