返回列表 上一主題 發帖

Visual Basic 新手教學 之 程序與函數

Visual Basic 新手教學 之 程序與函數

本帖最後由 呆呆 於 2010-5-29 18:09 編輯

程序與函數

  • 程序
    一般而言,如果我們常做某一件事,那這件事情的程式碼就可以寫在一個程序中,每當我們要做這件事時就可以呼叫這個程序
    程序一般而言會有下列的語法
    1. Sub 程序名稱()
    2. '你要做的事
    3. End
    複製代碼
    以下程式碼可以求出1+2+3....+10
    1. Public Class Form1
    2.     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    3.         求總和()
    4.     End Sub

    5.     Sub 求總和()
    6.         Dim 總和 As Integer = 0
    7.         For i As Integer = 0 To 10
    8.             總和 = 總和 + i
    9.         Next
    10.         MessageBox.Show(總和.tostring)
    11.     End Sub
    12. End Class
    複製代碼
    我們呼叫程序時只要在程式碼上鍵入程序名稱就可以了,這樣的話,如果我們想要1到10的加總,就可以一直利用求總和這個程序了,這樣不是很方便嗎
    但就有人想到了,我這樣只能求1加到10,那麼我想一加到任意數呢或者是連續的整數總和呢那要怎麼辦,當然,這裡就裡供了定義這種程序的語法
    Sub 程序名程(byval 變數1 as 型態 ,byval 變數2 as 型態,.........,byval 變數n as 型態 )
    End sub

    因此我們就可以在呼叫程序時利用傳入變數的方法讓程序內部可以利用這個變數來做事以下為範例
    1. Public Class Form1
    2.     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    3.         求總和(-10, 100)
    4.     End Sub

    5.     Sub 求總和(ByVal 起始值 As Integer, ByVal 終止值 As Integer)
    6.         Dim 總和 As Integer = 0
    7.         For i As Integer = 起始值 To 終止值
    8.             總和 = 總和 + i
    9.         Next
    10.         MessageBox.Show(總和.ToString)
    11.     End Sub

    12. End Class
    複製代碼
    事實上傳入變數分為二種,一種是傳值,另一種是傳址,我們上面用的是傳值,起始值是-10,終止值是100
    這二種有什麼不同呢,以下為程式碼
    1. Public Class Form1
    2.     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

    3.         Dim 起始值 As Integer = -10
    4.         Dim 終止值 As Integer = 100
    5.         Dim 總和 As Long = 0

    6.         求總和(起始值, 終止值, 總和)

    7.         MessageBox.Show("起始值 =" & 起始值 & vbCrLf & "終止值 = " & 終止值 & vbCrLf & "總和=" & 總和.ToString)

    8.     End Sub

    9.     Sub 求總和(ByVal 起始值 As Integer, ByVal 終止值 As Integer, ByRef 總和 As Long)

    10.         For i As Integer = 起始值 To 終止值
    11.             總和 = 總和 + i
    12.         Next

    13.         起始值 = 1000
    14.         終止值 = 1000
    15.         MessageBox.Show("起始值 =" & 起始值 & vbCrLf & "終止值 = " & 終止值 & vbCrLf & "總和=" & 總和.ToString)
    16.     End Sub

    17. End Class
    複製代碼
    我們由結果很快的就可以了解,總和這個變數我們是傳址的,也就是說,在主按鈕程序中的總和變數其實是和程序 求總和 中的總和變數是共用同一位址
    因此當我們修改了求總和程序中的總和變數那就會連同按鈕程序內的總和變數一起修改,也就是傳址(byref)
    然而,傳值(byval)是不一樣的,我們在求總和程序中修改了起始值和終止值的值,結果按鈕內的起始值和終止值的結果依然不變 ,比較簡單的說法是
    如果你想要你傳入程序中的變數值在程序結束後會改變其結果那就應該傳址(byref),如果不想,那就應該傳值(byval),另外,如果你傳的是參考型別,那不論是傳值或是傳址都一樣是參考到位址
    1. Public Class Form1

    2.     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    3.         Dim 陣列() As Integer = {1, 2, 3, 4, 5}
    4.         修改陣列值(陣列)
    5.         For Each 元素 As Integer In 陣列
    6.             MessageBox.Show(元素.ToString)
    7.         Next
    8.     End Sub

    9.     Sub 修改陣列值(ByVal 修改後陣列() As Integer)
    10.         For i As Integer = 0 To 修改後陣列.GetUpperBound(0)
    11.             修改後陣列(i) = i + 10
    12.         Next i
    13.     End Sub
    14. End Class
    複製代碼
    由以上的結果可知,就算是傳值,對於陣列而言,一樣會修改陣列中的值,只因為陣列是參考型別

  • 函數
    程序實際上並不能傳回值,我們有時候在程序執行完時想要有一些值回傳,這時候就需要函數
    定義函數的語法如下

        Function 函數名稱(ByVal 引數一 As 型態, ByVal 引數二 As 型態) As 型態
            Return 變數
        End Function

    和程序不同的是,函數一定要傳回值,該回值的型態一定要和函數本身定義的型態相同
    我們改寫上面的例子如下
    1. Public Class Form1
    2.     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    3.         MessageBox.Show(求總和(-10, 100).ToString)
    4.     End Sub
    5.     Function 求總和(ByVal 起始值 As Integer, ByVal 終止值 As Integer) As Integer
    6.         Dim 總和 As Integer = 0
    7.         For i As Integer = 起始值 To 終止值
    8.             總和 = 總和 + i
    9.         Next
    10.         Return 總和
    11.     End Function
    12. End Class
    複製代碼
    很清楚的我們可以看到函數本身就可以有值

    另外,函數本身亦回傳陣列以下為例
    1. Public Class Form1

    2.     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

    3.         For Each 元素 In 回傳多個值()
    4.             MessageBox.Show(元素.ToString)
    5.         Next

    6.     End Sub

    7.     Function 回傳多個值() As Integer()

    8.         Dim 回傳陣列() As Integer = {1, 2, 3, 4, 5}
    9.         Return 回傳陣列

    10.     End Function

    11. End Class
    複製代碼


