發新話題

Visual Basic 基本操作

變數

在 Visual Basic 中,當執行應用程式期間,您可能會用變數暫存數值。變數必須有名稱 (用來引用該變數所包含的值) 和資料型態 (決定變數可以儲存的資料種類)。

您可以把變數看作記憶體中存放未知數值的預留位置。舉例而言,假定您正為水果舖撰寫一個統計蘋果銷售的軟體。在銷售實際發生之前,您並不知道蘋果的價格和銷量。此時,您可以用兩個變數來儲存未知的數值,並將它們命名為 ApplePrice 和 ApplesSold。每當執行程式時,使用者才提供這兩個變數的具體數值。要計算總銷售額,並且將結果顯示在名稱為 txtSales 的文字方塊中,程式碼應該是這樣的:

txtSales.txt = ApplePrice * ApplesSold

每次根據使用者提供的數值,這個運算式會傳回不同的金額。由於有了變數,您就可以設計一個運算式,而不必事先知道實際的輸入是多少。

在這個例子中,ApplePrice 的資料型態是貨幣,而 ApplesSold 的資料型態是整數。變數還可以表示其它的數值,比如:文字、日期、各種數值型態,甚至物件也可以。

儲存和擷取變數中的資料

您可用指定陳述式進行計算,並將結果指定給變數。

ApplesSold = 10      ' 將 10 指定給變數。
ApplesSold = ApplesSold + 1      ' 變數值加一。

請注意,範例中的等號是指定運算子,而不是等於運算子;它是將數值 (10) 指定給變數 (ApplesSold)。

宣告變數(Declaration)

宣告變數就是事先將變數的相關資訊通知給程式知道。您可用 Dim 陳述式宣告變數,並指定變數名稱:

Dim variablename [As type]

在程序內部使用 Dim 陳述式宣告的變數,只有在該程序執行時才存在。程序一結束,該變數的值也就消失了。此外,程序中的變數值對程序來說是區域性的,也就是說,您無法在一個程序中存取另一個程序中的變數。由於這個特點,您就可以在不同程序中使用相同的變數名稱,而不必擔心名稱衝突的問題。

變數名稱:

必須以字母開頭。

 
無法包含句號或者型態宣告字元。

 
不得超過 255 個字元。

 
在同一個有效範圍內必須是唯一的。有效範圍就是變數可以被引用的區域,例如程序、表單等等。
Dim 陳述式中的選擇性 As type 子句可以讓您定義變數的資料型態或物件型態。資料型態定義了變數所儲存資訊的型態。舉例而言,String、Integer 和 Currency 等都是資料型態。變數的型態也可以是來自 Visual Basic 或其它應用程式的物件。Object、Form1 和 TextBox 都是 Visual Basic 物件型態或物件類別的範例。

詳細資訊 關於物件的詳細資訊,請參閱〈運用物件〉和〈運用元件〉。本章稍後的〈資料型態〉一節將會詳細討論資料型態。

宣告變數的其它方式:

不在程序內部,而在表單、一般或物件類別模組的宣告區塊中宣告變數,這將使變數對模組中的所有程序有效。

 
使用 Public 保留字宣告變數,這將使變數在整個應用程式中都有效。

 
使用 Static 保留字宣告一個區域變數,即使程序結束,變數值仍然會保留著。
隱含宣告(Implicit Declaration)

在使用一個變數之前,您並不必先宣告這個變數。舉例而言,您可以撰寫如下列所示的函數,如此在使用變數 TempVal 之前就不必先宣告它。

Function SafeSqr (num)
   TempVal = Abs (num)
   SafeSqr = Sqr (TempVal)
End Function

Visual Basic 會用這個名稱自動建立一個變數,使用這個變數時可以把它當成已明確宣告。雖然這種方法很方便,但是如果把變數名稱拼錯了的話,會導致一個難以察覺的錯誤。舉例而言,假定您寫了這樣一個函數:

Function SafeSqr (num)
   TempVal = Abs (num)
   SafeSqr = Sqr (TemVal)
End Function

乍看起來,這兩段程式碼好像是一樣的。但是因為在倒數第二行把 TempVal 變數名稱拼錯了,所以函數總是傳回 0。當 Visual Basic 遇到新名稱時,它無法分辨您是想隱含宣告一個新變數呢,還是您把一個現有的變數名稱寫錯了,於是只好再用這個名稱建立一個新變數囉。

明確宣告(Explicit Declaration)

