使用EXCEL肯定對函數不陌生,比如求和函數SUM,EXCEL內置了很多實用的函數,但有時候這些函數也不能滿足我們的使用要求,這時我們可以創建屬於自己的函數,這就叫自定義函數,使用方法和內置函數是一樣的。
現在演示的這個自定義函數類似於Vlookup,但Vlookup只能返回查找區域右邊某一列的數據。不能返回左邊的,也不能返回多個數據。這個自定義函數是可以返回左邊對應數據及自身的。如果返回多個數據會把多個數據以逗號隔開連接在一起。
Function txtjoin(str As Range, Rng As Range, Optional ByVal lkt As Integer = 1, Optional x As Integer = 1, Optional x1 As Integer = 100, Optional x2 As Integer = 100, Optional x3 As Integer = 100, Optional x4 As Integer = 100, Optional x5 As Integer = 100)
'參數說明,str,要查找的內容所在單元格對象,rng,指定在哪列查找,lkt完全匹配還是近似查找,默認為1完全匹配,x要返回的內容,相對於查找列的對應位置,默認右邊第1列,可以是負數,代表左邊第幾列。x1-x5,可返回的內容,可選。X-X5 之間的內容是連接成一個字符串,最多可以返回6列的數據合併成一列,要設置默認值就要使用Optional參數,如果使用了該選項,則後續參數都必須是可選的,而且必須都使用 Optional關鍵字聲明。如果使用了 ParamArray,則任何參數都不能使用 Optional 聲明。
Dim findvalue As Range
Dim str2 As String, strcol As Integer, i As Integer
str2 = str.value
strcol = str.Column
If lkt = 1 Then '如果參數=1則查找時使用下面的lookat:=xlWhole參數進行完全匹配查找
Set findvalue = Rng.Find(what:=str2, lookat:=xlWhole)
Else '如果參數lkt的值不為1則進行近似匹配查找,lkt設置了默認值為1,省略該參數時進行完全匹配查找。
Set findvalue = Rng.Find(what:=str2, lookat:=xlPart)
End If
If Not findvalue Is Nothing Then '如果找到,則
txtjoin = Cells(findvalue.Row, findvalue.Column + x).value '返回以當前找到的行偏移多少列的值,後面幾行是對後面5個可選參數進行判斷,如果指定要返回的列在查找列右邊100列以內,不能小於1,因為小於1的列是不存在的,因為這裡是可以返回查找列左邊的數據,所以要進行這樣的一個判斷。
If x1 < 100 And findvalue.Column + x1 > 0 Then txtjoin = txtjoin & "," & Cells(findvalue.Row, findvalue.Column + x1).value
If x2 < 100 And findvalue.Column + x1 > 0 Then txtjoin = txtjoin & "," & Cells(findvalue.Row, findvalue.Column + x2).value
If x3 < 100 And findvalue.Column + x1 > 0 Then txtjoin = txtjoin & "," & Cells(findvalue.Row, findvalue.Column + x3).value
If x4 < 100 And findvalue.Column + x1 > 0 Then txtjoin = txtjoin & "," & Cells(findvalue.Row, findvalue.Column + x4).value
If x5 < 100 And findvalue.Column + x1 > 0 Then txtjoin = txtjoin & "," & Cells(findvalue.Row, findvalue.Column + x5).value
Else '否則,沒有找到任何匹配的數據的話,設置返回值為空,如果這裡不設置為空的話會返回一個數值0
txtjoin = ""
End If
End Function
附:
基本語法[Public | Private | Friend] [Static] Function name [(arglist)] [As type]
Function語句的語法包含下面部分:
如果沒有使用 Public、Private 或 Friend 顯式指定,則 Function 過程預設為公用。如果沒有使用 Static,則局部變量的值在調用之後不會保留。Friend 關鍵字只能在類模塊中使用。但Friend 過程可以被工程的任何模塊中的過程訪問。Friend 過程不會在其父類的類型庫中出現,且 Friend 過程不能被後期綁定。
其中的 arglist 參數的語法以及語法各個部分如下:
'[Optional] [ByVal | ByRef] [ParamArray] varname[( )] [As type] [= defaultvalue]