



免費(fèi)預(yù)覽已結(jié)束,剩余1頁(yè)可下載查看
下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
提高VBA運(yùn)行效率方法 速度問(wèn)題一直是VBA程序值得關(guān)注的一個(gè)方面。當(dāng)您編寫了一個(gè)對(duì)大量數(shù)據(jù)進(jìn)行操作的程序后,在運(yùn)行時(shí)可能會(huì)發(fā)現(xiàn)程序運(yùn)行得很慢,有的甚至達(dá)好幾分鐘,就像Excel應(yīng)用程序已崩潰了一樣。但當(dāng)您發(fā)現(xiàn)程序確實(shí)在運(yùn)行,并得到正確的結(jié)果后,您可能就會(huì)想到如何使程序更快的運(yùn)行了。當(dāng)然,代碼運(yùn)行速度慢可能是VBA程序的一個(gè)缺點(diǎn),這也可能是程序語(yǔ)言本身的一個(gè)原因,但我們也可以找到一些方法優(yōu)化VBA代碼并使程序盡可能快的運(yùn)行。下面是我整理的一些優(yōu)化VBA代碼或提高程序運(yùn)行速度的方法,有些方法是我們?cè)诰幊讨泻玫淖龇ê蛻?yīng)該養(yǎng)成的好習(xí)慣,希望能帶給您一些有益的參考。高質(zhì)量的程序和運(yùn)行效率是需要不斷實(shí)踐,并在實(shí)踐中不斷總結(jié)和積累經(jīng)驗(yàn)的,也希望您能將在編寫程序過(guò)程中發(fā)現(xiàn)的一些優(yōu)化方法介紹給大家共享。1、盡量簡(jiǎn)化代碼通過(guò)簡(jiǎn)化代碼,可以提高程序的性能。您可以將通用過(guò)程編寫為子過(guò)程來(lái)調(diào)用。例如,假設(shè)有一個(gè)應(yīng)用程序需要在不同的地方實(shí)現(xiàn)查找一定范圍內(nèi)的某個(gè)特殊條目,在一個(gè)沒(méi)有簡(jiǎn)化代碼的應(yīng)用程序中,不同的過(guò)程可能需要應(yīng)用各自的算法以實(shí)現(xiàn)在某個(gè)范圍內(nèi)查找某一條目,修改每個(gè)過(guò)程使其采用一個(gè)更有效的算法并不是一件很容易的事。而一個(gè)簡(jiǎn)化的程序則只有一個(gè)查找算法,即將該查找算法編寫成通用的子程序,需要查找某個(gè)范圍的過(guò)程都調(diào)用該子程序,通過(guò)在查找方法的子程序中優(yōu)化查找算法,使得調(diào)用該方法的所有過(guò)程都享受性能提高所帶來(lái)的好處。另外,刪除所有無(wú)關(guān)的代碼,這在所錄制宏中表現(xiàn)得尤為明顯。在錄制宏時(shí),經(jīng)常會(huì)產(chǎn)生一些與所實(shí)現(xiàn)的功能無(wú)關(guān)的代碼,您可以將這些代碼刪除,以使得代碼得以簡(jiǎn)化。在下面將要講到的設(shè)置對(duì)象變量代替長(zhǎng)對(duì)象引用,使用WithEnd With語(yǔ)句、執(zhí)行For EachNext循環(huán)語(yǔ)句,根據(jù)程序環(huán)境盡量減少OLE引用,等等,均是簡(jiǎn)化代碼的好方法。2、強(qiáng)制聲明變量在VBE編輯器中的菜單“工具選項(xiàng)”對(duì)話框中“編輯器”選項(xiàng)卡中,您應(yīng)該始終保持“要求變量聲明”復(fù)選框被選中,這樣將在模塊代碼頂部出現(xiàn)Option Explicit語(yǔ)句,要求您在編寫代碼時(shí)對(duì)所有出現(xiàn)的變量均進(jìn)行聲明,這樣,在使用變量時(shí)減少內(nèi)存需求并加速性能。(1)要節(jié)省內(nèi)存資源,必須始終用特定的數(shù)據(jù)類型聲明所有變量。如果不使用特定的數(shù)據(jù)類型聲明變量,VBA會(huì)創(chuàng)建Variant類型的變量,這將比任何其他數(shù)據(jù)類型要求更多的內(nèi)存。 (2)清楚每種數(shù)據(jù)類型需要多少內(nèi)存以及它可以存儲(chǔ)的值的范圍。除使用較小的數(shù)據(jù)類型會(huì)導(dǎo)致隱性轉(zhuǎn)換的情況外,應(yīng)始終使用盡可能小的數(shù)據(jù)類型。例如,因?yàn)镮nteger類型的變量將被轉(zhuǎn)換成Long類型的變量,應(yīng)該將那些存儲(chǔ)整型值的變量聲明為L(zhǎng)ong類型,而不是Integer類型。 (3)除非確實(shí)需要,應(yīng)避免使用浮點(diǎn)數(shù)據(jù)類型。盡管Currency數(shù)據(jù)類型更大,但它比 Single 數(shù)據(jù)類型快,因?yàn)镃urrency數(shù)據(jù)類型不使用浮點(diǎn)處理器。 (4)如果在一個(gè)過(guò)程中多次引用一個(gè)對(duì)象,可以創(chuàng)建對(duì)象變量,并將對(duì)該對(duì)象的引用指派給它。因?yàn)閷?duì)象變量存儲(chǔ)對(duì)象在內(nèi)存中的位置,VBA將不必再次查找其位置。 (5)將對(duì)象變量聲明為特定的類型(不是Object類型),以便利用早期綁定。3、減少變量的作用范圍并及時(shí)釋放變量主要是對(duì)象變量,在其使用完后,及時(shí)釋放。例如,Dim TempObj As AnyObject,AnObj As AnyObjectSet TempObj=New AnyObjectSet AnObj=TempObjSet TempObj=Nothing 釋放對(duì)象變量4、盡可能使用早期綁定綁定是指將程序調(diào)用與實(shí)際代碼相匹配。為了實(shí)現(xiàn)早期綁定,先應(yīng)創(chuàng)建對(duì)對(duì)象庫(kù)的引用。早期綁定可以在代碼中使用定義在對(duì)象庫(kù)中的常量,可以自動(dòng)列出對(duì)象的方法和屬性,但早期綁定只有在所控制的對(duì)象擁有獨(dú)立的類型庫(kù)或?qū)ο髱?kù)文件才適用且還需要已安裝了特定的庫(kù)。而后期綁定則只是在運(yùn)行時(shí)才知道對(duì)象的類型并對(duì)對(duì)象進(jìn)行引用,因此不具備上述特點(diǎn)。使用早期綁定創(chuàng)建對(duì)象通常更有效率,使代碼能獲得更好的性能。因?yàn)閷?duì)象的早期綁定引用在編譯時(shí)可以通過(guò)VBE的解析,而不是通過(guò)運(yùn)行時(shí)模塊解析,因此早期綁定的性能要好得多。雖然在程序設(shè)計(jì)時(shí)不可能總是使用早期綁定,但應(yīng)該盡可能使用它。5、關(guān)閉屏幕刷新在Excel中,其ScreenUpdating屬性值的默認(rèn)值為True,這樣當(dāng)寫數(shù)據(jù)到工作表或者執(zhí)行任何導(dǎo)致其顯示屬性變化的動(dòng)作時(shí),Excel的屏幕界面將會(huì)不斷的刷新,不僅影響顯示,而且影響程序運(yùn)行的速度。您可以在進(jìn)入主程序運(yùn)行前將屏幕刷新屬性關(guān)閉,即用Application.ScreenUpdating = False語(yǔ)句關(guān)閉屏幕刷新,這樣將大大改善程序的運(yùn)行速度。但在程序運(yùn)行完成前,要確保將其恢復(fù)為原來(lái)的設(shè)置,即將ScreenUpdating屬性的值設(shè)置為True。因?yàn)槟鷮?duì)該屬性的修改是永久性的修改,Excel不會(huì)為您自動(dòng)恢復(fù)其默認(rèn)值,您必須用語(yǔ)句Application.ScreenUpdating = True恢復(fù)設(shè)置。6、設(shè)置計(jì)算模式為手動(dòng)如果您的工作表中含有多個(gè)公式,在每次單元格中的值發(fā)生變化時(shí),公式都將會(huì)重新計(jì)算,這會(huì)影響程序運(yùn)行速度。您可以在進(jìn)入主程序運(yùn)行前,將計(jì)算模式設(shè)置為手動(dòng),即使用如下語(yǔ)句Application.Calculation = xlCalculationManual,以避免不必要的計(jì)算。當(dāng)程序運(yùn)行結(jié)束前,您要恢復(fù)Excel的默認(rèn)計(jì)算模式設(shè)置,即設(shè)置為自動(dòng)重算,可使用下面的語(yǔ)句Application.Calculation = xlCalculationAutomatic,這同ScreenUpdating屬性一樣,Excel不會(huì)自動(dòng)恢復(fù)其為默認(rèn)值。Calculation屬性是對(duì)所有工作簿進(jìn)行的設(shè)置,您也可以用工作表的EnableCalculation屬性來(lái)設(shè)置對(duì)某個(gè)工作表是否進(jìn)行重新計(jì)算。7、使用For EachNext循環(huán)可以使用For EachNext循環(huán)來(lái)保證程序代碼更快地執(zhí)行。在使用For EachNext循環(huán)時(shí),對(duì)于存儲(chǔ)在集合或數(shù)組中的每個(gè)對(duì)象執(zhí)行一組語(yǔ)句,程序更簡(jiǎn)潔,也更容易閱讀、調(diào)試和維護(hù)。當(dāng)For EachNext語(yǔ)句迭代集合時(shí),自動(dòng)指定一個(gè)對(duì)集合當(dāng)前成員的引用,然后在到達(dá)集合的尾部時(shí)跳出循環(huán)語(yǔ)句。8、使用WithEnd With語(yǔ)句可以使用WithEnd With語(yǔ)句來(lái)盡量減少對(duì)象引用。使用With語(yǔ)句對(duì)指定的對(duì)象完成一系列的任務(wù),而不用重復(fù)引用對(duì)象。也可以使用嵌套的With語(yǔ)句進(jìn)一步提高程序代碼的效率。例如,下面的使用WithEnd With語(yǔ)句是在同一個(gè)單元格中執(zhí)行多個(gè)操作。With Workbooks(“Book1.xls”).Worksheets(“Sheet1”).Range(“A1”).Formula=”=SQRT(20)”With .Font .Name=”Arial” .Bold=True .Size=10End WithEnd With同理,可使用WithEnd With語(yǔ)句在同一個(gè)單元格區(qū)域中執(zhí)行多個(gè)操作。9、在執(zhí)行循環(huán)時(shí)考慮如何能夠盡可能地節(jié)省資源(1)分析循環(huán)以查看是否正在不必要地執(zhí)行一些消耗內(nèi)存的重復(fù)操作。例如,是否可以在循環(huán)外(而不是在循環(huán)中)設(shè)置某些變量?每次都通過(guò)循環(huán)執(zhí)行的轉(zhuǎn)換過(guò)程是否可以在循環(huán)之外執(zhí)行? (2)考慮是否必須在滿足特定的條件時(shí)才執(zhí)行循環(huán)。如果是,也許可以更早地退出循環(huán)。例如,假設(shè)正在對(duì)一個(gè)不應(yīng)該包含數(shù)字字符的字符串進(jìn)行數(shù)據(jù)驗(yàn)證。如果循環(huán)要檢查字符串中的每個(gè)字符以確定其中是否包含數(shù)字字符,那么您可以在找到第一個(gè)數(shù)字字符時(shí)立即退出循環(huán)。 (3)如果必須在循環(huán)中引用數(shù)組的元素,可以創(chuàng)建一個(gè)臨時(shí)變量存儲(chǔ)該元素的值,而不是引用數(shù)組中的值。從數(shù)組中檢索值比從相同類型的變量讀取值要慢。 10、盡量減少OLE引用可以通過(guò)盡量減少在VBA程序代碼中使用OLE(對(duì)象鏈接與嵌入自動(dòng)識(shí)別)引用來(lái)優(yōu)化程序代碼。VBA語(yǔ)句中所調(diào)用的方法和屬性越多,執(zhí)行語(yǔ)句所用的時(shí)間就越多。例如下面的兩個(gè)語(yǔ)句:語(yǔ)句1:Workbooks(1).Sheets(1).Range(“A1”).value=/10語(yǔ)句2:ActiveWindow.Left=200執(zhí)行時(shí),語(yǔ)句2比語(yǔ)句1快。同樣,上面所講的對(duì)重復(fù)使用的對(duì)象引用指定一個(gè)變量,通過(guò)調(diào)用變量從而保證避免多次進(jìn)行對(duì)象引用。11、避免對(duì)象激活或者不需要先進(jìn)行先擇在使用宏錄制器時(shí),所生成的程序代碼在應(yīng)用任何方法或?qū)傩灾岸紩?huì)激活或者選擇對(duì)象。但是,并不是在所有的情況下都需要這樣做。所以,在您編寫VBA程序代碼時(shí),不需要在對(duì)對(duì)象執(zhí)行任何任務(wù)之前都激活或者選擇每個(gè)對(duì)象。例如,在Excel中,我們?nèi)绻沟谝恍凶兂纱煮w就必須先選項(xiàng)中它。但在VBA中(除在圖表操作時(shí)需要選中圖表對(duì)象外),很少需要這樣做,即VBA可以在不選中第一行的情況下,將它變成粗體。宏錄制器的代碼:Rows(1:1).SelectSelection.Font.Bold = True改編后的代碼為:Row(“1:1”).Font.Bold=True這樣做還可以使程序代碼更簡(jiǎn)潔,并且程序可以運(yùn)行得更快。12、在一個(gè)語(yǔ)句中進(jìn)行復(fù)制或者粘貼在用宏錄制代碼時(shí),首先是選擇一個(gè)區(qū)域,然后再執(zhí)行ActiveSheet.Paste。在使用Copy方法時(shí),可以在一個(gè)語(yǔ)句中指定復(fù)制的內(nèi)容及要復(fù)制到的目的地。例如,將B5:C6區(qū)域的內(nèi)容復(fù)制到以單元格B8開始的區(qū)域中,使用宏錄制器的代碼為:Range(B5:C6).SelectSelection.CopyRange(B8).SelectActiveSheet.Paste經(jīng)修改后的最佳代碼是:Range(B5:C6).Copy Destination:=Range(B8)13、盡可能少使用“.”在前面已經(jīng)介紹過(guò)的對(duì)長(zhǎng)對(duì)象引用使用對(duì)象變量以及使用WithEnd With等都是簡(jiǎn)化”.”的方法。因?yàn)樵诖a中的每個(gè)句點(diǎn)都表示至少一個(gè)(而且可能是多個(gè))過(guò)程調(diào)用,而這些過(guò)程調(diào)用必須在后臺(tái)執(zhí)行。真正好的做法是在局部進(jìn)行緩存對(duì)象引用,例如,應(yīng)該把對(duì)象模型中較高層次的對(duì)象引用保存到局部對(duì)象變量中,然后用這些對(duì)象引用創(chuàng)建其他較低層次的對(duì)象引用。例如,引用某單元格數(shù)據(jù)時(shí),可用如下代碼:Dim i As LongFor i=1 to 10Workbooks(“Book1.xls”).Worksheets(“Sheet1”).Cells(1,i).Value=iNext i但下面的代碼運(yùn)行效率更高,因?yàn)榇a中引用Workbook對(duì)象和Worksheet對(duì)象的調(diào)用命令只執(zhí)行一次,而上面的代碼中卻要執(zhí)行10次。Dim ws As WorksheetDim i As LongSet ws= Workbooks(“Book1.xls”).Worksheets(“Sheet1”)For i=1 to 10ws.Cells(1,i).Value=iNext i14、合理地使用消息框和窗體在一個(gè)很長(zhǎng)的程序中,償試著將消息框或者窗體安排顯示在程序的最開始或最后面,避免干擾用戶。此外,盡管窗體提供了許多功能,但它們能夠?qū)е挛募笮⊙杆僭黾印_€有就是盡量避免給工作表單元格鏈接用戶窗體控件,因?yàn)檫@樣將會(huì)導(dǎo)致鏈接更新操作,影響程序運(yùn)行速度。15、盡可能加速對(duì)數(shù)字的運(yùn)算(1)當(dāng)對(duì)整數(shù)進(jìn)行除法時(shí),您可以使用整型除法運(yùn)算符()而不是浮點(diǎn)除法運(yùn)算符(/),因?yàn)闊o(wú)論參與除法運(yùn)算的數(shù)值類型如何,浮點(diǎn)除法運(yùn)算符總會(huì)返回Double類型的值。 (2)在任何具有整數(shù)值的算術(shù)表達(dá)式中使用Single或Double值時(shí),整數(shù)均將被轉(zhuǎn)換成Single或Double值,最后的結(jié)果將是Single或Double值。如果要對(duì)作為算術(shù)運(yùn)算結(jié)果的數(shù)字執(zhí)行多次操作,可能需要明確地將該數(shù)字轉(zhuǎn)換為較小的數(shù)據(jù)類型。 16、提高字符串操作的性能(1)盡可能少使用連接操作。可以在等號(hào)左邊使用Mid函數(shù)替換字符串中的字符,而不是將它們連接在一起。使用 Mid 函數(shù)的缺點(diǎn)是替換字符串必須與要替換的子字符串的長(zhǎng)度相同。例如,Dim strText As StringstrText = this is a testMid(strText, 11, 4) = tent(2)VBA提供許多可用來(lái)替換函數(shù)調(diào)用的內(nèi)部字符串常量。例如,可以使用vbCrLf常量來(lái)表示字符串中的回車/換行組合,而不是使用Chr(13) & Chr(10)。 (3)字符串比較操作的執(zhí)行速度很慢。有時(shí),可以通過(guò)將字符串中的字符轉(zhuǎn)換為 ANSI 值來(lái)避免這些操作。例如,下列代碼會(huì)檢查字符串中的第一個(gè)字符是否為空格: If Asc(strText) = 32 Then上面的代碼會(huì)比以下代碼更快:If Left(strText, 1) = Then17、使用Asc()檢驗(yàn)ANSI的值在VBA中,可以使用Chr$()函數(shù)把數(shù)轉(zhuǎn)換成字符,并確定ANSI的值,但是更好的是使用Asc()函數(shù)把字符串轉(zhuǎn)換成數(shù)值,然后確定它的ANSI值。如果需要進(jìn)行有限次數(shù)的這種檢驗(yàn),對(duì)程序代碼的效率可能不會(huì)產(chǎn)生很大影響,但是,如果需要在多個(gè)循環(huán)內(nèi)進(jìn)行這種檢驗(yàn)時(shí),這將節(jié)省處理時(shí)間并且有助于程序代碼更快地執(zhí)行。18、使用Len()檢驗(yàn)空串盡管有多種方法可檢驗(yàn)空串,但首選的是使用Len()函數(shù)。為了測(cè)試零長(zhǎng)度的串,可以選擇把串與”相比較,或者比較串的長(zhǎng)度是否為0,但這些方法比用Len()函數(shù)要用更多的執(zhí)行時(shí)間。當(dāng)對(duì)字符串應(yīng)用Len()函數(shù)并且函數(shù)返回0值時(shí),說(shuō)明該字符串是空的或者是零長(zhǎng)度的字符串。并且,因?yàn)樵贗f語(yǔ)句內(nèi)非零值被認(rèn)為是True,所以直接使用Len()函數(shù)而不必與”或0比較,減少了處理時(shí)間,因此執(zhí)行更快。19、有效地使用數(shù)組用VBA數(shù)組而不是單元格區(qū)域來(lái)處理數(shù)據(jù),即可以先將數(shù)據(jù)寫入到某個(gè)數(shù)組
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年軟件設(shè)計(jì)師考試內(nèi)容解析及試題答案
- 使用數(shù)據(jù)庫(kù)編程的VB考試題及答案
- 河南省平頂山市舞鋼市2025屆八年級(jí)數(shù)學(xué)第二學(xué)期期末監(jiān)測(cè)模擬試題含解析
- 2025屆浙江省杭州市富陽(yáng)區(qū)城區(qū)八下數(shù)學(xué)期末達(dá)標(biāo)檢測(cè)模擬試題含解析
- 法學(xué)概論考試必考內(nèi)容試題及答案
- 安徽省阜陽(yáng)市阜南縣2025屆數(shù)學(xué)八下期末學(xué)業(yè)質(zhì)量監(jiān)測(cè)試題含解析
- 2025年軟考重要策略與試題及答案
- 文化傳媒主管總結(jié)與項(xiàng)目開發(fā)展望計(jì)劃
- 高考作文追求夢(mèng)想的試題與答案
- 優(yōu)化學(xué)習(xí)方式2025年軟件設(shè)計(jì)師試題及答案
- 杭州市2025年中考作文《勇敢自信》寫作策略與范文
- 熱點(diǎn)主題作文寫作指導(dǎo):古樸與時(shí)尚(審題指導(dǎo)與例文)
- 河南省洛陽(yáng)市2025屆九年級(jí)下學(xué)期中考一模英語(yǔ)試卷(原卷)
- 2025年入團(tuán)考試各科目試題及答案分析
- 電網(wǎng)工程設(shè)備材料信息參考價(jià)2025年第一季度
- 成都設(shè)計(jì)咨詢集團(tuán)有限公司2025年社會(huì)公開招聘(19人)筆試參考題庫(kù)附帶答案詳解
- 2025年上海市金融穩(wěn)定發(fā)展研究中心招聘考試模擬測(cè)試
- 2025年高三高考沖刺主題教育班會(huì):《高三考前心理調(diào)適指南:減壓賦能 輕松備考》-2024-2025學(xué)年高中主題班會(huì)課件
- 學(xué)校設(shè)計(jì)施工及運(yùn)營(yíng)一體化(EPC+O)招標(biāo)文件
- 《動(dòng)物繁殖技術(shù)》課件
- 《胸部惡性腫瘤》課件
評(píng)論
0/150
提交評(píng)論