麻辣家族討論版版's Archiver

呆呆 發表於 2010-5-24 23:21

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

[i=s] 本帖最後由 呆呆 於 2010-5-29 18:09 編輯 [/i]

[size=5][b]程序與函數[/b][/size]
[list]
[*][font=仿宋_GB2312][size=5]程序[/size][/font]
一般而言,如果我們常做某一件事,那這件事情的程式碼就可以寫在一個程序中,每當我們要做這件事時就可以呼叫這個程序
程序一般而言會有下列的語法[code]Sub 程序名稱()
'你要做的事
End
[/code]以下程式碼可以求出1+2+3....+10[code]Public Class Form1
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        求總和()
    End Sub

    Sub 求總和()
        Dim 總和 As Integer = 0
        For i As Integer = 0 To 10
            總和 = 總和 + i
        Next
        MessageBox.Show(總和.tostring)
    End Sub
End Class[/code]我們呼叫程序時只要在程式碼上鍵入程序名稱就可以了,這樣的話,如果我們想要1到10的加總,就可以一直利用求總和這個程序了,這樣不是很方便嗎
但就有人想到了,我這樣只能求1加到10,那麼我想一加到任意數呢或者是連續的整數總和呢那要怎麼辦,當然,這裡就裡供了定義這種程序的語法
[b]Sub 程序名程(byval 變數1 as 型態 ,byval 變數2 as 型態,.........,byval 變數n as 型態 )
End sub
[/b]
因此我們就可以在呼叫程序時利用傳入變數的方法讓程序內部可以利用這個變數來做事以下為範例[code]Public Class Form1
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        求總和(-10, 100)
    End Sub

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

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

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

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

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

    End Sub

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

        For i As Integer = 起始值 To 終止值
            總和 = 總和 + i
        Next

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

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

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

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

[*][font=仿宋_GB2312][size=5]函數[/size][/font]
程序實際上並不能傳回值,我們有時候在程序執行完時想要有一些值回傳,這時候就需要函數
定義函數的語法如下

[b]    Function 函數名稱(ByVal 引數一 As 型態, ByVal 引數二 As 型態) As 型態
        Return 變數
    End Function[/b]
和程序不同的是,函數一定要傳回值,該回值的型態一定要和函數本身定義的型態相同
我們改寫上面的例子如下[code]Public Class Form1
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        MessageBox.Show(求總和(-10, 100).ToString)
    End Sub
    Function 求總和(ByVal 起始值 As Integer, ByVal 終止值 As Integer) As Integer
        Dim 總和 As Integer = 0
        For i As Integer = 起始值 To 終止值
            總和 = 總和 + i
        Next
        Return 總和
    End Function
End Class[/code]很清楚的我們可以看到函數本身就可以有值

另外,函數本身亦回傳陣列以下為例[code]Public Class Form1

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

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

    End Sub

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

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

    End Function

End Class[/code][/list]

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

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

    Overloads Sub 飲食()
        MessageBox.Show("印度人用右手將飯捏成一團來吃")
    End Sub
End Class[/code]

hugh0620 發表於 2011-6-20 13:32

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

alex_wu 發表於 2012-5-31 23:32

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

alumi 發表於 2012-6-1 00:56

[quote]其實我最近在新學vb2010
對於樓主文中提到的
Sub 程序名程(byval 變數1 as 型態 ,byval 變數2 as 型態,.. ...
[size=2][color=#999999]hugh0620 發表於 2011-6-20 13:32[/color] [url=http://forum.twbts.com/redirect.php?goto=findpost&pid=21953&ptid=394][img]http://forum.twbts.com/images/common/back.gif[/img][/url][/size][/quote]
sub 後面byval 接的變數, 是可以接受外來資料傳遞, 但變數值若在 sub 裡面有被異動, 是不會傳回去. 若要傳回去, 請改成 byRef.
而在 sub 裡面所宣告的變數,  大都是區域變數.

vuptp6 發表於 2019-2-23 20:19

[quote]sub 後面byval 接的變數, 是可以接受外來資料傳遞, 但變數值若在 sub 裡面有被異動, 是不會傳回去. 若要傳 ...
[size=2][color=#999999]alumi 發表於 2012-6-1 00:56[/color] [url=http://forum.twbts.com/redirect.php?goto=findpost&pid=38937&ptid=394][img]http://forum.twbts.com/images/common/back.gif[/img][/url][/size][/quote]


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

cslu37 發表於 2019-3-19 14:26

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

頁: [1]

麻辣家族討論版版為 麻辣學園 網站成員  由 昱得資訊工作室 © Since 1993 所提供