日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

【新提醒】Excel VBA編程的工程性規(guī)劃

 求知881 2017-07-25
 本帖最后由 wrove 于 2017-7-18 14:03 編輯

看過很多人寫的VBA代碼,一團一團的,一點規(guī)劃都沒有,為了VBA編程更具工程性,這里討論一下,并列出自己的一些建議:
0.給VBA工程定義一個名字,而非直接使用默認的名稱——"VBAProject",以方便以后可能要進行的跨VBA工程編碼
1.定義一個命名為“O”的標準模塊【拼音中“O”字母的讀音,意指“我”這個字】,用于定義所有的全局對象,管理本工程的代碼與數(shù)據(jù),主要API:
    [1]About(Optional ShowDetail As Boolean = False)函數(shù):對本工程的各方面的自述,方便查看本工程的各類信息,可以多設置一個信息開關參數(shù),如
        這里的ShowDetail參數(shù),比如再增加ShowCodeLinesCount參數(shù)
    [2]Public Property Get Project() As VBIDE.VBProject,對本工程的VBA工程的引用
    [3]Public Property Get VBAType() As VBAType,對本工程的VBA類型的定義,比如是在Excel,亦或是Word中,其中VBAType是自定義的Enum
    [4]Initialize()函數(shù):初始化本工程所有需要初始化的內(nèi)容
    [5]Terminate()函數(shù):銷毀所有需要銷毀的
    [6]HasLib(Byval LibName As String)函數(shù):檢查本工程是否有某COM的引用,主要是檢查O.Project.References集合,比如O.HasLib("Scripting"),方便
        可能需要的動態(tài)自動編碼
    [7]HasModule(Byval ModuleName As String)函數(shù):檢查本工程是否存在某個模塊
    [8]Property Get/Let NextErrorNumber:用于規(guī)劃本工程自定義錯誤號,使每個錯誤號都是特有的,自定義錯誤的拋出如下:
  1. ''第二個參數(shù)是在設置Err.Source屬性,形式為:VBA工程名+模塊名+方法/函數(shù)/屬性名,
  2. ''如果是屬性,屬性名后面還建議加一個后綴#Get/#Let/#Set,以示錯誤的更具體來源
  3. ''使用“#”而不是“_”,是因為“_”是合法的標識符字符,可能帶來含義混淆
  4. Err.Raise -2147221406, "Nutix.Output.Format", "Values參數(shù)包含的值的個數(shù)與txt參數(shù)中格式化標識個數(shù)不相等"
復制代碼
    [9]Bake()函數(shù):對本工程進行備份
    [10]Move()函數(shù):將本工程的所有代碼遷移到另外一個支持VBA的文件中
    [11]Activate(Byval ModuleName As String)函數(shù):將某模塊的代碼窗口打開
    [12]各種全局對象的聲明,在聲明中建議直接帶New關鍵字,這樣會避免掉很多Set語句,而且因為New關鍵字是在對應的對象變量被實際訪問時,
          才真正執(zhí)行對應的New操作,所以如果有必要,請在上面的Initialize()函數(shù)中,定義某些必須立即初始化的對象的初始化;集中在這個模塊聲明
         也能方便對應全局變量的管理與訪問,比如對象變量名稱很長,直接O.XXX會更方便輸入,畢竟有智能成員提示嘛,而且O模塊名只有一個字      
        符。另外,集中初始化與銷毀,也 能避免漏操作。
    [13]常見的第三方功能對象:
          (1)Scripting.FileSystemObject對象,全局命名為FSO
          (2)VBS_RegExp_55.RegExp對象,全局命名為RE
          (3)MSForms.DataObject對象,全局命名為Clip
          (4)Shell32.Shell對象,全局命名為SH
          (5)IWshRuntimeLibrary.WshShell對象,全局命名為WSH
          (6)MSComDlg.CommonDialog對象,全局命名為CD
