首页 > 其他分享 >VBA: 过程和函数

VBA: 过程和函数

时间:2024-07-03 15:21:57浏览次数:1  
标签:Function VBA End 函数 String msg 过程 Sub

过程(sub)

无参数过程

Sub SayHello()
    Msgbox "Hello World"
End Sub

有参数过程

'声明一个过程
Sub SayHello(name As String)
    Msgbox "Hello" & name
End Sub

'在另一个过程,调用上述过程,调用时,提供一个实际的 name 参数
Sub MyCode()
    SayHello "World 2"
End Sub

调用子过程

'主入口
Sub Main()
    Dim name As String
    Dim title As String
    
    name = "Zhang san"
    title = "CEO"
    
    WriteInfo name & "," & title
End Sub

'子过程,在工作表A1单元格填写信息
Sub WriteInfo(info As String)
    Range("A1") = info
End Sub

从代码可读性的角度来看,这里推荐使用关键词 Call 调用子过程

点击查看代码
Sub Main()
    Call MySub
End Sub

Sub MySub()
    '代码
End Sub

函数(Function)

VBA 函数与 VBA 过程很相似,除了使用的关键词外,主要区别是,函数可以返回值。

无参数函数

实例:

Function RandomLogic() As Boolean
    RandomLogic = Rnd() > 0.5
End Function

语法:

Function [函数名]() As [返回值类型]
    语句...
    [函数名] = [返回值]
End Function

有参数函数

实例:

Function Add2Number(num1 As Double, num2 As Double) As Double
    Add2Number = num1 + num2
End Function

语法:

Function [函数名]([变量名1] As [数据类型1],...[变量名n] As [数据类型n]) As [返回值类型]
    语句...
    [函数名] = [返回值]
End Function

调用函数

调用有返回值的函数时,一般有两种情形:

  • 一是,使用一个变量存储函数返回的值
  • 二是,函数返回的值参与其他计算

实例:

Sub Main()
    '使用变量存储函数返回的值
    Dim result1 As Double
    result1 = Add(12, 345)
    
    '函数返回值继续参与计算
    Dim result2 As Double
    result2 = RandNum + Add(12, 345)
End Sub

'函数:返回一个随机值
Function RandNum()
    RandNum = Rnd * 100
End Function
'函数:返回两数的和
Function Add(num1 As Double, num2 As Double) As Double
    Add = num1 + num2
End Function

过程sub和函数的不同:函数可以有返回值(函数可以不返回值,这种情况其作用与子过程相同。因此建议,不需要返回值时,直接使用子过程代替函数。)

ByVal传值和ByRef传地址

VBA 中定义过程或函数时,如果需要传递变量,需指定参数的传递类型,包括以下 2 类:

ByVal:传递参数的值

ByRef:传递参数的引用

两种传递类型的说明和区别如下:

  • ByVal:传递变量时,复制一份该变量,传入过程或函数。在过程和函数内部对该变量进行修改,只对该副本有效,对上一级过程(父过程)的变量没有影响。
  • ByRef:传递变量时,将该变量的引用地址传入过程或函数。传入引用地址意味着,在过程或函数内部对其修改时,也会影响上一级过程(父过程)中的变量的值。

ByVal 实例

Sub Test()

    Dim msg As String
    msg = "main"
    
    TestSub1 msg
    
    Msgbox msg

End Sub

'ByVal 传递类型
Sub TestSub1(ByVal msg As String)
    msg = "val"
End Sub

ByRef 实例

Sub Test()

    Dim msg As String
    msg = "main"
    
    TestSub2 msg
    
    MsgBox msg

End Sub

'ByRef 传递类型
Sub TestSub2(ByRef msg As String)
    msg = "ref"
End Sub

默认情况下,当省略传递类型时,默认值是 ByRef,因此以下两种写法是等效的。

'指定 ByRef 传递类型
Sub TestSub1(ByRef msg As String)

End Sub

'省略传递类型
Sub TestSub1(msg As String)

End Sub

变量作用域

  • 过程作用域
  • 模块作用域
  • 工程作用域

1、过程作用域

在过程或函数内部声明的变量,只有在当前过程或函数内被使用。