為了避免拼錯變數名稱所引起的種種麻煩,您可以事先設定,只要遇到一個未經明確宣告的變數名稱,Visual Basic 就會發出警告。

明確宣告變數

在物件類別模組、表單模組或一般模組的宣告區塊中可加入這個陳述式:
Option Explicit
- 或 -

在「工具」功能表中選取「選項」,按一下「編輯器」頁籤,再選定「要求變數宣告」選項。這樣就會在任何新模組中自動插入 Option Explicit 陳述式,但不會在已建立的模組中插入;所以在專案內部,只能用手動方法在現有模組中新增 Option Explicit 陳述式。

如果此陳述式在包含 SafeSqr 函數的表單或一般模組中已經生效,那麼 Visual Basic 將認定 TempVal 和 TemVal 都是未經宣告的變數,並為兩者發出錯誤訊息。您可以明確宣告 TempVal。

Function SafeSqr (num)
   Dim TempVal
   TempVal = Abs (num)
   SafeSqr = Sqr (TemVal)
End Function

因為 Visual Basic 對拼錯的 TemVal 會顯示錯誤訊息,所以您會立刻明白發生什麼問題。由於 Option Explicit 陳述式有助於發現這類型態的錯誤,所以建議您最好在所有程式碼中善加利用。

附註 Option Explicit 陳述式的運作範圍僅限於陳述式所在模組,所以,對每個需要 Visual Basic 強制明確宣告變數的表單模組、一般模組及物件類別模組,您必須將 Option Explicit 陳述式放在這些模組的宣告區塊中。如果您選取「要求變數宣告」,Visual Basic 會在下個表單模組、一般模組及物件類別模組中自動插入 Option Explicit,但不會將它新增到現有程式碼中。您必須在專案中透過手動才能將 Option Explicit 陳述式加到任何現有模組中。

TOP

靜態變數(Static variables)

除範圍之外,變數還有存活期,在這個期間變數可以保持它們的值。在應用程式的存活期內,模組層次變數和公用變數的值會一直保持著。但是,對於用 Dim 宣告的區域變數,只有當宣告它們的程序在執行時,這些區域變數才存在。通常,當一個程序執行完畢,所含區域變數的值就會消失,而且變數所佔據的記憶體也會被釋放。當下一次執行該程序時,它的所有區域變數將重新初始化。

然而,您可以將區域變數宣告成靜態,以保留變數的值。在程序內部用 Static 關鍵字宣告一個或多個變數,其用法和 Dim 陳述式完全一樣:

Static Depth

舉例而言,下面的函數將先前儲存在靜態變數 Accumulate 中的營運總值與一個新數值相加,以計算營運總值。

Function RunningTotal (num)
   Static ApplesSold
   ApplesSold = ApplesSold + num
   RunningTotal = ApplesSold
End Function

如果用 Dim 而不用 Static 宣告 ApplesSold,則呼叫函數時以前的累計值不會保留下來,函數每次只會傳回相同的數值。

您可以在模組的宣告區塊宣告 ApplesSold,使它成為模組層次變數,如此也會產生相同的效果。然而,當您使用這種方法來更改變數的範圍,程序就不能再對變數做獨佔性的存取。由於其它程序也可以存取和改變變值,所以運營總值也許不可靠,並且程式碼將更難於維護。

宣告所有的區域變數為靜態變數

要使程序中所有的區域變數都為靜態變數,您可以在程序標頭的起始處加上 Static 關鍵字。例如:

Static Function RunningTotal (num)

這將使程序中的所有區域變數都變為靜態,而無論它們是用 Static、Dim、Private 宣告還是隱含宣告的。您可以將 Static 放在任何 Sub 或 Function 程序標頭的前面,包括事件程序和宣告為 Private 的程序。

TOP

動態陣列

有時您可能不能正確的得知陣列到底應該要多大才合適。所以您可能希望能夠在執行階段具有改變陣列大小的能力。

動態陣列就可以在任何時候改變大小。在 Visual Basic 中,動態陣列是最靈活、最方便的特性,它可以幫助您更有效的管理記憶體。舉例而言,可以在短時間內使用一個大陣列,然後,在不使用這個陣列時,將記憶體空間釋放給系統。

如果不用動態陣列;則要宣告一個陣列,並讓它的大小儘可能達到最大,然後再忽略掉那些用不到的元件。但是,如果過度使用這種方法,會因記憶體不夠導致作業環境變慢。

建立動態陣列

