1. 程式人生 > 實用技巧 >Excel-VBA相關

Excel-VBA相關

目錄:

一、資料型別

二、VBA命名規則

三、比較運算子與邏輯運算子

四、For Next迴圈

五、分支結構

六、工作表物件

七、單元格物件

八、VBA中的選區問題

九、VBA中的篩選和 with 語句

十、事件

十一、工作表函式

十二、VBA函式

十三、自定義函式

十四、載入巨集

十五、SET表示把一個物件賦值給變數

十六、DIR指定一個檔案路徑,其檔案路徑下有這個檔案,返回檔名,沒有這個檔案,返回空

十七、VBA中的查詢

十八、陣列

十九、ActiveX控制元件

二十、窗體

二十一、Msgbox詳解

二十二、Inputbox詳解

二十三、GetOpenFilename與Dialogs

二十四、使用ADO連線外部Excel資料來源

二十五、Shape物件詳解

二十六、Vba中使用Name修改檔名

二十七、表單控制元件

二十八、VBA中的Like

二十九、Sub與變數的公有與私有

三十、類模組

三十一、VBA中的字典

三十二、& 的辨析

一、資料型別:

資料型別的最大值:

1bytes(1位元組)=8bit,8bit可儲存28個數字,負數佔一半,正數和0佔一半

例如:整型型別所佔2個位元組,2位元組=16位,可儲存216個數據,負數佔一半,正數和0佔一半

在定義變數時,不知道定義的變數型別,此時可以設定成Variant(變體型)型別

二、VBA命名規則:

1.可以使用字母、數字個一些標點符號,但是第一個字元必須為字母

2.不能使用空格和句點

