前言:
Excel基本是用來處理表單數(shù)據(jù)的湿镀,里面自帶一些工具和函數(shù)演侯,熟練運用工具和函數(shù)可以讓Excel變得比較高效姿染。但是,有時面對一些繁瑣的數(shù)據(jù)它就無能為力了秒际,因此微軟推出了VBA開發(fā)悬赏,VBA處理Excel數(shù)據(jù)既高效也比較簡單,適合編程小白上手娄徊。
VBA 是基于Visual Basic 發(fā)展而來的闽颇,它們具有相似的語言結(jié)構(gòu)。VB是設(shè)計用于創(chuàng)建標(biāo)準(zhǔn)的應(yīng)用程序寄锐,而VBA是使已有的應(yīng)用程序(EXCEL等)自動化兵多;VB具有自己的開發(fā)環(huán)境;而VBA必須寄生于已有的office應(yīng)用程序橄仆,是其中的一個開發(fā)模塊中鼠。
效果圖:
上圖的這個功能并不具有VBA開發(fā)功能的一個代表性,僅供練手沿癞,功能是輸入關(guān)鍵字后在Excel表中顯示關(guān)鍵字的描述列表援雇。
VBA在Excel中的應(yīng)用
VBA能實現(xiàn)Excel本身應(yīng)用公式等不能實現(xiàn)的更多非常強大的自動化功能,小到自動算數(shù)椎扬、做表惫搏,大到辦公平臺,如:
1.數(shù)據(jù)自動錄入客戶系統(tǒng)
2.系統(tǒng)網(wǎng)頁數(shù)據(jù)抓取
3.任務(wù)自動分配
4.狀態(tài)跟蹤管理
5.郵件自動批量發(fā)送
6.報告自動做成
7.問卷調(diào)查(配合Outlook)
8.項目管理(配合Access數(shù)據(jù)庫)
9.能力測試系統(tǒng)
10.知識庫
11.問詢管理系統(tǒng)
12.員工報銷管理系統(tǒng)
代碼分析:
Dim listDataArr As Collection 'excel顯示所需的數(shù)組數(shù)據(jù)
Sub testVBA()
Dim URLStr As String 'API
Dim originalStr As String '網(wǎng)絡(luò)請求后的原始字符串?dāng)?shù)據(jù)
Dim dataDic As Dictionary '字符串轉(zhuǎn)化為的json蚕涤,即dic
keyword = Application.InputBox("請輸入需查詢的關(guān)鍵字:")
'隨意使用的一個免費API用于下面的練習(xí)
URLStr = "http://baike.baidu.com/api/openapi/BaikeLemmaCardApi?scope=103&format=json&appid=379020&bk_length=600&bk_key=" & keyword
'執(zhí)行g(shù)et請求
originalStr = LXHelpModel.XMLHttpGET(URLStr)
If Len(originalStr) = 2 Then
MsgBox ("請輸入有效的關(guān)鍵字筐赔,如:vba、互聯(lián)網(wǎng)揖铜、app等")
Exit Sub
End If
'json解析茴丰,將服務(wù)器返回的字符串?dāng)?shù)據(jù)轉(zhuǎn)化為json(Dictionary),這里使用的是www.json提供的官方解析方法(使用別的方法解析時含有數(shù)組的數(shù)據(jù)將得到JScriptTypeInfo類型的數(shù)據(jù)天吓,不可使用)
Set dataDic = JSON.parse(originalStr)
Set listDataArr = dataDic("card")
updateExcelData
End Sub
'更新excel數(shù)據(jù)
Function updateExcelData()
'清空舊數(shù)據(jù)
ActiveSheet.Cells.ClearContents
'ActiveSheet.Cells.Interior.ColorIndex = 0
'將數(shù)據(jù)更新到excel指定的cell中
Dim item As Dictionary
For i = 1 To listDataArr.Count
Set item = listDataArr.item(i)
ActiveSheet.Cells(3 + i, 1) = item("name")
ActiveSheet.Cells(3 + i, 3) = item("format")(1)
ActiveSheet.Cells(3 + i, 1).Font.Color = RGB(0, 200, 50)
'ActiveSheet.Cells(3 + i, 1).Interior.Color = RGB(0, 50, 200)
Next
End Function
此效果在LXTestModel模塊中實現(xiàn)贿肩,將testVBA過程指定為一個按鈕的宏,可以通過點擊點擊宏按鈕選擇testVBA再運行龄寞,也可以直接點擊查詢按鈕即可運行testVBA方法汰规。
代碼分析在注釋中已經(jīng)寫的很明了了,主要通過ActiveSheet.Cells(3 + i, 1) = item("name")給表格的指定位置賦值物邑。
遇到的坑:
解析json時溜哮,若字段里包含有數(shù)組時滔金,則無法使用此字段,類行為JScriptTypeInfo茂嗓。
產(chǎn)生這個結(jié)果的原因是創(chuàng)建的ScriptControl對象餐茵,指定為JS語言去解析導(dǎo)致的。須要用JSON網(wǎng)站提供的專門解析json的庫去解析述吸,下載地址www.json.org忿族,找到VB-JSON下載,然后需導(dǎo)入cJSONScript.cls刚梭、cStringBuilder.cls肠阱、JSON.bas這三個文件到工程中,然后Set dataDic = JSON.parse(originalStr)
這樣使用朴读,傳入一個json字符串屹徘,將返回Dictionary類型的字典,這個類型iOS開發(fā)者很熟悉衅金,java中叫做map噪伊。
導(dǎo)入VBJson的三個文件后,提示錯誤:“用戶定義類型未定義”氮唯,代碼并定位到方法RStoJSON
需將類型ADODB.Recordset改為Object使編譯通過鉴吹。
使用Dictionary后提示錯誤:“用戶定義類型未定義”
產(chǎn)生這個結(jié)果的原因是VBA本身不支持此數(shù)據(jù)類型,需引用庫惩琉,按如下操作點擊:工具->引用->勾選“Microsoft Scripting Runtime” ->確定豆励。不建議使用Set dic=CreateObject("scripting.dictionary")
這種方式創(chuàng)建
使用Utf8ToUnicode方法解亂碼時,提示錯誤:運行時錯誤‘424’:要求對象
在此文件第一行添加如下代碼
Private Declare Function MultiByteToWideChar Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpMultiByteStr As Long, ByVal cchMultiByte As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long) As Long
Private Const CP_UTF8 = 65001
Option Explicit
網(wǎng)絡(luò)請求時使用Inet方式瞒渠,錯誤代碼提示定位在Inet1良蒸,提示錯誤:變量未定義
Inet是一個用于網(wǎng)絡(luò)請求的控件,需添加此控件到Execl中伍玖,按如下操作:開發(fā)工具->最后一個插入控件(在圖片右邊)->在下拉列表中找到“Microsoft Internet Transfer Control”并點擊->點擊在任意表格位置插入嫩痰。若下拉列表中無“Microsoft Internet Transfer Control”, 則需先安裝MSINET.OCX窍箍,再操作串纺。
運行宏無效
可能是運行后出現(xiàn)錯誤,修改完代碼后未點擊重新設(shè)置
VBA開發(fā)剛研究兩天還是菜鳥椰棘,不當(dāng)之處還望指正纺棺。
源碼請點擊github地址下載。