今天遇到一個怪病,困擾了我幾個小時,我有一段程序讀取窗體上的切換按鈕狀態,在一個新文件中運行得很好,但是同樣一個按鈕,同樣代碼,貼到另外一個窗體,卻怎麼也無法正常運行。
經過一個小時的單步跟蹤調試,終於發現原來問題出在Option Explicit上。Option Explicit原來是用於提高程序性能,也為了減少編程錯誤而使用的,他要求用戶必須聲明變量後才能使用。避免了系統自動使用占用資源很多的Variant類型,也強迫程序員養成良好習慣,寫出便於調試的代碼。 但是Option Explicit如果在窗體類中使用,將導致另外一個惡果。那就是未賦值的窗體控件,你對其取值都將得到NULL,例如切換按鈕,如果不使用Option Explicit,那麼你對未操作的切換按鈕取值將得到Boolean值False,但是如果使用了Option Explicit,那麼你就將得到NULL。 這個細節很難被注意到,而且一旦窗體類中使用了Option Explicit,那麼你將面對很多的IsNull判斷,當然這還不是最致命的,畢竟IsNull也就是多寫了幾行代碼,但是如果你在代碼中使用了criteria,比方說域聚合函數,那麼域聚合函數將報錯,中止代碼。而控件本身內涵在Criteria中,你根本無法對其進行IsNull判斷。 另外一個副作用就是條件格式將可能得到預期之外的結果,比方說切換按鈕狀態,如果使用了Option Explicit,那麼你必須注意,除了True和False之外,還可能有個值就是Null,你在條件格式中不應該使用=False,而應該使用<>True,看起來是不是完全等價?其實完全不同。 我個人對於Option Explicit的建議是,盡量不要在窗體類中使用,但是同時也盡量把大量的程序放在使用Option Explicit的模塊中,窗體類中盡可能少用變量。 如果你一定要在窗體類中使用Option Explicit的話,你有兩個選擇: 1、對於每個訪問的值都進行IsNull判斷。