VBA在Excel中實現自定義的Sum函數

2020-11-30 IT168

    【IT168 論壇採風】在Excel電子表格中最常使用的函數應該是Sum了,它是內置的;當然,在Excel中內置的函數還有很多;但是,往往我們使用的函數Excel中並沒有直接提供,或者提供了我們並不知道,這個時候可以自己使用VBA定義一個自己需要使用的函數參與電子表格單元格的計算,這在日常工作中可能是經常要遇到的一個問題。下面,討論如何實現一個自定義的具有合計功能的函數,由於Sum函數系統已經內置,我們要實現的函數不妨命名為udSum。

相關精彩文章

    首先,想到的應該使用VBA,毫無疑問,最直接的針對Excel功能的擴展來源於VBA。事實上,我們可以在Excel的Microsoft Visual Basic編輯器的模塊中增加一個公共函數來實現該自定義函數,該公共自定義函數是可以在Excel單元格中直接像使用Excel內置函數一樣使用的。

    使用菜單「工具——宏——Visual Basic 編輯器」 打開Microsoft Visual Basic編輯器窗口;
在「工程」瀏覽器窗口中的樹狀目錄的任一項目上單擊右鍵,使用「插入——模塊」命令;OK,在這個模塊編輯器中,即可以開始編輯自定義函數了。     

    在此之前,我們應該考慮該函數的參數形式,和內置的Sum函數進行類比,我們可以發現Sum函數的參數應該是一個或多個單元格,而在VBA中對應的就應該是一個Range對象(關於Range對象可以參考Microsoft Visual Basic幫助中的Excel VBA對象模型),也就是說我們要自定義的函數的參數應該是一個Range對象,由此,我們可以在「模塊1」的編輯器中自定義一個如下的函數: 

 1    Public Function udSum(r As range) As Double
 2
 3    Dim i As Integer
 4    Dim j As Integer
 5    Dim rtn As Double
 6       
 7    rtn = 0
 8           
 9    For i = 1 To r.Rows.Count
10        For j = 1 To r.Columns.Count
11            rtn = rtn + r.Cells(i, j)
12        Next j
13    Next i
14   
15    udSum = rtn
16   
17    End Function

    函數很簡單,遍歷Range對象的所有單元格,使其中的數字相加後返回即可。

    保存更改後,返回到工作簿Book1界面,在連續的單元格(如B2:C3)中錄入幾個數字,然後在另外一個單元格(如E4)中錄入「=udSum(B2:C3)」,也就是說,我們使用我們自定義的合計函數udSum來計算區域B2:C3中的數字之和。經過驗證,我們可以發現udSum可以實現內置函數Sum的合計功能。另外,由於udSum函數接受的參數是一個Range對象,所以該函數也可以這樣調用=udSum(testRegion),當然在當前工作表中應該實現定義一個名稱「testRegion」用於表示一個特定的單元格區域。

    在上面的描述中,我們可能也注意到了,udSum函數的參數是一個連續的單元格區域,而內置的Sum函數是可以以多個參數的形式接受不連續單元格區域中的數據,如=Sum(B2:C3,B5:C6,B8:C9)。也就是說,我們應該修改函數udSum,使其可以接受不定數量的多個參數,這個需要使用到VBA的ParamArray特性。修改後的自定義函數udSum如下所示:

 1    Public Function udSum (ParamArray x()) As Double
 2   
 3    Dim i As Integer
 4    Dim j As Integer
 5    Dim k As Integer
 6    Dim rtn As Double
 7
 8    rtn = 0
 9       
10    For i = 0 To UBound(x)
11        For j = 1 To x(i).Rows.Count
12            For k = 1 To x(i).Columns.Count
13                rtn = rtn + x(i).Cells(j, k)
14            Next k
15        Next j
16    Next i
17       
18    udSum = rtn
19   
20    End Function
21
   

   可以注意到,修改後的函數的參數沒有指定類型,未明確指定的數據類型被作為Variant類型處理,此處顯示的類型顯然應該是Range,即一個Range對象的數組,然而由於VBA中ParamArray必須聲明為變體數組,故此處只能以變體類型出現,但在函數主體中,我們還是將其作為Range數組處理,遍歷該數組中的所有不連續區域中的所有單元格,並將其中的數組相加後返回即可。

    至此,我們可以這樣使用類似於=Sum(B2:C3,B5:C6,B8:C9)的公式了。也就是說,我們已經實現了一個和內置Sum函數一樣功能的自定義函數了。

    當然,這篇隨筆的目的不僅是如何實現一個合計函數,而是討論關於自定義函數的實現過程,舉一反三之後,可以解決很多平時可能遇到的問題。

