国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

避免VBA陷阱--有時(shí),VBA使你避免危險(xiǎn)

2019-11-18 17:49:48
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
作為access-Office-VBADVISOR的技術(shù)編輯,我見(jiàn)過(guò)許多編程風(fēng)格。我常常驚異于VBA程序員能夠找到不同的方法來(lái)執(zhí)行相同的任務(wù),同時(shí)我也對(duì)VBA能夠容忍如此差的技術(shù)而感到沮喪。VBA是一種相當(dāng)寬容的語(yǔ)言,幾乎能夠運(yùn)行一切那些糟糕的程序員所賦予它的任務(wù)。

在我評(píng)價(jià)和測(cè)試本刊的文章之前,請(qǐng)首先關(guān)注五、六個(gè)我最經(jīng)常遇到的編程錯(cuò)誤。有一些編程手段對(duì)于每一個(gè)VBA代碼都是必不可少的。

毫無(wú)疑問(wèn),我所遇到的最常見(jiàn)的問(wèn)題如下:

Dimrs1,rs2AsRecordset

此處到底是什么類(lèi)型的變量呢?在其他編程語(yǔ)言里,等價(jià)的語(yǔ)句將導(dǎo)致兩個(gè)數(shù)據(jù)記錄型變量,而在VBA中,你得到的是一個(gè)數(shù)據(jù)記錄(rs2)和另一個(gè)變量(rs1)。雖然變量rs1運(yùn)行時(shí)毫無(wú)錯(cuò)誤,并且程序運(yùn)行順利,但是程序還是處于一種相當(dāng)不確定的狀態(tài)中。

一個(gè)變量應(yīng)當(dāng)是參數(shù)可變的一種特定數(shù)據(jù)類(lèi)型,它能夠被賦予任何沒(méi)有問(wèn)題的數(shù)值,因此,變量rs1能夠按照下面表述的形式接受任何數(shù)據(jù)記錄型賦值:

Setrs1=CurrentDb.OpenRecordset(“tblEmloyees”,dbOpenDynaset)

問(wèn)題在于每當(dāng)代碼中的rs1被執(zhí)行時(shí),VBA引擎都必須指明rs1變量的具體數(shù)值,在VBA決定如何處理該變量時(shí),需要消耗額外的CPU時(shí)鐘周期。而且,所有變量都會(huì)比等價(jià)的單個(gè)數(shù)據(jù)類(lèi)型占據(jù)更多的內(nèi)存。這些變量會(huì)降低應(yīng)用程序的性能,使運(yùn)行更加緩慢。

此處還有一個(gè)例子,變量strMsg具有如下定義:

DimstrMsg

任何包含strMsg的語(yǔ)句都將肯定比strMsg已經(jīng)被定義為一個(gè)字符串的情況下要運(yùn)行的緩慢。

如果你對(duì)變量指定數(shù)據(jù)類(lèi)型,對(duì)其進(jìn)行定義的基礎(chǔ)是要使你的應(yīng)用程序運(yùn)行的更快、更可靠。

另外一個(gè)常見(jiàn)的問(wèn)題是糟糕的代碼縮排。下述代碼段讓人難以理解,如果將For…Next和If…EndIf循環(huán)進(jìn)行仔細(xì)地縮排效果就會(huì)好得多:

Fori=1to20

IfCondition1Then

CallSomeOperation1

IfCondition2Then

CallAnotherOperation

EndIf

EndIf

CallAthirdOperation

Next

邏輯相關(guān)的語(yǔ)句,尤其是那些被當(dāng)作獨(dú)立單元進(jìn)行執(zhí)行的語(yǔ)句,應(yīng)當(dāng)縮進(jìn)兩格。如果你沒(méi)有花一點(diǎn)時(shí)間指明一段邏輯相關(guān)的語(yǔ)句之間的邏輯關(guān)系,你可能會(huì)消耗更多的時(shí)間,因此進(jìn)行適當(dāng)?shù)拇a縮排是值得的。

