EXCEL VBA常用代碼實戰(zhàn)大全_第1頁
EXCEL VBA常用代碼實戰(zhàn)大全_第2頁
EXCEL VBA常用代碼實戰(zhàn)大全_第3頁
EXCEL VBA常用代碼實戰(zhàn)大全_第4頁
EXCEL VBA常用代碼實戰(zhàn)大全_第5頁
已閱讀5頁,還剩601頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

EXCELVBA常用代碼實戰(zhàn)大全技巧148、REF_Ref230487954\r\h技巧149中我們在用戶窗體上添加了菜單和工具欄,為了使窗體更像正規(guī)的軟件,還需要在用戶窗體的底部添加一個狀態(tài)欄,用于顯示程序的各種狀態(tài)信息。在用戶窗體上添加狀態(tài)欄使用StatusBar控件,StatusBar控件用于設(shè)計窗體狀態(tài)欄,狀態(tài)欄由一組連續(xù)的窗格(最多16個)對象組合而成,用于顯示應(yīng)用程序當(dāng)前的工作狀態(tài),其位置通常在應(yīng)用程序窗體的底部。在設(shè)計模式下右鍵單擊“工具箱”,在顯示的右鍵菜單中選擇“附加控件”,在顯示的對話框中選擇“MicrosoftStatusBarControl,veision6.0”控件如REF_Ref230510200\h圖1521所示,拖動后就可以在用戶窗體上添加一個StatusBar控件。圖STYLEREF3\s152SEQ圖\*ARABIC\s31 選擇StatusBar控件在用戶窗體上添加了StatusBar控件后還需要添加窗格,可以在StatusBar控件的屬性頁中進(jìn)行設(shè)置和添加,在StatusBar控件的屬性窗口中選擇“自定義”按鈕,在顯示的屬性頁中設(shè)置屬性和添加窗格,如REF_Ref230510885\h圖1522所示。圖STYLEREF3\s152SEQ圖\*ARABIC\s32 添加StatusBar控件的窗格也可以在代碼運(yùn)行時對其進(jìn)行屬性設(shè)置和添加窗格,雙擊用戶窗體寫入下面的代碼:#001PrivateSubUserForm_Initialize()#002……使用API函數(shù)添加菜單代碼略,詳見附件。#003DimarrAsVariant#004DimiAsByte#005……使用Toolbar控件添加工具欄代碼略,詳見附件。#006arr=Array(0,6,5)#007WithStatusBar1#008.Width=Me.Width-10#009Fori=1To3#010.Panels.Add(i,,"").Style=arr(i-1)#011Next#012.Panels(1).Text="準(zhǔn)備就緒!"#013.Panels(2).Width=60#014.Panels(3).Width=75#015.Panels(1).Width=Me.Width-.Panels(1).Width-.Panels(2).Width#016.Panels(3).Picture=LoadPicture(ThisWorkbook.Path&"\123.BMP")#017Fori=0To2#018.Panels(i+1).Alignment=i#019Next#020EndWith#021EndSub代碼解析:第8行代碼設(shè)置StatusBar控件的寬度比用戶窗體略小一點(diǎn)。第9行到第11行代碼在StatusBar控件中添加三個窗格并指定窗格的樣式。添加窗格需要在Panels集合對象中使用Add方法,語法如下:object.Panels.Add(index,key,text,style,picture)參數(shù)object是必需的,代表StatusBar對象。參數(shù)index是可選的,指定新增窗格的索引值,該索引值決定了窗格在StatusBar控件中的位置。如果省略index參數(shù)新增窗格添加到Panels集合的最后。參數(shù)key是可選的,指定新增窗格的關(guān)鍵字。參數(shù)text是可選的,指定新增窗格中顯示的文本。參數(shù)style是可選的,指定新增窗格的樣式,設(shè)置值如REF_Ref230532763\h表格1521所示。屬性值值說明sbrText0顯示文本與圖形sbrCaps1顯示大小寫狀態(tài)sbrNum2顯示numlock鍵狀態(tài)sbrIns3顯示Insert狀態(tài)sbrScrl4顯示Scroll鍵狀態(tài)sbrtime5按系統(tǒng)格式顯示時間sbrDate6按系統(tǒng)格式顯示日期表格STYLEREF3\s152SEQ表格\*ARABIC\s31 Style參數(shù)值參數(shù)picture是可選的,指定新增窗格載入的圖像。第12行代碼設(shè)置第一個窗格顯示的文本。第13行到第15行代碼設(shè)置三個窗格的寬度。第16行代碼為第三個窗格加載指定的圖像。第17行到第19行代碼設(shè)置三個窗格中文本的對齊方式。Panels對象的Alignment屬性返回或設(shè)置窗格中文本的對齊方式,設(shè)置值如REF_Ref230533422\h表格1522所示。屬性值值說明sbrLeft0文本左對齊sbrCenter1文本居中對齊sbrRight3文本右對齊表格STYLEREF3\s152SEQ表格\*ARABIC\s32 Alignment屬性值在示例中使用StatusBar控件的第一個窗格在用戶窗體的文本框輸入時顯示所輸入的內(nèi)容,需要在文本框中寫入下面的代碼。#001PrivateSubTextBox1_Change()#002StatusBar1.Panels(1).Text="正在錄入:"&TextBox1.Text#003EndSub代碼解析:文本框的Change事件過程,將文本框中輸入的內(nèi)容顯示在StatusBar控件的第一個窗格中。運(yùn)行窗體后在窗體上添加狀態(tài)欄,如REF_Ref230533838\h圖1523所示。圖STYLEREF3\s152SEQ圖\*ARABIC\s33 在用戶窗體上添加狀態(tài)欄函數(shù)的使用調(diào)用工作表函數(shù)求和在對工作表的單元格區(qū)域進(jìn)行求和計算時,使用工作表Sum函數(shù)比使用VBA代碼遍歷單元格進(jìn)行累加求和效率要高得多,代碼如下所示。#001SubrngSum()#002DimrngAsRange#003DimdAsDouble#004Setrng=Range("A1:F7")#005d=Application.WorksheetFunction.Sum(rng)#006MsgBoxrng.Address(0,0)&"單元格的和為"&d#007EndSub代碼解析:rngSum過程調(diào)用工作表Sum函數(shù)對工作表的單元格區(qū)域進(jìn)行求和計算。在VBA中調(diào)用工作表函數(shù)需要在工作表函數(shù)前加上WorksheetFunction屬性。應(yīng)用于Application對象的WorksheetFunction屬性返回WorksheetFunction對象,作為VBA中調(diào)用工作表函數(shù)的容器,在實際應(yīng)用中可省略Application對象識別符。查找最大、最小值在VBA中沒有內(nèi)置的函數(shù)可以進(jìn)行最大、最小值的查找,借助工作表Max、Min函數(shù)可以快速地在工作表區(qū)域中查找最大、最小值,如下面的代碼所示。#001Subseeks()#002DimrngAsRange#003DimmyRngAsRange#004Dimk1AsInteger,k2AsInteger#005DimmaxAsDouble,minAsDouble#006SetmyRng=Sheet1.Range("A1:F30")#007ForEachrngInmyRng#008Ifrng.Value=WorksheetFunction.max(myRng)Then#009rng.Interior.ColorIndex=3#010k1=k1+1#011max=rng.Value#012ElseIfrng.Value=WorksheetFunction.min(myRng)Then#013rng.Interior.ColorIndex=5#014k2=k2+1#015min=rng.Value#016Else#017rng.Interior.ColorIndex=0#018EndIf#019Next#020MsgBox"最大值是:"&max&"共有"&k1&"個"_#021&Chr(13)&"最小值是:"&min&"共有"&k2&"個"#022EndSub代碼解析:seeks過程在工作表單元格區(qū)域中查找最大、最小值,并將其所在的單元格底色分別設(shè)置為紅色和藍(lán)色。第2行到第5行代碼聲明變量類型。第6行代碼使用關(guān)鍵字Set將單元格引用賦給變量myRng。第7行到第19行代碼遍歷單元格區(qū)域,使用工作表Max、Min函數(shù)判斷單元格數(shù)值是否是所在區(qū)域的最大、最小值,如果是,將其所在的單元格底色設(shè)置為紅色或藍(lán)色,并保存其數(shù)值和數(shù)量。第20、21行代碼使用消息框顯示最大、最小值數(shù)值和數(shù)量。運(yùn)行seeks過程后將工作表區(qū)域最大、最小值所在的單元格的底色設(shè)置為紅色或藍(lán)色并用消息框顯示其數(shù)值和數(shù)量,如REF_Ref230603713\h圖1541所示。圖STYLEREF3\s154SEQ圖\*ARABIC\s31 查找最大、最小值不重復(fù)值的錄入在工作表中錄入數(shù)據(jù)時,有時希望能限制重復(fù)值的錄入,比如在示例的A列單元格只能錄入唯一的人員編號,此時可以利用工作表的Change事件結(jié)合工作表的CountIf函數(shù)來判斷所錄入的人員編號是否重復(fù),示例代碼如下。#001PrivateSubWorksheet_Change(ByValTargetAsRange)#002WithTarget#003If.Column<>1Or.Count>1ThenExitSub#004IfApplication.CountIf(Range("A:A"),.Value)>1Then#005.Select#006MsgBox"不能輸入重復(fù)的人員編號!",64#007Application.EnableEvents=False#008.Value=""#009Application.EnableEvents=True#010EndIf#011EndWith#012EndSub代碼解析:工作表的Change事件過程,使A列單元格只能錄入唯一的人員編號。第4行代碼使用工作表的CountIf函數(shù)來判斷在A列單元格輸入的人員編號是否重復(fù)。工作表的CountIf函數(shù)計算區(qū)域中滿足給定條件的單元格的個數(shù),語法如下:COUNTIF(range,criteria)參數(shù)range為需要計算其中滿足條件的單元格數(shù)目的單元格區(qū)域。參數(shù)criteria為確定哪些單元格將被計算在內(nèi)的條件,其形式可以為數(shù)字、表達(dá)式、單元格引用或文本。在示例中以所錄入的人員編號與A列單元格區(qū)域進(jìn)行比較,如果CountIf函數(shù)的返回值大于1,說明錄入的是重復(fù)編號。第5行代碼,重新選擇該單元格便于下一步清空后重新錄入。第7、8、9行代碼,清除錄入的重復(fù)編號,在清除前將Application對象的EnableEvents屬性設(shè)置為False,禁用事件。因為如果不禁用事件,那么在清除重復(fù)值的過程中會不斷地觸發(fā)工作表的Change事件,從而造成代碼運(yùn)行的死循環(huán)。經(jīng)過以上的設(shè)置,在工作表的A列中只能錄入唯一的人員編號,如果錄入重復(fù)值會進(jìn)行提示,如REF_Ref230658280\h圖1551所示,點(diǎn)擊確定后自動清除錄入的重復(fù)編號。圖STYLEREF3\s155SEQ圖\*ARABIC\s31 限制重復(fù)值的錄入獲得當(dāng)月的最后一天在實際工作中經(jīng)常需要根據(jù)給定的日期計算其所屬月份的最后一天,此時可以使用DateSerial函數(shù)完成計算,如下面的代碼所示。#001SubSerial()#002DimDateStrAsByte#003DateStr=Day(DateSerial(Year(Date),Month(Date)+1,0))#004MsgBox"本月的最后一天是"&Month(Date)&"月"&DateStr&"號"#005EndSub代碼解析:Serial過程配合使用了4個VBA內(nèi)置函數(shù)Year、Month、Day和DateSerial完成計算并使用消息框顯示當(dāng)月最后一天的日期。Year、Month和Day函數(shù)分別返回代表指定日期的年、月、日的整數(shù),語法如下:Year(Date)Month(Date)Day(Date)其中參數(shù)Date可以是任何能夠表示日期的Variant、數(shù)值表達(dá)式、字符串表達(dá)式或它們的組合。DateSerial函數(shù)返回包含指定的年、月、日的Variant(Date),語法如下:DateSerial(year,month,day)其中參數(shù)year、month、day分別表示指定的年、月、日。為了指定某個日期,DateSerial函數(shù)中的每個參數(shù)的取值范圍應(yīng)該是可接受的,即日的取值范圍應(yīng)在1-31之間,而月的取值范圍應(yīng)在1-12之間。但是,當(dāng)一個數(shù)值表達(dá)式表示某日之前或其后的年、月、日數(shù)時,也可以為每個使用這個數(shù)值表達(dá)式的參數(shù)指定相對日期。當(dāng)任何一個參數(shù)的取值超出可接受的范圍時,它會自動地在可接受的時間單位進(jìn)行調(diào)整,例如本例中的day參數(shù)設(shè)置為0,則被解釋成month參數(shù)指定月的前一天,即表達(dá)式Month(Date)+1指定的下一個月的前一天,也就是本月的最后一天。運(yùn)行Serial過程結(jié)果如REF_Ref230659564\h圖1561所示。圖STYLEREF3\s156SEQ圖\*ARABIC\s31 獲得當(dāng)月的最后一天四舍五入運(yùn)算在實際工作中經(jīng)常需要對數(shù)值或計算結(jié)果進(jìn)行四舍五入運(yùn)算,此時可以使用VBA內(nèi)置的Round函數(shù)。Round函數(shù)返回一個數(shù)值,該數(shù)值是按照指定的小數(shù)位數(shù)進(jìn)行四舍五入運(yùn)算的結(jié)果,語法如下:Round(expression[,numdecimalplaces])參數(shù)expression是必需的,要進(jìn)行四舍五入運(yùn)算的數(shù)值表達(dá)式。參數(shù)numdecimalplaces是可選的,數(shù)字值,表示進(jìn)行四舍五入運(yùn)算時,小數(shù)點(diǎn)右邊應(yīng)保留的位數(shù)。如果忽略,則Round函數(shù)返回整數(shù)。但是VBA內(nèi)置的Round函數(shù)在對數(shù)值進(jìn)行四舍五入運(yùn)算時實行的是Bankre舍入,而不是算術(shù)舍入。按Bankre舍入規(guī)則,如果保留位數(shù)的下一個數(shù)字正好是5則其后沒有其他有效數(shù)字,則按保留位最后一位“偶舍奇入”的方法進(jìn)行處理。比如Round(1.5)的保留位最后為1,是奇數(shù),小數(shù)位的5入上去,因此Round(1.5)的運(yùn)算結(jié)果是2;而Round(4.5)的保留位最后為4,是偶數(shù),小數(shù)位的5舍去,因此Round(4.5)的運(yùn)算結(jié)果是4而不是5。Bankre舍入規(guī)則雖然有其合理性,但不符合實際工作的需要。在實際應(yīng)用中使用以下兩種方法避免Bankre舍入:極小值修正法在使用Round函數(shù)時對需要舍入的數(shù)值先加上極小值再調(diào)用VBA內(nèi)置的Round函數(shù),如下面的代碼所示。#001SubaTestRound()#002MsgBox"Round(4.5)="&Round(4.5)&Chr(13)&"Round(4.5)="&Round(4.5+0.0000001)#003EndSub代碼解析:aTestRound過程分別調(diào)用VBA內(nèi)置的Round函數(shù)和加上極小值再調(diào)用VBA內(nèi)置的Round函數(shù)在洗染店框中顯示兩者運(yùn)算結(jié)果,如REF_Ref230660537\h圖1571所示。圖STYLEREF3\s157SEQ圖\*ARABIC\s31 加上極小值進(jìn)行運(yùn)算結(jié)果從運(yùn)算結(jié)果中可以發(fā)現(xiàn),加上極小值后Round(4.5)已正確運(yùn)算為5而不是4。調(diào)用工作表函數(shù)法還可以使用工作表函數(shù)Round代替VBA內(nèi)置的Round函數(shù)。工作表函數(shù)Round和VBA內(nèi)置的Round函數(shù)的用法相同,但它采用算術(shù)舍入而不是Bankre舍入,所以不會有“偶舍奇入”的問題,如下面的代碼所示。#001SubbTestRound()#002MsgBox"Round(4.5)="&Round(4.5)&Chr(13)&"Round(4.5)="&Application.Round(4.5,0)#003EndSub代碼解析:bTestRound過程分別調(diào)用VBA內(nèi)置的Round函數(shù)和工作表Round函數(shù)在消息框中顯示兩者運(yùn)算結(jié)果,如REF_Ref230660671\h圖1572所示。圖STYLEREF3\s157SEQ圖\*ARABIC\s32 工作表函數(shù)運(yùn)算結(jié)果從運(yùn)算結(jié)果中可以發(fā)現(xiàn),使用工作表Round函數(shù)后Round(4.5)已正確運(yùn)算為5而不是4。使用字符串函數(shù)使用VBA的字符串函數(shù)可以對字符串進(jìn)行各種操作,如下面的代碼所示。#001SubStrFunctions()#002DimStrAsString#003Str="AbcDEFGhijkLmn"#004MsgBox"原始字符串為:"&Str&Chr(13)_#005&"字符串長度為:"&Len(Str)&Chr(13)_#006&"左邊8個字符為:"&Left(Str,8)&Chr(13)_#007&"右邊6個字符為:"&Right(Str,6)&Chr(13)_#008&"從左邊第2個開始取5個字符為:"&Mid(Str,2,5)&Chr(13)_#009&"轉(zhuǎn)換為大寫:"&UCase(Str)&Chr(13)_#010&"轉(zhuǎn)換為小寫:"&LCase(Str)&Chr(13)#011EndSub代碼解析:StrFunctions過程使用字符串函數(shù)對字符串進(jìn)行各種操作,如計算字符數(shù)、取得一定數(shù)量的字符、大小寫轉(zhuǎn)換等。第5行代碼使用Len函數(shù)返回字符串內(nèi)字符的數(shù)目,Len函數(shù)語法如下:Len(string|varname)參數(shù)string為任何有效的字符串表達(dá)式。參數(shù)varname為任何有效的變量名稱。兩個可能的參數(shù)必須有一個,而且只能有一個參數(shù)。第6行代碼使用Left函數(shù)從字符串左邊起返回8個字符。第7行代碼使用Right函數(shù)從字符串右邊起返回6個字符Left函數(shù)語法如下:Left(string,length)Right函數(shù)語法如下:Right(string,length)參數(shù)string是必需的,字符串表達(dá)式。參數(shù)length是必需的,數(shù)值表達(dá)式,將返回的字符數(shù)量。如果為0,返回零長度字符串("");如果大于或等于參數(shù)string的字符數(shù),則返回整個字符串。第8行代碼使用Mid函數(shù)從字符串第2位起返回5個字符。Mid函數(shù)語法如下:Mid(string,start[,length])參數(shù)string是必需的,字符串表達(dá)式。參數(shù)start是必需的,string中被取出部分的字符位置。如果超過string的字符數(shù),將返回零長度字符串("")。參數(shù)length是可選的,要返回的字符數(shù)。如果省略或超過string的字符數(shù),將返回字符串中所有字符。第9行代碼使用UCase函數(shù)將字符串轉(zhuǎn)換成大寫的字符串。第10行代碼使用LCase函數(shù)將字符串轉(zhuǎn)換成小寫的字符串。UCase函數(shù)的語法如下:UCase(string)LCase函數(shù)的語法如下:LCase(string)參數(shù)string是必需的,任何有效的字符串表達(dá)式。運(yùn)行StrFunctions過程結(jié)果如REF_Ref230704968\h圖1581所示。圖STYLEREF3\s158SEQ圖\*ARABIC\s31 使用字符串函數(shù)使用日期函數(shù)使用VBA的日期函數(shù)可以對日期進(jìn)行各種計算,如下面的代碼所示。#001SubDatFunctions()#002DimStrAsString#003DimWeekAsString#004Str=InputBox("請輸入日期:")#005IfLen(Str)>0Then#006IfIsDate(Str)Then#007SelectCaseWeekday(Str,vbMonday)#008Case1#009Week="一"#010Case2#011Week="二"#012Case3#013Week="三"#014Case4#015Week="四"#016Case5#017Week="五"#018Case6#019Week="六"#020Case7#021Week="日"#022EndSelect#023MsgBox"你輸入的日期是"&DateValue(Str)&Chr(13)_#024&"是"&Year(Str)&"年的第"&DatePart("q",Str)&"季度"&Chr(13)_#025&"是星期"&Week&Chr(13)_#026&"距離今天有"&Abs(DateDiff("d",Date,Str))&"天"&Chr(13)_#027&"60天后的日期是"&DateAdd("d",60,Str)#028Else#029MsgBox"請輸入正確格式的日期!"#030EndIf#031EndIf#032EndSub代碼解析:DatFunctions過程在對話框中輸入日期后使用各種日期函數(shù)對其進(jìn)行計算并用消息框顯示。第4、5行代碼使用InputBox函數(shù)顯示一個對話框,供用戶在對話框中輸入一個日期。第6行代碼使用IsDate函數(shù)判斷輸入的日期是否正確。IsDate函數(shù)返回Boolean值,指出一個表達(dá)式是否可以轉(zhuǎn)換成日期,語法如下:IsDate(expression)參數(shù)expression是必需的,日期表達(dá)式或字符串表達(dá)式,如果表達(dá)式是一個日期,或者可以作為有效日期識別,則IsDate函數(shù)返回True,否則返回False。第7行到第22行代碼使用Weekday函數(shù)判斷所輸入的日期是星期幾。Weekday函數(shù)返回一個整數(shù),代表某個日期是星期幾,語法如下:Weekday(date,[firstdayofweek])參數(shù)date是必需的,能夠表示日期的Variant、數(shù)值表達(dá)式、字符串表達(dá)式或它們的組合。參數(shù)firstdayofweek是可選的,指定一星期第一天的常數(shù),如REF_Ref230747531\h表格1591所示。常數(shù)值描述vbUseSystem0使用NLSAPI設(shè)置VbSunday1星期日(缺省值)vbMonday2星期一vbTuesday3星期二vbWednesday4星期三vbThursday5星期四vbFriday6星期五vbSaturday7星期六表格STYLEREF3\s159SEQ表格\*ARABIC\s31 firstdayofweek參數(shù)值Weekday函數(shù)返回一個1到7之間的整數(shù),當(dāng)firstdayofweek參數(shù)設(shè)置為vbMonday(2)時,返回1時說明是星期一,以此類推。第23行代碼根據(jù)系統(tǒng)中指定的短日期格式來顯示所輸入的日期。DateValue函數(shù)的語法如下:DateValue(date)參數(shù)date是必需的,任何表達(dá)式,表示從100年1月1日到9999年12月31日之間的一個日期。如果是一個字符串,且其內(nèi)容只有數(shù)字以及分隔數(shù)字的日期分隔符,則DateValue函數(shù)就會根據(jù)系統(tǒng)中指定的短日期格式來識別月、日、年的順序。DateValue函數(shù)也識別明確的英文月份名稱,全名或縮寫均可。例如,除了12/30/1991和12/30/91之外,DateValue函數(shù)也能識別December30,1991和Dec30,1991。如果date參數(shù)中略去了年這一部分,DateValue函數(shù)就會使用由計算機(jī)系統(tǒng)日期設(shè)置的當(dāng)前年份。第24行代碼判斷輸入的日期的季度。DatePart函數(shù)返回一個包含已知日期的指定時間部分的值,語法如下:DatePart(interval,date[,firstdayofweek[,firstweekofyear]])其中參數(shù)interval是必需的,字符串表達(dá)式,是要返回的時間間隔,設(shè)定值如REF_Ref230748823\h表格1592所示。設(shè)置說明yyyy年q季m日y一年的日數(shù)d日w一周的日數(shù)ww周h時n分鐘s秒表格STYLEREF3\s159SEQ表格\*ARABIC\s32 interval參數(shù)設(shè)定值第26行代碼計算所輸入的日期距當(dāng)天的天數(shù)。DateDiff函數(shù)返回兩個指定日期間的時間間隔數(shù)目,語法如下:DateDiff(interval,date1,date2[,firstdayofweek[,firstweekofyear]])其中參數(shù)interval是必需的,字符串表達(dá)式,表示用來計算date1和date2的時間差的時間間隔,設(shè)定值如REF_Ref230748823\h表格1592所示。參數(shù)date1和date2是必需的,計算中要用到的兩個日期。因為如果輸入的日期是當(dāng)前日期以前的日期,DateDiff函數(shù)會返回負(fù)值,所以使用Abs函數(shù)返回絕對值將其轉(zhuǎn)換為正值。第27行代碼計算所輸入的日期距當(dāng)天的天數(shù),DateAdd返回加上了一段時間間隔的一個日期,語法如下:DateAdd(interval,number,date)參數(shù)interval是必需的,字符串表達(dá)式,是所要加上去的時間間隔,設(shè)定值如REF_Ref230748823\h表格1592所示。參數(shù)number是必需的,是要加上的時間間隔的數(shù)目。其數(shù)值可以為正數(shù)(得到未來的日期),也可以為負(fù)數(shù)(得到過去的日期)。參數(shù)date是必需的,需要加上時間間隔的字符串表達(dá)式。運(yùn)行DatFunctions過程,在顯示的對話框中輸入一個日期,結(jié)果如REF_Ref230750505\h圖1591所示。圖STYLEREF3\s159SEQ圖\*ARABIC\s31 使用日期函數(shù)判斷是否為數(shù)值使用IsNumeric函數(shù)可以判斷表達(dá)式的運(yùn)算結(jié)果是否為數(shù)值,如下面的代碼所示。#001SubNumeric()#002DimiAsInteger#003DimnAsString#004DimsAsString#005WithSheet1#006Fori=1To.Range("A65536").End(xlUp).Row#007IfIsNumeric(.Cells(i,1))Then#008n=n&.Cells(i,1).Address(0,0)&Chr(9)&.Cells(i,1)&Chr(13)#009Else#010s=s&.Cells(i,1).Address(0,0)&Chr(9)&.Cells(i,1)&Chr(13)#011EndIf#012Next#013EndWith#014MsgBox"A列中數(shù)值單元格:"&Chr(13)&n&Chr(13)_#015&"A列中非數(shù)值單元格:"&Chr(13)&s#016EndSub代碼解析:Numeric過程使用IsNumeric函數(shù)判斷工作表的A列單元格是否為數(shù)值,并使用消息框顯示。第7行代碼判斷工作表的A列單元格是否為數(shù)值。IsNumeric函數(shù)返回Boolean值,指出表達(dá)式的運(yùn)算結(jié)果是否為數(shù),語法如下:IsNumeric(expression)參數(shù)expression是必需的,Variant類型,包含數(shù)值表達(dá)式或字符串表達(dá)式。如果參數(shù)expression的運(yùn)算結(jié)果為數(shù)字,則IsNumeric返回True,否則返回False。第8行代碼將數(shù)值單元格的地址和數(shù)值保存在變量e中。第10行代碼將非數(shù)值單元格的地址和內(nèi)容保存在變量s中。在保存時插入制表符對數(shù)據(jù)列進(jìn)行分隔,使之排列整齊,請參閱技巧REF_Ref231009602\r\h73-5。運(yùn)行Numeric過程結(jié)果如REF_Ref231009713\h圖1601所示。圖STYLEREF3\s160SEQ圖\*ARABIC\s31 判斷是否為數(shù)值格式化數(shù)值、日期和時間Format函數(shù)是VBA中的常用函數(shù),可以實現(xiàn)數(shù)值、日期和時間格式的轉(zhuǎn)變,示例代碼如下:#001SubFromatCurrent()#002MsgBoxFormat(123456.789,"0.00")&Chr(13)_#003&Format(123456.789,"0.00%")&Chr(13)_#004&Format(123456.789,"##,##0.00")&Chr(13)_#005&Format(-123456.789,"$#,##0.00;($#,##0.00)")&Chr(13)_#006&Format(-123456.789,"¥#,##0.00;(¥#,##0.00)")&Chr(13)_#007&Format(Date,"yyyy-mm-dd")&Chr(13)_#008&Format(Date,"yyyymmdd")&Chr(13)_#009&Format(Date,"LongDate")&Chr(13)_#010&Format(Now,"hh:mm:ss")&Chr(13)_#011&Format(Now,"hh:mm:ssAMPM")#012EndSub代碼解析:FromatCurrent過程使用消息框顯示格式化后的數(shù)值、日期和時間。Format函數(shù)根據(jù)格式表達(dá)式中的指令來格式化的數(shù)值、日期和時間,語法如下:Format(expression[,format[,firstdayofweek[,firstweekofyear]]])其中參數(shù)expression是必需的,任何有效的表達(dá)式。參數(shù)format是可選的,有效的命名表達(dá)式或用戶自定義格式表達(dá)式。第2行代碼將數(shù)值格式化為兩位小數(shù)格式顯示。第3行代碼將數(shù)值格式化為兩位小數(shù)的百分比格式顯示。第4行代碼將數(shù)值格式化為千位分隔符顯示。第5行代碼將數(shù)值格式化為以美元符號顯示的兩位小數(shù),以千位分隔符分隔,如果是負(fù)值則以小括號顯示。第6行代碼將數(shù)值格式化為以人民幣符號顯示的兩位小數(shù),以千位分隔符分隔,如果是負(fù)值則以小括號顯示。第7行代碼將系統(tǒng)日期格式化為“yyyy-mm-dd”格式顯示。第8行代碼將系統(tǒng)日期格式化為“yyyymmdd”格式顯示。第9行代碼將系統(tǒng)日期格式化為長日期格式顯示。第10行代碼將系統(tǒng)時間格式化為24小時、分鐘和秒的格式顯示。第11行代碼將系統(tǒng)時間格式化為分12小時、分鐘和秒的格式顯示。運(yùn)行FromatCurrent過程結(jié)果如REF_Ref231048403\h圖1611所示。圖STYLEREF3\s161SEQ圖\*ARABIC\s31 格式化數(shù)值、日期和時間個人所得稅自定義函數(shù)在財務(wù)工作中經(jīng)常需要計算個人所得稅,而在Excel中沒有計算個人所得稅的函數(shù),此時可以使用自定義函數(shù)來計算,如下面的代碼所示。#001PublicFunctionPITax(Income,OptionalThreshold)AsSingle#002DimRateAsSingle#003DimDebitAsSingle#004DimTaxliabilityAsSingle#005IfIsMissing(Threshold)ThenThreshold=2000#006Taxliability=Income-Threshold#007SelectCaseTaxliability#008Case0To500#009Rate=0.05#010Debit=0#011Case500.01To2000#012Rate=0.1#013Debit=25#014Case2000.01To5000#015Rate=0.15#016Debit=125#017Case5000.01To20000#018Rate=0.2#019Debit=375#020Case20000.01To40000#021Rate=0.25#022Debit=1375#023Case40000.01To60000#024Rate=0.3#025Debit=3375#026Case60000.01To80000#027Rate=0.35#028Debit=6375#029Case80000.01To10000#030Rate=0.4#031Debit=10375#032CaseElse#033Rate=0.45#034Debit=15375#035EndSelect#036IfTaxliability<=0Then#037PITax=0#038Else#039PITax=Application.Round(Taxliability*Rate-Debit,2)#040EndIf#041EndFunction代碼解析:自定義PITax函數(shù)根據(jù)應(yīng)納稅額計算應(yīng)納的個人所得稅額。第5行代碼設(shè)置個人所得稅的起征點(diǎn)為2000元,如果以后需要調(diào)整起征點(diǎn),可把2000元改為調(diào)整后的起征點(diǎn)。第6行代碼設(shè)置全月應(yīng)納稅所得額等于應(yīng)納稅收入減去起征點(diǎn)。第7行到第35行代碼根據(jù)全月應(yīng)納稅所得額取得稅率和速算扣除數(shù)。稅率和速算扣除數(shù)根據(jù)如REF_Ref231171248\h表格1621所示的工資、薪金所得適用個人所得稅九級超額累進(jìn)稅率表計算。級數(shù)全月應(yīng)納稅所得額(含稅所得額)稅率%速算扣除數(shù)(元)一不超過500元50二超過500元至2000元1025三超過2000元至5000元15125四超過5000元至20000元20375五超過20000元至40000元251375六超過40000元至60000元303375七超過60000元至80000元356375八超過80000元至100000元4010375九超過100000元4515375表格STYLEREF3\s162SEQ表格\*ARABIC\s31 個人所得稅九級超額累進(jìn)稅率表第36行到第40行代碼根據(jù)應(yīng)納稅所得額、稅率和速算扣除數(shù)計算應(yīng)納的個人所得稅額。其中第39行代碼中使用工作表函數(shù)Round對計算結(jié)果進(jìn)行四舍五入運(yùn)算,請參閱技巧REF_Ref231171280\r\h157-2。在工作表中使用自定義PITax函數(shù)結(jié)果如REF_Ref231171302\h圖1621所示。圖STYLEREF3\s162SEQ圖\*ARABIC\s31 工作表中使用自定義PITax函數(shù)人民幣大寫函數(shù)在VBA中沒有內(nèi)置的函數(shù)進(jìn)行人民幣大寫轉(zhuǎn)換,此時可以編寫自定義函數(shù)進(jìn)行人民幣大寫轉(zhuǎn)換,如下面的代碼所示。#001PublicFunctionRMBDX(M)#002RMBDX=Replace(Application.Text(Round(M+0.00000001,2),"[DBnum2]"),".","元")#003RMBDX=IIf(Left(Right(RMBDX,3),1)="元",Left(RMBDX,Len(RMBDX)-1)&"角"&Right(RMBDX,1)&"分",IIf(Left(Right(RMBDX,2),1)="元",RMBDX&"角整",IIf(RMBDX="零","",RMBDX&"元整")))#004RMBDX=Replace(Replace(Replace(Replace(RMBDX,"零元零角",""),"零元",""),"零角","零"),"-","負(fù)")#005EndFunction代碼解析:第2行代碼首先使用Round函數(shù)對小寫數(shù)字加上極小值后進(jìn)行四舍五入運(yùn)算,關(guān)于Round函數(shù)請參閱技巧REF_Ref231139367\r\h157-1。其次使用工作表Text函數(shù)將數(shù)值轉(zhuǎn)換成人民幣大寫格式表示的文本。Text函數(shù)將數(shù)值轉(zhuǎn)換為按指定數(shù)字格式表示的文本,語法如下:TEXT(value,format_text)Value參數(shù)為數(shù)值、計算結(jié)果為數(shù)值的公式,或?qū)Π瑪?shù)值的單元格的引用。Format_text參數(shù)為“單元格格式“對話框中”數(shù)字“選項卡上”分類框中的文本形式的數(shù)字格式。最后使用Replace函數(shù)將人民幣大寫格式表示的文本中的小數(shù)點(diǎn)替換成“元”。Replace函數(shù)返回一個字符串,該字符串中指定的子字符串已被替換成另一子字符串,并且替換發(fā)生的次數(shù)也是指定的,語法如下:Replace(expression,find,replace[,start[,count[,compare]]])其中參數(shù)expression是必需的,包含要替換的子字符串。參數(shù)find是必需的,要搜索到的子字符串。參數(shù)replace是必需的,用來替換的子字符串。參數(shù)start是可選的,在表達(dá)式中子字符串搜索的開始位置。第3行代碼使用了IIF函數(shù)、Left函數(shù)、Right函數(shù)根據(jù)第2行代碼返回的人民幣大寫格式表示的文本中的“元”的位置在文本中插入正確的“元”、“角”、“分”字符,使之符合人民幣大寫習(xí)慣。IIf函數(shù)根據(jù)表達(dá)式的值,來返回兩部分中的其中一個,語法如下:IIf(expr,truepart,falsepart)參數(shù)expr是必需的,用來判斷真?zhèn)蔚谋磉_(dá)式。參數(shù)truepart是必需的,如果expr為True,則返回這部分的值或表達(dá)式。參數(shù)falsepart是必需的,如果expr為False,則返回這部分的值或表達(dá)式。Left、Right函數(shù)請參閱REF_Ref231139668\r\h技巧158。第4行代碼使用Replace函數(shù)將人民幣大寫格式表示的文本中可能出現(xiàn)的“零元零角”、“零元”替換成空白字符;可能出現(xiàn)的“零角”替換成“零”。如果輸入負(fù)數(shù)的話,將“-”替換成“負(fù)”。在工作表中使用自定義RMBDX函數(shù)轉(zhuǎn)換人民幣大寫的效果如REF_Ref231139857\h圖1631所示。圖STYLEREF3\s163SEQ圖\*ARABIC\s31 人民幣大寫轉(zhuǎn)換列號轉(zhuǎn)換為列標(biāo)使用VBA獲取單元格的列號時,只能返回一個數(shù)值。如果需要獲取以字符表示的列標(biāo),可以使用下面的自定義GetColumn函數(shù)過程。#001FunctionGetColumn(CAsInteger)AsString#002GetColumn=Split(Cells(1,C).Address,"$")(1)#003EndFunction代碼解析:GetColumn函數(shù)過程代碼中,將參數(shù)iCol作為列號傳遞給Cells屬性,并獲取其絕對地址字串符,然后以“$”字符為分隔符,通過Split函數(shù)返回一個一維數(shù)組。Split函數(shù)返回一個下標(biāo)從零開始的一維數(shù)組,它包含指定數(shù)目的子字符串,語法如下:Split(expression[,delimiter[,limit[,compare]]])其中參數(shù)expression是必需的,包含子字符串和分隔符的字符串表達(dá)式。如果expression是一個長度為零的字符串(""),則返回一個空數(shù)組,即沒有元素和數(shù)據(jù)的數(shù)組。參數(shù)delimiter是可選的,用于標(biāo)識子字符串邊界的字符串字符。如果忽略,則使用空格字符("")作為分隔符。返回一維數(shù)組后獲取該數(shù)組的第2個元素(下標(biāo)為1),即該列號的字符列標(biāo)。下面的代碼使用GetColumn函數(shù)過程獲得所選單元格的字符列標(biāo)。#001PrivateSubWorksheet_SelectionChange(ByValTargetAsRange)#002MsgBoxGetColumn(Selection.Column)#003EndSub在工作表中選擇單元格后結(jié)果如REF_Ref231172504\h圖1641所示。圖STYLEREF3\s164SEQ圖\*ARABIC\s31 返回列標(biāo)字符串判斷工作表是否為空表VBA中沒有專門的屬性或函數(shù)可以判斷工作表是否為空白工作表,可以使用自定義函數(shù)返回指定工作表是否為空工作表,如下面的代碼所示。#001FunctionIsBlankSht(ShAsVariant)AsBoolean#002IfTypeName(Sh)="String"ThenSetSh=Worksheets(Sh)#003IfApplication.CountA(Sh.UsedRange.Cells)=0Then#004IsBlankSht=True#005EndIf#006EndFunction代碼解析:自定義IsBlankSht函數(shù)包含一個Variant變量類型的參數(shù),代表工作表名稱或者對象名稱。如果指定的工作表為空工作表,則該函數(shù)返回True。第2行代碼使用TypeName函數(shù)判斷參數(shù)Sh是否為字符串類型(“String”),如果是字符串,則將以該字符串作為名稱的工作表賦值給變量Sh。第3行代碼通過工作表函數(shù)CountA統(tǒng)計工作表已使用區(qū)域的非空單元格個數(shù),如果統(tǒng)計結(jié)果為0,則表示該工作表為空工作表?,F(xiàn)在就可以像使用VBA函數(shù)一樣使用自定義的IsBlankSht函數(shù),如下面的代碼所示。#001SubDelBlankSht()#002DimShAsWorksheet#003Application.DisplayAlerts=False#004ForEachShInThisWorkbook.Sheets#005IfIsBlankSht(Sh)ThenSh.Delete#006Next#007Application.DisplayAlerts=True#008EndSub代碼解析:使用自定義的IsBlankSht函數(shù)刪除工作簿中所有空工作表。第3行代碼將Application對象的DisplayAlerts屬性設(shè)置為False,使刪除時不顯示系統(tǒng)警告對話框。第4行到第6行代碼,使用ForEach...Next語句遍歷所有工作表,使用自定義的IsBlankSht函數(shù)判斷是否為空表,如果為空表則使用Delete方法刪除。注意自定義IsBlankSht函數(shù)僅僅判斷工作表單元格區(qū)域內(nèi)容是否為空,如果工作表中存在其它對象(如圖形對象、數(shù)據(jù)有效性、單元格批注等),還需要再進(jìn)一步判斷。查找指定工作表判斷工作簿中是否存在指定名稱的工作表,除了使用遍歷工作簿中所有工作表的方法外,還可以使用自定義函數(shù),如下面的代碼所示。#001FunctionExistSh(ShAsString)AsBoolean#002DimShtAsObject#003OnErrorResumeNext#004SetSht=Sheets(Sh)#005IfErr.Number=0ThenExistSh=True#006SetSht=Nothing#007EndFunction代碼解析:自定義ExistSh函數(shù)包含一個String類型的參數(shù),代表需要判斷的工作表名稱。如果該工作表存在,則返回True。第5行代碼判斷前面的代碼是否出錯,如果前面的代碼存在錯誤,則表示不存在指定名稱的表。使用自定義ExistSheet函數(shù)判斷工作簿中是否存在指定名稱的工作表,如下面的代碼所示。#001SubNotSht()#002DimShAsString#003Sh=InputBox("請輸入工作表名稱:")#004IfLen(Sh)>0Then#005IfNotExistSh(Sh)Then#006MsgBox"對不起,"&Sh&"表不存在!"#007Else#008Sheets(Sh).Select#009EndIf#010EndIf#011EndSub代碼解析:NotSht過程使用自定義的ExistSh函數(shù)判斷工作簿中是否存在指定名稱的工作表,如果不存在則使用消息框進(jìn)行提示,如REF_Ref231314742\h圖1661所示。圖STYLEREF3\s166SEQ圖\*ARABIC\s31 查找指定工作表查找指定工作簿是否打開如果需要判斷指定名稱的工作簿是否已經(jīng)打開,除了使用REF_Ref231141736\r\h技巧43的方法外,還可以使用與REF_Ref231141764\r\h技巧166類似的自定義函數(shù),如下面的代碼所示。#001FunctionExistWorkbook(WbNameAsString)AsBoolean#002DimwbAsWorkbook#003OnErrorResumeNext#004Setwb=Workbooks(WbName)#005IfErr.Number=0ThenExistWorkbook=True#006Setwb=Nothing#007EndFunction代碼解析:自定義ExistWorkbook函數(shù)判斷指定名稱的工作簿是否已經(jīng)打開。第5行代碼判斷前面的賦值語句是否存在錯誤。如果沒有指定名稱的工作簿,則第4行代碼會產(chǎn)生錯誤,自定義ExistWorkbook函數(shù)返回False。下面使用自定義ExistWorkbook函數(shù)判斷名稱為“ExcelHome”的工作簿是否已經(jīng)打開,如果沒有打開則使用消息框進(jìn)行提示,如REF_Ref231141813\h圖1671所示。#001SubNotWorkbook()#002IfNot(ExistWorkbook("ExcelHome"))ThenMsgBox"對不起,ExcelHome工作簿沒有打開!"#003EndSub圖STYLEREF3\s167SEQ圖\*ARABIC\s31 消息框提示取得應(yīng)用程序的安裝路徑使用自定義函數(shù)取得應(yīng)用程序的安裝路徑,如下面的代碼所示。#001FunctionGetSetupPath(AppNameAsString)#002DimWSHAsObject#003SetWSH=CreateObject("Wscript.Shell")#004GetSetupPath=WSH.RegRead("HKEY_LOCAL_MACHINE\Software"_#005&"\Microsoft\Windows\CurrentVersion\AppPaths\"_#006&AppName&"\Path")#007SetWSH=Nothing#008EndFunction#009SubWinRARPath()#010MsgBoxGetSetupPath("WinRAR.exe")#011EndSub代碼解析:自定義GetSetupPath函數(shù)取得應(yīng)用程序的安裝路徑,其中參數(shù)AppName代表指定的應(yīng)用程序的名稱。第3行代碼使用CreateObject函數(shù)將Wscript.Shell對象的引用賦給變量WSH。CreateObject函數(shù)創(chuàng)建并返回一個對ActiveX對象的引用,語法如下:CreateObject(class,[servername])參數(shù)class是必需的,Variant(String),要創(chuàng)建的應(yīng)用程序名稱和類。參數(shù)servername是可選的,Variant(String),要在其上創(chuàng)建對象的網(wǎng)絡(luò)服務(wù)器名稱。如果servername是一個空字符串(""),即使用本地機(jī)器。第4行代碼取得AppName參數(shù)指定的應(yīng)用程序在注冊表中的路徑。WinRARPath過程使用消息框顯示由自定義的GetSetupPath函數(shù)取得的應(yīng)用程序“WinRAR”的安裝路徑。運(yùn)行WinRARPath過程結(jié)果如REF_Ref231141866\h圖1681所示。圖STYLEREF3\s168SEQ圖\*ARABIC\s31 應(yīng)用程序安裝路徑數(shù)組的使用代碼運(yùn)行時創(chuàng)建數(shù)組使用Array函數(shù)可以在代碼運(yùn)行時創(chuàng)建數(shù)組并把一系列數(shù)據(jù)保存在數(shù)組中,示例代碼如下:#001OptionBase1#002Subarr()#003DimarrAsVariant#004DimiAsInteger#005arr=Array("王曉明","吳勝玉","周志國","曹武偉","張新發(fā)","卓雪梅","沈煜婷","丁林平")#006Fori=LBound(arr)ToUBound(arr)#007Cells(i,1)=arr(i)#008Next#009EndSub代碼解析:Arr過程使用Array函數(shù)創(chuàng)建一個數(shù)組用來保存數(shù)據(jù)并將其寫入到工作表的單元格區(qū)域。第1行代碼使用OptionBase語句聲明數(shù)組下標(biāo)的缺省下界為1,數(shù)組下標(biāo)的缺省下界默認(rèn)為0。第5行代碼使用Array函數(shù)創(chuàng)建數(shù)組用來保存數(shù)據(jù)。Array函數(shù)返回一個包含數(shù)組的Variant,語法如下:Array(arglist)Arglist參數(shù)是一個用逗號隔開的值表,這些值用于給Variant所包含的數(shù)組的各元素賦值。如果不提供Arglist參數(shù),則創(chuàng)建一個長度為0的數(shù)組。第6行代碼使用LBound函數(shù)和UBound函數(shù)取得數(shù)組的最小和最大下標(biāo)。LBound函數(shù)返回一個Long型數(shù)據(jù),其值為指定數(shù)組維可用的最小下標(biāo),語法如下:LBound(arrayname[,dimension])UBound函數(shù)返回一個Long型數(shù)據(jù),其值為指定數(shù)組維可用的最大下標(biāo),語法如下:UBound(arrayname[,dimension])參數(shù)arrayname是必需的,數(shù)組變量的名稱。參數(shù)dimension是可選的,指定返回哪一維的下界,1表示第一維,2表示第二維,如此類推。默認(rèn)為1。UBound函數(shù)與LBound函數(shù)一起使用,可以用來確定數(shù)組的大小。第7行代碼確定數(shù)組的大小后使用For...Next語句遍歷數(shù)組元素并將數(shù)組元素依次寫入到工作表的A列單元格中,如REF_Ref231490137\h圖1691所示。圖STYLEREF3\s169SEQ圖\*ARABIC\s31 將數(shù)組元素寫入工作表文本轉(zhuǎn)換為數(shù)組在處理字符串時可以使用Split函數(shù)將字符串按指定的分隔符分開并以數(shù)組返回,代碼如下:#001SubSplitarr()#002DimArrAsVariant#003Arr=Split(Sheet2.Cells(1,1),",")#004Sheet1.Cells(1,1).Resize(UBound(Arr)+1,1)=Application.Transpose(Arr)#005EndSub代碼解析:Splitarr過程使用Split函數(shù)將工作表Sheet2中A1單元格的姓名分別寫入到工作表Sheet1中的A列單元格。Split函數(shù)返回一個下標(biāo)從零開始的一維數(shù)組,包含指定數(shù)目的子字符串,語法如下:Split(expression[,delimiter[,limit[,compare]]])參數(shù)expression是必需的,包含子字符串和分隔符的字符串表達(dá)式。參數(shù)delimiter是必需的,用來標(biāo)識子字符串邊界的字符串字符。如果忽略,則使用空格字符("")作為分隔符。第4行代碼,首先使用UBound函數(shù)取得返回數(shù)組的最大下標(biāo)后調(diào)整單元格區(qū)域,因為數(shù)組下標(biāo)的缺省下界默認(rèn)為0,所以在使用Resize屬性調(diào)整單元格區(qū)域時參數(shù)RowSize需要在返回數(shù)組的最大下標(biāo)上加一。然后使用工作表Transpose函數(shù)將返回數(shù)組轉(zhuǎn)置后寫入到工作表調(diào)整后的單元格區(qū)域中。工作表Transpose函數(shù)返回轉(zhuǎn)置單元格區(qū)域,即將一行單元格區(qū)域轉(zhuǎn)置成一列單元格區(qū)域,反之亦然,語法如下:TRANSPOSE(array)參數(shù)array為需要進(jìn)行轉(zhuǎn)置的數(shù)組或工作表中的單元格區(qū)域。Splitarr過程將如REF_Ref231520697\h圖1692所示的工作表單元格中的字符串以逗號分隔后依次寫入到工作表的A列單元格中,如REF_Ref231520726\h圖1693所示。圖STYLEREF3\s169SEQ圖\*ARABIC\s32 工作表單元格中的字符串圖STYLEREF3\s169SEQ圖\*ARABIC\s33 文本轉(zhuǎn)換為數(shù)組寫入單元格使用動態(tài)數(shù)組去除重復(fù)值在技巧REF_Ref231550675\r\h169-2中使用數(shù)組函數(shù)將單元格中的文本進(jìn)行分隔后寫入到工作表Sheet1中的A列單元格,但是如果文本中含有大量的重復(fù)值,在寫入時也會將重復(fù)值寫入到工作表中,此時可以使用動態(tài)數(shù)組去除文本中的重復(fù)值,如下面的代碼所示。#001SubSplitarr()#002DimSplarr()AsString#003DimArr()AsString#004DimTemp()AsString#005DimrAsInteger#006DimiAsInteger#007OnErrorResumeNext#008Splarr=Split(Sheet2.Range("a1"),",")#009Fori=0ToUBound(Splarr)#010Temp=Filter(Arr,Splarr(i))#011IfUBound(Temp)<0Then#012r=r+1#013ReDimPreserveArr(1Tor)#014Arr(r)=Splarr(i)#015EndIf#016Next#017Sheet1.Range("a1").Resize(r,1)=Application.Transpose(Arr)#018EndSub代碼解析:Splitarr過程將工作表Sheet2中A1單元格的文本去除重復(fù)值后寫入到工作表Sheet1中的A列單元格。第2行代碼聲明數(shù)組Splarr用來保存Sheet2中A1單元格的文本。第3行代碼聲明數(shù)組Arr用來保存去除重復(fù)值后的文本。第4行代碼聲明數(shù)組Temp用來判斷文本是否重復(fù)。第5行代碼聲明變量r用來保存去除重復(fù)值后的文本數(shù)量。第7行代碼啟動錯誤處理程序來忽略錯誤,因為在程序運(yùn)行到第11行代碼會發(fā)生下標(biāo)越界錯誤。第8行代碼使用Split函數(shù)以Sheet2中A1單元格的文本創(chuàng)建一個下標(biāo)從零開始的一維數(shù)組。關(guān)于Split函數(shù)請參閱技巧REF_Ref231553612\r\h169-2。第9行代碼使用For...Next語句遍歷數(shù)組Splarr的所有元素。第10行代碼使用Filter函數(shù)創(chuàng)建一個數(shù)組Temp用來保存以當(dāng)前Splarr數(shù)組的值在Arr數(shù)組中的搜索結(jié)果。Filter函數(shù)返回一個下標(biāo)從零開始的數(shù)組,該數(shù)組包含基于指定篩選條件的一個字符串?dāng)?shù)組的子集,語法如下:Filter(sourcesrray,match[,include[,compare]])參數(shù)sourcesrray是必需的,要執(zhí)行搜索的一維字符串?dāng)?shù)組。參數(shù)match是必需的,要搜索的字符串。參數(shù)include是可選的,Boolean值,表示返回子串是否包含match字符串。如果參數(shù)include是True,F(xiàn)ilter函數(shù)返回的是包含match參數(shù)子字符串的數(shù)組子集。如果參數(shù)include是False,F(xiàn)ilter函數(shù)返回的是不包含match參數(shù)子字符串的數(shù)組子集。參數(shù)compare是可選的,所使用的字符串比較類型。第11行代碼根據(jù)返回的數(shù)組Temp的最大下標(biāo)來判斷當(dāng)前Splarr數(shù)組的值是否重復(fù)。在使用使用Filter函數(shù)時如果沒有相匹配的值,將返回一個空數(shù)組,最大下標(biāo)小于0。第12行代碼如果當(dāng)前Splarr數(shù)組的值不重復(fù)則將變量r的值加1。第13行代碼重新定義動態(tài)數(shù)組大小。ReDim語句,在過程級別中使用,用于為動態(tài)數(shù)組變量重新分配存儲空間,語法如下:ReDim[Preserve]varname(subscripts)[Astype][,varname(subscripts)[Astype]]參數(shù)Preserve是可選的,關(guān)鍵字,當(dāng)改變原有數(shù)組最末維的大小時,使用此關(guān)鍵字可以保持?jǐn)?shù)組中原來的數(shù)據(jù)。參數(shù)varname是必需的,變量的名稱。參數(shù)subscripts是必需的,數(shù)組變量的維數(shù),最多可以定義60維的多維數(shù)組,使用下面的語法;[lowerTo]upper[,[lowerTo]upper]第14行代碼將不重復(fù)值添加到數(shù)組Arr中。第15行代碼使用工作表Transpose函數(shù)將去除重復(fù)值的的文本轉(zhuǎn)置后寫入到工作表的A列單元格中。如果需要將去除重復(fù)值的的文本寫入到第一行單元格中,可以將第15行代碼改成下面的代碼:Sheet1.Range("a1").Resize(1,r)=Arr如果需要將去除重復(fù)值的的文本還是以逗號作為分隔符寫入到A1單元格中,可以將第15行代碼改成下面的代碼:Sheet1.Range("a1")=Join(Arr,",")Join函數(shù)返回一個字符串,該字符串是通過連接某個數(shù)組中的多個子字符串而創(chuàng)建的,語法如下:Join(sourcearray[,delimiter])參數(shù)sourcearray是必需的,包含被連接子字符串的一維數(shù)組。參數(shù)delimiter是可選的,在返回字符串中用于分隔子字符串的字符,如果忽略則使用空格("")來分隔子字符串。文件操作導(dǎo)入文本文件在實際應(yīng)用中,我們經(jīng)常從軟件中將數(shù)據(jù)導(dǎo)出為文本文件,在需要將這些文本文件導(dǎo)入到Excel中時可以使用以下的方法。使用查詢表導(dǎo)入在ExcelVBA中可以使用Add方法新建查詢表后導(dǎo)入文本文件,如下面的代碼所示。#001SubAddQuery()#002Sheet1.UsedRange.ClearContents#003WithSheet1.Qu

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論