2.定義一個命名為Enums標準模塊,存放所有的自定義Enum
3.定義一個命名為Types標準模塊,存放所有的自定義Type結(jié)構(gòu)體
4.定義一個命名為Constants標準模塊,存放所有自定義的常數(shù)
5.定義一個命名為API標準模塊,存放所有對Windows API聲明及擴展
6.定義一個命名為Main標準模塊,作為本工程的工作模塊,所有的編碼,在本模塊測試,通用的測試也存放在本模塊,以方便查閱,來了解VBA的特性,尤其是不常用的對象,你可能某一時候?qū)W會了使用它的API,但長久不用,就又忘了,如果將當初的試驗代碼,很好的命名,并保存于此模塊,也會方便你再次熟悉這種對象。
7.定義一系列X_XXX類模塊,用于對VBA的標準類型,或引用的第三方類型,或VBA固有的對象,進行功能性增強
    [1]比如對Collection/Array/Dictionary/VB(這里指的是VBA庫,因為VBA與VB的相似性,這里寫成VB而非VBA)/VBE(你寫VBA代碼的那個窗口)
        /Designer(VBE的窗體設計器)/Math/String/RegExp/ErrObject/FileSystemObject類型或?qū)ο蟮脑鰪?,分別定義如X_Collection/X_Array
       /X_Dictionary/X_VB/X_VBE/X_Designer/X_Math/X_String/X_RegExp/X_ErrObject/X_FileSystemObject的類模塊;
    [2]在O模塊中分別定義一個全局的該類模塊的實例對象,分別命名為xCollection/xArray/xDictionary/xVB/xVBE/xDesigner/xMath/xString/xRegExp
        /xErrObject/xFileSystemObject
    [3]當要使用對應的對象時,統(tǒng)一通過O.XXX的形式來引用,尤其是對象名很長時。
    [4]雖然只需要一個這樣的對象,但是還是建議使用類模塊,而非標準模塊,這是為了避免命名污染,因為定義太多的標準模塊的全局函數(shù),會將命名
        弄得一團糟,有時會出現(xiàn)相互遮蔽的現(xiàn)象;而且如TypeName這種VBA標準中已使用了的命名,如果在標準模塊中重定義了,那么它會被遮蔽,造
        成功能混亂,明明想調(diào)用VBA.TypeName卻調(diào)用了某標準模塊的自定義TypeName成員
8.定義一系列的Tool_XXX類模塊,用于對支持VBA的文件進行功能擴展
    [1]比如.doc/.xls/.mdb/.dwg/.ppt,則可對應的定義Tool_DOC/Tool_XLS/Tool_MDB/Tool_DWG/Tool_PPT類模塊,來封裝對Word/Excel/Access      
         /AutoCAD/PowerPoint文件的功能代碼的設計。
    [2]仍然只在O模塊中定義一個這些類型的全局對象,并分別命名為tDOC/tXLS/tMDB/tDWG/tPPT,方便訪問
    [3]Property Get/Set App屬性:用于定義對應的VBA宿主對象,即Application對象,根據(jù)O.VBAType屬性來決定是新建對象,還是直接引用現(xiàn)成對象,
        比如你要調(diào)用O.tXLS.App屬性,而當前文檔是一個Word文檔,那么對其進行訪問,就需要新建Application對象,而如果本來就是Excel文檔,就
        可以直接設置為當前的Application對象
    [4]Property Get/Set Doc屬性:用于定義對應的文檔對象,Word的是Document類型,Excel的是Workbook,……
    [5]其它的功能代碼
9.定義一個命名為TXTData的標準模塊,來存放本VBA工程的工程數(shù)據(jù),比如上面的O.NextErrorNumber的數(shù)據(jù),以XML文本的形式保存,你可以借用ThsiWorkbook.VBProject.VBComponent.CodeModule.Lines()/AddFromString()/ReplaceLine()/InsertLines()/DeleteLines() 等API來完成數(shù)據(jù)的讀寫
10.定義一個命名為Checker的類模塊,用來存放本VBA工程中所有的通用的判斷式API
    [1]返回值總是Boolean,成員建議命名為IsXXX形式,仍然只在全局定義一個這樣的對象實例,命名為Chk,可能經(jīng)常要用到的功能如下
    [2]IsAllInType(Obj As Object,Byval TypeName As String)方法:檢查如數(shù)組/集合這種包含很多元素的對象的每一個元素類型是否是某類型
    [3]IsAllInTypes(Obj As Object,ParamArray TypeNames() As Variant)方法:檢查如數(shù)組/集合這種包含很多元素的對象的每一個元素類型是否是某幾個
        類型中的一個
    [4]IsInTypes(Obj As Object, ParamArray TypeNames() As Variant)方法:用于檢查某個變量,是否是某幾個類型中的一個
    [5]HasAttr(Obj As Object, Byval ProcName As String)方法:用于檢驗某對象是否存在某成員
    [6]IsAllTrue(ParamArray Values() As Variant)方法:用于檢驗某些變量,是否全為True,如果只傳遞一個變量,將把該變量當作一個多元素變量,并對
        其所有元素執(zhí)行該操作
    [8]IsAnyTrue(ParamArray Values() As Variant)方法:用于檢驗某些變量,是否存有一個為True,如果只傳遞一個變量,將把該變量當作一個多元素變
        量,并對其所有元素執(zhí)行該操作
    [9]IsSubSet(Items1 As Variant, Items2 As Variant)方法:用于檢驗前者是否是后者的子集
    [10]IsIn(Item As Variant, ParamArray Items() As Variant)方法:用于檢驗前者是否是后者中的一項,如果只傳遞一個變量,將把該變量當作一個多元素
          變量,并在該變量的元素中檢驗Item是否是其中之一
