返回列表 上一主題 發帖

[發問] ByVal Target As Range 用法

[發問] ByVal Target As Range 用法

各位師兄,師姐,

我是EXCEL VBA的初學者,而我亦都有買書黎自學,但有TERM "VBA ByVal Target As Range" 我上網,睇書都不是好明白這句語法的意思,

請求各位指點

謝謝

真的萬分多謝ML089版主,JACKQ 大大,不厭其煩對愚蠢的小弟給予詳細的解釋...
我現在更加明白到byval 的語法用途,
謝謝兩位.......

TOP

about byval  2,3.....
(2) 自轉型態
(3)  至於物件
       物件不需要分身 (  物件自己會處理  )
       物件也不適合有分身 (  效能折扣  )
so  byval object 編譯器傳的還是本尊

TOP

回復 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
{...} 表示需要用 CTRL+SHIFT+ENTER 三鍵輸入公式

TOP

cc lai 大大, jackyq  大大

而家我真的明白byval的用法,真的多謝你們不厭其煩幫忙解釋和提供列子給我參考
萬分感謝你們的幫忙....
謝謝

TOP

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

TOP

本帖最後由 c_c_lai 於 2016-1-28 18:39 編輯

回復 9# mdr0465
在函式裡引入參數如為傳值,則無論該參數在該
函式裡如何變化都不會改變該參數傳入時的引入初始值,
該範例內之舉例,只是告訴你,txt 或 num 在函式裡不管
它怎麼異動都不會改變傳入當時的初始值 (原值)。
如果用白話說的話,就如 jackyq  大大說的。

TOP

本帖最後由 mdr0465 於 2016-1-28 18:08 編輯

cc lai師兄,
真的謝謝你耐心的解釋,我亦都有上網再了解byval 語法
以我所理解,byval 是不會影響程式中有既數值,
如果我無理由錯誤的話,
咁test2 的
txt = "非常好!伯父身體好麼?"
    num = num - 85
是不會出現的,但是用byval是沒有影響原有的數值變更的情況下為什麼我們還要寫
txt = "非常好!伯父身體好麼?"
    num = num - 85

而不寫其他的字句呢??

不好意思,我腦筋真的很笨,所以想請教各位解答多少少問題.....
謝謝

TOP

byval 用來保護本尊的
如果本尊資料很重要
不允許被人竄改 ( read  only )
就可以派分身出去拋頭露臉
萬一分身在外地被他人霸凌
甚至被殺死
甚至還死的很慘
本尊依然會完好無缺

TOP

回復 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
複製代碼
如此說明,明白否?

TOP

        靜思自在 : 難行能行,難捨能捨,難為能為,才能昇華自我的人格。
返回列表 上一主題