VBA的form相关实验2,form里的变量传递和模块里有什么不同?(---未完成-----)
草稿
'1.1 參數的傳遞,應該還是要以
'Public index1 ?'傳不過去,擦, 這是之前,想把一個form里的變量,傳遞給其他form 不管用
 '懷疑,可能只能public private 只再模塊間是這樣的
 '測試下
'但好方法?,確實先把東西存再excel表,也就是數據庫,之后在讀,這樣安全?
 ?
感覺存在數據庫表里,是個好思路
0 名詞解釋:
0.1 作用域
- 常量/變量的作用域
- 作用域是指這個變量允許在什么地方 使用/ 調用變量。
- ( 反過來說就是那些程序可以訪問到這些變量)
- 作用域有各種說法
- 聲明變量的作用域,一定要在模塊最開始聲明
- 如果只在模塊中間聲明,比如某些過程后面,會有問題。因為代碼是順序執行的,沒執行到那,那個變量在之前還不是全局變量等,所以要在模塊最開始聲明
0.2 生存周期:(聲明作用域會影響生命周期)
- 常量/變量的生存周期
- 變量保留其值的時間,稱為生存周期。
- 生存周期的 start :? 賦值的過程,開始生效(也就是即使聲明為public,賦值所在的過程,不允許,變量的值還是沒被改變,可能還是"")
- 比如public a1 在模塊開始聲明時其實已經創建了,但沒賦值,還是為空
- 生存周期的 end? :? ?賦值的過程,已經結束,回收變量,消滅了。(但是聲明public private的變量,在過程結束后,并不回收,而是整個模塊(其實是整個workbook關閉了)關閉才會回收)
- if 常量在模塊開頭定義和賦值,生存周期就是整個模塊加載期間。
- if 常量定義在過程/函數里,就是過程/函數 生命期內。
- VBA里一般變量(非靜態static變量)都在過程內,賦值,生命期也是,離開這個過程,除非已經調用到內存,否則過程外是不生效的,因為已經回收消滅了。
- 靜態變量與動態變量 動態變量是指被過程調用時均重新初始化的變量,而靜態變量在初始化后,下一次調用時仍保留上次的值的變量。
聲明變量作用域會影響變量的生命周期的關系
- 模塊級的變量,只要不關表(模塊一直在加載)就一直在生效,不會被消滅!。比如public? private dim 定義在模塊最開始的地方的( dim定義在過程內的不算模塊級變量)
- 過程級變量,過程運行結束馬上消滅,變量每次重置計算,特殊的static記住之前的
下面是網上查的資料
這個 ?https://blog.csdn.net/qq_25582033/article/details/117427865
比方說你在一個xls文件中有兩個工程(應該1個EXCEL表都只有1個工程吧),那么在某個工程中的模塊如果不寫這個語句,那么兩個工程都可以用這個模塊的內容。如果寫上Option Private Module,那么另外那個工程就不能使用這個模塊的內容。
?? ? 下面表格里有幾個地方是錯的,private聲明的變量,因為必須在模塊頂部(只要是聲明在模塊頂部的,即使是 dim 或 public private都一樣,因為都是模塊級變量了),所以一旦過程內運行賦值后,其聲明周期不是過程有效期內,而是模塊/整個EXCEL的 workbook 文件有效期內都在生效,而并沒有被釋放消滅。
? ? ? 下面的代碼可以證明
Private Sub tf2()Debug.Print "x= " & X Debug.Print "y= " & y Debug.Print "z= " & z Debug.Print "z1= " & z1End Sub'模塊級的,只要不關表就一直在 '過程級馬上沒,一般變量每次重置計算, static記住之前的 Private Sub tf3()X = 1y = 111z = 222z1 = 333End Sub0.3?即使寫了參數調用? 和 聲明作用域,也得先運行那個程序
因為即使是一個public變量,作用域是全局,但是沒有被其他程序賦值改變前,值為空
- VBA 并不會,自動運行這個變量的相關的其他 block,
- VBA 和其他代碼一樣,都是順序執行的
- 即使聲明了某模塊級變量,但是如果還未運行賦值過程給這個 模塊級變量,那么這個 模塊級變量仍然還是 "" none null nothing 等等,運行了賦值過程后,雖然賦值過程本身消滅了,但是這個模塊級變量的值會一直保留,且可以被修改到,這個模塊結束(被關閉)之前。
0.4 特殊的靜態變量?Static (很適合用來計數--因為模塊內不清除)
- static 變量 特殊性:生命周期效果類模塊級變量,但是作用域還是過程級的變量。這么特殊,可能時比public等更安全點
- VB允許你通過改變聲明方式延長當地變量的存活期,這種就是 static 靜態變量
- 很特殊,首先是變量,不是常量? (可改變)
- 而且仍然是過程級,外部程序無法訪問
- 但是可以在模塊結束之前,一直都存在, 生命周期效果類 模塊級變量,但是作用域還是過程及的變量。
1第1部分,模塊內和模塊之間的 直接使用和調用
1.1 常量的 直接使用和調用
- 常量的直接使用,非傳遞的話,想直接使用只能靠聲明
- 常量一般都是聲明了直接使用吧,本身不變,沒有什么調用的必要了吧?得查查后以后看
1.2? 常量的定義,賦值和生命周期
- 常量的聲明和定義 (聲明和定義一般是一塊兒,但賦值一般是在計算時才賦值)
- 常量可以聲明,聲明在模塊開始
- 常量的賦值
- 賦值在哪兒,決定了常量的生命周期
- 如果常量賦值在模塊開始,整個模塊內都生效,在本模塊內常量不會被釋放(變量是不允許在 過程外賦值的!)
- 賦值在過程內,只能在過程內生命周期內有效,過程結束就釋放了
1.2.1??直接使用常量
- 直接使用常量,靠常量本身的聲明的使用域的范圍
- private 不能跨模塊,這個級別聲明,只能在本模塊內的,不同過程/函數之間用
- public可跨模塊,本模塊內所有,其他模塊的都能直接使用
- 本例中,因為取不到其他模塊的private內容,a1會被識別為本模塊的 過程級變量名,而且因為沒定義沒賦值,就為空
1.3 常量的調用
常量一般都是聲明了直接使用吧,本身不變,沒有什么調用的必要了吧?
2 變量的使用 和調用
2.1 代碼的封裝,無法訪問 封裝內部的變量,只能整體調用
- 也就是外部代碼無法訪問封裝部分內部的內容,但是可以訪問其外部整體調用
- 那些東西是封裝的:過程/函數等完整的block,而不是那種順序流的
- 過程/函數封裝的內部到底有啥:變量,一些處理邏輯表達式
- 不能直接調用其他過程內的變量,而只能根據作用域,調用這些過程,并且只能執行這些過程這個動作,并不能引用 那些過程的結果"
2.2 整體調用方式
- 怎么叫 整體調用,就是調用,過程名,call? t1() 這種 整體調用。
- 特殊的
- 但是函數特殊,有返回值的函數可以當變量調用,把? ?特殊變量 = 函數名(代表函數)
- 但本質還是 調用函數,只是函數返回值是這樣
function t2
t2=XXXX
end function
- t2= XXXX? ?相當于return ,只有函數function 可以這樣返回,sub 過程不能這樣return
2.3 調用過程,也需要看 過程本身的作用域,比如private sub? 無法被跨過程調用
- sub / function 因為本身就存在于模塊級,不存在在過程中的可能,所以默認是全局的 public
- (默認 public ) sub?
- 可以主動聲明為 private sub
- Option Private Module ,寫在模塊開頭,會設置下面的所有的 過程/函數都是private的
2.4? 過程/函數的 作用域和 變量本身作用域 完全無關! 獨立的
3? 函數和變量的調用
- 函數包括帶返回值,和不帶返回值的情況
- 函數如果不帶返回值時,類 sub,基本和sub一樣的處理
- 但是function 帶返回值,的情況是不同的
3.1 不帶返回值的function 被調用參數時
- 直接無法訪問,其他代碼內部的變量,無論時本模塊,還是其他模塊的
- 因為訪問其他變量的代碼,本身是在 過程/函數內,所以,在本過程內,沒有這些變量。就會認為是未定義的空變量
- 如果內存里已經有 其他過程內的變量,聲明為 非過程級,比如? 整個模塊開始處定義的?public private? dim,而且已經運行過其對應賦值過程,內存里變量已經生成,且因為 聲明的作用域一直還處于生效期,則可以訪問到其值。
- 特殊情況,如果不是在整個模塊開始處定義的?public private? dim,比如下面例子的 public d3 只是在過程前聲明,而不是在整個模塊開始處聲明,則聲明無意義。
- 如果 訪問作為整體的 過程,則要i看過程/ 函數本身是否聲明為 public private. 一般來說,默認過程/函數 默認都是 public ,也就是可以各個模塊都訪問。
- 但是可以強制聲明為 private 只讓本模塊內的其他程序,call 調用他
- 但是至少最小的調用范圍就是private了
?
3.2 如果函數帶返回值了,是一種特殊處理, 變量名= 函數名= 函數返回值return
- 核心就是特殊處理?:變量名= 函數名= 函數返回值return
sub內的代碼,聲明周期也是過程級,應該不影響其他吧
- Application.DisplayAlerts = False ?
- 這個聲明的生命周期也應該在sub內,有啥必要非在sub結尾前關閉掉?多此一舉把
 ?