11.定義一個命名為Createor的類模塊,封裝所有的NewXXX操作,方便初始化對象
    [1]仍然只在全局定義一個這樣的對象實例,全局變量名為Crt
    [2]實現(xiàn)某些標準或者第三方的類型對象的實例化,及初始化,比如新建一個ErrObject對象
    [3]實現(xiàn)某些第二方類型(就是你自己的自定義類型)對象的實例化,及初始化,比如某些Type結(jié)構(gòu)體,或者某些自定義類
12.定義一個命名為Convertor的類模塊,封裝所有的轉(zhuǎn)化操作
    [1]仍然只在全局定義一個這樣的對象實例,全局變量名為Cvt
    [2]各種對象的字符串格式化方法,命名為str_+TypeName,方便對對象的格式化
13.定義一個命名為Caller的類模塊,封裝所有的集群調(diào)用,能一定程度上實現(xiàn)函數(shù)式編程,封裝好了,可以減少使用循環(huán)語句
    [1]仍然只在全局定義一個這樣的對象實例,全局變量名為Cal
    [2]ForEach(Objs As Variant, ByVal ProcName As String, ByVal CallType As VbCallType, ParamArray Args() As Variant)方法:對Objs中每一個對象訪問對
        應的成員
    [3]Filtrate(Objs As Variant, ByVal ProcName As String, ByVal CallType As VbCallType,  CompareTo As Variant, ByVal GetWhenEqual As Boolean,  _
        ParamArray Args() As Variant)方法:從Objs對象集中篩選對象
14.定義一個命名為Dialogs的類模塊,用于封裝可能用到的對話框
    [1]仍然只在全局定義一個這樣的對象實例,全局變量名為Dlgs
    [2]GetColor(Optional dlgTitle As String)方法:調(diào)用MSComDlg庫的功能,實現(xiàn)顏色的選取
    [3]GetFont(Optional Min As Integer = -1, Optional Max As Integer = -1,  Optional dlgTitle As String) As Nutix.MSComDlgFont方法:調(diào)用MSComDlg庫的
        功能,實現(xiàn)對字體的設置,其中Nutix.MSComDlgFont為自定義的Type結(jié)構(gòu)體類型,因為你是沒辦法直接New出一個Font對象的
    [4]GetSaveFileName(Optional Filter As String = "所有多件 (*.*)",  Optional FilterIndex As Integer = 1, Optional DefaultExt As String, _
         Optional InitDir As String, Optional dlgTitle As String)方法:調(diào)用MSComDlg庫的功能,獲取要保存的文件名與路徑
    [5]GetOpenFileName(Optional Filter As String = "所有多件 (*.*)",  Optional FilterIndex As Integer = 1, Optional DefaultExt As String, _
        Optional MultiSelect As Boolean = False, Optional InitDir As String,  Optional dlgTitle As String)方法:調(diào)用MSComDlg庫的功能,獲取要打開的文件名
        與路徑
15.定義一個命名為System的類型模塊,用于對封裝本操作系統(tǒng)的功能操作
    [1] 仍然只在全局定義一個這樣的對象實例,全局變量名為Sys
    [2]HasTaskNamed(ByVal Name As String)方法:調(diào)用WbemScripting庫(WMI)的相關功能,檢驗操作系統(tǒng)上是否已經(jīng)運行了某名稱的進程
    [3]GetClipText()方法:調(diào)用MSForms.DataObject的功能,實現(xiàn)對系統(tǒng)剪貼板的文本的讀取
    [4]SetClipText()方法:調(diào)用MSForms.DataObject的功能,實現(xiàn)對系統(tǒng)剪貼板的內(nèi)容進行設置

16.定義一個命名為VBS/JS的類模塊,用于封裝對VBS/JS代碼的調(diào)用,借助MSScriptControl庫來實現(xiàn)
    [1]仍然只在全局定義一個這樣的對象實例,全局變量名為VBS/JS
    [2]代碼保存在上面所說的本VBA工程的數(shù)據(jù)模塊,即TXTData模塊中
    [3]Property Get This() As MSScriptControl屬性:用于向外公開內(nèi)部的中心對象,因為所有功能是構(gòu)建在MSScriptControl對象上的,故如此說
    [4]AddCode(Byval Code As String)方法:用于向This中添加代碼,代碼數(shù)據(jù)也會被同步存入TXTData模塊中
