2020国产成人精品视频,性做久久久久久久久,亚洲国产成人久久综合一区,亚洲影院天堂中文av色

分享

[VBA][基礎(chǔ)入門(mén)] 第4講 對(duì)象模型

 東西二王 2019-05-17

[VBA][基礎(chǔ)入門(mén)] 第4講 對(duì)象模型

本文算是一個(gè)VBA很有意義的啟蒙,本文的內(nèi)容我以前只給兩個(gè)有VBA基礎(chǔ)的朋友講過(guò)

現(xiàn)在這倆,一個(gè)在學(xué)python,一個(gè)已經(jīng)開(kāi)了Office排版公司

本文內(nèi)容對(duì)于小白,有巨大的啟蒙作用:

一、理解對(duì)象模型

Office有多種文檔格式,doc、docm、docx、xls、xlsm、xlsx、ppt、ppa、pptm、vsd、vsdx等等

不管是WPS還是微軟,開(kāi)發(fā)這些Office程序之前,肯定要先定義好這些格式的文件結(jié)構(gòu)。

注:微軟現(xiàn)在已經(jīng)公開(kāi)了所有office文件的結(jié)構(gòu),這也是為什么現(xiàn)在有不少第三方office文件解析庫(kù)(例如java的POI, .net的NPOI, 還有商業(yè)庫(kù)aspose系列等等……)的原因。

文件結(jié)構(gòu)里會(huì)明確定義,文件頭長(zhǎng)啥樣,文字、圖片、表格、OLE對(duì)象等等,在文檔里以什么形式擺放,等等一套復(fù)雜的規(guī)則。

定義好之后,就開(kāi)始寫(xiě)各種代碼實(shí)現(xiàn)讀寫(xiě)這些定義好的文檔。

期間會(huì)定義很多常量、很多全局變量、會(huì)寫(xiě)很多類(lèi)、定義不少接口,寫(xiě)出很多輸入輸出的函數(shù)……

這個(gè)時(shí)候,有必要說(shuō)一下office對(duì)象模型,其實(shí)是COM(Component Object Model),這個(gè)貨是微軟一個(gè)了不起的創(chuàng)造。至于為什么這么說(shuō),以后在VBA高階應(yīng)用里介紹。

現(xiàn)在你只需要理解,這個(gè)對(duì)象模型,其實(shí)就是微軟把他們的工程師開(kāi)發(fā)的一些對(duì)象、方法、屬性、事件,以一個(gè)可視化的文檔結(jié)構(gòu)形式展示給用戶(hù)了,方便用戶(hù)直接通過(guò)對(duì)象模型調(diào)用底層的一些接口,來(lái)實(shí)現(xiàn)目標(biāo)文件的讀寫(xiě)操作。

微軟爸爸把VB6改造了一下,結(jié)合了一下COM,移植到了Office里,改名叫Visual Basic for Application(VBA),然后VBAer就很輕松的,在VBA里通過(guò)F2查看對(duì)象模型,通過(guò)IDE提供的成員提醒(上一講講過(guò)的Ctrl J記得吧)訪(fǎng)問(wèn)對(duì)象模型。很輕松地完成對(duì)Office文件的訪(fǎng)問(wèn)了。其酸爽刺激簡(jiǎn)直不可言喻。

學(xué)習(xí)Office VBA童鞋們,你們不知道你們是多么的幸運(yùn)。這么簡(jiǎn)單的一門(mén)語(yǔ)言,給你一個(gè)禮拜學(xué)不會(huì),都對(duì)不起微軟爸爸。

對(duì)于對(duì)象、方法、屬性、事件,這幾個(gè)外星語(yǔ)言,看我來(lái)給NewBee舉個(gè)栗子解釋一哈:

你是廚師

柴米油鹽醬醋茶鍋碗瓢盆就是對(duì)象

煎炸燜煮蒸燉炒就是方法

香辣咸淡就是屬性

高壓鍋里的飯煮熟了,就會(huì)“?!币幌峦ㄖ?,這個(gè)叮就可以理解為事件

