VBA應用經驗:工作表函數和VBA代碼,你選擇哪種方案?

2020-12-11 VBA語言專家

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代碼解決方案》時要理解,以實際的問題為切入點,要綜合的考慮問題,千萬不要片面。

相關焦點

  • vba第十八課
    vba第十八課調用工作表函數在vba中我經常會對工作表的數據進行一些運算,雖然通過代碼進行循環或判斷也可以完成,但是通vba調用函數可以更簡單更直接進行運算提高代碼的運行效率,比如countif、sumif等需要進行判斷統計和求和的運算。
  • VBA與函數公式的一生一世,若如初見,怎奈何不再見
    在上一個章節中我們說到循環和Goto語句的使用,今天正式起航細節類的知識點,相信經過你前面的學習和積累,現在已經初步具體看懂一個簡單的代碼和寫一個簡單的代碼的能力了。因此今天和您分享的是如何在VBA中間使用函數公式和他們的前世今生。
  • excel VBA是什麼?VBA編程入門教程
    VBA是一種面向對象的解釋性語言,通常使用來實現Excel中沒有提供的功能、編寫自定義函數、實現自動化功能等。學會之後,你會愛上它,因為它真的很有趣。而且實用起來很高大上,還可以在小白面前炫耀炫耀。原來需要自己添加),然後在代碼選項卡中點擊【Visual Basic】 即可,如下圖所示:
  • VBA代碼解決方案第49講:VBA代碼中工作表函數SUM的利用方法 - VBA...
    大家好,我們今日繼續講解VBA代碼解決方案的第49講內容(註:在整理之前的VBA系列文章中合併了一些文章,重新成集排序為第49講,所以從這篇文章開始以新的排序計算):VBA中SUM函數的利用方法。在對工作表的單元格區域進行求和計算時,使用工作表Sum函數比使用VBA代碼遍歷單元格進行累加求和效率要高得多,我們在熟悉了基本的代碼規則後,就要把重點放在優化程序上,這點非常重要,在一般的簡單運算中或許體會的不是很深,在資料庫的操作中這點非常的明顯。SUM函數就是優化程序的一個方法。我們看下面的代碼。
  • Excel vba工作表事件【實現快速自動隱藏工作表】
    後來編寫了如下代碼,其中我把字符「X」優化了一下,利用數據有效性,每個工作表名稱後面為隱藏和不隱藏兩個選擇:Target.Row)    If Target.Column = 4 AndRange("D" & Target.Row) = "隱藏" Then        Worksheets(m).Visible = 0 『實現工作表隱藏的核心代碼
  • VBA代碼大全010:用vba遍歷文件夾及其子文件夾內的文件
    vba老手都知道,vba寫多了,其實都是在做循環。循環處理多個單元格的內容,循環處理多個工作表的內容,循環處理多個工作簿的內容。
  • 運用Excel-vba合併工作表數據
    如下圖,工作簿中共有以下幾個工作表,現希望將各張工作表中的數據合併在一起。1.打開vba編輯器:右鍵單擊任意工作表,選擇「查看代碼」。2.輸入代碼:雙擊"ThisWorkbook",在代碼窗口中輸入以下代碼:Sub 合併當前工作簿下的所有工作表()Dim ws As WorksheetDim sh As Worksheet, i%
  • Excel VBA 批量匯總多個工作表,您只需要在一瞬間完成
    今天主要和大家介紹的是,我們如何在Excel中使用vba代碼來完成多個工作表的匯總工作。在某些時候,我們經常需要處理如下圖的工作表數據匯總工作,將其他月份的數據統一匯總到同一個工作表中。大多數人都是用手動粘貼複製來完成這個重複性的工作,那麼在你學習了本篇,你就會用更高的效率去完成這個事情了。
  • Excel VBA 實例(22) - 一鍵篩選其他工作表或工作簿的數據
    今天說的這個vba實例還是和學校有關。
  • VBA代碼大全030:用vba強制關閉word應用程式
    這時候一般的套路都是在excel vba中創建word應用程式實例,然後一番操作以後關閉word應用程式。oWord.QuitEnd Sub這裡會有個問題,就是最後的 oWord.Quit 好像是把word應用程式關閉了,但是事實上往往經常是關閉不成功的,如果打開系統任務管理器,會發現實際上word.exe進程仍然存在。
  • Excel VBA常用代碼!
    前兩天有兩位朋友留言想收集一些VBA的常用代碼,今天開始會陸續分享一些!記得收藏好哦,因為今後你應用到稍大型Excel VBA程序時,這其中某些代碼肯定會用到。來看看都是哪些常用代碼:下面先舉一個簡單的例子:場景再現:在當前的工作表中插入一張e盤中名為1.jpg的圖片(長350、高300,距離Excel左側90、上邊框230)操作方法:第一步,打開vba代碼區
  • 排序法,函數法,vba 你更喜歡哪種?
    當然製作工資條的方法有很多,比如排序法,函數法,vba 或錄製宏,還有以前的郵件合併法。製作的武器庫各種槍炮齊全,我們仍然需要努力學習,常學常新。然後使用CHOOSE函數,以此為索引值,依次返回空文本""(空白行)、工資表!$A$1:$F$1(標題)和OFFSET(工資表!$A$1:$F$1,ROW(1:1)/3+1,)的計算結果。其中OFFSET函數部分的作用是,以第一行為基點,公式每下拉三行,引用的行數向下偏移一行。
  • VBA代碼解決方案之二十二:EXCEL中如何選擇一個或多個工作表
    各位朋友好,在上一講VBA代碼解決方案之二十一中,我們講了如何引用工作表的方法,今日我們講如何選擇工作工作表的方法,在選擇工作表時有選擇單個工作表和選擇多個工作表兩種方案,今日會分別講解:一 選擇單個工作表的方法
  • VBA工作表事件實現「聚光燈效果」
           VBA工作表事件實現           「聚光燈效果」▶用工作表事件,三句核心代碼就可以實現。將如下代碼放在sheet1的VBE界面下。
  • vba編程常用英文單詞100個
    vba編程常用英文單詞100個大家好,部分朋友在公眾號留言,建議把vba
  • 使用VBA代碼完成判斷工作表是否存在及刪除工作表的方法
    大家好,今日內容仍是和大家分享VBA編程中常用的簡單「積木」過程代碼,這些內容大多是取至我編寫的「VBA代碼解決方案」教程中內容。NO.174-NO.175內容是:NO. 174:如何利用VBA代碼,判斷是否為空表,如果為空表則使用Delete方法刪除NO. 175:利用VBA的自定義函數,判斷工作表是否存在 VBA過程代碼174:如何利用VBA代碼,判斷是否為空表,如果為空表則使用Delete方法刪除
  • Excel VBA入門教程 1.6 過程和函數
    調用 Sub 過程的是一個獨立的語句,而調用函數過程只是表達式的一部分。另外,自定義函數並不允許修改工作表和單元格格式 (A UDF will only return a value it won't allow you to change the properties of a cell/sheet/workbook. )。
  • Excel VBA 中是如何處理單元格呢?複製或者移動,你真的了解她嗎
    複製單元格區域我們還是通過錄製宏來說明我們操作的複製和粘貼代碼的應用吧!相信錄製宏操作你肯定已經會了,我們就不在細說了,如下為我們錄製的代碼:當然我們可以看到錄製是非常傻瓜的代碼,他有很多的選擇代碼,我們可以精簡一下,因為在vba中不需要選擇就可處理執行。我們更改的代碼如下:是不很簡單的啦!
  • VBA代碼用SetFocus精確控制焦點事件
    VBA++ 題記: 靜下心,多學習有用的知識,多提高自己的水平和能力,這才是正道。時間就像一張網,你撒在哪裡,你的收穫就在哪裡。謹記自己的方向,這是路之所在。適當節制自我的各種欲望,誰都逃不過時間的歷練,誰都是命運的行者,誰都是在人生的道路上一步一趨。你要做的,是悄悄地去努力,等你變厲害之後,把自己也嚇一跳,才是你現在需要當作目標的事。
  • 利用VBA代碼將文本轉換為數組函數
    今日繼續和大家分享VBA編程中常用的常用「積木」過程代碼。這些內容大多是我的經驗的記錄,來源於我多年的經驗。>MyNZ過程使用Split 函數將工作表Sheets("21")中A1單元格的姓名分別寫入到工作表Sheets("20")中的A列單元格。