發新話題

Visual Basic 教學 - 《關於變數》進階 Variant 主題

Visual Basic 教學 - 《關於變數》進階 Variant 主題

數值在 Variants 變數中的內部表示
Variant 變數會維護它們所儲存數值的內部表示法。這個表示法會決定 Visual Basic 在執行比較和其它動作時,將如何處理這些數值。當您將數值指定給 Variant 變數時,Visual Basic 會用最簡潔的表示法來準確的記錄此數值。以後的動作可能使 Visual Basic 改變這個用於特定變數的表示法 (Variant 變數不是無型態的變數,而是能夠隨意改變型態的變數)。這些內部表示法與本章前面〈資料型態〉中所討論的資料型態相對應。
附註 Variant 只會用到 16 個位元組。物件、字串與陣列的實體不能直接存為 Variant;而是以 Variant 的四個位元組存放一個物件的引用,還是指向字串或陣列的指標。而實際資料是存放在其他地方。
很多時候,您不必瞭解 Visual Basic 為某特定變數使用那一種變數型態;因為 Visual Basic 會自動轉換型態。若想瞭解 Visual Basic 正在使用那種變數型態,您可以使用 VarType 函數。
舉例而言,如果您在 Variant 變數中儲存小數值,Visual Basic 就會用 Double 內部表示法。如果應用程式並不需要 Double 數值所提供的高精密度 (以及它造成的較慢速度),則您可以將此數值轉換成 Single 甚至 Currency 型態以加快計算速度:
If VarType (X) = 5 Then X = CSng (X)   ' 轉換成單倍精確浮點數。對於陣列變數,VarType 的數值等於陣列與資料型態傳回值的總和。舉例而言,這個陣列包含 Double 數值:
Private Sub Form_Click ()   Dim dblSample (2) As Double   MsgBox VarType (dblSample)End SubVisual Basic 的未來版本可能會增加新的 Variant 表示法;所以,任何根據 VarType 函數的傳回數值做出判斷的程式碼,都必須要慎重地處理這些目前尚未定義的傳回值。
詳細資訊 關於 VarType 函數的資訊,請參閱《程式語言參考手冊》中的〈VarType 函數〉。若要讀取有關陣列的更詳細資訊,請參閱本章稍後的〈陣列〉。關於轉換資料型態的詳細資訊,請參閱本章前面的〈資料型態〉。
在 Variant 變數中存放的數值
當您在 Variant 變數中儲存所有數字時,Visual Basic 會儘可能的使用最簡潔的表示法。舉例而言,若是儲存不帶小數點的微小數值,Variant 會使用 Integer 來表示該數值。此後如果您指定一個較大的數字,則 Visual Basic 將使用 Long 數值,如果這個數字非常大或者有小數部份,則 Visual Basic 將使用 Double 數值。
有時您可能想用特定的表示法來表示一個數字。舉例而言,為了在以後的計算中避免四捨五入的誤差,您可能希望 Variant 變數將數值用 Currency 型態儲存起來。Visual Basic 提供了幾種轉換函數,您可以用它們將數值轉換成指定的型態 (參閱本章前面的〈轉換資料型態〉)。舉例而言,用 Ccur 函數可以將數值轉換成 Currency 型態:
PayPerWeek = CCur (hours * hourlyPay)如果 Variant 變數不含數字或者可以解釋為數字的內容,則當您對此 Variant 變數執行數學運算或函數計算時會發生錯誤。舉例而言,您無法對 'U2' 這個值進行任何算術運算,儘管它包含一個數字字元 ' 2 ';因為整個值並非正確的數字。同樣無法對數值 1040EZ 進行任何計算,但是,可以對 +10 或 -1.7E6 進行計算,因為它們是正確的數字。因此您可能經常需要判定 Variant 變數是否包含可以當作數字使用的值。IsNumeric 函數可以完成這樣的工作:
Do   anyNumber = InputBox ("Enter a number")Loop Until IsNumeric (anyNumber)MsgBox "The square root is: " & Sqr (anyNumber)當 Visual Basic 將一個非數字的表示法 (如一個包含數值的字串) 轉換成數值時,會根據「國別設定」(在 Windows 的「控制台」中) 來解譯小數點符號、千位分隔符號和貨幣符號。
因此,如果 Windows「控制台」中的「國別設定」被設定成美國、加拿大或澳大利亞,則下列兩個陳述式將傳回 True:
IsNumeric ("$100")IsNumeric ("1,560.50")而下面兩個陳述式則傳回 False:
IsNumeric ("DM100")IsNumeric ("1.560,50")但是,如果 Windows「控制台」中的「國別設定」被設定成德國,則情況正好相反:前兩個陳述式傳回 False,而後兩個陳述式傳回 True。
如果您把包含數字的 Variant 指定給字串變數或屬性,則 Visual Basic 會自動把數字的內部表示法轉換成字串表示法。如果您想明確地將數字轉換成字串,則可以利用 CStr 函數。您還可以用 Format 函數將數字轉換成字串,而此字串可包含某些格式,如貨幣,千位分隔符號和小數點符號。Format 函數會依照 Windows「控制台」中「國別設定」對話方塊的設定值,來自動使用相對的符號。
詳細資訊 請參閱《程式語言參考手冊》中的〈Format 函數〉和轉換函數。關於撰寫可分佈在國外市場的應用程式的詳細資訊,請參閱〈國際化議題〉。
在 Variant 變數中存放的字串
一般而言,在 Variant 變數中儲存和使用字串並不會出什麼問題。但是如前所述,有時在使用兩個 Variant 值時,"+" 運算子的結果可能很含糊。如果兩個 Variant 變數都包含數字,則 "+" 運算子執行加法運算。如果兩個 Variant 變數都包含字串,則 "+" 運算子會執行字串連接。但是,如果一個數值代表數字,而另一個數值代表 字串,則情況就很複雜了。Visual Basic 首先嘗試把字串轉換成數字。如果轉換成功,那麼 "+" 運算子會把兩者相加;如果不成功,則產生一個「型態不符合」的錯誤。
要確保執行的動作為字串連接,則不管變數值的表示法如何,都使用 & 運算子。舉例而言,下列的程式碼:
Sub Form_Click ()   Dim X , Y   X = "6"   Y = "7"   Print X + Y,X & Y   X = 6   Print X + Y,X & YEnd Sub在表單上產生如下的結果:
67      6713      67附註 Visual Basic 在內部用 Unicode 儲存字串。關於 Unicode 的詳細的資訊,請參閱〈國際發行〉。
在 Variant 變數中存放的 Date/Time 值
Variant 變數還可以包含日期 / 時間值。有幾個函數可以傳回日期 / 時間值。舉例而言,DateSerial 可以傳回該年所剩的天數。
Private Sub Form_Click ()   Dim rightnow , daysleft , hoursleft , minutesleft   rightnow = Now   ' Now 傳回目前的日期和時間。    daysleft = Int (DateSerial (Year (rightnow) _   + 1,1,1) - rightnow)   hoursleft = 24 - Hour (rightnow)   minutesleft = 60 - Minute (rightnow)   Print daysleft & " days left in the year."   Print hoursleft & " hours left in the day."   Print minutesleft & " minutes left in the hour."End Sub您還可以對日期 / 時間值進行運算。透過加減一個整數來新增或減少天數;或透過加減一個分數來新增或減少時間。所以,加 20 就是加 20 天,而減掉 1/24 就是減去 1 小時。
儲存在 Variant 變數中的日期之有效範圍是從公元 0100 年 1 月 1 日到公元 9999 年 12 月 31 日。計算日期時不考慮 Gregorian 曆法採用之前的日期。所以如果計算 Gregorian 曆法被採用那年 ( 在英國及其殖民地為 1752 年;其它國家則或早一些或晚一些 ) 之前的日期,結果可能會不正確。
只要用一對 " # " 號將它們括起來,您就可以在程序碼中使用短式日期 / 時間,如同用一對雙引號 ( "" ) 將字串括起來一樣。舉例而言,您可以將包含日期 / 時間值的 Variant 和短式日期作比較:
If SomeDate > #3/6/93# Then同樣的,您可以將包含日期 / 時間值的 Variant 變數和一完整的短式日期 / 時間相比較:
If SomeDate > #3/6/93 1:20pm# Then如果在短式日期 / 時間中並不包括時間,則 Visual Basic 自動將該值的時間部份設定為午夜 (一天的開始 )。如果短式日期 / 時間中不包括日期,則 Visual Basic 自動將該值的日期部份設定為公元 1899 年 12 月 30 日。
Visual Basic 接受許多種文字格式的日期和時間。下面全部都是正確的日期 / 時間值:
SomeDate = #3-6-93 13:20#SomeDate = #March 27 , 1993 1:20am#SomeDate = #Apr-2-93#SomeDate = #4 April 1993#詳細資訊 有關用國際格式處理日期的資訊,請參閱〈國際發行〉。
用 IsNumeric 函數可測試 Variant 變數所包含的值是否可以當作正確的數值,同樣,用 IsDate 函數可測試 Variant 變數所包含的值是否可以當作正確的日期 / 時間值。然後您可用 CDate 函數將該值轉換成日期 / 時間值。
舉例而言,下列程式碼用 IsDate 測試文字方塊的 Text 屬性。如果屬性包含可被視為正確日期的文字,則 Visual Basic 會將此文字轉換成日期並計算到年底還有幾天。
Dim SomeDate , daysleftIf IsDate (Text1.Text) Then   SomeDate = CDate (Text1.Text)   daysleft = DateSerial (Year (SomeDate) _   + 1,1,1) - SomeDate   Text2.Text = daysleft & " days left in the year."Else   MsgBox Text1.Text & " is not a valid date."End If詳細資訊 關於各種日期和時間函數的資訊,請參閱《程式語言參考手冊》中的〈Date 函數〉。
在 Variant 變數中存放的物件
物件可以被儲存在 Variant 變數中。當您需要更有效率地處理包括物件在內的各種資料型態時,這可能十分有用。舉例而言,一個陣列中的所有元件都必須具有相同的資料型態。將陣列的資料型態設定成 Variant 就可以在同一個陣列中存放不同的資料型態。

TOP

發新話題

本站所有圖文均屬網友發表,僅代表作者的觀點與本站無關,如有侵權請通知版主會盡快刪除。