題外話(huà),事件和消息有什么區(qū)別呢? 消息是Windows系統(tǒng)最基礎(chǔ)的部分,理解Windows消息需要時(shí)間,深入理解Windows消息需要更多時(shí)間。這個(gè)我們以后在VBA高階應(yīng)用里再展開(kāi)。 在這里消息就像是高壓鍋的各種傳感器不停讀出的溫度、壓強(qiáng)。 事件是對(duì)消息的封裝,在這里當(dāng)傳感器監(jiān)測(cè)溫度超過(guò)6000°,壓強(qiáng)超過(guò)70kPa,時(shí)間累計(jì)30分鐘后,就“?!币幌隆?這個(gè)溫度、壓強(qiáng)就相當(dāng)于消息?!岸!本拖喈?dāng)于事件。

總結(jié)一下,對(duì)象模型,你就簡(jiǎn)單理解為對(duì)象、方法、屬性、事件等的顯式集合。

這個(gè)時(shí)候,應(yīng)該有幾張圖片:

[VBA][基礎(chǔ)入門(mén)] 第4講 對(duì)象模型

[VBA][基礎(chǔ)入門(mén)] 第4講 對(duì)象模型

上圖看到木?直接光標(biāo)放在Address這里,按F1,自動(dòng)彈出Range.Address屬性的官方幫助。你們是真的沒(méi)有意識(shí)到F1是個(gè)多么龐大的代碼寶庫(kù)吧。

學(xué)VBA,花7天時(shí)間入門(mén),然后多花時(shí)間看看F1,玩玩窗體、數(shù)組、集合、字典、正則,不出1個(gè)月就能獨(dú)立解決自己碰到的所有問(wèn)題了。

二、前期綁定和后期綁定

前期綁定:就是在使用改對(duì)象庫(kù)之前,像講它引用到工程里,這樣就可以在IDE里方便的看到其對(duì)象模型成員(啥成員,上面剛講的那些)了。

[VBA][基礎(chǔ)入門(mén)] 第4講 對(duì)象模型

添加引用

工具-引用,就可以看到上圖界面。

已經(jīng)勾選的,是當(dāng)前已經(jīng)添加的引用,這些我們叫前期綁定好了

如果還想添加列表里沒(méi)有的內(nèi)容(不在列表里,證明其沒(méi)有注冊(cè)),就直接從瀏覽按鈕進(jìn)去選中響應(yīng)的組件加進(jìn)來(lái)。

這里不得不吐槽一下,這個(gè)引用界面其實(shí)不怎么好用,不過(guò),誰(shuí)叫微軟是你爸爸呢,你也不敢嫌棄,嫌棄也沒(méi)用,反正爸爸也不會(huì)理你。

前期綁定后,怎么玩呢,下面來(lái)一個(gè)代碼。

以Word里訪(fǎng)問(wèn)Excel為例:

[VBA][基礎(chǔ)入門(mén)] 第4講 對(duì)象模型

在WordVBA里加上Excel的引用

Sub UserModel()
Dim xlApp As Excel.Application 
Dim xlBook As Excel.Workbook 
Dim xlSht As Excel.Worksheet
Dim xlRng As Excel.Range 
'注意對(duì)象賦值用Set
Set xlApp = New Excel.Application '新建一個(gè)Excel.Application進(jìn)程
Set xlBook = xlApp.Workbooks.Open('c:\1.xlsm') '通過(guò)進(jìn)程打開(kāi)一個(gè)已有Excel工作簿
Set xlSht = xlBook.Worksheets('Sheet1') '訪(fǎng)問(wèn)這個(gè)工作簿里名稱(chēng)為'Sheet1'的工作表
Set xlRng = xlSht.UsedRange '返回該工作表里使用的區(qū)域
Debug.Print xlRng.Address '打印Range對(duì)象的地址屬性
End Sub

上面四句聲明做幾條簡(jiǎn)單解釋?zhuān)?/p>

1.前期綁定后,才能這樣聲明Excel里的對(duì)象

2.強(qiáng)烈建議新手在前期綁定時(shí),不要省略前綴,這樣才能加快你對(duì)對(duì)象模型的理解

很多人在寫(xiě)代碼時(shí),跟上面的風(fēng)格完全不同,他們習(xí)慣這樣寫(xiě)的。