2、模块作用域

一个模块中,在任何一个过程和函数外面,使用关键词 Private 或 Dim 声明的变量,称之为模块变量,其作用域是当前模块。例如,

Dim guest As String

Sub Test()

    Dim message As String
    
    guest = "张三"
    message = "你好"
    
    MsgBox message & "! " & guest

End Sub

3、工程作用域
Excel VBA 中,一个 Excel 工作簿是一个 VBA 工程。与之对应,工程作用域表示变量在当前工程中的模块、Excel 对象、用户窗体、类模块中均可以被使用。

工程级别变量,在所在模块顶部声明 Option Private Module 修饰语句前提下,在过程或函数外面,使用关键词 Public 声明的变量,其作用域是当前工程。例如,

Option Private Module

Public guest As String

Sub Test()

    Dim message As String
    
    guest = "张三"
    message = "你好"
    
    MsgBox message & "! " & guest

End Sub

标签:Function,VBA,End,函数,String,msg,过程,Sub
From: https://www.cnblogs.com/marshban/p/18281246

相关文章

  • 排序函数
    1.std::sort(不稳定排序,时间复杂度为O(nlogn)) std::vector<int>list;std::sort(list.begin(),list.end());//默认升序std::less<int>();std::sort(list.begin(),list.end(),std::greater<int>());//降序autocmp=[](intx,inty){returnx<y;};std::s......
  • 02-JS函数基础
    01函数中的arguments1.1传多的参数也会存在里面<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><t......
  • SQL的存储过程,语法示例
    存储过程类型含义IN作为输入,调用时需要传入值OUT作为输出,该参数作为返回值INOUT既可以输入参数,也可以输出参数 语法:创建createprocedure存储过程名称(in参数名称1参数数据类型,out参数名称2参数数据类型,i......
  • strlen/strcpy/strncpy/strcat/strcmp/memset/memcmp不完成实现(部分函数跑过测试集)
    #include<klib.h>#include<klib-macros.h>#include<stdint.h>#if!defined(__ISA_NATIVE__)||defined(__NATIVE_USE_KLIB__)size_tstrlen(constchar*s){//panic("Notimplemented");assert(s!=NULL);size_tl=0;......
  • 【自动化测试数据管理】对于不可重复使用的测试数据(一次性的测试数据),自动化实现过程
    准备不可重复使用的测试数据,其实是一件比较让人头疼的一件事。因为只能使用一次,每次运行之前都要准备新的数据,工作量不可谓不大。而且如果数据本身比较复杂或者稀少,这个数据准备工作就更让人怀疑这些功能用自动化的方式来测试是否有价值。那么对于这种一次性的测试......
  • PHP 函数封装,常用
    PHP封装一个echo函数, 字符串前自动加"\t";字符串结尾自动加.PHP_EOL 制表符://用法echoTab('abcdefg;',2);//默认一个制表符"\t",#tab为缩进制表符数量;functionechoTab($data,$tab=1){$data=str_repeat("\t",$tab).$data.PHP_EOL;echo$data;......
  • VBA一键修改word表格样式
    一次修改文档中的表格样式一次修改文档中所有表格样式为美化文档,我们通常会将文档中的所有表格格式样式统一,如何快速快速搞定,这里小编教大家一招批量设置表格样式的技巧。第一步:直接按Alt+F11键,打开VBA代码窗口。第二步:在打开的VBA窗口中,右击Thisdocument,在弹出的菜单中选择......
  • 函数模版和类模版
    函数模板函数模板概念函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本函数模板格式.1函数模板格式template<typenameT1,typenameT2,......,typenameTn>返回值类型函数名(参数列表){}template<typenameT>v......
  • 【转载】SCI审稿过程中的几种状态
    原文地址:http://cjsphd.blog.163.com/blog/static/44718111201191175154300/审稿中涉及到的人:EIC-EditorinChief主编,此人很重要,有稿件最终决定权。ADM-(可能是)Administrator应该是协助主编日常工作的。AE-AssociatedEditor副编辑(就是文章发表后在首页第一栏下方的c......
  • 【C++】多态(定义、虚函数、重写、隐藏)
      ......