您可以用 Public 陳述式宣告陣列 (如果希望陣列為公用陣列),或者,在模組層次用 Dim 陳述式宣告陣列 (如果希望陣列為模組層次),或者,在程序中用 Static 或 Dim 陳述式宣告陣列 (如果希望陣列為區域陣列)。您可以對陣列附以一個空白的維數清單,以將陣列宣告為動態陣列。
Dim DynArray ()

用 ReDim 陳述式分配實際的元件個數。
ReDim DynArray (X + 1)

ReDim 陳述式只能出現在程序中。與 Dim 陳述式、Static 陳述式不同,ReDim 陳述式是一個可執行陳述式 -- 應用程式在執行階段可以執行另一個動作。

對於固定陣列,ReDim 陳述式支援同樣的語法。對於每一維數,每個 ReDim 陳述式都能改變索引的上下界。但是,陣列的維數無法改變。

ReDim DynArray (4 to 12)

舉例而言,動態陣列 Matrix1 是利用在模組層次的宣告所建立:
Dim Matrix1 () As Integer

然後,在程序中再分配空間給陣列:
Sub CalcValuesNow ()
   .
   .
   .
   ReDim Matrix1 (19, 29)
End Sub

上述的 ReDim 陳述式給 Matrix 分配一個 20 × 30 的整數矩陣 (元素總數為 600 )。另外,還可以用變數設定動態陣列的邊界:
ReDim Matrix1 (X, Y)

附註 您可以將字串指定給可改變大小的位元組陣列。一個位元組陣列也可以被指定給一個可變長度的字串。要注意字串的位元組數會隨平台而變化。同一個字串在 Unicode 平台上的位元組數是它在非 Unicode平台上的兩倍。

保存動態陣列的內容

每次執行 ReDim 陳述式時,目前儲存在陣列中的數值都會全部遺失。Visual Basic 會重新將陣列元件的值設定為 Empty (對 Variant 陣列而言)、為 0 (對數值陣列而言)、為長度為零的字串 (對字串陣列而言) 或者為 Nothing (對於物件的陣列而言)。

當您要在陣列中填入資料,或者要縮減陣列大小以節省記憶體時,這樣做是非常有用的。有些時候您可能希望改變陣列大小,但又不想遺失陣列中的資料,此時使用具有 Preserve 關鍵字的 ReDim 陳述式就可做到這點。舉例而言,您可使用 UBound 函數引用上界,使陣列增加一個元件,而現有元件的值並不會遺失:

ReDim Preserve DynArray (UBound (DynArray) + 1)

當使用 Preserve 保留字時,您只能改變多維陣列中最後一維的上界;如果改變了其它維數或最後一維的下界,則會發生執行階段的錯誤。因此,您可以撰寫如下的程式碼:

ReDim Preserve Matrix (10, UBound (Matrix, 2) + 1)

但不可撰寫如下的程式碼:
ReDim Preserve Matrix (UBound (Matrix, 1) + 1, 10)

TOP

瞭解變數的範圍

變數的範圍定義了能夠知曉該變數存在的程式碼範圍。當您在程序內部宣告變數時,只有程序內部的程式碼才能存取或改變此變數的值;它有一個只對該程序有效的區域範圍。但是,有時您需要使用具有更大範圍的變數,例如其值對於同一模組內的所有程序都有效的變數,甚至對於整個應用程式的所有程序都有效。Visual Basic 允許您在宣告變數時指定它的範圍。

指定變數的有效範圍

變數可以被宣告為程序層次 (區域變數) 或模組層次的變數,主要取決於宣告變數時採用的方式。

有效範圍 Private Public
程序層次 變數對於所在程序是私有的。 不可使用。您無法在程序中宣告公用變數。
模組層次 變數對於所在模組是私有的。 變數可用於所有模組。

 

程序內部使用的變數

程序層次變數只有在宣告它們的程序中才能被識別,也就是所謂的區域變數。您可以用 Dim 或者 Static 保留字來宣告它們。例如:

Dim intTemp As Integer
- 或 -

Static intPermanent As Integer

在應用程式執行階段,用 Static 宣告的區域變數的值會一直存在;而用 Dim 宣告的變數只在程序執行期間才存在。

對任何暫存計算來說,區域變數是最佳選擇。舉例而言,您可以建立十幾個不同的程序,每個程序都包含名稱為 intTemp 的變數。只要每個 intTemp 都宣告為區域變數,那麼每個程序都只識別自己的 intTemp。任何一個程序都都能夠改變它的 intTemp 變數值,而不會影響其它程序中的 intTemp 變數。

