Board logo

標題: [發問] 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
舉個實例說明,你便會明瞭:
  1. Sub joke()
  2.     Dim txt As String, num As Integer
  3.    
  4.     txt = "你好嗎?": num = 200
  5.     Test1 txt, num    '  傳址  (即 jackyq 大大分享的 "本尊")
  6.     MsgBox "txt = " & txt & " , num = " & num
  7.     '  答案是: txt = 很好,謝謝! 大家可好? , num = 150
  8.    
  9.     txt = "早餐吃了嗎?": num = 100
  10.     Test2 txt, num     '  傳值  (即 jackyq 大大分享的 "分身")
  11.     MsgBox "txt = " & txt & " , num = " & num
  12.     '  答案是: txt = 早餐吃了嗎? , num = 100
  13. End Sub

  14. Sub Test1(ByRef txt As String, ByRef num As Integer)   '  傳址 (位址 Address)
  15.     txt = "很好,謝謝! 大家可好?"                      '   (Reference)
  16.     num = num - 50
  17. End Sub

  18. Sub Test2(ByVal txt As String, ByVal num As Integer)   '  傳值  (數值 Value)
  19.     txt = "非常好!伯父身體好麼?"
  20.     num = num - 85
  21. 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
  1. Sub Test2(ByVal txt As String, ByVal num As Integer)   '  傳值  (數值 Value)
  2.     txt = "非常好!伯父身體好麼?"
  3.     num = num - 85
  4. End Sub
複製代碼
一般實務上除非須同步更新變數值 (ByRef),否則都是宣告成傳入值 (ByVal):
以上範例即等於平常習慣使用的:
  1. Sub Test2(txt As String, num As Integer)   '  傳值  (數值 Value)
  2.     txt = "非常好!伯父身體好麼?"
  3.     num = num - 85
  4. 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/)