程序和函數都可以有多載,所謂的多載就是同樣的 函數/程序 名稱 ,但內部定義不同
,會有這種的方法主要是方便我們只要定一個 函數/程序 名稱 就可以做出不同的方法
多載的語法為只要在 函數/程序 之前加一個Overloads 就可以
  1. Public Class Form1
  2.     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  3.         Dim 餐具 As String = "筷子"
  4.         飲食(餐具)
  5.         飲食()
  6.     End Sub

  7.     Sub 飲食(ByVal 餐具 As String)
  8.         MessageBox.Show("台灣人用" & 餐具 & "吃飯")
  9.     End Sub

  10.     Overloads Sub 飲食()
  11.         MessageBox.Show("印度人用右手將飯捏成一團來吃")
  12.     End Sub
  13. End Class
複製代碼

其實我最近在新學vb2010
對於樓主文中提到的
Sub 程序名程(byval 變數1 as 型態 ,byval 變數2 as 型態,.........,byval 變數n as 型態 )
有些疑問~
這邊樓主的文中是將[byval 變數1 as 型態]先愛sub中先指定
  這與在程式中去指定 Dim  變數1 as integer(型態)
  有何差異性呢??
學習才能提升自己

TOP

VB與Excel VBA 語法好像.
不好意思我是新手,請問二者差在那裡呢?

TOP

其實我最近在新學vb2010
對於樓主文中提到的
Sub 程序名程(byval 變數1 as 型態 ,byval 變數2 as 型態,.. ...
hugh0620 發表於 2011-6-20 13:32

sub 後面byval 接的變數, 是可以接受外來資料傳遞, 但變數值若在 sub 裡面有被異動, 是不會傳回去. 若要傳回去, 請改成 byRef.
而在 sub 裡面所宣告的變數,  大都是區域變數.

TOP

sub 後面byval 接的變數, 是可以接受外來資料傳遞, 但變數值若在 sub 裡面有被異動, 是不會傳回去. 若要傳 ...
alumi 發表於 2012-6-1 00:56



敢問大大
所以接在sub後面的變數是通用在全域的嗎
小的也是自學的新手
麻煩指教

TOP

請問大大:
我複製了最後一個"餐具"的語法,並貼到Module1,但...在Excel表格都是空白的啊...
是有對應的格子(如A1 或 A2)嗎?  還是我需要按什麼按鍵嗎@@?

TOP

        靜思自在 : 忘功不忘過,忘怨不忘恩。
返回列表 上一主題