模組內部使用的變數

根據預設值,模組層次變數對該模組的所有程序都有效,但無法給其它模組的程式碼使用。您可以在模組頂端的宣告區塊使用 Private 關鍵字宣告,從而建立模組層次變數。例如:

Private intTemp As Integer

在模組層次,Private 和 Dim 之間沒有什麼差別;但 Private 較好些,因為可以很容易把它和 Public 區別開來,使得程式碼更易瞭解。

所有模組使用的變數

要讓模組層次的變數在其它模組中也有效,您可以用 Public 保留字宣告變數。公用變數中的值對應用程式中的所有程序都有效。與所有模組層次變數一樣,公用變數也是在模組頂端的宣告區塊中宣告。例如:

Public intTemp As Integer

附註 您不能在程序中宣告公用變數,只能在模組的宣告區塊中宣告公用變數。


進階變數主題

多個同名變數的使用

如果不同模組中的公用變數使用了相同的名稱,則只要在引用時加上模組名稱與變數名稱就可以在程式碼中區分它們。舉例而言,如果有一個在 Form1 和 Module1 中都宣告的公用整數變數 intX,則您可以用 Module1.intX 和 Form1.intX 來引用。

若要清楚整個處理過程,可在一個新專案中插入兩個一般模組,並在表單中放入三個指令按鈕。

在第一個一般模組 Module1 之中宣告一個變數 intX。並利用 Test 程序設定它的值。

Public intX As Integer      ' 宣告 Module1 的 intX 。
Sub Test ()
   ' 設定 Module1 的 intX 變數值。
   intX = 1   
End Sub

在第二個一般模組 Module2 中宣告了第二個具有相同名稱的變數 intX。再次利用名稱為 Test 的程序來設定它的值。

Public intX As Integer      ' 宣告了 Module2 的 intX。
Sub Test ()
   ' 設定 Module2 的 intX 變數的值
   intX = 2   
End Sub

在表單模組中宣告了第三個變數 intX。並再次利用名稱為 Test 的程序來設定它的值。

Public intX As Integer      ' 宣告表單中的 intX 變數。
Sub Test ()
   ' 設定 form 中的 intX 變數的值。
   intX = 3
End Sub

在三個指令按鈕的 Click 事件程序中,每一個都呼叫了相對的 Test 程序,並用 MsgBox 來顯示這三個變數的值。

Private Sub Command1_Click ()
   Module1.Test               ' 呼叫 Module1 中的 Test 程序。
   MsgBox Module1.intX         ' 顯示 Module1 的 intX。
End Sub

Private Sub Command2_Click ()
   Module2.Test               ' 呼叫 Module2 中的 Test 程序。
   MsgBox Module2.intX         ' 顯示 Module2 的 intX。
End Sub

Private Sub Command3_Click ()
   Test                     ' 呼叫 Form1 中的 Test 程序。
   MsgBox intX               ' 顯示 Form1 的 intX。
End Sub

執行應用程式,並將三個指令按鈕都按一下。您將會看到對三個公用變數的不同引用。請注意在第三個指令按鈕的 Click 事件程序中,當呼叫 Form1 的 Test 程序時,您並不需指定 Form1.Test,而呼叫 Form1 中整數型態的變數值時,也不必指定 Form1.intX。如果多個程序或變數同名,則 Visual Basic 會取區域性較大的變數值,在這個例子中,就是 Form1 變數。

公用變數(Public variables)與區域變數(Private variables)

在不同的範圍內也可以有同名稱的變數。例如,您可以有名稱為 Temp 的公用變數,並在程序中宣告名稱為 Temp 的局部變數。在程序內引用名稱 Temp 將會存取局部變數;而在程序外引用名稱 Temp 將會存取公用變數。在程序內若要存取模組層次變數,您可以用模組名稱來限定此變數。
引用:
Public Temp As Integer

Sub Test ()
   Dim Temp As Integer
   Temp = 2               ' Temp 的數值為 2。
   MsgBox Form1.Temp      ' Form1.Temp 的數值為 1。
End Sub

Private Sub Form_Load ()
   Temp = 1               ' 將 Form1.Temp 的數值設定成 1。
End Sub

Private Sub Command1_Click ()
   Test   
End Sub
一般而言,當變數名稱相同而範圍不同時,區域性大的變數總會遮蔽住區域性小的變數 (即優先存取區域性大的變數)。所以,如果還有名稱為 Temp 的程序層次變數,則它會遮蔽模組內部的公用變數 Temp。

