Excel VBA自定義函式 根據條件連線字串

2021-10-02 22:26:48 字數 2839 閱讀 1287

做excel發現現有的函式功能不夠用,就自學了一下vba寫了第乙個新函式:根據條件連線字串

比如count()有countif()和countifs(),sum()有sumif()和sumifs(),但是concatenate()卻沒有類似concatenateifs()的函式,於是自己寫了個替代品

(寫的解釋比較面向初學者,如果是只需要參考,完全可以跳過直接看**塊)

問題:我需要在選區中找出同時符合兩個條件的值,比如地區魚

調料沙灘鹹魚鹽

海溝深海魚

醬油海溝

深海魚芥末

火星深海魚

沙子這其中地區和名稱同時相同的視為同一種魚,那麼海溝的深海魚既可以用醬油也可以用芥末,在新的表中需要將這一項合併,也就是說處理後的新錶如下:地區魚

調料沙灘鹹魚鹽

海溝深海魚

醬油芥末

火星深海魚

沙子實現:

首先排個序會比較清晰,將要統計的地區和魚錄入新錶(我自己的做法是直接複製到新錶,再去除重複值),然後對調料使用函式自動填充

自定義的函式concatenate_ifs()仿照countifs()來設定引數,countifs()的語法就不說了

使用引數

給它起個名字

需要合併的字串所在單元格列,即表1的調料列

concatenate_range

範圍1,即表1的地區列

range1

條件1,即表2要去匹配的地區單元格

criteria1

範圍2,即表1的魚列

range2

條件2,即表2要去匹配的魚

criteria2

函式的使用,在表2的調料一格填充:

=concatenate_ifs(表1!調料:調料,表1!地區:地區,表2!地區1,表1!魚:魚,表2!魚1)

剩下的格仔自動填充即可

自定義函式的vba**:

'思路:

'先在range1中查詢criteria1,找到了就記錄是第幾行,存為rownum

'在滿足條件1的記錄行中找滿足條件2的行,即range2中查criteria2

'查到的行會同時滿足條件1、2,將行中對應的內容拼起來

function concatenate_ifs(concatenate_range as range, range1 as range, criteria1 as

string

, range2 as range, criteria2 as

string

)'range型別是單元格

'stop

'stop是用來除錯的

dim rownum as

integer

rownum =

1dim r1 as range

dim res as

string

res =

""for each r1 in range1

if r1 = criteria1 then

rownum = r1.row

if range2.cells(rownum)

= criteria2 then

res = res & concatenate_range.cells(rownum)

'使用&合併字串

endif

endif

next r1

concatenate_ifs = res

endfunction

這樣寫缺點是效率太低了點,很卡,因為vba引用單元格cells比陣列和字典慢很多,於是優化,用陣列來計算:

function concatenate_ifs(concatenate_range as range, range1 as range, criteria1 as

string

, range2 as range, criteria2 as

string

)'stop '斷點除錯

dim rownum as

integer

dim ub as

integer

ub = worksheetfunction.countif(range1,

"<>"

)'將迴圈次數縮減為有內容的單元格

'如果表內有空白值要刪除換成ubound(range1)

dim res as

string

res =

""dim rr1(

), rr2(

), c_r(

) rr1 = range1

rr2 = range2

c_r = concatenate_range

'要注意excel將單元格匯入陣列會按照單元格本身的形式

'比如這裡將整列匯入陣列,陣列的樣子也是一列,而不是一維陣列

for rownum =

1to ub

if rr1(rownum,1)

= criteria1 then

if rr2(rownum,1)

= criteria2 then

if c_r(rownum,1)

<>

""then

res = res & c_r(rownum,1)

endif

endif

endif

next rownum

concatenate_ifs = res

endfunction

使用陣列的計算速度要快很多

針對要分析的資料的結構改進函式也能省略許多不需要計算的值

使用函式的時候選擇的範圍更精確一些也能提高計算速度

自定義函式 Excel之自定義函式

在excel中,當系統函式不能滿足我們的需求時候,我們可以使用vba自定義函式,如抓取網頁資料,翻譯詞彙,手機號歸屬地查詢等。下面將介紹2個自定義函式,idymd函式 身份證年月日性別 通過身份證號,返回性別,出生年月日。語法 idymd id 引數 id,身份證號,預設身份證長度18位。vba 如...

自定義函式

使用者自定義函式是sqlserver的資料庫物件,他不能應用於一系列改變資料庫狀態的操作。但它可以像系統函式那樣在查詢中或儲存過程中等中的程式段中使用。也可以像儲存過程一樣通過execute命令來執行,使用者自定義函式中儲存了transact sql可以返回一定的值。在sqlserver中根據函式返...

自定義函式

自定義函式有標量值函式和錶值函式。標量值函式 如果返回結果指定一種資料型別,則函式為標量值函式。錶值函式 如果返回結果指定table則函式為表值函式。基本語法示例 標量值函式 create function funadd a int return int asbegin declare b int ...