17.定義一個命名為Output的類模塊,用于封裝常用的各種字符串格式化操作
    [1]仍然只在全局定義一個這樣的對象實例,全局變量名為Out
    [2]WriteLine(Byval Line As String)方法:定義當前類的寫操作,所有其它寫操作是基于這個方法的;內(nèi)部提供向立即窗口/文本文件兩種方向的寫操作
    [3]SingleSepLine(Optional Length As Integer)方法:輸出指定長度的“-”(減號),即輸出一個單分割線
    [4]DoubleSepLine(Optional Length As Integer)方法:輸出指定長度的“=”(等號),即輸出一個雙分割線
    [5]NamedSepLine(ByVal Name As String, Optional ByVal Char As String = "*", Optional Length As Integer)方法:輸出一個命名居中的,指定長度的, 
        由Char字符串構(gòu)成的行
    [6]FileName屬性:用于改變輸出方向到一個文本文件
    [7]ObjectName屬性:用于定義對象輸出時的對象名,與下面聯(lián)合完成對象格式化
    [8]PObjSelf(Obj As Variant)方法:用于輸出對象本身,對象名由7定義,輸出形式是:ObjectName + " = " +Object的字符串
    [9]PObjCall(Obj As Object, ByVal ProcName As String, ByVal CallType As VBA.VbCallType, ParamArray Args() As Variant)方法:用于輸出對象的某個
        成員,輸出形式是:ObjectName + "." + ProcName + " = " + Object.Proc的值
    [10]PObjProperties(Obj As Object, ParamArray ProcNames() As Variant)方法:用于輸出對象的多個屬性,輸出形式如上,每一個屬性,對應一個等式
          輸出行
    [11]PTypeValue(Obj As Variant)方法:輸出變量的類型和值,輸出形式:ObjTypeName + " => " + ObjValue的字符串
18.定義命名為frmXXXTool的系列窗體模塊,封裝對各種支持VBA的文件的有界面操作
    [1]對應于.doc/.xls/.mdb/.dwg/.ppt,窗體模塊的命名分別為frmDOCTool/frmXLSTool/frmMDBTool/frmDWGTool/frmPPTTool
    [2]不用定義全局以上窗體對象,因為VBA系統(tǒng)默認已經(jīng)創(chuàng)建了一個這樣的對象,其命名與窗體模塊名相同
19.定義命名為Coder的類模塊,用于封裝對本VBA工程的對象編碼功能
    [1]仍然只在全局定義一個這樣的對象實例,全局變量名為Cod
    [2]引用管理功能
    [3]代碼統(tǒng)計功能
    [4]代碼增刪替換的功能
    [5]基于固定模式的動態(tài)編程功能