更多熱點:Photoshop教程 ASP入門教程 視頻教程 圖片教程 開發速查手冊

相關焦點

  • excel函數公式大全之利用SUM函數IF函數的嵌套把成績劃為三個等級
    excel函數公式大全之利用SUM函數和IF函數的嵌套把學生成績劃為三個等級。excel函數與公式在工作中使用非常的頻繁,會不會使用公式直接決定了我們的工作效率,今天我們來學習一下提高我們工作效率的函數SUM函數和IF函數。
  • 用excel製作文件管理器,所有版本皆可使用
    Hello,大家好,之前跟大家分享了使用excel中的power query功能製作一個文件管理器,但是很多分析反應自己的excel版本不夠高,無法使用,今天就跟大家分享如何使用宏表函數製作文件管理器,他也是可以實現文件刷新的,這個的操作也不難,下面就讓我們來看下他是如何設置的一、什麼是宏表函數以及FILES函數宏表函數是早期低版本excel的產物
  • 掌握這7條excel函數,自動化生成數據周報上篇
    excel的二八原則曾經在面試時候被問到VLOOKUP和HLOOKUP有什麼區別,我回答的是前者是以列匹配,後者是以行匹配。面試完我一個勁兒後悔沒有回答好,對這個函數不熟悉,回答太簡單。諷刺的是已經過去好幾年,我卻一次未用到過HLOOKUP。所以真的沒必要抱著一本excel大全在那挨個學函數,浪費時間。
  • excel中的替代函數——replace和substitute函數的應用實例
    在excel中,常用的替換函數有replace和substitute函數,這兩個函數都可以替換單元格中的部分內容,功能和ctrl+H的功能類似,但是使用函數的目的一方面不會破壞原數據,另一方面與其他函數結合可以實現更多功能,對於substitute的參數=substitute(單元格,被替換的字符串,新字符串,指定替換第幾個),第四個參數可以省略,表示全部替換。
  • WPS-Excel表格sumproduct函數一次性算出相乘相加總額
    excel表格單純相加或者相乘大家都會應用,但是有時候我們需要算出相乘相加的總額,這種計算也是可以一次性算出的。今天來教大家怎樣在WPS表格中,讓數據一次性算出相乘相加的總額,會了這個小技巧,會方便很多。實例、算出第二周總銷售額。
  • Excel函數sum、large、small、count和數組在案例中的組合用法
    今天的內容,我們將引入更多的Excel函數來加入其中,比如函數sum,函數small,函數count,還有昨天用到的函數large。現在我們就通過實例的形式,一步步腳踏實地地來調用上述函數來解決實際案例的問題。
  • Excel 公式之 SUM 統計函數
    2、SUMIF 條件求和,主要是先分析數據達到指定的條件後才進行統計函數語法:=SUMIF(range,criteria,[sum_range])如下圖所示,使用 SUMIF 函數分別統計主操及輔助崗位的補助總和函數方法:=SUMIF(C2:C11,"主操",D2:D11)函數說明 SUMIF(range,criteria,[sum_range
  • excel函數公式大全之利用LARGE函數和SUM函數提取前五名銷售額
    excel函數公式大全之利用LARGE函數和SUM函數提取前五名銷售額,excel函數與公式在工作中使用非常的頻繁,會不會使用公式直接決定了我們的工作效率,今天我們來學習一下提高我們工作效率的函數LARGE函數和SUM函數。
  • VBA代碼解決方案第49講:VBA代碼中工作表函數SUM的利用方法 - VBA...
    對多個單元格求和,是統計工作中非常普遍的工作,在之前的函數講解過程中,我下了很大的氣力來講解SUM函數及其衍生的函數,在數組的講解中也講了此函數在數組中的利用,可以說SUM函數在統計工作中起著舉足輕重的作用,如果把這個函數利用好了,對自己的工作是非常方便的,今日我在VBA中就此函數的利用及規律再次加以講解。
  • 工作中為什麼有必要學點VBA
    從office97開始,VBA作為MS的標準內置配置,彌補了excel內在的基本函數不足以支持的複雜計算,提供了一種相對輕量級的、所見即所得的解決方案,濤哥在21世紀初因內部工作需要(統計代碼行數記工作量)第一次接觸了VBA,並在以後的工作中多次出色的完成相關任務,甚至給濤嫂編的幾個小程序大大提升了她們的工作效率,還受到了時任行長的讚許,現在想來還歷歷在目。
  • excel函數公式大全利用max函數min函數找多個數值的最大值最小值
    excel函數公式大全利之用max函數min函數找多個匯總數據的最大值和最小值,excel函數與公式在工作中使用非常的頻繁,會不會使用公式直接決定了我們的工作效率,今天我們來學習一下提高我們工作效率的函數max函數和min函數。
  • 使用vlookup解決自定義排序的問題,原來自定義排序竟如此簡單
    Hello,大家好,今天跟大家分享下如何自定義排序,實現想怎麼排序就怎麼排序,工作中我們可能會遇到這樣的問題,就是要根據給定的數據位置進行排序,如果我們直接使用排序excel會根據默認的排序規則進行排序,而不能達到我們想要的結果,解決這樣的問題,跟大家分享2種方法,一種是使用自定義排序,一種是使用
  • excel函數利用ROUNDDOWN函數ROUND函數ROUNDUP函數進行四捨五入
    ,excel函數公式大全之利用ROUNDDOWN函數ROUND函數ROUNDUP函數對數字進行向下捨入、四捨五入、向上捨入操作,excel函數與公式在工作中使用非常的頻繁,會不會使用公式直接決定了我們的工作效率。
  • Excel函數large、與數組在實際案例中的聯合運用
    在講述這些數組計算的過程,我們也穿插了一些簡單的函數的使用方法,比如函數randbetween、函數sumproduct等,另外由於我們在生活和學習當中可能更習慣於去數值之間的計算,而忽視了對數組計算方法的學習,所以在之前的文章當中,一直在將數值計算和數組計算進行比較。
  • 如何在Keras中創建自定義損失函數?
    Keras 中的自定義損失函數可以以我們想要的方式提高機器學習模型的性能,並且對於更有效地解決特定問題非常有用。例如,假設我們正在構建一個股票投資組合優化模型。在這種情況下,設計一個定製損失函數將有助於實現對在錯誤方向上預測價格變動的巨大懲罰。
  • Excel中的單條件計數函數countif
    COUNTIF函數會統計某個區域內符合您指定的單個條件的單元格數量,記得函數返回值是滿足給定條件的單元格的數量。例如,我們可以計算以某個特定字母開頭的所有單元格的數量,或者可以計算包含大於或小於指定數字的所有單元格的數量。
  • excel數組和函數sumproduct在乘積求和運算中的實際運用
    D6單元格中使用函數sum,輸入公式「=SUM(D2:D5)」,按回車鍵後就能得到計算的結果。說道最後計算銷售總額的問題,我們接下來就順便介紹了一個函數,這個函數同樣也能解決這個問題,只是其公式的形式會有些許不同。2.函數sumproduct的用法
  • Excel用Sum函數實現多表同位置與數字帶單位及新增數據後自動求和
    無論是哪種情況,都可能遇到數字帶單位或空格的情況,此時,需要先把單位或空格去掉再求和,這就需要用到 Left、Find、Trim、Clean、Substitute 等函數;另外,可能還會遇到在表格中新增加數據後要求自動求和,這需要用Sum與OffSet和CountA函數組合實現。以下就是它們的具體實現方法,共有5個實例,實例操作中所用版本均為 Excel 2016。
  • excel函數公式大全之利用ROUND函數FLOOR函數實現特定條件的捨入
    excel函數公式大全之利用ROUND函數FLOOR函數實現特定條件的捨入,excel函數與公式在工作中使用非常的頻繁,會不會使用公式直接決定了我們的工作效率,今天我們來學習一下提高我們工作效率的函數ROUND函數FLOOR函數,利用ROUND函數FLOOR函數實現特定條件特定數值的捨入。