乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

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

       東西二王 2019-05-17

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

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

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

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

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

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

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

      注:微軟現(xiàn)在已經(jīng)公開了所有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ī)則。

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

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

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

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

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

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

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

      你是廚師

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

      煎炸燜煮蒸燉炒就是方法

      香辣咸淡就是屬性

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

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

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

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

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

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

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

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

      二、前期綁定和后期綁定

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

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

      添加引用

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

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

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

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

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

      以Word里訪問Excel為例:

      [VBA][基礎(chǔ)入門] 第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') '通過進(jìn)程打開一個(gè)已有Excel工作簿
      Set xlSht = xlBook.Worksheets('Sheet1') '訪問這個(gè)工作簿里名稱為'Sheet1'的工作表
      Set xlRng = xlSht.UsedRange '返回該工作表里使用的區(qū)域
      Debug.Print xlRng.Address '打印Range對(duì)象的地址屬性
      End Sub

      上面四句聲明做幾條簡(jiǎn)單解釋:

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

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

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

      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.寫VBA代碼時(shí),嚴(yán)格按照對(duì)象模型來聲明和使用是有很大的好處的

      Dim r, s

      set r = range('A1')

      s = worksheets(1).name

      代碼TM這樣寫,遺患無窮。

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

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

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

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

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

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

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

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

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

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

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

      先來后期綁定的語法:

      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本身效率就沒有前期綁定高,然后Variant比Object效率還要低,你說你用啥。

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

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

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

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

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

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

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

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

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

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

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

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(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)遵守用戶 評(píng)論公約

        類似文章 更多