VBA操作Excel的一個簡單網(wǎng)絡(luò)應(yīng)用

前言:

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ā)模塊中鼠。

效果圖:

screen1.png



screen2.png



screen3.png

上圖的這個功能并不具有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地址下載。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末晰搀,一起剝皮案震驚了整個濱河市五辽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌外恕,老刑警劉巖杆逗,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異鳞疲,居然都是意外死亡罪郊,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進(jìn)店門尚洽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來悔橄,“玉大人,你說我怎么就攤上這事腺毫⊙⑴保” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵潮酒,是天一觀的道長睛挚。 經(jīng)常有香客問我,道長急黎,這世上最難降的妖魔是什么扎狱? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮勃教,結(jié)果婚禮上淤击,老公的妹妹穿的比我還像新娘。我一直安慰自己故源,他們只是感情好污抬,可當(dāng)我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著绳军,像睡著了一般印机。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上删铃,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天耳贬,我揣著相機與錄音,去河邊找鬼猎唁。 笑死咒劲,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的诫隅。 我是一名探鬼主播腐魂,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼逐纬!你這毒婦竟也來了蛔屹?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤豁生,失蹤者是張志新(化名)和其女友劉穎兔毒,沒想到半個月后漫贞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡育叁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年迅脐,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片豪嗽。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡谴蔑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出龟梦,到底是詐尸還是另有隱情隐锭,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布计贰,位于F島的核電站钦睡,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蹦玫。R本人自食惡果不足惜赎婚,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望樱溉。 院中可真熱鬧挣输,春花似錦、人聲如沸福贞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽挖帘。三九已至完丽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拇舀,已是汗流浹背逻族。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留骄崩,地道東北人聘鳞。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像要拂,于是被迫代替她去往敵國和親抠璃。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容