VBA是我們工作中,特別是對於長期與數據打交道、用EXCEL較多的朋友而言,是非常值得利用的一種工具,甚至說是可以起到立竿見影的效果,也不為過。之前用幾小時甚至一天的工作,在用了VBA後可以在幾分鐘甚至幾秒鐘來完成。這種體驗有朋友告訴我說就是一個字"爽"。每當我看到這些朋友的回覆時,真是由衷得高興。能引導大家走上方便工作的大路也是我最為高興的事。
很多朋友在學習VBA的過程中,確實很下功夫,其中新入職場的年輕人,有近不惑之年的朋友,也有和我一樣快50歲的朋友,甚至還有比我大的朋友,都在一起努力著。為了讓自己的工作更出色,為了讓可以節約出時間陪父母和親人,都在嘗試努力著。我的宗旨是不變的:分享成果,隨喜正能量,就是把我20多年的VBA成果分享給需要的朋友,隨喜正能量給同路人.我會把我的經驗無保留的給大家.
今天和大家說的是EXCEL函數和VBA代碼實現同一個目的誰優先的問題。最近很多朋友在糾結於這個問題,那麼我給大家指導一二。
一 什麼是EXCEL函數,和VBA函數的區別
1什麼是EXCEL函數呢?就是我們平時在EXCEL工作時用到的函數,如SUM () SUMIF() COUNT() COUNIF() 等等,
2 什麼是VBA函數呢? 就是我們在VBA中可以直接利用的函數,這類函數比較少:如isdata ,isempty,isnumeric等等
3 EXCEL函數(下面稱為工作表函數)和VBA函數的聯繫;有些函數是可以通用的 如TRIM() LEFT() RIGHT() 等;有些是不可以通用的,如SUM() SUMIF 。
二: 有沒有辦法在VBA中利用工作表函數呢?在《VBA代碼解決方案》第二冊中我專門的講到這個問題:
在第49講中我講到:
這講中我給出了了工作表函數,的普遍應用方法代碼,如:
Set rng = Range("A1:H10")
d = Application.WorksheetFunction.Sum(rng)
或許正是這節內容的作用,很多的朋友在VBA代碼中編寫時常常採用工作表函數,而放棄了一些基本的VBA變量判斷的方法,其實,這是有所偏見的。
這裡需要提醒大家幾點:
1我在《VBA代碼解決方案》中突出講的是程序運行的效率,其實在我們實際工作中,大多在運算效率上的要求並沒有太高,無非是幾秒鐘的差異,完全可以不用考慮,
2 工作表函數在應用時各個參數有著非常嚴格的要求,不能出錯。
3 工作函數在VBA中的表示和EXCEL中是不同的.
4 在VBA中,採用工作表函數還是變量的判斷,需要較為靈活的運用。
三 下面我們結合實際看看為了達到我們的目的,工作表函數和VBA代碼中變量求解的方案有什麼不同。
實例:如下的工作表,求數據1和數據2相乘後的和。
方案一:利用工作表函數在工作表中實現:這時在D7單元格中錄入公式:=SUMPRODUCT(A2:A6,B2:B6) 即可實現:
方案二:在VBA中利用工作表函數實現,函數要用WorksheetFunction為開頭的,如下:
Sub SumProduct()
Range("d8") = WorksheetFunction.SumProduct(Range("A2:A6"), Range("B2:B6"))
End Sub
運行後的結果,在D8的單元格顯示了最後的結果:225,這時要注意表示單元格名稱的變化,前面加上了range().下面為運行的結果;
方案三: 那麼還有沒有其他的辦法呢?有的,用VBA變量求和來實現。我們看代碼:Sub SumProduct2()
i = 2
k = 0
Do While Cells(i, 1) <> ""
k = k + Cells(i, 1) * Cells(i, 2)
i = i + 1
Loop
Range("d9") = k
End Sub
代碼截圖:
最後看運行的結果:
方案四:還有沒有其他的辦法呢?如果你熟悉了《VBA代碼解決方案》你一定會想到了第一冊:
下面我們看看用這講的內容來完成我們的要求:
代碼:
Sub SumProduct3()
Range("d10").Formula = "=SUMPRODUCT(A2:A6,B2:B6)"
End Sub
代碼截圖:
看看運行的結果:
上述的四種方案給大家都列出來了,不知讀者是認可哪一種方案呢?
其實我們不要拘泥於任何的固定模式,要實際問題實際分析,不要一味地追求運行的效率而忽視了我們的真正目的。在我的經驗中,如果能在工作表中解決的在工作表中解決,如果需要複雜的函數,涉及到的參數很複雜的,就要發揮代碼變量的作用,來達到目的。
所以大家在學習《VBA代碼解決方案》時要理解,以實際的問題為切入點,要綜合的考慮問題,千萬不要片面。