一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

#Excel公式與函數#4.SUMPRODUCT函數詳解(4)

 L羅樂 2016-10-14

完美Excel公眾號:excelperfect

本文資料來源于xlDynamic.com,供參考。

VBA中的條件統(tǒng)計和求和

到目前為止,我們關于條件公式的所有討論都是直接在Excel工作表中。有時,我們需要在VBA程序中對一些工作表單元格進行條件統(tǒng)計和求和。在這些情形下,編寫簡單的循環(huán)來遍歷所有數據并檢查它們是否與條件相匹配,統(tǒng)計匯總相匹配的項。

Excel VBA允許在程序中調用內置的工作表函數,避免讓我們再重復創(chuàng)建這些功能,極大地改善了VBA代碼的能力。當在VBA中調用Excel函數時,如果不過度使用,那么任何的性能影響應該是最小的,優(yōu)勢也很明顯。我們能夠利用這種優(yōu)勢很容易地在VBA中獲取條件統(tǒng)計和求和,但是要注意一些事項。

作為示例,考慮下表中的數據(與上文中表相同)。

如果需要使用VBA程序求單元格區(qū)域A1:A10有多少“Ford”,程序代碼如下:

Dim mModel As String

Dim mCount As Long

mModel = 'Ford'

mCount =Application.WorksheetFunction.CountIf(Range('A1:A10'), mModel)

此時,”Ford”的數量將被賦值給mCount變量,其值為4。

同樣,我們可以使用SUMIF來計算”Ford”所對應的價格和:

Dim mModel As String

Dim mValue As Long

mModel = 'Ford'

mValue =Application.WorksheetFunction.SumIf(Range('A1:A10'), mModel,Range('C1:C10'))

此時,”Ford”相對應的價格之和被賦值給變量mValue,其值為33873

接下來,假設我們能擴展這種技術到上文中已討論的多條件測試公式。例如,統(tǒng)計在六月份(June)銷售了多少Ford,代碼如下:

Dim mModel As String

Dim mMonth As String

Dim mCount As Long

mModel = 'Ford'

mMonth = 'June'

mCount =Application.WorksheetFunction.CountIfs(Range('A1:A10'), _

mModel, Range('B1:B10'),mMonth)

代碼將結果3賦值給變量mCount。不幸的是,這項技術不能被擴展到數組公式或者條件測試SUMPRODUCT公式。

例如,下面是統(tǒng)計在五月(May)有銷售了多少Ford的公式:

=SUMPRODUCT((A2:A10=”Ford”)*(B2:B10=”Feb”))

你可能想使用下面的VBA代碼得到相同的結果:

Dim mModel As String

Dim mMonth As String

Dim mCount As Long

mModel = 'Ford'

mMonth = 'May'

mCount =Application.WorksheetFunction.SumProduct( _

Range('A1:A10') = mModel,Range('C1:C10') = mMonth)

然而,在編譯時會得到錯誤消息。在這種情況下,VBA試圖簡單地調用工作表函數,但并不會評估單元格區(qū)域并傳遞正確的數組信息到工作表函數中。

下面是該問題的解決方案。在VBA中使用Evaluate方法評估函數調用,轉換Excel名稱為值。代碼如下:

Dim mModel As String

Dim mMonth As String

Dim mFormula As String

Dim mCount As Long

mModel = 'Ford'

mMonth = 'May'

mFormula ='SUMPRODUCT((A1:A10=''' & mModel & _

