在 Excel 中編寫自定義函式 返回多個值

2021-04-18 20:01:33 字數 2442 閱讀 4073

前面講了自定義函式的基本框架和如何傳遞不定引數,這一篇講如何返回多個值。返回多個值,基本上就可以理解為返回陣列。我們自定義的返回陣列的函式,跟 excel 自帶的陣列函式一樣,需要按 ctrl+shift+enter 輸入。

在返回陣列這件事上,我們需要決定返回的陣列的維度。有下面幾種情況:

第一種情況,返回乙個大小固定的陣列。

function fixedfill() as variant

dim n as long

dim r as long

dim c as long

n = 0

dim v(1 to 3, 1 to 4)

for r = 1 to 3

for c = 1 to 4

n = n + 1

v(r, c) = n

next c

next r

fixedfill = v

end function

這個函式返回乙個 3x4 大小的陣列,值從 1 到 12。但是這個函式並沒有什麼應用價值,我們的返回值還是應該根據傳入的引數或者輸入函式的單元格範圍的大小來變化。

第二種情況,根據輸入函式的單元格範圍大小來變化。也就是說,如果選了 a1:b2 這樣 2x2 的範圍來輸入我們自定義的函式,我們返回的陣列就是 2x2 大小;如果選了 c3:e8 這樣 6x3 的範圍來輸入我們自定義的函式,我們返回的陣列就是 6x3 大小。要獲得輸入函式的單元格範圍的大小,我們可以用

這個屬性。當我們從表單單元格裡呼叫函式時,

屬性返回的是乙個 range 物件引用,表示輸入該函式的單元格範圍。

function dynamicfill() as variant

dim callerrows as long

dim callercols as long

dim result() as long

dim n as long

dim i as long

dim j as long

n = 0

callerrows = .rows.count

callercols = .columns.count

end with

redim result(1 to callerrows, 1 to callercols)

for i = 1 to callerrows

for j = 1 to callercols

n = n + 1

result(i, j) = n

next j

next i

dynamicfill = result

end function

第三種情況,結合傳入的引數和函式的目的來決定返回陣列的維度。像我前一篇文章裡的 mysum 函式,傳入的雖然是個引數陣列,但返回唯一的值。我這裡舉的乙個例子,返回的陣列大小根據傳入的引數範圍而變化。這個自定義函式是用來排序的,比如對員工年齡,學生分數等等。期望的引數是至少兩列的單元格範圍,引數的第一列是識別符號,比如姓名,工號等等,引數的最後一列是要排序的數值。返回的陣列為兩列,行數根據傳入的引數變化。返回陣列的第一列即傳入引數的第一列,返回陣列的第二列即傳入引數的最後一列,返回的陣列裡面的資料已經排過序。

function mysort(cells as range)

dim x as integer

dim y as integer

dim i as integer

dim j as integer

dim workcells()

x = cells.rows.count

y = cells.columns.count

redim workcells(1 to x, 1 to 2)

for i = 1 to x

workcells(i, 1) = cells(i, 1)

workcells(i, 2) = cells(i, y)

next i

dim temp

for i = 2 to x

temp = workcells(i, 2)

j = i - 1

do while (workcells(j, 2) > temp)

workcells(j + 1, 2) = workcells(j, 2)

workcells(j + 1, 1) = workcells(j, 1)

j = j - 1

if j < 1 then

exit do

end if

loop

workcells(j + 1, 2) = cells(i, y)

workcells(j + 1, 1) = cells(i, 1)

next i

mysort = workcells

end function

最後補充一下,返回的陣列應該定義為兩維的,單維的陣列在填充單元格的時候有問題。

在 Excel 中編寫自定義函式 基礎篇

工作中經常在 excel 中使用公式,很多問題不是乙個函式可以解決的,往往是很多函式巢狀在一起。熟練以後,輸入很長很長的公式倒也不是什麼難事,就當是一次腦筋鍛鍊。但是閱讀上到底有點不方便,尤其是隔了很長時間再去看這個公式,又是一次腦筋鍛鍊,不如把工作中解決實際問題常用到的函式組合包裝成單一的自定義函...

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

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

Excel 自定義函式

假設我們在excel中有以下需求 你可以巢狀使用if函式,判斷每乙個分數屬於哪乙個區間。但是,4層if會不會很容易出錯 如果是5個區間,甚至是10個區間呢?巢狀使用10個if不太現實,也很容易出錯吧。其實在excel中,我們可以自定義自己的函式,使用vb實現 下面的內容就介紹如何在excel中新增自...