標題:
[發問]
ByVal Target As Range 用法
[打印本頁]
作者:
mdr0465
時間:
2016-1-28 12:23
標題:
ByVal Target As Range 用法
各位師兄,師姐,
我是EXCEL VBA的初學者,而我亦都有買書黎自學,但有TERM "VBA ByVal Target As Range" 我上網,睇書都不是好明白這句語法的意思,
請求各位指點
謝謝
作者:
c_c_lai
時間:
2016-1-28 13:05
回復
1#
mdr0465
多多上網查詢,你便會更加明瞭外面的世界了。
以 ByVal 和 ByRef 傳遞引數
ByRef and ByVal Parameters
作者:
jackyq
時間:
2016-1-28 13:54
byval object =byref object = object的本尊
byval 變數a = 變數a的分身
byref 變數a = 變數a的本尊
作者:
c_c_lai
時間:
2016-1-28 14:32
本帖最後由 c_c_lai 於 2016-1-28 16:07 編輯
回復
1#
mdr0465
舉個實例說明,你便會明瞭:
Sub joke()
Dim txt As String, num As Integer
txt = "你好嗎?": num = 200
Test1 txt, num ' 傳址 (即 jackyq 大大分享的 "本尊")
MsgBox "txt = " & txt & " , num = " & num
' 答案是: txt = 很好,謝謝! 大家可好? , num = 150
txt = "早餐吃了嗎?": num = 100
Test2 txt, num ' 傳值 (即 jackyq 大大分享的 "分身")
MsgBox "txt = " & txt & " , num = " & num
' 答案是: txt = 早餐吃了嗎? , num = 100
End Sub
Sub Test1(ByRef txt As String, ByRef num As Integer) ' 傳址 (位址 Address)
txt = "很好,謝謝! 大家可好?" ' (Reference)
num = num - 50
End Sub
Sub Test2(ByVal txt As String, ByVal num As Integer) ' 傳值 (數值 Value)
txt = "非常好!伯父身體好麼?"
num = num - 85
End Sub
複製代碼
作者:
yen956
時間:
2016-1-28 16:02
回復
4#
c_c_lai
謝謝分享!!
作者:
mdr0465
時間:
2016-1-28 16:47
回復
4#
c_c_lai
jackyq 師兄,謝謝你有用的資料
cc lai 謝謝你仔細提供的sample, 但因為我都比較蠢,我想問多少少,byref 我都大約知道佢既用法,佢係會改變原有數值的值,
但是byval 佢係法係唔會改變個變本身原有既數值,咁要設定byval 有什麼作用呢??
謝謝
作者:
c_c_lai
時間:
2016-1-28 17:00
回復
6#
mdr0465
Sub Test2(ByVal txt As String, ByVal num As Integer) ' 傳值 (數值 Value)
txt = "非常好!伯父身體好麼?"
num = num - 85
End Sub
複製代碼
一般實務上除非須同步更新變數值 (ByRef),否則都是宣告成傳入值 (ByVal):
以上範例即等於平常習慣使用的:
Sub Test2(txt As String, num As Integer) ' 傳值 (數值 Value)
txt = "非常好!伯父身體好麼?"
num = num - 85
End Sub
複製代碼
如此說明,明白否?
作者:
jackyq
時間:
2016-1-28 17:56
byval 用來保護本尊的
如果本尊資料很重要
不允許被人竄改 ( read only )
就可以派分身出去拋頭露臉
萬一分身在外地被他人霸凌
甚至被殺死
甚至還死的很慘
本尊依然會完好無缺
作者:
mdr0465
時間:
2016-1-28 17:59
本帖最後由 mdr0465 於 2016-1-28 18:08 編輯
cc lai師兄,
真的謝謝你耐心的解釋,我亦都有上網再了解byval 語法
以我所理解,byval 是不會影響程式中有既數值,
如果我無理由錯誤的話,
咁test2 的
txt = "非常好!伯父身體好麼?"
num = num - 85
是不會出現的,但是用byval是沒有影響原有的數值變更的情況下為什麼我們還要寫
txt = "非常好!伯父身體好麼?"
num = num - 85
而不寫其他的字句呢??
不好意思,我腦筋真的很笨,所以想請教各位解答多少少問題.....
謝謝
作者:
c_c_lai
時間:
2016-1-28 18:37
本帖最後由 c_c_lai 於 2016-1-28 18:39 編輯
回復
9#
mdr0465
在函式裡引入參數如為傳值,則無論該參數在該
函式裡如何變化都不會改變該參數傳入時的引入初始值,
該範例內之舉例,只是告訴你,txt 或 num 在函式裡不管
它怎麼異動都不會改變傳入當時的初始值 (原值)。
如果用白話說的話,就如 jackyq 大大說的。
作者:
jackyq
時間:
2016-1-28 20:00
Sub 執行我()
'用 ByRef 發生 本尊信息 被 鄰居2 竄改事件
'導致 鄰居3, 鄰居4 收到錯誤信息
'改成 ByVal 就可以避開被 鄰居2 竄改
msg = "我是陳小美, 星期日晚上6:00 歡迎來我家聚餐"
發信息給鄰居1 msg
發信息給鄰居2 msg
發信息給鄰居3 msg
發信息給鄰居4 msg
End Sub
Sub 發信息給鄰居1(ByRef msg)
MsgBox "鄰居 1 收到信息: " + msg
End Sub
Sub 發信息給鄰居2(ByRef msg)
MsgBox "鄰居 2 收到信息: " + msg
msg = "我是陳小美, 星期日晚上聚餐因為有事緊急取消" '鄰居2 惡搞信息
End Sub
Sub 發信息給鄰居3(ByRef msg)
MsgBox "鄰居 3 收到信息: " + msg
End Sub
Sub 發信息給鄰居4(ByRef msg)
MsgBox "鄰居 4 收到信息: " + msg
End Sub
作者:
mdr0465
時間:
2016-1-29 09:50
cc lai 大大, jackyq 大大
而家我真的明白byval的用法,真的多謝你們不厭其煩幫忙解釋和提供列子給我參考
萬分感謝你們的幫忙....
謝謝
作者:
ML089
時間:
2016-1-31 07:40
回復
12#
mdr0465
補充
1. 沒宣告時為 ByRef
2. 用()括住引數時,強迫傳值。
Sub 主程式()
Dim A%, B%, C%
Debug.Print
A = 123: B = 456: C = 789
Debug.Print "主程式", A, B, C
Call 副程式((A), (B), C) '(A)、(B)強迫傳值
Debug.Print "副程式 - 1", A, B, C
Call 副程式(A, B, C)
Debug.Print "副程式 - 2", A, B, C
End Sub
Sub 副程式(X%, ByRef Y%, ByVal Z%) '沒有宣告時內定為ByRef
X = 321: Y = 654: Z = 987
End Sub
'Debug.Print
'主程式 123 456 789
'副程式 - 1 123 456 789
'副程式 - 2 321 654 789
作者:
jackyq
時間:
2016-1-31 12:11
about byval 2,3.....
(2) 自轉型態
(3) 至於物件
物件不需要分身 ( 物件自己會處理 )
物件也不適合有分身 ( 效能折扣 )
so byval object 編譯器傳的還是本尊
作者:
mdr0465
時間:
2016-2-1 11:07
真的萬分多謝ML089版主,JACKQ 大大,不厭其煩對愚蠢的小弟給予詳細的解釋...
我現在更加明白到byval 的語法用途,
謝謝兩位.......
歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)