2.2?
'----------------此處是模塊5,下面是模塊6的內容------------------'1常量 Private Const a1 = 5 Public Const a2 = 5 Public b5'2變量 'VBA 變量的聲明可以在 過程/函數的內/外,但是賦值只能在過程/函數的 內 'bbb = 555 '報錯,無效的外部過程'3過程和變量,調用過程只能用call Private Sub t1()b1 = 61 ' t1 = 61 '報錯,缺少函數/或變量,相當于return ,只有函數可以這樣返回,sub 過程不能這樣returnDebug.Print "內部b1= " & b1 End SubPublic Sub t2()b2 = 62 ' t2 = 62 '相當于return ,只有函數可以這樣返回,sub 過程不能這樣returnDebug.Print "內部b2= " & b2 End SubSub t3()b9 = 69 ' t3 = 63 '相當于return ,只有函數可以這樣返回,sub 過程不能這樣returnDebug.Print "內部b9= " & b9 End Sub '----------------此處是模塊6,下面是模塊6的內容------------------Private Const a3 = 777 Private Const a4 = 778Private b7 Public b8Sub test0001()Debug.Print "調用常量" & "private 不能跨模塊,public可跨模塊,取不到其他模塊的private內容,a1只能識別為本模塊的 過程級變量名" Debug.Print "其他模塊的 a1=" & a1 Debug.Print "其他模塊的 a2=" & a2 Debug.Print "a3=" & a3 Debug.Print "a4=" & a4 Debug.PrintEnd SubPublic Sub test01()b7 = 111Debug.Print "內部b7= " & b7 End SubPrivate Sub test02()b8 = 222Debug.Print "內部b8= " & b8 End SubSub test0002()Debug.Print "直接調用其他函數過程里的變量是不行的!封閉性,程/函數 內部的內容都是封裝的,外部不能訪問,只能整體調用" Debug.Print "b1=" & b1 Debug.Print "b2=" & b2 Debug.Print "b7=" & b7 Debug.Print "b8=" & b8 Debug.Print "b9=" & b9 End SubSub test0003() Debug.Print "調用過程/函數,也要看 過程/函數本身的 作用域聲明,這個和變量的作用域完全獨立" Debug.Print "一般默認過程/函數,都是模塊級的,public 公有的" Debug.Print "不能直接調用其他過程內的變量,而只能根據作用域,調用這些過程,并且只能執行這些過程這個動作,并不能引用 那些過程的結果"'Call t1 '非public 過程,無法被這么調用 Call t2 Call t3Call test01 Call test02End Sub
 '沒法調用過程了里得變量的!只能調用過程。
 ' 函數特殊,有返回值的函數可以當變量調用,但本質還是 調用函數,只是函數返回值是這樣
