全民一起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值传递

求余运算

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值