VBA-语法-函数和过程


两种注释的方法,其一是使用单引号,另一种是Rem。

函数可以在Excel表格中像一般的Excel函数那样使用,但过程不可以
过程可以指定给Excel表格中的按钮或者图片等对象,但是函数不可以
函数只能在被调用时执行,比如在过程中调用,或者在另一个函数中调用,或者在Excel表格中调用。但不能直接执行,而过程是可以的

Sub sub_test(s As String)
    Debug.Print s
End Sub

Sub test()
    Call sub_test("hello")
End Sub

Function 函数名(参数1, 参数2, ...) As 数据类型
    ' 需要在函数中执行的代码
    函数名 = 函数执行后的结果
End Function

退出Sub过程,使用Exit Sub语句。
退出函数,使用Exit Function语句。

====================================
可选参数

1、可选参数可用Optional关键字标示;
2、可选参数需赋予默认值;
3、如未赋予默认值,那么需要在函数里可以通过ismissing(b)来判断该参数时候有值传入 ;
4、Optional参数(可选参数)必须放在后面,即先必选参数再可选参数。

如果有多个可选参数,那么第一个可选参数后的参数必须还是可选参数

可选参数在定义时用Optional关键字声明,可选参数必须放在参数列表的最后面
Sub sub_test(Optional s As String = "Hello, World")
    Debug.Print s
End Sub

Sub Sub1(var1 As String, Optional Var2 As String = "可选参数默认值") 

function multi(a as integer,b as integer,optional third)
    if not ismissing (third) then  '判断可选参数third是否有值传入 

====================================
返回值与括号

方法后面的参数是不用加括号的,只需用空格隔开
用到返回值,加括号;
没用到返回值,不要加括号。
函数或方法的语法里有括号,表示它有返回值
在语句里如果不利用这个返回值赋给变量的话,调用函数或方法不要加括号。

MsgBox "Task Completed!", 0, "Task Box" 
Answer3 = MsgBox("Are you happy with your salary?", 4, "Question 3") 

使用命名参数调用MsgBox函数,但它将忽略返回值。
MsgBox Title:="Task Box", Prompt:="Task Completed!" 

使用命名参数,并将返回值分配给变量。
answer3 = MsgBox(Title:="Question 3",  Prompt:="Are you happy with your salary?", Buttons:=4) 


如果定义了一个Function,这个function还有返回值
在调用function()的时候需要有个变量接收返回值,否则会报错
如果返回值不想接收,那么调用方法的时候就不要加小括号了。

调用一个无参数的方法时,不带小括号,否则编译不通过

======================================
值传递引用传递

参数可以定义成 ByVal和ByRef,默认是ByRef,参数传入前一定要先定义,否则会提示类型不符
参数传值的时候如果是对一个对象ByRef,那么这个对象需要Dim,否则就会编译报错

方法定义:
Public Sub writeScreenSheet(ByRef screenSheet As Worksheet)

调用的时候:
Dim s As Worksheet
Set s = 。。。
writeScreenSheet(s)

======================================

ByRef的问题

Private Function inner(ByRef a As Integer)
    a = 8
End Function

Public Sub Test()
    Dim t As Integer
    t = 5
    'inner (t)  这样调用的时候还是5,所以必须加call才可以。不知道为啥,奇怪的逻辑
    Call inner(t) 这样调用的时候,就是8了
    MsgBox t
End Sub

当定义结构体的时候,ByRef也是好用的
Public Type ConfigData
    pQueryString As String
    pOutSheets As String
End Type

Private Function inner(ByRef a As ConfigData)
    a.pQueryString = 9
End Function

Public Sub Main()
    Dim t As ConfigData
    t.pQueryString = 5
    Call inner(t)
    MsgBox t.pQueryString
End Sub
 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值