日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

VBA的form相关实验2,form里的变量传递和模块里有什么不同?(---未完成-----)

發布時間:2023/12/20 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 VBA的form相关实验2,form里的变量传递和模块里有什么不同?(---未完成-----) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

草稿

'1.1 參數的傳遞,應該還是要以

'Public index1 ?'傳不過去,擦, 這是之前,想把一個form里的變量,傳遞給其他form 不管用
'懷疑,可能只能public private 只再模塊間是這樣的
'測試下

'但好方法?,確實先把東西存再excel表,也就是數據庫,之后在讀,這樣安全?
?

感覺存在數據庫表里,是個好思路

0 名詞解釋:

0.1 作用域

  • 常量/變量的作用域
  • 作用域是指這個變量允許在什么地方 使用/ 調用變量。
  • ( 反過來說就是那些程序可以訪問到這些變量)
  • 作用域有各種說法
  • 公有變量/全局變量/跨模塊變量? ? ?public
  • 模塊級變量? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? private 或 dim
  • 私有變量/ 過程級變量? ? ? ? ? ? ? ? ? ?dim 或 static
    • 聲明變量的作用域,一定要在模塊最開始聲明
    • 如果只在模塊中間聲明,比如某些過程后面,會有問題。因為代碼是順序執行的,沒執行到那,那個變量在之前還不是全局變量等,所以要在模塊最開始聲明

    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 Sub

    0.3?即使寫了參數調用? 和 聲明作用域,也得先運行那個程序

    因為即使是一個public變量,作用域是全局,但是沒有被其他程序賦值改變前,值為空

    • VBA 并不會,自動運行這個變量的相關的其他 block,
    • VBA 和其他代碼一樣,都是順序執行的
    • 即使聲明了某模塊級變量,但是如果還未運行賦值過程給這個 模塊級變量,那么這個 模塊級變量仍然還是 "" none null nothing 等等,運行了賦值過程后,雖然賦值過程本身消滅了,但是這個模塊級變量的值會一直保留,且可以被修改到,這個模塊結束(被關閉)之前。

    0.4 特殊的靜態變量?Static (很適合用來計數--因為模塊內不清除)

    • static 變量 特殊性:生命周期效果類模塊級變量,但是作用域還是過程級的變量。這么特殊,可能時比public等更安全點
    • VB允許你通過改變聲明方式延長當地變量的存活期,這種就是 static 靜態變量
    • 很特殊,首先是變量,不是常量? (可改變)
    • 而且仍然是過程級,外部程序無法訪問
    • 但是可以在模塊結束之前,一直都存在, 生命周期效果類 模塊級變量,但是作用域還是過程及的變量。
    Const aaa1 = 2 Public Const aaa2 As Integer = 111 Public y Private z Dim z1Sub tf1()Const aaa5 = 555 'Public Const aaa6 = 666Debug.Print "aaa1= " & aaa1 Debug.Print "aaa2= " & aaa2 Debug.Print "aaa5= " & aaa5 'Debug.Print "aaa6= " & aaa6End SubPrivate Sub tf2()'沒法調用過程了里得變量的!只能調用過程。 ' 函數特殊,有返回值的函數可以當變量調用,但本質還是 調用函數,只是函數返回值是這樣Debug.Print "x= " & X Debug.Print "y= " & y Debug.Print "z= " & z Debug.Print "z1= " & z1 Debug.Print "z2= " & z2 End SubPrivate Sub tf3()X = 1y = 111z = 222z1 = 333Static z2z2 = z2 + 1Debug.Print "內部X= " & XDebug.Print "內部z2= " & z2End Sub

    1第1部分,模塊內和模塊之間的 直接使用和調用

    1.1 常量的 直接使用和調用

    • 常量的直接使用,非傳遞的話,想直接使用只能靠聲明
    • 常量一般都是聲明了直接使用吧,本身不變,沒有什么調用的必要了吧?得查查后以后看

    1.2? 常量的定義,賦值和生命周期

    • 常量的聲明和定義 (聲明和定義一般是一塊兒,但賦值一般是在計算時才賦值)
    • 常量可以聲明,聲明在模塊開始

    • 常量的賦值
    • 賦值在哪兒,決定了常量的生命周期
    • 如果常量賦值在模塊開始,整個模塊內都生效,在本模塊內常量不會被釋放(變量是不允許在 過程外賦值的!)
    • 賦值在過程內,只能在過程內生命周期內有效,過程結束就釋放了
    Const aaa1 = 2 Public Const aaa2 As Integer = 111Sub tf1()Const aaa5 = 555 'Public Const aaa6 = 666Debug.Print "aaa1= " & aaa1 Debug.Print "aaa2= " & aaa2 Debug.Print "aaa5= " & aaa5 'Debug.Print "aaa6= " & aaa6End Sub

    1.2.1??直接使用常量

    • 直接使用常量,靠常量本身的聲明的使用域的范圍
    • private 不能跨模塊,這個級別聲明,只能在本模塊內的,不同過程/函數之間用
    • public可跨模塊,本模塊內所有,其他模塊的都能直接使用
    • 本例中,因為取不到其他模塊的private內容,a1會被識別為本模塊的 過程級變量名,而且因為沒定義沒賦值,就為空
    '----------------此處是模塊5,下面是模塊6的內容------------------'1常量 Private Const a1 = 5 Public Const a2 = 5 Public b5

    '----------------此處是模塊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 Sub

    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了

    '----------------此處是模塊5,下面是模塊6的內容------------------'4函數,和變量 函數(函數名)可以作為變量用,有無返回值時 '函數,無返回值 Private Function e1()d1 = 6Debug.Print "內部 d1= " & d1 End FunctionPublic Function e2()d2 = 6Debug.Print "內部d2= " & d2End Function

    '----------------此處是模塊6,下面是模塊6的內容------------------ Public d3Sub test03()d3 = 5 d4 = 6 d5 = 7Debug.Print "內部d3= " & d3 Debug.Print "內部d4= " & d4 Debug.Print "內部d5= " & d5End SubSub test0004()Debug.Print "d1= " & d1 Debug.Print "d2= " & d2 Debug.Print "d3= " & d3 Debug.Print "d4= " & d4 Debug.Print "d5= " & d5End SubSub test0005()'Call e1 '會報錯,子過程 sub 或函數 function 未定義! Call e2End Sub

    ?

    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


    '沒法調用過程了里得變量的!只能調用過程。
    ' 函數特殊,有返回值的函數可以當變量調用,但本質還是 調用函數,只是函數返回值是這樣

    Private Sub tf2()'沒法調用過程了里得變量的!只能調用過程。 ' 函數特殊,有返回值的函數可以當變量調用,但本質還是 調用函數,只是函數返回值是這樣Debug.Print "x= " & XEnd SubPrivate Sub tf3()X = 1End 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里的变量传递和模块里有什么不同?(---未完成-----)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。