遮蔽表單屬性和控制項

由於遮蔽效應,表單屬性、控制項、常數和程序皆被視為表單模組中的模組層次變數。表單屬性或控制項的名稱與模組層次變數、常數、自訂型態或程序的名稱相同是不合法的,因為它們的範圍相同。

在表單模組內,和表單中之控制項同名的區域變數,將遮蔽控制項。因此在引用時,您必須使用表單名稱或 Me 保留字來限定控制項,如此才能設定或取得該控制項的值或屬性。例如:

Private Sub Form_Click ()
Dim Text 1 , BackColor
' 假定該表單有一個控制項也稱作 Text1。
   Text1 = "Variable"       ' 變數會遮蔽住控制項。
   Me.Text1 = "Control"    ' 要取得控制項,必須用『Me』來限定。
   Text1.Top = 0          ' 會導致錯誤!
   Me.Text1.Top = 0       ' 要得到控制項,必須用『Me』來限定。
   BackColor = 0          ' 變數遮蔽住屬性。
   Me.BackColor = 0       ' 要得到表單屬性,必須用『Me』限定。
End Sub

使用同名的變數和程序

私有模組層次變數和公用模組層次變數的名稱,也可能會和程序名稱衝突。模組中的變數無法和任何程序或在模組中定義的型態同名稱。但可以和其它模組中的公用程序、定義的型態或變數同名稱。在這種情況下,當從別的模組存取這個變數時,就必須用模組名稱來限定。

雖然上面討論的遮蔽規則並不複雜,但是用遮蔽的方法可能會帶來混淆,並且會導致難以察覺的錯誤。因此,對不同的變數使用不同的名稱才是一種好的程式撰寫習慣。在表單模組中應儘量讓變數名稱和表單中的控制項名稱不一樣。

TOP

進階 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 Sub

Visual 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 & Y
End Sub

在表單上產生如下的結果:

67      67
13      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 , daysleft
If 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

[glow=570,#8B008B,6]專案檔案格式[/glow]

Microsoft Visual Basic 在設計和執行階段都會利用和建立一些檔案。專案或應用程式將依有效範圍和功能決定需要那些檔案。

專案檔案的副檔名
Visual Basic 在建立和編譯連結專案時會產生許多檔案。這些檔案分類如下:設計階段檔案、其它開發檔案和執行階段檔案。

設計階段檔案是專案的建立區塊,例如:基本模組 (.bas) 和表單模組 (.frm)。

其它檔案是由 Visual Basic 開發環境中各種不同的處理序和函數產生的,例如「封裝暨部署」精靈相關檔案 (.dep)。

設計階段檔案和其它檔案
開發應用程式時會產生各種設計階段檔案和其它檔案,如下表所列:

副檔名 描述
.bas 基本模組
.cls 物件類別模組
.ctl 使用者控制項檔案
.ctx 使用者控制項的二進位檔案
.dca 使用中設計工具的快取記憶體
.ddf 「封裝暨部署」精靈 CAB資訊檔案
.dep 「封裝暨部署」精靈依存檔案
.dob ActiveX 文件表單檔案
.dox ActiveX 文件的二進位表單檔案
.dsr 使用中設計工具檔案
.dsx 使用中設計工具的二進位檔案
.dws Deployment 精靈 script檔案
.frm 表單檔案
.frx 二進位表單檔案
.log 載入錯誤的記錄檔
.oca 控制項型態庫快取記憶體檔案
.pag 屬性頁檔案
.pgx 二進位屬性頁檔案
.res 資源檔
.tlb 遠端自動化型態庫檔案
.vbg Visual Basic 群組專案檔案
.vbl 控制項許可檔案
.vbp Visual Basic 專案檔案
.vbr 遠端自動化註冊檔案
.vbw Visual Basic 專案工作區檔案
.vbz 精靈啟動檔案
.wct WebClass HTML 範本

 
執行階段檔案
編譯應用程式時,執行階段執行檔會包括所有必要的設計階段檔案,下表列出各種執行階段檔案:

附檔名 描述
.dll 同處理序的 ActiveX 元件
.exe 執行檔或 ActiveX 元件
.ocx ActiveX 控制項
.vbd ActiveX 文件狀態檔案
.wct WebClass HTML 範本

TOP

謝謝分享vb經驗,學習中

TOP

|y08| |y08| |y08| |y08|
本帖最近評分記錄

TOP

用力給他拍拍手

TOP

我要學亂數..

TOP

發新話題

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