关于按地址传递和按值传递的验证(包含一些小验证)

昨天晚上弄的,算是对这几天辛苦啃书的总结

Sub VBATest003()
    Dim i As Single, j As Single, k As Single
    Dim Result As Single
    i = 45.33
    j = 19.24
    Result = myFunction(i, j)
    Debug.Print Result
    Debug.Print "子过程中的i=" & i
End Sub

Rem=之所以会出现所谓的形参/值参或按地址和按值传递参数的说法就是因为
Rem=在函数过程中与数学上的函数还不真的一样,因为数学上的函数表达式只一个,只要给了自变量一个值
Rem=后,其值就不会再变.而在VBA的函数过程中,其所谓的自变量是完全可能会发生变化的,因为其代码行可
Rem=以有多行.
Public Function myFunction(ByVal i, ByVal j) As Integer '自已运行验证,如果去掉ByVal关键字的情况
    myFunction = i * j
    i = i + 1
    Debug.Print "函数中的i=" & i
End Function


'Result1 : 子过程与函数过程中的参数均为i和j,为什么写成相同的呢?因为是先有子过程后有函数过程
'Result2 : 而函数过程就是针对子过程而写的,所以参数符号相同是最好的选择,
'Result3 : 但要注意如果不想被函数过程把你自己开始设定的参数值给改的乱七八糟的话,那就要函数过程的参数列表中
'Result4 : 每个自变量(参数)前均添加ByVal关键字,这就告诉函数过程:
'Result5 : 小子,无论你怎么用,还给我时必须原样交回!!
'Result6 : 如果不加ByVal关键字或者更改为ByRef呢?那就小子无论最后参数值是什么,你只要还给我就好,不要求必须原样交回了!!!

Sub VBATest004()
    '如果只是想显示对话框,不要加括号就可以正常显示,像下行代码
    'MsgBox prompt:="你要打开工作簿吗?", Buttons:=vbYesNoCancel + vbQuestion + vbDefaultButton1, Title:="我的程序"
    '如果需要将对话框的返回值赋给变量,则必须加括号,并且将其赋给某一变量
    Dim myButton As Integer '虽然改为String类型代码一样可以通过,但这样并不好,还是设置成Integer好些.
    myButton = MsgBox(prompt:="你要打开工作簿吗?", Buttons:=vbYesNoCancel + vbQuestion + vbDefaultButton1, Title:="我的程序")
    Select Case myButton
        Case vbYes '或6
            Workbooks.Add xlWBATWorksheet
            ActiveSheet.Name = "斜晖"
        Case vbNo '或7
            MsgBox "您可以稍后再打开一个工作簿!"
        Case vbCancel '或2
            MsgBox "您按了取消键"
    End Select
End Sub
'---------------------------------------------------------------------------------------
' Procedure : VBATest006
' Author    : Administrator
' Date      : 2013-12-7
' Purpose   : 将除指定工作表外的其余非空工作表删除
'---------------------------------------------------------------------------------------
'
Sub VBATest006()
    Dim MyWorkSheet As Worksheet
    Application.DisplayAlerts = False
    For Each MyWorkSheet In Worksheets
        If MyWorkSheet.Range("A1") <> "" And MyWorkSheet.Name <> "成绩" Then
            MyWorkSheet.Delete
        End If
    Next MyWorkSheet
    Set MyWorkSheet = Nothing
    Application.DisplayAlerts = True
    
End Sub
'---------------------------------------------------------------------------------------
' Procedure : VBATest007
' Author    : Administrator
' Date      : 2013-12-7
' Purpose   : 验证删除指定内容的所在行
'---------------------------------------------------------------------------------------
'
Sub VBATest007()
    Dim i As Integer, totalR As Integer
    totalR = Range("A65536").End(xlUp).Row
    For i = totalR To 2 Step -1
        If Cells(i, 1).Value = "0" Then
            Cells(i, 1).EntireRow.Delete
        End If
    Next i
End Sub
'---------------------------------------------------------------------------------------
' Procedure : VBATest008
' Author    : Administrator
' Date      : 2013-12-7
' Purpose   : 验证对数组进行For...Each遍历操作,其变量的类型(实体Variant)
'---------------------------------------------------------------------------------------
'
Sub VBATest008()
    Dim MyArr(1 To 10) As Integer
    Dim i As Integer
    For i = 1 To 10
        MyArr(i) = i
    Next i
    Dim ArrOb As Variant '如果想利用For...Each循环对数组进行遍历操作,必须将变量设置成变体(Variant)变量.
'    For Each ArrOb In MyArr
'        ArrOb = ArrOb + 1
'        Debug.Print ArrOb
'        If ArrOb = 8 Then
'            Exit Sub '遍历中如果找到了自己需要的数据,就没有必要再继续下去了,可以直接退出过程。
'        End If
'    Next ArrOb
    For i = 1 To 10
        Debug.Print MyArr(i)
    Next i
    Range("A1").Resize(1, UBound(MyArr)).Value = MyArr()
    Range("A1").Resize(UBound(MyArr), 1).Value = Application.WorksheetFunction.Transpose(MyArr)
    
    
    
End Sub

 

 
posted @ 2013-12-07 22:46  surfacetension  阅读(559)  评论(0编辑  收藏  举报