|
目錄: 十六、DIR 指定一個(gè)文件路徑,其文件路徑下有這個(gè)文件,返回文件名,沒有這個(gè)文件,返回空 二十四、使用ADO連接外部Excel數(shù)據(jù)源 數(shù)據(jù)類型的最大值: 1bytes(1字節(jié))=8bit,8bit可存儲(chǔ)28個(gè)數(shù)字,負(fù)數(shù)占一半,正數(shù)和0占一半 例如:整型類型所占2個(gè)字節(jié),2字節(jié)=16位,可存儲(chǔ)216個(gè)數(shù)據(jù),負(fù)數(shù)占一半,正數(shù)和0占一半
在定義變量時(shí),不知道定義的變量類型,此時(shí)可以設(shè)置成Variant(變體型)類型 1.可以使用字母、數(shù)字個(gè)一些標(biāo)點(diǎn)符號(hào),但是第一個(gè)字符必須為字母 2.不能使用空格和句點(diǎn) 3.不能含有特殊的聲明字符(#、¥、%、&、、?。?/span> 4.變量名不能超過254個(gè)字符 5.變量名不區(qū)分大小寫 空白符:空格符、制表符、換行符等統(tǒng)稱為空白符,主要用于規(guī)范程序格式 運(yùn)算符的結(jié)合性:
對(duì)于算數(shù)運(yùn)算符而言,計(jì)算的順序?yàn)閺淖笾劣?/span> 對(duì)于賦值運(yùn)算符而言,計(jì)算的順序?yàn)閺挠抑磷?/span>
跳出FOR循環(huán),用exit for(常于if搭配使用) 用于按指定的次數(shù)執(zhí)行循環(huán)體
For each in Next循環(huán): 針對(duì)一個(gè)集合或是數(shù)組中的每個(gè)元素循環(huán)執(zhí)行操作
For each in next相當(dāng)于python中的for I in range 他會(huì)遍歷對(duì)象中的每一個(gè)元素 如將其他工作表的名稱放入到 部門 表中
分支控制語句(IF語句、Select Case語句) IF結(jié)構(gòu):
兩種語言不同的點(diǎn)在于Python將VBA中IF\ElseIF的Then換成了冒號(hào),VBA中的ElseIF不能簡(jiǎn)寫成Elif Select Case語句 針對(duì)多重判定任務(wù)反復(fù)進(jìn)行循環(huán)操作處理
While循環(huán)的兩種寫法:
DO…Until循環(huán) Until語句又稱為“直到型”循環(huán)結(jié)構(gòu)處理語句。也就是直到條件成立的時(shí)候才結(jié)束循環(huán)體。
工作表有四種:
'工作表的選擇
Sheet1.Select '選擇工作表1
Sheets(3).Select '選擇第三個(gè)工作表
Sheets('一月').Select '選擇名稱為一月的工作表
'插入工作表
Sheets.Add '在當(dāng)前工作表前面插入新的工作表
Sheets.Add , after:=Sheet3 '在sheet3后面插入新的工作表
'在sheet3后面插入100個(gè)新的工作表
Dim i As Integer
For i = 1 To 100
Sheets.Add , after:=Sheet3
Next
'統(tǒng)計(jì)工作簿中工作表的數(shù)量
Sheet5.Range('a1') = Sheets.Count '在工作表的A1單元格中輸出工作簿中所有工作表的數(shù)量
Sheet5.Range('a1') = Sheet1.Name '在工作表的A1單元格中輸出I作表1的名稱
Sheet1.Name = '匯總' '將工作表1的名稱改為匯總
'使其總是在最后張工作表后面插入新表
Sheets.Add , after:=Sheets(Sheets.Count)
'創(chuàng)建十二個(gè)月的工作表
Dim i As Integer
For i = 1 To 12
Sheets.Add , after:=Sheets(Sheets.Count) '這里的Sheets.Count表示插入前的工作表數(shù)
Sheets(Sheets.Count).Name = i & '月' '這里的Sheets.Count表示插入后的工作表數(shù),與上句相差1
Next
Excel.Application.DisplayAlerts = False '關(guān)閉Excel 的報(bào)錯(cuò)機(jī)制
Sheet3.Delete '刪除工作表3
Excel.Application.DisplayAlerts = True '開啟Excel 的報(bào)錯(cuò)機(jī)制
'插入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) '復(fù)制工作表,并且將其置于左起第二 張工作表之后
Sheet1.Copy , after:=Sheets(Sheets.Count) '復(fù)制工作表,并且始終將其置在最后端
操作工作簿: Sub open_file()
'關(guān)閉錯(cuò)誤提示框
Application.DisplayAlerts = False
'關(guān)閉屏幕更新
Application.ScreenUpdating = False
'打開路徑文件,文件名需要填寫完整
Workbooks.Open Filename:=('E:\Excel_date\case.xlsx')
'給活動(dòng)工作簿的表1添加值
ActiveWorkbook.Sheets(1).Range('A1') = '到此一游o'
'保存
ActiveWorkbook.Save
'關(guān)閉
ActiveWorkbook.Close
Application.DisplayAlerts = True
End Sub
Sub create_file()
'創(chuàng)建新的工作簿
Workbooks.Add
ActiveWorkbook.Sheets(1).Range('A1') = '測(cè)試內(nèi)容'
'文件另存為
ActiveWorkbook.SaveAs Filename:=('E:\Excel_date\caeate.xlsx')
'關(guān)閉
ActiveWorkbook.Close
End Sub
將工作表另存為工作簿:
代碼:
單元格是EXCEL中最小的對(duì)象 單元格對(duì)象Range:(跳轉(zhuǎn)到指定單元格搭配select使用) Range:
Sub try_case_2()
'彈出A1單元格所在的當(dāng)前區(qū)域的最后一個(gè)單元格的行號(hào)
MsgBox Range('A1').End(xlDown).Row
'從a65536單元格向上移動(dòng)到第一個(gè)有數(shù)據(jù)的單元格
MsgBox Range('A65536').End(xlUp).Row
End Sub
Range('A6').EntireRow.Select '選中A6所在單元格的整行
Range('A6').Resize(1, 3).Select '以A6單元格為參照,重新框選選區(qū)
Range('H7:L7').Copy , Range('N7') '將H7:L7復(fù)制到N7
'注意:如果是復(fù)制一整行的話,最好在相同列復(fù)制
Range('A7').EntireRow.Copy , Range('A10')
'這樣就會(huì)報(bào)錯(cuò),因?yàn)榱刑?hào)不匹配,會(huì)導(dǎo)致粘貼區(qū)域范圍不夠
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
注意:如果活動(dòng)單元格不是sheet1,那么以下代碼就會(huì)報(bào)錯(cuò)
如下就不會(huì)報(bào)錯(cuò): Cells指定單元格對(duì)象: (跳轉(zhuǎn)到指定單元格搭配select使用)
Selection:當(dāng)前選區(qū),表示當(dāng)前選中的單元格區(qū)域 ActiveCell:活動(dòng)單元格,有且僅有一個(gè) UsedRange:已使用區(qū)域,表示使用過的所有區(qū)域,(對(duì)某個(gè)單元格進(jìn)行格式設(shè)置,即使沒有輸入內(nèi)容,也屬于已使用區(qū)域) CurrentRegion:當(dāng)前區(qū)域,表示此單元格四周相連的單元格區(qū)域
1.篩選的原理就是將不符合條件的數(shù)據(jù)隱藏起來(行高設(shè)為0) Sub 篩選()
Sheet8.Range('$A$9:$C$13').AutoFilter Field:=2, Criteria1:='凱迪拉克'
'Field:=2表示數(shù)據(jù)區(qū)域第幾列應(yīng)用篩選
'Criteria1:='凱迪拉克'表示篩選條件
Sheet8.Range('$A$9:$C$13').AutoFilter
'關(guān)閉篩選
End Sub
2.With與End With: 作用就是節(jié)省代碼,使代碼簡(jiǎn)潔,書寫方便 Sub case_1()
With Sheet1
.Range('A1') = 1
.Range('A2') = 2
.Range('A3') = 3
Sheet2.Range('A1') = 1
End Sub
只有前面加點(diǎn)的才會(huì)應(yīng)用with
十、事件:語義可以理解為:當(dāng)采取……操作的時(shí)候,就執(zhí)行…… 工作表事件:
例如:用事件在工作表中修改顏色,即單元格選區(qū)發(fā)生改變,所在選區(qū)的那一行設(shè)置為黃色底紋,其余行的底紋顏色為透明
Sub change_color()
Cells.Interior.Pattern = xlNone
Selection.EntireRow.Interior.Color = 65535
End Sub
Change事件的注意:
點(diǎn)擊表格自動(dòng)更新事件:
工作簿事件:
舉例:在保存工作簿前的時(shí)候備份數(shù)據(jù)到指定文件下且文件名字為當(dāng)前時(shí)間
Application.WorksheetFunction.函數(shù)名 '工作表函數(shù)調(diào)用方式
On Error Resume Next '程序崩潰請(qǐng)繼續(xù)執(zhí)行代碼
舉例:考生成績(jī)統(tǒng)計(jì)查詢系統(tǒng) 題目示例
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 '如果代碼崩潰,繼續(xù)執(zhí)行代碼
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 '結(jié)束循環(huán)
End If
Next
End Sub
1.isnumeric(參數(shù)) 判斷參數(shù)是不是數(shù)字 2.參數(shù)=val(參數(shù)) 將參數(shù)轉(zhuǎn)為數(shù)值型 VBA函數(shù)調(diào)用方式: 完整寫法: VBA.Strings.Left (參數(shù)) 第二個(gè)單詞表示VBA函數(shù)類型,使用函數(shù)要準(zhǔn)確寫出其所屬類型
3.instr 用來確定參數(shù)2,在參數(shù)1中處于第幾位的,如果參數(shù)2沒在參數(shù)1中則返回0(find函數(shù)查找的時(shí)候,如果沒有會(huì)程序崩潰) 舉例:截取@前面的字符:
Sub try()
Sheet1.Range('B2') = VBA.Strings.Left(Sheet1.Range('A2'), VBA.Strings.InStr(Sheet1.Range('A2'), '@') - 1)
End Sub
結(jié)果:
4.split Split(參數(shù)1,參數(shù)2)表示在參數(shù)1中用參數(shù)2進(jìn)行分割,得到的結(jié)果為一個(gè)數(shù)組 數(shù)組的第一個(gè)值為0,即用python中索引的方式去取數(shù),索引從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
結(jié)果:
在工作中使用自定義的函數(shù)
可以將VBA中的函數(shù)作為一個(gè)新的函數(shù),這樣這個(gè)函數(shù)不僅可以在SUB過程中被調(diào)用,也可以在工作表中被調(diào)用 例如:將VBA函數(shù)中的Split函數(shù)封裝為 截取字符 函數(shù),這樣工作表中和sub過程中都可以調(diào)用
結(jié)果:
創(chuàng)建帶參數(shù)的SUB: 根據(jù)表格內(nèi)容創(chuàng)建新的工作表,工作表名為表格內(nèi)容
按值傳遞與按引用傳遞:
想讓代碼在任何工作簿中都可以使用,需要做三件事: 1.將代碼放入代碼庫(kù)中 點(diǎn)擊已經(jīng)寫好代碼的工作簿的另存為---瀏覽---保存類型選擇xlam或者xla Excel會(huì)自動(dòng)跳到保存加載宏的文件夾,起好名字點(diǎn)擊保存
2.告訴Excel每次打開工作簿都加載此代碼
3.將代碼設(shè)置一個(gè)按鈕(添加到快速訪問工具欄) 先關(guān)閉打開的工作簿,打開一個(gè)新的工作簿---文件---選項(xiàng)
但是需要注意的是,加載宏的代碼必須具有可移植性,相當(dāng)于軟代碼的感覺,要保證這塊代碼在任何工作簿中都可以完整且正確的執(zhí)行 加載宏的代碼一定不能出現(xiàn)Thisworkbook這種類型的自動(dòng),因?yàn)樵诩虞d宏的文件里,Thisworkbook代表那個(gè)原本的xla文件,可以使用變量,將變量定義為當(dāng)前的活動(dòng)工作簿即可 在刪除代碼庫(kù)的時(shí)候,需要先將第二步中的加載項(xiàng)取消勾選,然后再找到路徑去刪除(可以另存為選擇xlam類型自動(dòng)跳轉(zhuǎn)到文件夾的時(shí)候刪除,即第一步的窗口中刪除)
十六、DIR 指定一個(gè)文件路徑,其文件路徑下有這個(gè)文件,返回文件名,沒有這個(gè)文件,返回空
DIR里支持通配符操作,可以幫助我們回避掉文件同名,格式不同的情況
Dir多條符合值的辨析: 當(dāng)有多個(gè)文件符合Dir的結(jié)果時(shí),第一個(gè)Dir需要加條件,并返在內(nèi)存中存儲(chǔ)一個(gè)符合結(jié)果的序列,其后的Dir如果不加文件路徑,返回的是結(jié)果序列的第二個(gè)值,以此類推。 如果只有兩個(gè)符合結(jié)果的值,第一個(gè)Dir返回的是序列一的值,第二個(gè)返回序列二的值,第三個(gè)返回空,第四個(gè)會(huì)報(bào)錯(cuò) 例如:(文件路徑下蘇州只有兩個(gè) 蘇州.xls和蘇州.xlsx)
于是,我想查找文件路徑下所有的文件可以這樣寫:
Dir的殼子: 打開路徑文件里的所有數(shù)據(jù),然后執(zhí)行一些操作,然后關(guān)閉
案例:將路徑文件下工作簿里的表復(fù)制到指定工作簿中 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中的FIND功能很強(qiáng)大,完全可以替換Vlookup函數(shù),甚至突破Vlookup函數(shù)的局限性,比如,姓名不在數(shù)據(jù)第一列、查找數(shù)據(jù)橫向的任何一個(gè)單元格(改變offset參數(shù))、對(duì)單元格進(jìn)行清除 格式設(shè)置 等等一系列操作 舉例:
一維數(shù)組:
二維數(shù)組:
在VBA中最經(jīng)常涉及的就是讀寫工作表中的單元格,如果讀寫操作次數(shù)較多,或者涉及到的單元格數(shù)量較多,往往會(huì)導(dǎo)致程序運(yùn)行效率較低。這時(shí)經(jīng)常用到的解決方法就是使用數(shù)組保存數(shù)據(jù),在內(nèi)存中進(jìn)行數(shù)據(jù)處理和加工,最后一次行更新工作表,這樣的操作方式往往會(huì)極大提升程序的運(yùn)行效率。 對(duì)比:
在for循環(huán)中盡量不用range,而是用數(shù)組替代,當(dāng)代碼量特別大的時(shí)候它們的區(qū)別就會(huì)特別明顯 數(shù)組應(yīng)用例子: 數(shù)組可以幫我們虛擬出來一個(gè)內(nèi)存空間,臨時(shí)存放一些中間用到的數(shù)據(jù)(輔助列) 數(shù)組可以直接用在函數(shù)里
Dim 與 ReDim: Dim里面的東西必須用常量,Dim arr(1 to i)就會(huì)報(bào)錯(cuò) 上述圖片中的數(shù)組應(yīng)用例子,只能有4行,如果A列為N個(gè)產(chǎn)品呢?此時(shí)我們就需要將數(shù)組中的元素個(gè)數(shù)設(shè)置為1 to n
在開發(fā)工具的設(shè)計(jì)模式下,可點(diǎn)擊右鍵進(jìn)行屬性設(shè)置 1.CommandButton控件(按鈕)
常用屬性: Enabled可用性 Caption標(biāo)題 Visible可見性 常用事件:Click事件(點(diǎn)擊事件) 2.Label控件(標(biāo)簽)
常用屬性: Enabled可用性 Caption標(biāo)題 Visible可見性 一般沒有應(yīng)用的事件,就一個(gè)文本框而已 3. OptionButton控件(選項(xiàng)按鈕)
常見屬性: Caption 標(biāo)題 Enabled 可用性 GroupName 組名 Value 返回值 Visible 可見性 常見事件: Click事件(點(diǎn)擊事件) 4. SpinButton控件(微調(diào)按鈕)
可以根據(jù)長(zhǎng)寬比調(diào)整是上下布局還是左右布局 常見屬性: Enabled可用性 Value 返回值 可返回按鈕改變之后的數(shù)值大小 Visible可見性 Min 最小值 Max 最大值 常用事件: Change事件 5.chexbox按鈕(復(fù)選框) 一組之中各個(gè)選項(xiàng)不會(huì)互斥,即都可以選擇 但是可以用事件,也可以將chekbox做成互斥的模樣,即click事件,然后另外一個(gè)的值為False 6.Textbox(文本框控件) 常見屬性: Enabled 可用性 Value 返回值 Visible 可見性 PasswordChar 密碼字符 即保護(hù)用戶輸入信息掩碼 TabIndex 按下Tab鍵時(shí)的切換順序,多個(gè)控件之間用Tab鍵切換,可在屬性設(shè)置 注意值為0開始 舉例事件:輸入賬號(hào)密碼的文本框事件舉例
7. ComboBox復(fù)合框控件(下拉框) 常用屬性: Enable Value Visible List 數(shù)據(jù)源列表 常用方法: AddItem 增加一個(gè)下拉項(xiàng)目 RemoveItem 移除一個(gè)項(xiàng)目 Clear 清除 舉例:使用的時(shí)候可以結(jié)合各種事件來調(diào)用相應(yīng)的sub '增加下拉框的選項(xiàng)
Sub test1()
UserForm1.ComboBox1.AddItem '蘇州'
End Sub
'把單元格一列數(shù)據(jù)設(shè)置為下拉的數(shù)據(jù)源
Sub test2()
For i = 2 To 6
UserForm1.ComboBox1.AddItem Sheet1.Range('a' & i)
Next
End Sub
'刪除掉下拉框里的一項(xiàng)
Sub test3()
Call test2
UserForm1.ComboBox1.RemoveItem (1) '刪除第二項(xiàng)
End Sub
'清空下拉框數(shù)據(jù)源
Sub test4()
Call test2
UserForm1.ComboBox1.Clear
End Sub
'計(jì)算下拉框里有多少個(gè)選項(xiàng)
Sub test5()
Call test2
MsgBox UserForm1.ComboBox1.ListCount
End Sub
'把下拉框數(shù)據(jù)源里某個(gè)值輸出到單元格
Sub test6()
Call test2
Range('c2') = UserForm1.ComboBox1.List(1)
End Sub
'把下拉框里所有的選項(xiàng)輸出到單元格區(qū)域
Sub test7()
Call test2
Range('d1:d5') = UserForm1.ComboBox1.List
End Sub
8.listbox(列表框) 舉例:使用的時(shí)候可以結(jié)合各種事件來調(diào)用相應(yīng)的sub '增加列表框的選項(xiàng)
Sub test1()
UserForm1.ListBox1.AddItem '蘇州'
End Sub
'把單元格一列數(shù)據(jù)設(shè)置為列表框的數(shù)據(jù)源
Sub test2()
For i = 2 To 5
UserForm1.ListBox1.AddItem Sheet1.Range('a' & i)
Next
End Sub
'刪除掉列表框里的一項(xiàng)
Sub test3()
Call test2
UserForm1.ListBox1.RemoveItem (1) '刪除第二項(xiàng)
End Sub
'清空列表框數(shù)據(jù)源
Sub test4()
Call test2
UserForm1.ListBox1.Clear
End Sub
'計(jì)算列表里有多少個(gè)選項(xiàng)
Sub test5()
Call test2
MsgBox UserForm1.ListBox1.ListCount
End Sub
'把組合框數(shù)據(jù)源里某個(gè)值輸出到單元格
Sub test6()
Call test2
Range('c2') = UserForm1.ListBox1.List(1)
End Sub
'把下拉框里所有的選項(xiàng)輸出到單元格區(qū)域
Sub test7()
Call test2
Range('d1:d4') = UserForm1.ListBox1.List
End Sub
'把一個(gè)區(qū)域的一列數(shù)據(jù)設(shè)置為列表框的數(shù)據(jù)源
Sub test8()
UserForm1.ListBox1.List =Range('d1:d4').value
End Sub
二十、窗體
窗體對(duì)應(yīng)屬性: Enabled 可用性 Caption 標(biāo)題 Visible 可見性 ShowModal 顯示模式 True表示獨(dú)占,F(xiàn)alse表示不獨(dú)占,設(shè)置獨(dú)占之后此窗口以外的對(duì)象則不能被點(diǎn)擊,當(dāng)有多個(gè)窗體的獨(dú)占模式有錯(cuò)誤時(shí),會(huì)報(bào)以下錯(cuò)誤:
窗體常用方法: Show 顯示 Hide 隱藏 窗體常用事件: UserForm_Activate 激活 UserForm_QueryClose 退出 在窗體背后寫代碼時(shí),直接雙擊就可以進(jìn)入事件代碼編輯區(qū)域,雙擊窗體上的按鈕可以直接跳轉(zhuǎn)到該按鈕對(duì)應(yīng)的事件代碼編輯區(qū)域 窗體常用方法可與事件搭配使用: 例如當(dāng)工作簿一打開,就顯示此窗口
Msgbox有四個(gè)參數(shù):(這里只需掌握三個(gè)即可) 第一個(gè)參數(shù)表示文本框內(nèi)容 第二個(gè)參數(shù)表示按鈕顯示類型 第三個(gè)參數(shù)表示彈出框標(biāo)題 例如:
效果圖:
樣式參數(shù) 對(duì)于第二個(gè)參數(shù)來說:需要多種樣式組合就用加號(hào)連接
Msgbox的返回值:
返回值的對(duì)應(yīng)結(jié)果:
返回1說明點(diǎn)擊了確定,以此類推 Inputbox有兩個(gè),一個(gè)是函數(shù),一個(gè)是方法 Inputbox函數(shù)
Inputbox方法
1.GetOpenFilename 返回所選文件的完整路徑
那么根據(jù)前面Dir殼子的思路,可以利用GetOpenFilename也做一個(gè)打開文件,關(guān)閉文件的殼子,但是不同的是文件是用戶自己選de Sub try()
Dim arr()
Dim i As Integer
Dim wb As Workbook
arr = Application.GetOpenFilename('Excel文件,*.xls*', 1, , , True)
On Error Resume Next '防止用戶沒有選擇文件直接點(diǎn)擊取消
If arr(1) <> 'False' Then
For i = LBound(arr) To UBound(arr)
Set wb = Workbooks.Open(arr(i))
'這里寫需要進(jìn)行的操作
wb.Close
Next
End If
End Sub
2.Application.Dialogs 用于操作Excel中所有的對(duì)話框 在使用的時(shí)候需要注意有的操作要先選中對(duì)象,才能再執(zhí)行對(duì)話框,比如指定宏的對(duì)話框,需要先選中指定宏的控件,在執(zhí)行sub過程即可
二十四、使用ADO連接外部Excel數(shù)據(jù)源 1、在VBE界面中工具—引用—勾選Microsoft ActiveX Data Object x.x Library(x.x表示版本號(hào)) 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 = '' '雙引號(hào)里是一組sql代碼語句,要用雙引號(hào)把整個(gè)代碼括起來 '
Columns('A:Z').ClearComments
Range('A2').CopyFromRecordset conn.Execute(sql) '如果sql代碼沒有返回值那么就只保留coon.Execute(sql)的代碼
conn.Close
End Sub
以下給出各種數(shù)據(jù)庫(kù)連接的語句(即上文加粗部分) ![]()
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數(shù)據(jù)庫(kù)
conn.Open 'Provider=SQLOLEDB;DataSource=' & Path & ';Initial Catolog=' & strDataName
MSSQL數(shù)據(jù)庫(kù)
conn.Open 'Provider=MSDASQL;Driver={SQL Server};Server=' & Path & ';Database=' & strDataName
Oracle數(shù)據(jù)庫(kù)
conn.Open 'Provider=madaora;Data Source=MyOracleDB; User Id=UserID; Password=Password'
插入圖片案例:
圖表對(duì)象: 在不知道如何操作的時(shí)候一定要想到錄制宏
Name 案例: 將圖片文件的名字改為姓名加身份證號(hào):
當(dāng)做很復(fù)雜的程序(點(diǎn)擊切換題目點(diǎn)擊計(jì)算分?jǐn)?shù))等需要編程的東西我們使用Active X 控件,對(duì)于調(diào)查文件等只需要勾選的情況,就可以使用表單控件,又小又靈活 表單控件的所有控件都要設(shè)置單元格鏈接地址來獲取返回值 選中控件---右鍵 設(shè)置空間格式---控制
Active X控件有分組屬性,在表單控件中只能使用分組框來框選表單控件來達(dá)到分組的目的
那么如何隱藏分組框還讓他發(fā)揮作用的,這里就涉及到觸類旁通的思想,在VBA的學(xué)習(xí)過程中要不斷地去嘗試觸類旁通的思想,推測(cè)思想以及錄制宏的方式去解決
相當(dāng)于Mysql中l(wèi)ike,只不過稍微有點(diǎn)區(qū)別 * 任意字符 # 任意一位數(shù)字 ? 一位字符 ! 邏輯非 [A-Z] 大寫字母 [A-Z a-z] 字母 [0-9] 數(shù)字 [!A-Z] 非大寫字母 [!0-9] 非數(shù)字
這里的共有與私有相當(dāng)于python中的局部變量和全局變量 對(duì)于sub而言,在一個(gè)模塊中可以相互調(diào)用,在另外一個(gè)模塊中也可以相互調(diào)用(sub 默認(rèn)為 public 公有的) 對(duì)于private sub而言,其在一個(gè)模塊中可以調(diào)用private sub,另外的模塊就不能調(diào)用(private 私有的) 對(duì)于變量而言:
在實(shí)際開發(fā)過程中,盡量少用public 定義全局變量,可以使用定義一個(gè)函數(shù)作為橋梁進(jìn)行傳遞:
靜態(tài)變量: 普通變量用Dim聲明,過程結(jié)束后內(nèi)存就會(huì)釋放其變量的存儲(chǔ)空間,多次執(zhí)行的話,每次都要開辟新的空間
靜態(tài)變量用Static聲明,過程結(jié)束內(nèi)存也不會(huì)釋放其變量的存儲(chǔ)空間,多次執(zhí)行的話,就會(huì)在原基礎(chǔ)上繼續(xù)進(jìn)行運(yùn)算
用于保存以類或?qū)ο蠓绞骄帉懙拇a。 通過創(chuàng)建類模塊,可以創(chuàng)建用戶自定義類和對(duì)象。 使用已建立的類模塊,不需要編碼者了解具體是如何工作的,因此可以實(shí)現(xiàn)共享代碼 bilibili視頻講解地址:https://www.bilibili.com/video/bv14i4y1g7dH 類模塊變量定義方法: Dim 變量名 as new 類模塊名
定義方式: 方法1 工具-引用-瀏覽-找到scrrun.dll-確定 Dim dic As New Dictionary 方法2 (推薦) Dim dic Set dic = CreateObject('Scripting.Dictionary') 可以把字典理解成只有兩列數(shù)據(jù)的數(shù)組 字典有兩個(gè)優(yōu)點(diǎn): 一是查詢非??旄鶕?jù)鍵值配對(duì)value 二是可以自動(dòng)去重
可以將需要賦值給字典的單元格區(qū)域設(shè)置成數(shù)組模式,既快速又簡(jiǎn)潔
在單元格給數(shù)組區(qū)域賦值的時(shí)候隨便幾行幾列都沒問題,在給字典賦值的時(shí)候只能是一列鍵值,一列value而已,將數(shù)組的某一列區(qū)域賦值給字典的keys,可以達(dá)到去重的效果
|
|
|