''')*(B1:B10=''' & mMonth &'''))'

mCount = Application.Evaluate(mFormula)

雖然需要更多的努力來確保合適地構建函數調用的正確語法,并且合適地使用引號來確保字符串被引號括住,但是這仍然是一項有用的技術,提供了在VBA中使用SUMPRODUCT函數的能力。

Excel 2007及以上版本中的SUMPRODUCT

Microsoft引入Excel 2007時,主要集中在容易使用以及改善商務分析功能。不幸的是,工作表函數沒有得到太多的關注,只是引入了一些新的函數,其中的兩個新函數:COUNTIFSSUMIFS支持多條件測試。

例如,在我們前面的示例中:

=SUMPRODUCT((A1:A10=”Ford”)*(B1:B10=”June”))

=SUMPRODUCT((A1:A10=”Ford”)*(B1:B10=”June”)*(C1:C10))

我們統(tǒng)計單元格區(qū)域A1:A10中的內容為“Ford”并且單元格區(qū)域B1:B10中的內容為June的項目數,以及統(tǒng)計單元格區(qū)域A1:A10中的內容為“Ford”并且單元格區(qū)域B1:B10中的內容為June并將單元格區(qū)域C1:C10相應單元格求和。在Excel 2007及以上版本中,可以使用COUNTIFS函數和SUMIFS函數代替SUMPRODUCT函數,相應的公式為:

=COUNTIFS(A1:A10,”Ford”,B1:B10,”June”)

=SUMIFS(C1:C10,A1:A10,”Ford”,B1:B10,”June”)

Excel 2007中,SUMPRODUCT函數的改進是可以取整列的地址。在Excel開發(fā)者工具庫中,SUMPRODUCT函數仍然保留著其獨特的位置,因為COUNTIFS函數和SUMIFS函數仍然不能夠計算已關閉工作簿中的值。

性能分析

雙目運算符(--)與*運算符

在大多數情形下,可以使用SUMPRODUCT函數的“*””--“版本,并且都能得到正確的功能。然而,也有一些例外??紤]在單元格區(qū)域A1:B10中是一個包含姓名和數量的表,其中第一行是文本標題“Name”“Amount”。公式:

=SUMPRODUCT(--(A1:A10=”Bob”),--(B1:B10)>0),B1:B10)

將正確地計算列A中姓名是“Bob”且列B中為正值的和。然而,公式:

=SUMPRODUCT((A1:A10=”Bob”)*(B1:B10>0)*(B1:B10))

將返回#VALUE!錯誤。錯誤的原因是由于B1中是文本,乘以文本值導致錯誤。為了解決錯誤,單元格區(qū)域不能含標題單元格,應以單元格A2B2開始。

類似地,如果公式中的一個或多個單元格區(qū)域包含多列,則必須使用“*”運算符,而下面的公式將不能運行:

=SUMPRODUCT(--(A1:A10=”Bob”),--(B1:C10>0),--(B1:C10))

下面的公式工作得很好:

=SUMPRODUCT((A1:A10=”Bob”)*(B1:C10>0)*(B1:C10))

事實上下面的公式也可以:

=SUMPRODUCT((A1:A10=”Bob”)*(B1:C10>0),B1:C10)

使用轉置

如果在SUMPRODUCT函數中使用TRANSPOSE函數,那么必須使用“*”運算符。

公式效率

很多人都知道使用數組公式要付出高的代價,如果過多地使用將明顯減弱工作表/工作簿的重新計算速度。

雖然SUMPRODUCT函數不是數組公式,然而它也面臨同樣的問題。雖然SUMPRODUCT函數通常比等價的數組公式更快,但與數組公式一樣,SUMPRODUCT函數比COUNTIF函數和SUMIF函數更慢,因此如果合適的話使用這些函數會更好。

因此,在下面的情形下,不要使用SUMPRODUCT函數:

=SUMPRODUCT((A1:A10=”Ford”)*(C1:C10))

而是使用等價的SUMIF函數:

=SUMIF(A1:A10,”Ford”,C1:C10)

甚至兩個COUNTIF函數或SUMIF函數都比一個SUMPRODUCT函數更快,因此下面的公式:

=COUNTIF(A1:A10,>=10)-COUNTIF(A1:A10,>20)

比下面的公式更有效率:

=SUMPRODUCT((A1:A10>=10)*(A1:A10<=20))

大致提高20%

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    日韩欧美一区二区不卡看片| 国产免费无遮挡精品视频| 亚洲精品欧美精品一区三区| 亚洲中文在线观看小视频| 三级理论午夜福利在线看| 美女被啪的视频在线观看| 九九热国产这里只有精品| 老司机精品在线你懂的| 中日韩免费一区二区三区| 翘臀少妇成人一区二区| 日韩美成人免费在线视频| 黄色国产一区二区三区| 91偷拍与自偷拍精品| 五月激情婷婷丁香六月网| 欧美在线观看视频免费不卡| 欧美精品一区二区水蜜桃| 亚洲中文在线中文字幕91| 亚洲国产av精品一区二区| 国产欧美日产久久婷婷| 东京干男人都知道的天堂| 成人免费高清在线一区二区| 日韩精品亚洲精品国产精品| 亚洲中文在线观看小视频| 国产中文另类天堂二区| 日韩美女偷拍视频久久| 久久99午夜福利视频| 国产一区二区精品高清免费 | 欧美日韩国产精品黄片| 久久99青青精品免费观看| 国产一区二区三区免费福利| 精品亚洲av一区二区三区| 免费一级欧美大片免费看| 免费福利午夜在线观看| 国产精品成人一区二区三区夜夜夜 | 深夜少妇一区二区三区| 久久99精品国产麻豆婷婷洗澡| 精品一区二区三区中文字幕 | 国产综合欧美日韩在线精品| 日本人妻丰满熟妇久久| 国产精品熟女在线视频| 人人妻在人人看人人澡|