20.最后加一段代碼,作為Main模塊的主要工作代碼塊【主要是預先聲明了大量的可能用到的變量和數(shù)組,避免每次重新聲明】
  1. Public Sub AAA_00000000_AAA()
  2.     ''[VBA]數(shù)據(jù)類型變量聲明
  3.     Dim Byt As Byte, Byt1 As Byte, Byt2 As Byte, Byt3 As Byte
  4.     Dim Bln As Boolean, Bln1 As Boolean, Bln2 As Boolean, Bln3 As Boolean
  5.     Dim Itg As Integer, Itg1 As Integer, Itg2 As Integer, Itg3 As Integer
  6.     Dim Lng As Long, Lng1 As Long, Lng2 As Long, Lng3 As Long
  7.     Dim Sng As Single, Sng1 As Single, Sng2 As Single, Sng3 As Single
  8.     Dim Dbl As Double, Dbl1 As Double, Dbl2 As Double, Dbl3 As Double
  9.     Dim Str As String, str1 As String, str2 As String, Str3 As String
  10.     Dim Dt As Date, Dt1 As Date, Dt2 As Date, Dt3 As Date
  11.     Dim Var As Variant, Var1 As Variant, Var2 As Variant, Var3 As Variant
  12.     Dim Obj As Object, Obj1 As Object, Obj2 As Object, Obj3 As Object
  13.     ReDim byts(0) As Byte, blns(0) As Boolean, itgs(0) As Integer, lngs(0) As Long
  14.     ReDim sngs(0) As Single, dbls(0) As Double, Strs(0) As String
  15.     ReDim Dts(0) As Date, Vars(0) As Variant, Objs(0) As Object
  16.     Dim i As Long, j As Long, k As Long, RE As New VBScript_RegExp_55.RegExp
  17.     Dim c As New Collection, c1 As New Collection, c2 As New Collection, c3 As New Collection
  18.     ''[Scripting]數(shù)據(jù)類型變量聲明
  19.     Dim d As New Scripting.Dictionary, d1 As New Scripting.Dictionary, d2 As New Scripting.Dictionary
  20.     Dim Key As Variant, Key1 As Variant, Key2 As Variant
  21.     ''[VBScript_RegExp_55]數(shù)據(jù)類型變量聲明
  22.     Dim m As VBScript_RegExp_55.Match, ms As VBScript_RegExp_55.MatchCollection
  23.     ''[VBIDE]數(shù)據(jù)類型變量聲明
  24.     Dim vbc As vbide.VBComponent, cp As vbide.CodePane, cm As vbide.CodeModule
  25.     ''[Excel]數(shù)據(jù)類型變量聲明
  26.     Dim rng As Excel.Range, rng1 As Excel.Range, rng2 As Excel.Range, rng3 As Excel.Range
  27.     Dim sht As Excel.Worksheet, sht1 As Excel.Worksheet, sht2 As Excel.Worksheet, sht3 As Excel.Range
  28.     Dim wb As Excel.Workbook, wb1 As Excel.Workbook, wb2 As Excel.Workbook, wb3 As Excel.Workbook
  29.     Dim shp As Excel.Shape, Ole As Excel.OLEObject
  30.     ''[Word]數(shù)據(jù)類型變量聲明
  31.     Dim Doc As New MSXML2.DOMDocument60, e As MSXML2.IXMLDOMElement, a As MSXML2.IXMLDOMAttribute
  32.     ''[MSXML2]數(shù)據(jù)類型變量聲明
  33.     Dim CData As MSXML2.IXMLDOMCDATASection, NL As MSXML2.IXMLDOMNodeList, N As MSXML2.IXMLDOMNode
  34.     ''MSForms相關變量聲明
  35.     Dim win As MSForms.UserForm, grp As MSForms.Frame
  36.     Dim ctls As MSForms.Control, ctl As MSForms.Control
  37.     Dim btn As MSForms.CommandButton, rbtn As MSForms.OptionButton
  38.     Dim sbtn As MSForms.SpinButton, tbtn As MSForms.ToggleButton
  39.     Dim cbb As MSForms.ComboBox, lst As MSForms.ListBox
  40.     Dim ckb As MSForms.CheckBox, img As MSForms.Image
  41.     Dim lbl As MSForms.Label, txt As MSForms.TextBox
  42.     Dim mp As MSForms.MultiPage, pg As MSForms.Page
  43.     Dim ts As MSForms.TabStrip, tb As MSForms.Tab
  44.     Dim scb As MSForms.ScrollBar
  45.     ''<AAA_00000000_AAA_WorkingCode>
  46.    
  47.     ''</AAA_00000000_AAA_WorkingCode>
  48. End Sub
復制代碼
================================================================================
如上是我的VBA工程——“VBA工具集.xlsm"的編碼規(guī)劃,共享于此,希望能夠給予各位愛好VBA的壇友以幫助。
如果覺得我的規(guī)劃有功能性劃分或組織不合理的地方,請給出您的建議。

關于各數(shù)據(jù)類型的Array的初始化寫很多語句是不是很煩人,定義X_Array類如下成員