Dim xl As Application

Dim bk as workbook

dim sht as worksheet

dim r as range

下面,請(qǐng)你們自己把我上面的代碼,改成下面的這些

然后F5運(yùn)行,再F8單步試試,看看到底發(fā)生了什么。有收獲可以在評(píng)論里分享。

3.寫(xiě)VBA代碼時(shí),嚴(yán)格按照對(duì)象模型來(lái)聲明和使用是有很大的好處的

Dim r, s

set r = range('A1')

s = worksheets(1).name

代碼TM這樣寫(xiě),遺患無(wú)窮。

所以,經(jīng)常會(huì)見(jiàn)到新人提問(wèn),我的代碼怎么又報(bào)錯(cuò)了,F(xiàn)8試過(guò)了,怎么還是不對(duì)啊,都瘋了。

原因其實(shí)就在這里。

上述代碼相當(dāng)于如下代碼:

Dim r As Variant, s as Variant '一個(gè)效率極低的類(lèi)型

Set r = Application.ActiveWorkbook.ActiveSheet.Range('A1') '省略的是當(dāng)前激活的工作表

s = Application.ActiveWorkbook.Worksheets(1).Name

都怪微軟爸爸對(duì)你們太好,讓你們不認(rèn)祖先,都可以寫(xiě)代碼,而且大部分情況下,還都能成功完成任務(wù)。

如果你像我前面說(shuō)的那樣寫(xiě)代碼,時(shí)刻注意返回值適不適合存到變量里。你特么最少能少60%的問(wèn)題。

很多人在學(xué)VBA時(shí),學(xué)習(xí)的方法就錯(cuò)了,不停地走彎路。

很多人在教VBA時(shí),教育的方法就錯(cuò)了,光教怎么吃魚(yú),不教怎么釣魚(yú)。

后期綁定:我想你也能猜出來(lái),就是你不用引用就可以直接使用咯。

先來(lái)后期綁定的語(yǔ)法:

Dim xlApp As Object, xlBook as Object

Set xlApp = CreateObject('Excel.Application')

Set xlBook = xlApp.Workbooks.Open('c:\1.xlsx')

是不是發(fā)現(xiàn)跟上面差別不大?

然而,你圖樣了,變量聲明的時(shí)候全部用的是Object,為毛不像有些人那樣就偷懶,Dim xlApp, xlBook呢,使用Variant又不是不能存Object。

我TM大寶劍都快按捺不住了。Object本身效率就沒(méi)有前期綁定高,然后Variant比Object效率還要低,你說(shuō)你用啥。

肯定還會(huì)有人抬杠,這點(diǎn)效率差別,相比代碼完成后的效率前后對(duì)比,可以忽略不計(jì)。

如果你這么說(shuō),我只能說(shuō):好的,好的,你說(shuō)的都對(duì),你開(kāi)心就好。

還有在后期綁定里,可就沒(méi)有一分半點(diǎn)相關(guān)的成員提醒了,你按Ctrl J按到手抽筋也不會(huì)有。

當(dāng)然后期綁定也有一大好處:就是我特么就不用管你引用的類(lèi)庫(kù)的版本了。

你的代碼是Word里引用了Excel 2010,如果是前期綁定,放到Excel2013里,還得重新引用。

而用后期綁定,極大概率代碼不需要修改。除非相關(guān)使用到的內(nèi)容,在2013的對(duì)象模型里相比2010有調(diào)整。

下面給一張前期綁定和后期綁定的對(duì)應(yīng)整理(不全):

[VBA][基礎(chǔ)入門(mén)] 第4講 對(duì)象模型

常用的對(duì)象的前期綁定和后期綁定都有了。

當(dāng)然,怎么知道后期綁定的字符呢。這個(gè)暫時(shí)也不講了,后面在高階應(yīng)用里一起扒,因?yàn)槲恼率前l(fā)出去了再被我撤回來(lái)加的上面圖片。

一下子又扒了3k多字,本來(lái)還預(yù)定了一個(gè)實(shí)戰(zhàn)操作,改下一講分解吧。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多