全民一起VBA提高篇第五课:深入理解函数

可选参数

Option Explicit
Function myproduct(r As Range, Optional usecolumn As Boolean)
Dim i&, j&, s&, k&
s = 0
'usedcolumn为true,按列求积,否则按行求积,参数可选,默认为False
If usecolumn Then
'逐列扫描,将每行个单元格相乘,再将乘积加到总s上
    For j = 1 To r.Columns.Count
    
        k = 1
        
        For i = 1 To r.Rows.Count
        
            k = k * r.Cells(i, j)
            
        Next i
        
        s = s + k
    Next j
    
Else

    For i = 1 To r.Rows.Count
    
        k = 1
        
        For j = 1 To r.Columns.Count
        
            k = k * r.Cells(i, j)
            
        Next j
        
        s = s + k
        
    Next i
    
End If

myproduct = s

End Function

在这里插入图片描述
在这里插入图片描述
第二个参数给false或者不写,都是按行求积

ismissing函数

Sub calldemo()
Dim x, y

x = myfunction(1)

y = myfunction(1, 3)

MsgBox "x是" & x & ", y 是 " & y

End Sub

Function myfunction(a, Optional b)
'这里的b不能定义为具体数据类型,也不能赋予默认值

    If IsMissing(b) Then
    '没提供b,为真
    
        myfunction = a * 2
        
    Else
    
    myfunction = (a + b) * b
    
    End If
    
End Function

传参


Sub 传参()
Dim x
 x = myfun(3)
 MsgBox x
 x = myfun(3, 4)
 MsgBox x
 x = myfun(3, 4, 5)
 MsgBox x
 x = myfun(3, , 5)
 MsgBox x
  x = myfun(c:=3, a:=5)
  'a=3,c=5,说清楚了就不需要一一对应顺序了
 MsgBox x
End Sub

Function myfun(a, Optional b = 0, Optional c = 0)
'提供两个默认值
myfun = a + b - c

End Function

msgbox参数

在这里插入图片描述
加个逗号后面可以写参数

在这里插入图片描述

Sub msgbox参数()
MsgBox "注意!", 4
'是否双按钮
End Sub

在这里插入图片描述
在这里插入图片描述
利用msgbox的传参来做窗体

Sub msgboxDemo()

Dim i, r

r = Selection.Row

i = MsgBox("删除第" & r & "行数据,是否确定?", vbYesNo)
'vbyes=6
    If i = 6 Then
    
    Rows(r).Delete
    
    End If
    
End Sub

在这里插入图片描述

括号问题

在这里插入图片描述
在这里插入图片描述

情况一 无参数,调用不写括号

在这里插入图片描述

情况二 有参数,语句中间调用

在这里插入图片描述

情况三,有参数,语句开头调用

在这里插入图片描述

统一解决法:加Call

在这里插入图片描述

值传递和引用传递

引用传递

Sub 引用传递和值传递()
Dim x As Integer
x = 1
Call 子过程(x)
MsgBox x

End Sub
Sub 子过程(a As Integer)
a = a * 2
End Sub


值传递

Sub 引用传递和值传递()
Dim x As Integer
x = 1
Call 子过程(x)
MsgBox x

End Sub
Sub 子过程(ByVal a As Integer)
a = a * 2
End Sub

byval值传递

扫描二维码关注公众号,回复: 8738143 查看本文章

求余运算

Option Explicit
Sub 染色()
Dim mycolor(3) As Long, i As Integer, k As Integer
'用数组存数据
mycolor(0) = vbRed: mycolor(1) = vbYellow
mycolor(2) = vbBlue: mycolor(3) = vbGreen
i = 3
Do While Cells(i, 1) <> ""
    Cells(i, 1).Resize(1, 4).Interior.Color = mycolor(i Mod 4)
    '用求余数的方法获得循环
i = i + 1
Loop
End Sub

随机数染色

Option Explicit
Sub 随机数染色()
Randomize
'一个程序用一次就够了
'用系统时间生成随机数
Dim mycolor(3) As Long, i As Integer, k As Integer
'用数组存数据
mycolor(0) = vbRed: mycolor(1) = vbYellow
mycolor(2) = vbBlue: mycolor(3) = vbGreen
i = 3
Do While Cells(i, 1) <> ""
    Cells(i, 1).Resize(1, 4).Interior.Color = mycolor(Int(Rnd() * 4))
    '用随机数获取1-4
i = i + 1
Loop
End Sub

在这里插入图片描述

作弊生成随机数

Option Explicit
Sub mycheat()

Dim i As Integer

Randomize

i = Rnd()

'如果随机数i在0到0.5之间,则随机生成一个1到3之间的中奖号码

If i < 0.5 Then

    Range("c7").Value = Int(Rnd() * 3) + 1
    
Else    '否则,随机生成一个4到100之间的中奖号码

    Range("c7").Value = Int(Rnd() * 97) + 4

End If


End Sub

发布了26 篇原创文章 · 获赞 5 · 访问量 1095

猜你喜欢

转载自blog.csdn.net/qq_43568982/article/details/103943138
今日推荐