VBA 中的變量和常量

在 VBA 中,與在任何其他編程語言中一樣,變量和常量用於存儲任何值。 顧名思義,變量可以改變,而常量存儲固定值。

例如,一個常數 Pi 存儲值 3,14159265... 數字“Pi”在程序執行過程中不會改變,但是將這樣的值存儲為常數還是比較方便的。

同時,我們可以使用變量 增值稅稅率 存儲所購商品的增值稅率。 變量值 增值稅稅率 可能因購買的產品而異。

數據類型

所有變量和常量都屬於特定的數據類型。 下表列出了 VBA 中使用的數據類型以及可能值的描述和範圍:

數據類型 尺寸產品描述取值範圍
字節1字節正整數; 常用於二進制數據從0 255
布爾2字節可以是真或假對或錯
整型2字節整數(無小數部分)從 -32 到 +768
4字節大整數(無小數部分)от -2 147 483 648 до +2 147 483 647
4字節單精度浮點數從 -3.4e38 到 +3.4e38
Double8字節雙精度浮點數從 -1.8e308 到 +1.8e308
貨幣8字節浮點數,小數位數固定от -922 337 203 685 477.5808 до +922 337 203 685 477.5807
日期8字節日期和時間——日期類型的數據由浮點數表示。 這個數字的整數部分錶示日期,小數部分錶示時間。從 1 年 100 月 31 日到 9999 年 XNUMX 月 XNUMX 日
對象4字節對象引用任何對象引用
在改變字符集。 String 類型可以是固定長度或可變長度。 更常用於可變長度固定長度 - 最多大約 65 個字符。 可變長度——最多約 500 億個字符
變種在改變可能包含日期、浮點數或字符串。 這種類型用於事先不知道將輸入什麼類型的數據的情況。數字 - 雙精度,字符串 - 字符串

顯然,使用上表並選擇正確的數據類型,可以更經濟地使用內存(例如,選擇數據類型 整型 代替 or 代替 Double)。 但是,當使用更緊湊的數據類型時,您需要注意您的代碼不要嘗試將不成比例的大值放入其中。

聲明變量和常量

譯者註: 說到 VBA 中的變量,值得一提的是更重要的一點。 如果我們聲明了一個變量但沒有給它賦值,那麼它會被初始化為一個默認值:

• 文本字符串用空字符串初始化;

• numbers — 值 0;

• 類型變量 布爾 - 錯誤的;

• 日期 – 30 年 1899 月 XNUMX 日。

在使用變量或常量之前,必須先聲明它。 為此,請將以下簡單的代碼行添加到宏中:

Dim Имя_Переменной As Тип_Данных

在上面的代碼行中 變量名 是將在代碼中使用的變量的名稱,並且 數據類型 是本文前面給出的表中的數據類型之一。 例如:

將 sVAT_Rate 調暗為單個 Dim i As Integer

常量的聲明方式類似,但在聲明常量時,必須立即指出它們的值。 例如,像這樣:

常量 iMaxCount = 5000 常量 iMaxScore = 100

不必在 Excel 中聲明變量。 默認情況下,Excel 中所有輸入但未聲明的變量都將具有類型 變種 並且將能夠接受數字和文本值。

因此,程序員可以隨時使用新變量(即使它沒有被聲明),Excel 會將其視為類型變量 變種. 但是,不應該這樣做有幾個原因:

  1. 內存使用和計算速度。 如果你沒有聲明一個帶有數據類型指示的變量,那麼默認情況下它將被設置為類型 變種. 此數據類型比其他數據類型使用更多內存。 每個變量的幾個額外字節聽起來可能不多,但實際上,程序可以有數千個變量(尤其是在使用數組時)。 因此,變量使用的額外內存如 變種, 與類型變量相比 整型 or , 可以加起來很大。 此外,具有類型變量的操作 變種 執行速度比其他類型的變量慢得多,分別是額外的一千個類型的變量 變種 可以顯著減慢計算速度。
  2. 防止變量名中的拼寫錯誤。 如果聲明了所有變量,則可以使用 VBA 語句 - Option Explicit (我們稍後會談到)以識別所有未聲明的變量。 這消除了由於錯誤寫入變量名而在程序中出現的錯誤。 例如,使用一個名為 增值稅稅率,你可以打錯字,給這個變量賦值,寫:“VATRate = 0,175”。 預計從現在開始,變量 增值稅稅率 應該包含值 0,175 - 但當然不是。 如果啟用強制聲明所有使用的變量的模式,則 VBA 編譯器將立即指示錯誤,因為它不會找到該變量 增值稅率 在那些宣布。
  3. 突出顯示與變量聲明類型不匹配的值。 如果你聲明一個特定類型的變量並嘗試為其分配不同類型的數據,你會得到一個錯誤,如果不加以糾正,可能會導致程序崩潰。 乍一看,這似乎是不聲明變量的一個很好的理由,但實際上,與以前相比,其中一個變量接收到了它應該接收的錯誤數據——這樣更好! 否則,如果程序繼續運行,結果可能是不正確的和意外的,並且要找到錯誤的原因將變得更加困難。 宏也有可能“成功”執行。 結果,錯誤將被忽視,工作將繼續使用不正確的數據!