3.不能含有特殊的宣告字元(#、¥、%、&、、!)

4.變數名不能超過254個字元

5.變數名不區分大小寫

空白符:空格符、製表符、換行符等統稱為空白符,主要用於規範程式格式

三、比較運算子與邏輯運算子

運算子的結合性:

對於算數運算子而言,計算的順序為從左至右

對於賦值運算子而言,計算的順序為從右至左

四、For Next迴圈

跳出FOR迴圈,用exit for(常於if搭配使用)

用於按指定的次數執行迴圈體

For each in Next迴圈:

針對一個集合或是陣列中的每個元素迴圈執行操作

For each in next相當於python中的for I in range

他會遍歷物件中的每一個元素

如將其他工作表的名稱放入到 部門 表中

五、分支結構

分支控制語句(IF語句、Select Case語句)

IF結構:

兩種語言不同的點在於Python將VBA中IF\ElseIF的Then換成了冒號,VBA中的ElseIF不能簡寫成Elif

Select Case語句

針對多重判定任務反覆進行迴圈操作處理

While迴圈的兩種寫法:

DO…Until迴圈

Until語句又稱為“直到型”迴圈結構處理語句。也就是直到條件成立的時候才結束迴圈體。

六、工作表物件

工作表有四種:

'工作表的選擇
Sheet1.Select '選擇工作表1
Sheets(3).Select '選擇第三個工作表
Sheets("一月").Select '選擇名稱為一月的工作表

'插入工作表
Sheets.Add '在當前工作表前面插入新的工作表
Sheets.Add , after:=Sheet3 '在sheet3後面插入新的工作表

'在sheet3後面插入100個新的工作表
Dim i As Integer
For i = 1 To 100
    Sheets.Add , after:=Sheet3
Next

'統計工作簿中工作表的數量
Sheet5.Range("a1") = Sheets.Count   '在工作表的A1單元格中輸出工作簿中所有工作表的數量
Sheet5.Range("a1") = Sheet1.Name    '在工作表的A1單元格中輸出I作表1的名稱
Sheet1.Name = "彙總"                '將工作表1的名稱改為彙總

'使其總是在最後張工作表後面插入新表
Sheets.Add , after:=Sheets(Sheets.Count)

'建立十二個月的工作表
Dim i As Integer
For i = 1 To 12
Sheets.Add , after:=Sheets(Sheets.Count)  '這裡的Sheets.Count表示插入前的工作表數
Sheets(Sheets.Count).Name = i & ""   '這裡的Sheets.Count表示插入後的工作表數,與上句相差1
Next

Excel.Application.DisplayAlerts = False '關閉Excel 的報錯機制
Sheet3.Delete  '刪除工作表3
Excel.Application.DisplayAlerts = True   '開啟Excel 的報錯機制

'插入100張工作表
Sheets.Add , Count:=100

'刪除100張工作表
Dim i As Integer
Excel.Application.DisplayAlerts = False
For i = 1 To 100
Sheets(1).Delete    '總是刪除左起第一 張工作表,這裡也可以用step -1 倒序刪除
Next
Excel.Application.DisplayAlerts = True

Sheet1.Copy , after:=Sheets(2)    '複製工作表,並且將其置於左起第二 張工作表之後
Sheet1.Copy , after:=Sheets(Sheets.Count) '複製工作表,並且始終將其置在最後端

操作工作簿:

Sub open_file()
'關閉錯誤提示框
Application.DisplayAlerts = False
'關閉螢幕更新
Application.ScreenUpdating = False
'開啟路徑檔案,檔名需要填寫完整
Workbooks.Open Filename:=("E:\Excel_date\case.xlsx")
'給活動工作簿的表1新增值
ActiveWorkbook.Sheets(1).Range("A1") = "到此一遊o"
'儲存
ActiveWorkbook.Save
'關閉
ActiveWorkbook.Close
Application.DisplayAlerts = True
End Sub

Sub create_file()
'建立新的工作簿
Workbooks.Add
ActiveWorkbook.Sheets(1).Range("A1") = "測試內容"
'檔案另存為
ActiveWorkbook.SaveAs Filename:=("E:\Excel_date\caeate.xlsx")
'關閉
ActiveWorkbook.Close
End Sub

將工作表另存為工作簿:

程式碼:

七、單元格物件

單元格是EXCEL中最小的物件

單元格物件Range:(跳轉到指定單元格搭配select使用)

Range:
Sub try_case_2()
'彈出A1單元格所在的當前區域的最後一個單元格的行號
MsgBox Range("A1").End(xlDown).Row

'從a65536單元格向上移動到第一個有資料的單元格
MsgBox Range("A65536").End(xlUp).Row

End Sub

Range("A6").EntireRow.Select  '選中A6所在單元格的整行
Range("A6").Resize(1, 3).Select  '以A6單元格為參照,重新框選選區
Range("H7:L7").Copy , Range("N7") '將H7:L7複製到N7

'注意:如果是複製一整行的話,最好在相同列複製
Range("A7").EntireRow.Copy , Range("A10")

'這樣就會報錯,因為列號不匹配,會導致貼上區域範圍不夠
Range("A7").EntireRow.Copy , Range("B10")
Sub 合併單元格()
Dim rng As Range
For Each rng In Range("H21:O21") '將H21與H22合併,直到021與022合併
rng.Resize(2, 1).Merge
Next
End Sub

注意:如果活動單元格不是sheet1,那麼以下程式碼就會報錯

Sub case_1()
Sheet1.Range("c2").Select
End Sub

如下就不會報錯:

Sub case_1()
Sheet1.Select
Sheet1.Range("c2").Select
End Sub

Cells指定單元格物件: (跳轉到指定單元格搭配select使用)

八、VBA中的選區問題

Selection:當前選區,表示當前選中的單元格區域

ActiveCell:活動單元格,有且僅有一個

UsedRange:已使用區域,表示使用過的所有區域,(對某個單元格進行格式設定,即使沒有輸入內容,也屬於已使用區域)

CurrentRegion:當前區域,表示此單元格四周相連的單元格區域

九、VBA中的篩選和 with 語句

1.篩選的原理就是將不符合條件的資料隱藏起來(行高設為0)

Sub 篩選()
Sheet8.Range("$A$9:$C$13").AutoFilter Field:=2, Criteria1:="凱迪拉克"
'Field:=2表示資料區域第幾列應用篩選
'Criteria1:="凱迪拉克"表示篩選條件
Sheet8.Range("$A$9:$C$13").AutoFilter
'關閉篩選
End Sub

2.With與End With:

作用就是節省程式碼,使程式碼簡潔,書寫方便

Sub case_1()
With Sheet1
    .Range("A1") = 1
    .Range("A2") = 2
    .Range("A3") = 3
    Sheet2.Range("A1") = 1
End Sub

只有前面加點的才會應用with

十、事件:語義可以理解為:當採取……操作的時候,就執行……

工作表事件:

例如:用事件在工作表中修改顏色,即單元格選區發生改變,所在選區的那一行設定為黃色底紋,其餘行的底紋顏色為透明

Sub change_color()
Cells.Interior.Pattern = xlNone
Selection.EntireRow.Interior.Color = 65535
End Sub

Change事件的注意:

點選表格自動更新事件:

工作簿事件:

舉例:在儲存工作簿前的時候備份資料到指定檔案下且檔名字為當前時間

十一、工作表函式

Application.WorksheetFunction.函式名   ‘工作表函式呼叫方式
On Error Resume Next      ‘程式崩潰請繼續執行程式碼

舉例:考生成績統計查詢系統

題目示例

Sub try_1()
Dim i, k, n As Integer
For i = 2 To Sheets.Count
    k = k + Application.WorksheetFunction.CountA(Sheets(i).Columns("A")) - 1
    v = v + Application.WorksheetFunction.CountIf(Sheets(i).Columns("F"), "")
    n = n + Application.WorksheetFunction.CountIf(Sheets(i).Columns("F"), "")
Next
Sheet1.Range("D26") = k
Sheet1.Range("D27") = v
Sheet1.Range("D28") = n
End Sub

Sub try_2()
On Error Resume Next    '如果程式碼崩潰,繼續執行程式碼
Dim i As Integer
Sheet1.Range("D14").ClearContents
For i = 2 To Sheets.Count
Sheet1.Range("D14") = Application.WorksheetFunction.VLookup(Sheet1.Range("D9"), Sheets(i).Columns("A:H"), 5, 0)
Sheet1.Range("D16") = Application.WorksheetFunction.VLookup(Sheet1.Range("D9"), Sheets(i).Columns("A:H"), 6, 0)
Sheet1.Range("D18") = Application.WorksheetFunction.VLookup(Sheet1.Range("D9"), Sheets(i).Columns("A:H"), 3, 0)
Sheet1.Range("D20") = Application.WorksheetFunction.VLookup(Sheet1.Range("D9"), Sheets(i).Columns("A:H"), 8, 0)
Sheet1.Range("D22") = Sheets(i).Name
If Sheet1.Range("D14") <> "" Then
    Exit For    '結束迴圈
End If
Next
End Sub

十二、VBA函式

1.isnumeric(引數)

判斷引數是不是數字

2.引數=val(引數)

將引數轉為數值型

l = InputBox("請輸入你要按哪列分")
If IsNumeric(l) = False Or l < 1 Then
    Exit Sub
End If
l = Val(l)

VBA函式呼叫方式:

完整寫法:

VBA.Strings.Left (引數)

第二個單詞表示VBA函式型別,使用函式要準確寫出其所屬型別

3.instr

用來確定引數2,在引數1中處於第幾位的,如果引數2沒在引數1中則返回0(find函式查詢的時候,如果沒有會程式崩潰)

舉例:擷取@前面的字元:

Sub try()
Sheet1.Range("B2") = VBA.Strings.Left(Sheet1.Range("A2"), VBA.Strings.InStr(Sheet1.Range("A2"), "@") - 1)
End Sub

結果:

4.split

Split(引數1,引數2)表示在引數1中用引數2進行分割,得到的結果為一個數組

陣列的第一個值為0,即用python中索引的方式去取數,索引從0開始

Sub try()
Dim i As Integer
For i = 2 To Range("A65535").End(xlUp).Row
    If InStr(Range("A" & i), "-") <> 0 Then
        Range("B" & i) = Split(Range("A" & i), "-")(2) & "年 第" & Split(Range("A" & i), "-")(3) & ""
    End If
Next
End Sub

結果:

十三、自定義函式

在工作中使用自定義的函式

可以將VBA中的函式作為一個新的函式,這樣這個函式不僅可以在SUB過程中被呼叫,也可以在工作表中被呼叫

例如:將VBA函式中的Split函式封裝為 擷取字元 函式,這樣工作表中和sub過程中都可以呼叫

結果:

建立帶引數的SUB:

根據表格內容建立新的工作表,工作表名為表格內容

按值傳遞與按引用傳遞:

十四、載入巨集

想讓程式碼在任何工作簿中都可以使用,需要做三件事:

1.將程式碼放入程式碼庫中

點選已經寫好程式碼的工作簿的另存為---瀏覽---儲存型別選擇xlam或者xla

Excel會自動跳到儲存載入巨集的資料夾,起好名字點選儲存

2.告訴Excel每次開啟工作簿都載入此程式碼

3.將程式碼設定一個按鈕(新增到快速訪問工具欄)

先關閉開啟的工作簿,開啟一個新的工作簿---檔案---選項

但是需要注意的是,載入巨集的程式碼必須具有可移植性,相當於軟程式碼的感覺,要保證這塊程式碼在任何工作簿中都可以完整且正確的執行

載入巨集的程式碼一定不能出現Thisworkbook這種型別的自動,因為在載入巨集的檔案裡,Thisworkbook代表那個原本的xla檔案,可以使用變數,將變數定義為當前的活動工作簿即可

在刪除程式碼庫的時候,需要先將第二步中的載入項取消勾選,然後再找到路徑去刪除(可以另存為選擇xlam型別自動跳轉到資料夾的時候刪除,即第一步的視窗中刪除)

十五、SET表示把一個物件賦值給變數

十六、DIR指定一個檔案路徑,其檔案路徑下有這個檔案,返回檔名,沒有這個檔案,返回空

DIR裡支援萬用字元操作,可以幫助我們迴避掉檔案同名,格式不同的情況

Dir多條符合值的辨析:

當有多個檔案符合Dir的結果時,第一個Dir需要加條件,並返在記憶體中儲存一個符合結果的序列,其後的Dir如果不加檔案路徑,返回的是結果序列的第二個值,以此類推。

如果只有兩個符合結果的值,第一個Dir返回的是序列一的值,第二個返回序列二的值,第三個返回空,第四個會報錯

例如:(檔案路徑下蘇州只有兩個 蘇州.xls和蘇州.xlsx)

於是,我想查詢檔案路徑下所有的檔案可以這樣寫:

Dir的殼子:

開啟路徑檔案裡的所有資料,然後執行一些操作,然後關閉

案例:將路徑檔案下工作簿裡的表複製到指定工作簿中

Sub try()
Dim i, v As Integer
Dim str As String
Dim sht As Worksheet
str = Dir("E:\Excel_date\*.*")
For i = 1 To 100
    Set wb = Workbooks.Open("E:\Excel_date\" & str)
    For v = 1 To wb.Sheets.Count
    wb.Sheets(v).Copy after:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
    ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count).Name = Split(wb.Name, ".")(0) & wb.Sheets(v).Name
    Next
    wb.Close
    str = Dir
    If str = "" Then
        Exit For
    End If
Next
End Sub

十七、VBA中的查詢

VBA中的FIND功能很強大,完全可以替換Vlookup函式,甚至突破Vlookup函式的侷限性,比如,姓名不在資料第一列、查詢資料橫向的任何一個單元格(改變offset引數)、對單元格進行清除 格式設定 等等一系列操作

舉例:

十八、陣列

一維陣列:

二維陣列:

在VBA中最經常涉及的就是讀寫工作表中的單元格,如果讀寫操作次數較多,或者涉及到的單元格數量較多,往往會導致程式執行效率較低。這時經常用到的解決方法就是使用陣列儲存資料,在記憶體中進行資料處理和加工,最後一次行更新工作表,這樣的操作方式往往會極大提升程式的執行效率。

對比:

在for迴圈中儘量不用range,而是用陣列替代,當代碼量特別大的時候它們的區別就會特別明顯

陣列應用例子:

陣列可以幫我們虛擬出來一個記憶體空間,臨時存放一些中間用到的資料(輔助列)

陣列可以直接用在函式裡

Dim 與 ReDim:

Dim裡面的東西必須用常量,Dim arr(1 to i)就會報錯

上述圖片中的陣列應用例子,只能有4行,如果A列為N個產品呢?此時我們就需要將陣列中的元素個數設定為1 to n

十九、ActiveX控制元件

在開發工具的設計模式下,可點選右鍵進行屬性設定

1.CommandButton控制元件(按鈕)

常用屬性:

Enabled可用性

Caption標題

Visible可見性

常用事件:Click事件(點選事件)

2.Label控制元件(標籤)

常用屬性:

Enabled可用性

Caption標題

Visible可見性

一般沒有應用的事件,就一個文字框而已

3. OptionButton控制元件(選項按鈕)

常見屬性:

Caption 標題

Enabled 可用性

GroupName 組名

Value 返回值

Visible 可見性

常見事件: Click事件(點選事件)

4. SpinButton控制元件(微調按鈕)

可以根據長寬比調整是上下佈局還是左右佈局

常見屬性:

Enabled可用性

Value 返回值 可返回按鈕改變之後的數值大小

Visible可見性

Min 最小值

Max 最大值

常用事件:

Change事件

5.chexbox按鈕(複選框)

一組之中各個選項不會互斥,即都可以選擇

但是可以用事件,也可以將chekbox做成互斥的模樣,即click事件,然後另外一個的值為False

6.Textbox(文字框控制元件)

常見屬性:

Enabled 可用性

Value 返回值

Visible 可見性

PasswordChar 密碼字元

即保護使用者輸入資訊掩碼

TabIndex 按下Tab鍵時的切換順序,多個控制元件之間用Tab鍵切換,可在屬性設定

注意值為0開始

舉例事件:輸入賬號密碼的文字框事件舉例

7. ComboBox複合框控制元件(下拉框)

常用屬性:

Enable Value Visible

List 資料來源列表

常用方法:

AddItem 增加一個下拉專案

RemoveItem 移除一個專案

Clear 清除

舉例:使用的時候可以結合各種事件來呼叫相應的sub

'增加下拉框的選項
Sub test1()
UserForm1.ComboBox1.AddItem "蘇州"
End Sub

'把單元格一列資料設定為下拉的資料來源
Sub test2()
For i = 2 To 6
    UserForm1.ComboBox1.AddItem Sheet1.Range("a" & i)
Next
End Sub

'刪除掉下拉框裡的一項
Sub test3()
Call test2
UserForm1.ComboBox1.RemoveItem (1) '刪除第二項
End Sub

'清空下拉框資料來源
Sub test4()
Call test2
UserForm1.ComboBox1.Clear
End Sub

'計算下拉框裡有多少個選項
Sub test5()
Call test2
MsgBox UserForm1.ComboBox1.ListCount
End Sub

'把下拉框資料來源裡某個值輸出到單元格
Sub test6()
Call test2
Range("c2") = UserForm1.ComboBox1.List(1)
End Sub

'把下拉框裡所有的選項輸出到單元格區域
Sub test7()
Call test2
Range("d1:d5") = UserForm1.ComboBox1.List
End Sub

8.listbox(列表框)

舉例:使用的時候可以結合各種事件來呼叫相應的sub

'增加列表框的選項
Sub test1()
UserForm1.ListBox1.AddItem "蘇州"
End Sub

'把單元格一列資料設定為列表框的資料來源
Sub test2()
For i = 2 To 5
    UserForm1.ListBox1.AddItem Sheet1.Range("a" & i)
Next
End Sub

'刪除掉列表框裡的一項
Sub test3()
Call test2
UserForm1.ListBox1.RemoveItem (1) '刪除第二項
End Sub

'清空列表框資料來源
Sub test4()
Call test2
UserForm1.ListBox1.Clear
End Sub

'計算列表裡有多少個選項
Sub test5()
Call test2
MsgBox UserForm1.ListBox1.ListCount
End Sub

'把組合框資料來源裡某個值輸出到單元格
Sub test6()
Call test2
Range("c2") = UserForm1.ListBox1.List(1)
End Sub

'把下拉框裡所有的選項輸出到單元格區域
Sub test7()
Call test2
Range("d1:d4") = UserForm1.ListBox1.List
End Sub

'把一個區域的一列資料設定為列表框的資料來源
Sub test8()
UserForm1.ListBox1.List =Range("d1:d4").value
End Sub

二十、窗體

窗體對應屬性:

Enabled 可用性

Caption 標題

Visible 可見性

ShowModal 顯示模式

True表示獨佔,False表示不獨佔,設定獨佔之後此視窗以外的物件則不能被點選,當有多個窗體的獨佔模式有錯誤時,會報以下錯誤:

窗體常用方法:

Show 顯示

Hide 隱藏

窗體常用事件:

UserForm_Activate 啟用

UserForm_QueryClose 退出

在窗體背後寫程式碼時,直接雙擊就可以進入事件程式碼編輯區域,雙擊窗體上的按鈕可以直接跳轉到該按鈕對應的事件程式碼編輯區域

窗體常用方法可與事件搭配使用:

例如當工作簿一開啟,就顯示此視窗

二十一、Msgbox詳解

Msgbox有四個引數:(這裡只需掌握三個即可)

第一個引數表示文字框內容

第二個引數表示按鈕顯示型別

第三個引數表示彈出框標題

例如:

效果圖:

樣式引數

對於第二個引數來說:需要多種樣式組合就用加號連線

Msgbox的返回值:

返回值的對應結果:

返回1說明點選了確定,以此類推

二十二、Inputbox詳解

Inputbox有兩個,一個是函式,一個是方法

Inputbox函式

Inputbox方法

二十三、GetOpenFilename與Dialogs

1.GetOpenFilename

返回所選檔案的完整路徑

那麼根據前面Dir殼子的思路,可以利用GetOpenFilename也做一個開啟檔案,關閉檔案的殼子,但是不同的是檔案是使用者自己選de

Sub try()
Dim arr()
Dim i As Integer
Dim wb As Workbook
arr = Application.GetOpenFilename("Excel檔案,*.xls*", 1, , , True)
On Error Resume Next '防止使用者沒有選擇檔案直接點選取消
If arr(1) <> "False" Then
    For i = LBound(arr) To UBound(arr)
        Set wb = Workbooks.Open(arr(i))
        '這裡寫需要進行的操作
        wb.Close
    Next
End If
End Sub

2.Application.Dialogs

用於操作Excel中所有的對話方塊

在使用的時候需要注意有的操作要先選中物件,才能再執行對話方塊,比如指定巨集的對話方塊,需要先選中指定巨集的控制元件,在執行sub過程即可

二十四、使用ADO連線外部Excel資料來源

1、在VBE介面中工具—引用—勾選Microsoft ActiveX Data Object x.x Library(x.x表示版本號)

2、連線程式碼

Sub test()
Dim conn As New ADODB.Connection
Dim sql As String
conn.Open "Provider = Microsoft.ACE.OLEDB.12.0;Data Source=E:\Excel_date\Adata.accdb"
sql = ""           '雙引號裡是一組sql程式碼語句,要用雙引號把整個程式碼括起來 "
Columns("A:Z").ClearComments
Range("A2").CopyFromRecordset conn.Execute(sql)  '如果sql程式碼沒有返回值那麼就只保留coon.Execute(sql)的程式碼
conn.Close
End Sub

以下給出各種資料庫連線的語句(即上文加粗部分)

Excel檔案
conn.Open "Provider = Microsoft.ACE.OLEDB.12.0;Data Source=D:\data\Edata.xlsx;extended properties=""excel 12.0;HDR=YES"""
conn.Close

ACCESS檔案
conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\data\Adata.accdb"

Mysql資料庫
conn.Open  "Provider=SQLOLEDB;DataSource=" & Path & ";Initial Catolog=" & strDataName


MSSQL資料庫
conn.Open  "Provider=MSDASQL;Driver={SQL Server};Server=" & Path & ";Database=" & strDataName

Oracle資料庫
conn.Open  "Provider=madaora;Data Source=MyOracleDB; User Id=UserID; Password=Password"
各種資料庫連線程式碼

二十五、Shape物件詳解

插入圖片案例:

圖表物件:

在不知道如何操作的時候一定要想到錄製巨集

二十六、Vba中使用Name修改檔名

Name 案例:

將圖片檔案的名字改為姓名加身份證號:

二十七、使用表單控制元件

當做很複雜的程式(點選切換題目點選計算分數)等需要程式設計的東西我們使用Active X 控制元件,對於調查檔案等只需要勾選的情況,就可以使用表單控制元件,又小又靈活

表單控制元件的所有控制元件都要設定單元格連結地址來獲取返回值

選中控制元件---右鍵 設定空間格式---控制

Active X控制元件有分組屬性,在表單控制元件中只能使用分組框來框選表單控制元件來達到分組的目的

那麼如何隱藏分組框還讓他發揮作用的,這裡就涉及到觸類旁通的思想,在VBA的學習過程中要不斷地去嘗試觸類旁通的思想,推測思想以及錄製巨集的方式去解決

二十八、VBA中的Like

相當於Mysql中like,只不過稍微有點區別

* 任意字元

# 任意一位數字

? 一位字元

! 邏輯非

[A-Z] 大寫字母

[A-Z a-z] 字母

[0-9] 數字

[!A-Z] 非大寫字母

[!0-9] 非數字

二十九、Sub與變數的公有與私有

這裡的共有與私有相當於python中的區域性變數和全域性變數

對於sub而言,在一個模組中可以相互呼叫,在另外一個模組中也可以相互呼叫(sub 預設為 public 公有的)

對於private sub而言,其在一個模組中可以呼叫private sub,另外的模組就不能呼叫(private 私有的)

對於變數而言:

在實際開發過程中,儘量少用public 定義全域性變數,可以使用定義一個函式作為橋樑進行傳遞:

靜態變數:

普通變數用Dim宣告,過程結束後記憶體就會釋放其變數的儲存空間,多次執行的話,每次都要開闢新的空間

靜態變數用Static宣告,過程結束記憶體也不會釋放其變數的儲存空間,多次執行的話,就會在原基礎上繼續進行運算

三十、類模組

用於儲存以類或物件方式編寫的程式碼。

通過建立類模組,可以建立使用者自定義類和物件。

使用已建立的類模組,不需要編碼者瞭解具體是如何工作的,因此可以實現共享程式碼

bilibili視訊講解地址:https://www.bilibili.com/video/bv14i4y1g7dH

類模組變數定義方法: Dim 變數名 as new 類模組名

三十一、VBA中的字典

定義方式:

方法1

工具-引用-瀏覽-找到scrrun.dll-確定

Dim dic As New Dictionary

方法2 (推薦)

Dim dic

Set dic = CreateObject("Scripting.Dictionary")

可以把字典理解成只有兩列資料的陣列

字典有兩個優點:

一是查詢非常快根據鍵值配對value

二是可以自動去重

可以將需要賦值給字典的單元格區域設定成陣列模式,既快速又簡潔

在單元格給陣列區域賦值的時候隨便幾行幾列都沒問題,在給字典賦值的時候只能是一列鍵值,一列value而已,將陣列的某一列區域賦值給字典的keys,可以達到去重的效果

三十二、& 的辨析