接下來(lái)的問(wèn)題不太好用書(shū)面形式進(jìn)行表述。因?yàn)榭镯?yè)面的幅寬有限,我不能將我所見(jiàn)到的長(zhǎng)達(dá)470個(gè)字符的語(yǔ)句展示給你們。假設(shè)頁(yè)面是標(biāo)準(zhǔn)的65個(gè)字符的幅寬,那么僅僅這個(gè)單句,就要換行8次,因此在編輯時(shí),就要不得不向右滾動(dòng)屏幕8次才能看清全句。盡管能夠這樣做,你也不可能一下把握全句的邏輯關(guān)系。顯然,采用少量的分隔符將本長(zhǎng)句劃分為一些更短的句子,將便于管理。

與長(zhǎng)句類(lèi)似,但并不象那么嚴(yán)重的一個(gè)問(wèn)題如下:

DimiAsInteger,strAsString,rs_

AsRecordset,dbAsDatabase,db1AsDouble

在單行中進(jìn)行許多定義,尤其當(dāng)最后一個(gè)句子的末尾遠(yuǎn)遠(yuǎn)超出了編輯窗口的右端邊界,將使得在大量的定義中查找某一個(gè)定義變得更加困難。

此處還有一個(gè)常常易犯的編程問(wèn)題:

If(Condition)Then

 rs.AddNew

 rs.FirstName=txtFirstName

 rs.LastName=txtLastName

 rs.Address=txtAddress

 rs.City=txtCity

 rs.State=txtState

 rs.ZipCode=txtZipCode

 rs..Update

EndIf

VBA提供特別的With…Endwith結(jié)構(gòu)處理同一個(gè)對(duì)象的多個(gè)成分:

If(Condition)Then

 Withrs

  .AddNew

  !FirstName=txtFirstName

  !LastName=txtLastName

  !Address=txtAddress

  !City=txtCity

  !State=txtState

  !ZipCode=txtZipCode

.Update

 EndWith

EndIf

采用With…EndWith結(jié)構(gòu)不僅可以使得表述簡(jiǎn)單,而且執(zhí)行起來(lái)相當(dāng)快。一旦VBA獲得rs對(duì)象的句柄,那么With…EndWith代代碼碼塊中的每一個(gè)成分將執(zhí)行得更快。

VBA的諸多優(yōu)點(diǎn)中有一條是其對(duì)語(yǔ)句的使用方式具有較高的寬容性,在C或Pascal程序中可能會(huì)引起崩潰的代碼也許能夠在VBA中毫無(wú)錯(cuò)誤地得以運(yùn)行,但是這樣的靈活性常常會(huì)付出代價(jià)。體系結(jié)構(gòu)糟糕的VBA程序或其子程序比精心構(gòu)造的程序運(yùn)行得要緩慢,并且效率低下,另外調(diào)試和維護(hù)起來(lái)也更加困難。以上所有問(wèn)題在矯正時(shí)都只需耗費(fèi)少許的時(shí)間,但是花在學(xué)習(xí)和提高VBA代碼編制技術(shù)上的時(shí)間將由更快的執(zhí)行速度和更容易的日常維護(hù)來(lái)獲得補(bǔ)償。->


發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 尼木县| 偃师市| 成武县| 新兴县| 大丰市| 漠河县| 云浮市| 康乐县| 平乐县| 黔东| 加查县| 奉新县| 麦盖提县| 铜梁县| 布拖县| 鞍山市| 扶绥县| 白河县| 北安市| 沙坪坝区| 汤阴县| 潼南县| 桃源县| 保康县| 罗山县| 三台县| 岑巩县| 泗水县| 临夏市| 卓尼县| 通许县| 东乌珠穆沁旗| 中山市| 崇仁县| 墨竹工卡县| 涪陵区| 唐河县| 浠水县| 巴林左旗| 顺昌县| 溧阳市|