1.2.1 變量的直接使用
1.2.2 變量的調用
? 第2是調用
而傳遞,可以繞開聲明,也可以跨過程
形式和實際
 ?
傳遞方法
位置參數
名稱參數
混合的,名稱的在后,好像是
---------
'在模塊里試下,在form里試下,在workbook和sheet里試下
 '然后再試下,能不能跨這幾個
'VBA的一個BUG,修改函數,變量的聲明范圍后,比如去掉加上public 有時候,需要關掉重開,運行代碼才會正常,還按老的,
 'VBA,甚至跨模塊調用時,賦值也有這種滯后的問題
'調用,常量,變量/函數
 'call 過程/函數
-------
然后 form內呢
然后三者互相呢
 '在模塊里試下,在form里試下,在workbook和sheet里試下
 '然后再試下,能不能跨這幾個
'VBA的一個BUG,修改函數,變量的聲明范圍后,比如去掉加上public 有時候,需要關掉重開,運行代碼才會正常,還按老的,
 'VBA,甚至跨模塊調用時,賦值也有這種滯后的問題
 '調用,常量,變量/函數
 'call 過程/函數
1 先在模塊里做了實驗
'常量 Private Const a1 = 5 Public Const a2 = 5 Public b5'過程和變量Private Sub t1()b1 = 6t1 = 6End SubPublic Sub t2()b2 = 6 ' t2 = 6 '相當于return ,只有函數可以這樣返回,sub 過程不能這樣returnEnd Sub'函數和變量 Private Function f1()b3 = 55c1 = 6f1 = 6End FunctionPublic Function f2() '過程/函數 不是默認public嗎?b4 = 66c2 = 6f2 = 6 '相當于returnb5 = 777 'Public b6 'vba,聲明跨過程/函數級的參數,必須在 過程/函數 外部聲明,一般是最開始(理論上使用前聲明就行,但放最前面最安全) ' b6 = 777End Function'函數,無返回值 Private Function e1()d1 = 6End FunctionPublic Function e2()d2 = 6End Function '在模塊里試下,在form里試下,在workbook和sheet里試下 '然后再試下,能不能跨這幾個'VBA的一個BUG,修改函數,變量的聲明范圍后,比如去掉加上public 有時候,需要關掉重開,運行代碼才會正常,還按老的, 'VBA,甚至跨模塊調用時,賦值也有這種滯后的問題'調用,常量,變量/函數 'call 過程/函數Private Const a3 = 777 Private Const a4 = 778Private b7 Public b8Public Sub test01()b7 = 111 End SubPublic Function test02()b8 = 222End FunctionSub test001()Debug.Print "調用常量" & "private 不跨模塊,public可跨模塊,取不到其他模塊的private內容,a1只能識別為本模塊的 過程級變量名" Debug.Print "a1=" & a1 Debug.Print "a2=" & a2 Debug.Print "a3=" & a3 Debug.Print "a4=" & a4 Debug.PrintDebug.Print "調用其他函數過程里的變量" & "都不行,過程/函數 內部的內容()都是封裝的,除非return拿到,否則只能靠聲明變量拿到" Debug.Print "b1=" & b1 Debug.Print "b2=" & b2 Debug.Print "b3=" & b3 Debug.Print "b4=" & b4 Debug.Print "b5=" & b5 '參數聲明public還不夠,還需要函數/過程也 public ? Debug.Print "b6=" & b6 Debug.Print "b7=" & b7 Debug.Print "b8=" & b8 Debug.PrintDebug.Print "t1=" & t1'Debug.Print "t2=" & t2 '過程名不能當 變量/函數 這樣直接使用,只能call 調用?'這樣是變量,不是函數,但是無參數的不是默認自動去掉括號嗎? 'Debug.Print "t2=" & t2()'Call t1 Call t2Debug.Print "f1=" & f1 Debug.Print "f2=" & f2'Call f1 Call f2Debug.Print "e1=" & e1 Debug.Print "e2=" & e2'Call e1 Call e2End Sub'傳遞參數的幾個思路'存下來傳遞,存儲,文件中,中轉'方法,按位置,按名稱'中轉總結
以上是生活随笔為你收集整理的VBA的form相关实验2,form里的变量传递和模块里有什么不同?(---未完成-----)的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 红旗linux镜像文件iso,红旗Lin
- 下一篇: 基于再生龙(clonezilla)的系统
