VBA 代碼程序運行時間的優化與視覺效果的兼顧

2020-12-27 VBA語言專家

在《VBA代碼解決方案》一書完結後,我寫了《VBA程序調試》一文,在文章中,我著重講了如何進行程序的調試,這篇文章的內容其實是很深的,為了讀者能更好地領會其中的意思,我將就幾個重點的部分內容再做側重地解釋,這些內容和我編程搭積木的思想是一脈相承的,希望給朋友分享些有用的經驗。

程序的編寫過程中,在第二冊的85講到89講,我講了程序優化的問題,其實在這些章節中,我也一直在講視覺和程序運行時間的兼顧問題。我在做程序的時候,往往注重的是前者,而不是後者,為什麼呢?其實VBA帶給我們的就是實用,真正要求做到節約時間往往是那些大型程序考慮的範疇,正如我在講到VBA地位時的比喻,那些大型程序是城市與城市之間的高鐵啊、火車啊、飛機啊,而VBA只是連接車站到家之間的汽車、電動車,當你考慮大型數據處理時最好要藉助大型程序,如Python、PHP、GO、JAVA等等,從嚴格意義上講,VBA不能稱之為一種獨立的語言體系,只是寄生於OFFICE的一條寄生蟲,但你不要小看它,這部分交通運行不順暢,也會引起城市的擁堵,工作效率的低下。

所以,我們在工作中主要考慮的是視覺的效果,其次才是時間的節約。如何做到視覺的愉悅呢?下面我就來就一段實際的程序和大家分享。今天的程序讀者也可以作為一個工具利用。

需求:建立一個工作薄1,寫入代碼,代碼執行首先打開另外一個指定工作薄2,把其中工作表sheet1中A,B列的內容寫入數組,然後關閉工作薄2,回到工作薄1,把數組數據保存到工作表1的CD列中。

這個案例在實際工作中會經常用到,或者類似的應用非常多,大家可以記住下面的代碼。

要利用到的知識點:

1 工作薄的打開;

2 數據寫入數組;

3 數組數據的導出。

今天我利用到了《方案》第三冊第113講的內容,將一個工作薄中工作表的數據寫入數組,然後導出,看下面的代碼截圖:

代碼:

Sub mynzkk()

Dim a(5000, 2)

Workbooks.Open Filename:=ThisWorkbook.Path & "\工作表.xlsx" '打開一個指定存儲數據的工作薄

Workbooks("工作表.xlsx").Activate '讓數據的工作表處在激活狀態

MsgBox ("數據已經打開,是否繼續?") '判斷是否繼續

Sheets("SHEET1").Select

k = 0

i = 1

'數組,並賦值

Do While Cells(i, 1) <> ""

k = k + 1

Cells(i, 1).Select

a(k, 1) = Cells(i, 1) '寫入數組

a(k, 2) = Cells(i, 2)

i = i + 1

Loop

Workbooks("工作表.xlsx").Close '關閉數據工作薄

Workbooks("工作簿1.xlsm").Activate '讓主程序的工作薄處在激活狀態

Sheets("SHEET1").Select

[C1:D65536].Clear '清除原有數據

MsgBox ("下面將寫入數據,請確認!")

For i = 1 To k

Cells(i, 3).Select

Cells(i, 3) = a(i, 1)

Cells(i, 4) = a(i, 2)

Next

MsgBox ("OK!")

End Sub

代碼講解:上述代碼中,為了照顧到視覺,我加了四條語句如下所示:

目的:

1 讓程序的運行可視,操作者可以隨時知道程序運行到了哪裡。

2 讓應用這個程序的人有個主動的感覺,好像是自己在操控著程序的運行。這也是從心理上來取悅程序的使用者。其實不加這些都是可以的。