本帖最后由 wrove 于 2017-7-19 08:34 編輯
  1. Public Function NewBooleans(ParamArray Values() As Variant) As Boolean()
  2.     Dim blns() As Boolean, Value As Variant
  3.     ReDim blns(0)
  4.     For Each Value In Values
  5.         blns(UBound(blns)) = Value
  6.         ReDim Preserve blns(UBound(blns) + 1)
  7.     Next
  8.     If UBound(blns) <> 0 Then
  9.         ReDim Preserve blns(UBound(blns) - 1)
  10.     Else
  11.         Err.Raise -2147221322, "Nutix.X_Array.NewBooleans", "至少應有一個數(shù)據(jù)"
  12.     End If
  13.     NewBooleans = blns
  14. End Function

  15. Public Function NewBooleansInLength(ByVal Length As Long, ParamArray Values() As Variant) As Boolean()
  16.     Dim blns() As Boolean, Value As Variant, lNow As Long
  17.     ReDim blns(0)
  18.     For Each Value In Values
  19.         blns(UBound(blns)) = Value
  20.         ReDim Preserve blns(UBound(blns) + 1)
  21.     Next
  22.     If UBound(blns) <> 0 Then
  23.         lNow = UBound(blns) - LBound(blns) + 1
  24.         Select Case lNow
  25.             Case Is = Length
  26.                 ''Already Exists, Do Nothing
  27.             Case Is > Length
  28.                 Err.Raise -2147221323, "Nutix.X_Array.NewBooleansInLength", "太多數(shù)據(jù)"
  29.             Case Is < Length
  30.                 ReDim Preserve blns(Length)
  31.         End Select
  32.     End If
  33.     NewBooleansInLength = blns
  34. End Function

  35. Public Function NewBytes(ParamArray Values() As Variant) As Byte()
  36.     Dim byts() As Byte, Value As Variant
  37.     ReDim byts(0)
  38.     For Each Value In Values
  39.         byts(UBound(byts)) = Value
  40.         ReDim Preserve byts(UBound(byts) + 1)
  41.     Next
  42.     If UBound(byts) <> 0 Then
  43.         ReDim Preserve byts(UBound(byts) - 1)
  44.     Else
  45.         Err.Raise -2147221322, "Nutix.X_Array.NewBytes", "至少應有一個數(shù)據(jù)"
  46.     End If
  47.     NewBytes = byts
  48. End Function

  49. Public Function NewBytesInLength(ByVal Length As Long, ParamArray Values() As Variant) As Byte()
  50.     Dim byts() As Byte, Value As Variant, lNow As Long
  51.     ReDim byts(0)
  52.     For Each Value In Values
  53.         byts(UBound(byts)) = Value
  54.         ReDim Preserve byts(UBound(byts) + 1)
  55.     Next
  56.     If UBound(byts) <> 0 Then
  57.         lNow = UBound(byts) - LBound(byts) + 1
  58.         Select Case lNow
  59.             Case Is = Length
  60.                 ''Already Exists, Do Nothing
  61.             Case Is > Length
  62.                 Err.Raise -2147221323, "Nutix.X_Array.NewBytesInLength", "太多數(shù)據(jù)"
  63.             Case Is < Length
  64.                 ReDim Preserve byts(Length)
  65.         End Select
  66.     End If
  67.     NewBytesInLength = byts
  68. End Function

  69. Public Function NewDates(ParamArray Values() As Variant) As Date()
  70.     Dim Dts() As Date, Value As Variant
  71.     ReDim Dts(0)
  72.     For Each Value In Values
  73.         Dts(UBound(Dts)) = Value
  74.         ReDim Preserve Dts(UBound(Dts) + 1)
  75.     Next
  76.     If UBound(Dts) <> 0 Then
  77.         ReDim Preserve Dts(UBound(Dts) - 1)
  78.     Else
  79.         Err.Raise -2147221322, "Nutix.X_Array.NewDates", "至少應有一個數(shù)據(jù)"
  80.     End If
  81.     NewDates = Dts
  82. End Function

  83. Public Function NewDatesInLength(ByVal Length As Long, ParamArray Values() As Variant) As Date()
  84.     Dim Dts() As Date, Value As Variant, lNow As Long
  85.     ReDim Dts(0)
  86.     For Each Value In Values
  87.         Dts(UBound(Dts)) = Value
  88.         ReDim Preserve Dts(UBound(Dts) + 1)
  89.     Next
  90.     If UBound(Dts) <> 0 Then
  91.         lNow = UBound(Dts) - LBound(Dts) + 1
  92.         Select Case lNow
  93.             Case Is = Length
  94.                 ''Already Exists, Do Nothing
  95.             Case Is > Length
  96.                 Err.Raise -2147221323, "Nutix.X_Array.NewDatesInLength", "太多數(shù)據(jù)"
  97.             Case Is < Length
  98.                 ReDim Preserve Dts(Length)
  99.         End Select
  100.     End If
  101.     NewDatesInLength = Dts
  102. End Function

  103. Public Function NewDoubles(ParamArray Values() As Variant) As Double()
  104.     Dim dbls() As Double, Value As Variant
  105.     ReDim dbls(0)
  106.     For Each Value In Values
  107.         dbls(UBound(dbls)) = Value
  108.         ReDim Preserve dbls(UBound(dbls) + 1)
  109.     Next
  110.     If UBound(dbls) <> 0 Then
  111.         ReDim Preserve dbls(UBound(dbls) - 1)
  112.     Else
  113.         Err.Raise -2147221322, "Nutix.X_Array.NewDoubles", "至少應有一個數(shù)據(jù)"
  114.     End If
  115.     NewDoubles = dbls
  116. End Function

  117. Public Function NewDoublesInLength(ByVal Length As Long, ParamArray Values() As Variant) As Double()
  118.     Dim dbls() As Double, Value As Variant, lNow As Long
  119.     ReDim dbls(0)
  120.     For Each Value In Values
  121.         dbls(UBound(dbls)) = Value
  122.         ReDim Preserve dbls(UBound(dbls) + 1)
  123.     Next
  124.     If UBound(dbls) <> 0 Then
  125.         lNow = UBound(dbls) - LBound(dbls) + 1
  126.         Select Case lNow
  127.             Case Is = Length
  128.                 ''Already Exists, Do Nothing
  129.             Case Is > Length
  130.                 Err.Raise -2147221323, "Nutix.X_Array.NewDoublesInLength", "太多數(shù)據(jù)"
  131.             Case Is < Length
  132.                 ReDim Preserve dbls(Length)
  133.         End Select
  134.     End If
  135.     NewDoublesInLength = dbls
  136. End Function

  137. Public Function NewIntegers(ParamArray Values() As Variant) As Integer()
  138.     Dim itgs() As Integer, Value As Variant
  139.     ReDim itgs(0)
  140.     For Each Value In Values
  141.         itgs(UBound(itgs)) = Value
  142.         ReDim Preserve itgs(UBound(itgs) + 1)
  143.     Next
  144.     If UBound(itgs) <> 0 Then
  145.         ReDim Preserve itgs(UBound(itgs) - 1)
  146.     Else
  147.         Err.Raise -2147221322, "Nutix.X_Array.NewIntegers", "至少應有一個數(shù)據(jù)"
  148.     End If
  149.     NewIntegers = itgs
  150. End Function

  151. Public Function NewIntegersInLength(ByVal Length As Long, ParamArray Values() As Variant) As Integer()
  152.     Dim itgs() As Integer, Value As Variant, lNow As Long
  153.     ReDim itgs(0)
  154.     For Each Value In Values
  155.         itgs(UBound(itgs)) = Value
  156.         ReDim Preserve itgs(UBound(itgs) + 1)
  157.     Next
  158.     If UBound(itgs) <> 0 Then
  159.         lNow = UBound(itgs) - LBound(itgs) + 1
  160.         Select Case lNow
  161.             Case Is = Length
  162.                 ''Already Exists, Do Nothing
  163.             Case Is > Length
  164.                 Err.Raise -2147221323, "Nutix.X_Array.NewIntegersInLength", "太多數(shù)據(jù)"
  165.             Case Is < Length
  166.                 ReDim Preserve itgs(Length)
  167.         End Select
  168.     End If
  169.     NewIntegersInLength = itgs
  170. End Function

  171. Public Function NewLongs(ParamArray Values() As Variant) As Long()
  172.     Dim lngs() As Long, Value As Variant
  173.     ReDim lngs(0)
  174.     For Each Value In Values
  175.         lngs(UBound(lngs)) = Value
  176.         ReDim Preserve lngs(UBound(lngs) + 1)
  177.     Next
  178.     If UBound(lngs) <> 0 Then
  179.         ReDim Preserve lngs(UBound(lngs) - 1)
  180.     Else
  181.         Err.Raise -2147221322, "Nutix.X_Array.NewLongs", "至少應有一個數(shù)據(jù)"
  182.     End If
  183.     NewLongs = lngs
  184. End Function

  185. Public Function NewLongsInLength(ByVal Length As Long, ParamArray Values() As Variant) As Long()
  186.     Dim lngs() As Long, Value As Variant, lNow As Long
  187.     ReDim lngs(0)
  188.     For Each Value In Values
  189.         lngs(UBound(lngs)) = Value
  190.         ReDim Preserve lngs(UBound(lngs) + 1)
  191.     Next
  192.     If UBound(lngs) <> 0 Then
  193.         lNow = UBound(lngs) - LBound(lngs) + 1
  194.         Select Case lNow
  195.             Case Is = Length
  196.                 ''Already Exists, Do Nothing
  197.             Case Is > Length
  198.                 Err.Raise -2147221323, "Nutix.X_Array.NewLongsInLength", "太多數(shù)據(jù)"
  199.             Case Is < Length
  200.                 ReDim Preserve lngs(Length)
  201.         End Select
  202.     End If
  203.     NewLongsInLength = lngs
  204. End Function

  205. Public Function NewSingles(ParamArray Values() As Variant) As Single()
  206.     Dim sngs() As Single, Value As Variant
  207.     ReDim sngs(0)
  208.     For Each Value In Values
  209.         sngs(UBound(sngs)) = Value
  210.         ReDim Preserve sngs(UBound(sngs) + 1)
  211.     Next
  212.     If UBound(sngs) <> 0 Then
  213.         ReDim Preserve sngs(UBound(sngs) - 1)
  214.     Else
  215.         Err.Raise -2147221322, "Nutix.X_Array.NewSingles", "至少應有一個數(shù)據(jù)"
  216.     End If
  217.     NewSingles = sngs
  218. End Function

  219. Public Function NewSinglesInLength(ByVal Length As Long, ParamArray Values() As Variant) As Single()
  220.     Dim sngs() As Single, Value As Variant, lNow As Long
  221.     ReDim sngs(0)
  222.     For Each Value In Values
  223.         sngs(UBound(sngs)) = Value
  224.         ReDim Preserve sngs(UBound(sngs) + 1)
  225.     Next
  226.     If UBound(sngs) <> 0 Then
  227.         lNow = UBound(sngs) - LBound(sngs) + 1
  228.         Select Case lNow
  229.             Case Is = Length
  230.                 ''Already Exists, Do Nothing
  231.             Case Is > Length
  232.                 Err.Raise -2147221323, "Nutix.X_Array.NewSinglesInLength", "太多數(shù)據(jù)"
  233.             Case Is < Length
  234.                 ReDim Preserve sngs(Length)
  235.         End Select
  236.     End If
  237.     NewSinglesInLength = sngs
  238. End Function

  239. Public Function NewStrings(ParamArray Values() As Variant) As String()
  240.     Dim Strs() As String, Value As Variant
  241.     ReDim Strs(0)
  242.     For Each Value In Values
  243.         Strs(UBound(Strs)) = Value
  244.         ReDim Preserve Strs(UBound(Strs) + 1)
  245.     Next
  246.     If UBound(Strs) <> 0 Then
  247.         ReDim Preserve Strs(UBound(Strs) - 1)
  248.     Else
  249.         Err.Raise -2147221322, "Nutix.X_Array.NewStrings", "至少應有一個數(shù)據(jù)"
  250.     End If
  251.     NewStrings = Strs
  252. End Function

  253. Public Function NewStringsInLength(ByVal Length As Long, ParamArray Values() As Variant) As String()
  254.     Dim Strs() As String, Value As Variant, lNow As Long
  255.     ReDim Strs(0)
  256.     For Each Value In Values
  257.         Strs(UBound(Strs)) = Value
  258.         ReDim Preserve Strs(UBound(Strs) + 1)
  259.     Next
  260.     If UBound(Strs) <> 0 Then
  261.         lNow = UBound(Strs) - LBound(Strs) + 1
  262.         Select Case lNow
  263.             Case Is = Length
  264.                 ''Already Exists, Do Nothing
  265.             Case Is > Length
  266.                 Err.Raise -2147221323, "Nutix.X_Array.NewStringsInLength", "太多數(shù)據(jù)"
  267.             Case Is < Length
  268.                 ReDim Preserve Strs(Length)
  269.         End Select
  270.     End If
  271.     NewStringsInLength = Strs
  272. End Function