在這方面,希望儘早檢測出不正確的數據類型並糾正代碼中的此類錯誤。 由於這些原因,建議您在編寫 VBA 宏時聲明所有變量。

Option Explicit

操作者 Option Explicit 導致聲明將在 VBA 代碼中使用的所有變量,並在編譯期間(在代碼執行開始之前)將所有未聲明的變量標記為錯誤。 應用這個運算符並不難——只需在 VBA 文件的最頂部寫下這一行:

Option Explicit

如果你想總是插入 Option Explicit 到創建的每個新 VBA 模塊的頂部,這可以自動完成。 為此,您需要啟用該選項 需要變量聲明 在 VBA 編輯器設置中。

這樣做是這樣的:

  • 從 Visual Basic 編輯器菜單中,單擊 工具 > 選項
  • 在出現的對話框中,打開選項卡 編輯頁
  • 勾選方塊 需要變量聲明 並按下 OK

啟用時,字符串 Option Explicit 將自動插入到創建的每個新模塊的開頭。

變量和常量的範圍

每個聲明的變量或常量都有自己的有限範圍,即該變量所在的程序的有限部分。 範圍取決於變量或常量的聲明位置。 以變量為例 增值稅稅率, 在函數中使用 總消耗. 下表討論了變量作用域的兩個選項 增值稅稅率在模塊的兩個不同位置聲明:

Option Explicit Dim sVAT_Rate As Single Function Total_Cost() As Double ... End Function
如果變量 增值稅稅率 在模塊的最開始聲明,那麼這個變量的作用域就是整個模塊(即變量 增值稅稅率 將被本模塊中的所有程序識別)。

因此,如果在函數中 總消耗 變量 增值稅稅率 將被分配一些值,然後在同一模塊中執行的下一個函數將使用該變量 增值稅稅率 具有相同的含義。

但是,如果調用位於另一個模塊中的某個函數,那麼它的變量 增值稅稅率 將不為人知。

Option Explicit Function Total_Cost() As Double Dim sVAT_Rate As Single ... End Function
如果變量 增值稅稅率 在函數開頭聲明 總消耗, 那麼它的作用域將僅限於這個函數(即函數內 總消耗, 你可以使用變量 增值稅稅率,但不在外面)。

嘗試使用時 增值稅稅率 在另一個過程中,VBA 編譯器將報告錯誤,因為該變量未在函數外部聲明 總消耗 (前提是使用了運算符 Option Explicit).

在上面顯示的示例中,變量在模塊級別使用關鍵字聲明 暗淡. 但是,聲明的變量可能需要在其他模塊中使用。 在這種情況下,聲明一個變量而不是關鍵字 暗淡 必須使用關鍵字 評價.

順便說一句,為了在模塊級別聲明一個變量,而不是關鍵字 暗淡 可以使用關鍵字 私人的,這表明此變量僅適用於當前模塊。

您還可以使用關鍵字來聲明常量。 評價 и 私人的,但不能代替關鍵字 康斯特,隨之而來。

以下示例顯示了關鍵字的使用 評價 и 私人的 應用於變量和常量。

Option Explicit Public sVAT_Rate As Single Public Const iMax_Count = 5000 ...    
在本例中,關鍵字 評價 用於聲明變量 增值稅稅率 和常數 i最大計數. 以這種方式聲明的元素範圍將是整個當前項目。

這意味著 增值稅稅率 и i最大計數 將在任何項目模塊中可用。

Option Explicit Private sVAT_Rate As Single Private Const iMax_Count = 5000 ...    
在這個例子中,聲明一個變量 增值稅稅率 和常數 i最大計數 使用的關鍵字 私人的. 這些元素的範圍是當前模塊。

這意味著 增值稅稅率 и i最大計數 將在當前模塊的所有過程中可用,但對其他模塊中的過程不可用。

發表評論