相關焦點

  • VBA代碼大全030:用vba強制關閉word應用程式
    點擊上面的話題標籤,可以訂閱感興趣的話題,下次有更新的時候就可以第一時間收到了。
  • VBA程序正式運行前的調試
    這個時候就是程序調試了。不是每個程序寫完後都能馬上會正常運行的,有的調試過程很快,有的會時間長些,有的甚至會推倒重來。什麼是程序調試呢?就是編制的程序在投入實際運行前,要進行的測試,測試過程包括修正語法錯誤和邏輯錯誤的過程。這是保證程序正確性的必不可少的步驟。通過測試時所發現的錯誤,要進行診斷,找出原因和具體的位置進行修正.從而完善程序。
  • 代碼中經常使用With,也能讓你的VBA程序優化恰到好處
    其實,優化代碼有多種方法,有的可以個人根據自己的經驗去總結,比如:在需要重複引用同一個對象時可以使用With語句來獲得較快的運行速度.With語句,在一個單一對象或一個用戶定義類型上執行一系列的語句。注意點:程序進入With塊後,對象就不能改變了,因此不能用一個With語句來設置多個不同的對象。可將一個With塊放在另一個之中,產生嵌套的With語句。但在內層的With塊中,要使用完整的對象引用來指出在外層的With塊中的對象成員。如下面的代碼所示。
  • .NET程序優化不要僅僅盯著代碼執行時間
    【IT168 技術】其實很多寫.NET程序的開發人員都很喜歡通過一些計時器來看來一程序或代碼的運行效率,的確這樣是可以計算出代碼執行所損耗的時間。但.net程序的優化不僅僅在於此.大家知道.net提供自動內存回收機制,讓我們不用煩惱內存回收問題;同樣.net提供給我們的內存分配機制也很出色,因為它能非常快速地幫我們進行內存分配工作。當我們在享受吃糖的樂趣的時候,別忘了這東西吃多了很容易把牙齒給搞壞的;同樣.net 回收內存的時候同樣也讓難受,當然這些情況不會在你資源充足的時候給你帶來煩惱;不過一但出現他足可以讓你吃不下飯。
  • 對應用程式對象Application屬性的理解(VBA學習方案系列之七)
    對於ScreenUpdating,最大的用處是可以顯著提高程序的運行速度,但是希望大家理解我的另外一篇文章《VBA程序的運行時間優化和視覺效果的兼顧》。這篇文章中,我給出了我的觀點:在第二冊的85講到89講(註解:指《VBA代碼解決方案》這套教程),我講了程序優化的問題,其實在這些章節中,我也一直在講視覺和程序運行時間的兼顧問題
  • 【小白教程】除了數組,如何提高VBA代碼運行速度?
    20分鐘還沒運行完?!怎麼優化代碼?我首先問了下數據量,也就幾千行,但是一運行就是卡著不動了。最後我檢查了代碼之後,發現他裡面寫了個死循環。並不是程序運行的慢,而是程序卡主了。他靜靜的等待了20多分鐘,最後強退了。
  • excel VBA是什麼?VBA編程入門教程
    本篇將介紹excel vba是什麼?vba編程入門教程,有興趣的朋友可以了解一下!一、excel vba是什麼?VBA的英文全稱是Visual Basic for Applications,是一門標準的宏語言。VBA語言不能單獨運行,只能被office軟體(如:Word、Excel等)所調用。
  • VBA代碼的調試行為
    當房子建好後,我們首先要測試房子的各項指標是否達到了我們要求,這個就是程序調試。不是每個程序寫完後都能馬上正常運行,在某種程度上講,寫完代碼後的調試本身就是寫代碼的一部分。有的程序調試過程很快,有的會時間長些,有的甚至會推倒重來。
  • 一次程序優化經歷,運行8小時到3小時到50分鐘
    實際上,很多人第一次寫程序都很難按預想那樣寫出簡單高效的代碼片段,只是有的場景對性能要求並不高,所以有的人看著自己的程序能運行後就不再進行優化了。其實,絕大多數程序都是有優化空間的,並且還有很大的優化空間,這個空間指的是時間和空間。廢話不多說,我把這次優化的過程和思路總結為8個點,分享出來,希望能對大家有所幫助。大數據時代,處理大量數據成為了不少程式設計師的家常便飯。
  • Excel VBA常用代碼!
    前兩天有兩位朋友留言想收集一些VBA的常用代碼,今天開始會陸續分享一些!記得收藏好哦,因為今後你應用到稍大型Excel VBA程序時,這其中某些代碼肯定會用到。來看看都是哪些常用代碼:下面先舉一個簡單的例子:場景再現:在當前的工作表中插入一張e盤中名為1.jpg的圖片(長350、高300,距離Excel左側90、上邊框230)操作方法:第一步,打開vba代碼區
  • 嵌入式Linux啟動時間優化的秘密之一工具鏈/應用程式優化
    嵌入式Linux啟動時間優化的秘密之一工具鏈/應用程式優化 逸珺 發表於 2020-04-02 16:07:10   嵌入式Linux啟動時間優化的秘密
  • VBA編程理論學習之談
    既浪費時間又沒有意義。鑑於對Excel的整理和學習,很有必要對這個月來的學習經過總結一下。No.2 功能完善整個9月總共做了38個文件,每一個都是實例操作。No.3 重構代碼通常情況,完成之後的VBA就不想再返回來再次更改,因為要重新對代碼進行一個整體了解,浪費一些時間不說,可能更改的結果也不一定理想。於是,可能將重構一下編碼方式。
  • Excel vba 無邊框窗體,如何實現
    文/江覓易見Excel vba製作無邊框是一個特殊的需求,有些時候,在一些功能上需要運用到沒有標題欄的窗體,沒有最大化、最小化和關閉功能按鈕。這就需要做一個無邊框的窗體。運行效果如下(這不僅僅是一張圖片,而是背景是一張圖片的Form窗體)無題欄窗體是一種比較特殊的窗體,由於比較另類,一般用到程序開始展示過渡或者一些過程提示方面應用。當然了,也可出做一些個性的界面功能來,那就看自己喜好了 。
  • Excel vba 批量刪除窗體控制項
    文/江覓易見動態創建窗體控制項後,可以進行動態刪除,如果是設計時從工具欄添加的控制項,不能動態刪除,不要問為什麼vba就是這麼規定的,也可以認為這是一個BUG,反正就是不能。效果演示本示例演示了刪除標籤控制項、文本控制項和圖片控制項。單擊頁面建立所有控制項,然後單擊按鈕逐一刪除。刪除圖片控制項後效果。
  • 讓 Python 代碼運行更快的最佳方式!
    下面討論了一些例外,但是PyPy的目標是運行現有的,並且未經修改的Python代碼並為其提供自動化的速度提升。PyPy目前通過項目的不同版本支持Python 2和Python 3。換句話說,你需要下載不同版本的PyPy,具體取決於你運行的Python版本。 PyPy的Python 2分支已經存在了很長時間,但到目前為止,python 3版本的速度已經提高了很多。
  • vba第十八課
    vba第十八課調用工作表函數在vba中我經常會對工作表的數據進行一些運算,雖然通過代碼進行循環或判斷也可以完成,但是通vba調用函數可以更簡單更直接進行運算提高代碼的運行效率,比如countif、sumif等需要進行判斷統計和求和的運算。
  • VBA 教程 | VBA 程序結構入門
    程序結構示例首先,本篇將使用以下代碼,介紹各種程序結構,大家可以先看一下。過程過程是 VBA 中,程序實際運行的最小結構。單獨的一行或多行代碼無法運行,必須把它們放置在一個過程裡,才能運行。在示例中,Sub 過程名() 開頭,End Sub 為結尾部分是一個過程的主題,其餘代碼需要放置在兩者之間。Sub MyCode()End Sub程序語句語句,是表示一個完整意思的一行代碼。
  • 【Excel技巧】- VBA代碼提示運行時錯誤 '1004': 應用程式定義或對象定義錯誤
    問題如下:        我從群文件裡下載這位武漢的小夥伴上傳的【源文件和代碼.zip】文件,打開該壓縮包,有兩個文檔一個是xlsx結尾的,另一個是保存為文本的宏代碼。因為按照正常的編寫VBA代碼來說,不會出現這個問題。我自從大二自學VBA以來到現在,寫了那麼多VBA代碼,也沒有遇到過一次這樣的問題。所以這個問題的出現的確讓我感到困惑,所以我從頭開始梳理代碼,按F8一條一條的調試,調試方法如下:
  • VBA乾貨實操:如何加快VBA運行速度案例實戰
    提問裡的文件以及我優化最終的結果大家可以先下載一下,對照著看效果會比較好。下載方法是:關注「POINT小數點數據」公眾號,然後在公眾號裡輸入「長期VBA腳本分享計劃」,就能獲取到分享的網盤連結啦,網盤裡的「如何加快VBA運行速度案例-知乎問題.xlsm」文件就是啦。還有,網盤裡還有個文件「不同VBA運行速度對比.xlsm」,是我在這篇文章裡對比不同代碼運行速度用的,有興趣也可以下載看一下。
  • VBA代碼解決方案第49講:VBA代碼中工作表函數SUM的利用方法 - VBA...
    大家好,我們今日繼續講解VBA代碼解決方案的第49講內容(註:在整理之前的VBA系列文章中合併了一些文章,重新成集排序為第49講,所以從這篇文章開始以新的排序計算):VBA中SUM函數的利用方法。在對工作表的單元格區域進行求和計算時,使用工作表Sum函數比使用VBA代碼遍歷單元格進行累加求和效率要高得多,我們在熟悉了基本的代碼規則後,就要把重點放在優化程序上,這點非常重要,在一般的簡單運算中或許體會的不是很深,在資料庫的操作中這點非常的明顯。SUM函數就是優化程序的一個方法。我們看下面的代碼。