復制代碼
  1. Public Function NewVariants(ParamArray Values() As Variant) As Variant()
  2.     Dim Vars() As Variant, Value As Variant
  3.     ReDim Vars(0)
  4.     For Each Value In Values
  5.         Vars(UBound(Vars)) = Value
  6.         ReDim Preserve Vars(UBound(Vars) + 1)
  7.     Next
  8.     If UBound(Vars) <> 0 Then
  9.         ReDim Preserve Vars(UBound(Vars) - 1)
  10.     Else
  11.         Err.Raise -2147221322, "Nutix.X_Array.NewVariants", "至少應有一個數(shù)據(jù)"
  12.     End If
  13.     NewVariants = Vars
  14. End Function

  15. Public Function NewVariantsInLength(ByVal Length As Long, ParamArray Values() As Variant) As Variant()
  16.     Dim Vars() As Variant, Value As Variant, lNow As Long
  17.     ReDim Vars(0)
  18.     For Each Value In Values
  19.         Vars(UBound(Vars)) = Value
  20.         ReDim Preserve Vars(UBound(Vars) + 1)
  21.     Next
  22.     If UBound(Vars) <> 0 Then
  23.         lNow = UBound(Vars) - LBound(Vars) + 1
  24.         Select Case lNow
  25.             Case Is = Length
  26.                 ''Already Exists, Do Nothing
  27.             Case Is > Length
  28.                 Err.Raise -2147221323, "Nutix.X_Array.NewVariantsInLength", "太多數(shù)據(jù)"
  29.             Case Is < Length
  30.                 ReDim Preserve Vars(Length)
  31.         End Select
  32.     End If
  33.     NewVariantsInLength = Vars
  34. End Function
復制代碼
看下面場景:
  1. Public Sub AAA()
  2.     BBB Split("good hello smile")
  3. End Sub

  4. Public Sub BBB(Values() As String)
  5.     Dim Value
  6.     For Each Value In Values
  7.         Debug.Print Value
  8.     Next
  9. End Sub
復制代碼
報錯如圖

如果有上面的API,就可以這樣調(diào)用,BBB NewStrings("good","hello","smile")
C:\Users\nutix\Desktop\捕獲.png

捕獲.PNG (12.32 KB, 下載次數(shù): 0)

捕獲.PNG

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多