VBA基础 - 函数和模块

概要

对于一般的 VBA 程序来说, 可能一个或几个函数就行了. 毕竟, VBA 只是作为 excel 的辅助工具来用的.

但是, 随着 VBA 写的越来越多, 用个工程来管理就有必要了, 而一个代码工程的基础, 就是 函数模块.

函数

VBA 的中的函数有 2 种, 一种是 Sub, 一种是 Function 在 VBA 中, 其实 Sub 叫过程, 不叫函数, 它们的区别有 2 个:

  1. Function 有返回值, Sub 没有
  2. Sub 可以直接执行, Function 必须被调用才能执行

Sub 和 Function 的示例如下:

 1  Option Explicit
 2
 3  Sub CallAnotherMod()
 4      Dim sum As Integer
 5      sum = Add(2, 3)
 6      Debug.Print sum
 7  End Sub
 8
 9  Function Add(a As Integer, b As Integer) As Integer
10      Debug.Print a
11      Debug.Print b
12      Add = a + b
13  End Function

注意, 函数的返回值, 是将结果赋值给函数名本身 Add = a + b , 否则返回值一直是 0

模块

模块化的目的是复用, 对于一些通用的功能, 我们可以封装成模块并导出. 这样, 在不同的 VBA 工程中导入已有的模块, 就不用重复的造轮子.

模块的导出很方便, 只要在对应的模块上点击右键, 导出即可, 导出后是一个 *.bas 的文件.

一般模块

一般模块简单明了, 我们之前写的 Sub 或者 Function 其实都在一个默认的一般模块中. 下面的示例工程, 我创建 2 个模块, 分别是 Main 和 MyMath, Main 用来测试, MyMath 中是为了以后复用的函数.

  • Main 模块:

    1  Option Explicit
    2
    3  Sub CallAnotherMod()
    4      Debug.Print "2 + 3 = " & (Add(2, 3))
    5      Debug.Print "2 * 3 = " & (Multiply(2, 3))
    6
    7  End Sub
  • MyMath 模块:
    1  Option Explicit
    2
    3  Function Add(A As Integer, B As Integer) As Integer
    4      Add = A + B
    5  End Function
    6
    7  Function Multiply(A As Integer, B As Integer) As Integer
    8      Multiply = A * B
    9  End Function
  • 运行 Main 模块, 结果如下:
    2 + 3 = 5
    2 * 3 = 6

类模块

除了像上面那样通过函数来封装一些功能, VBA 也可以按照类的方式来组织, 熟悉面向对象设计的开发人员可能更喜欢这种方式.

  • 新建一个类模块, 和新建普通模块的步骤一样, 只是新建之前选择的类型是 类模块
  • 比如我们新建一个 MathCls 的类模块:
     1  Option Explicit
     2
     3  ' 常量, class说明
     4  Const MathClsName = "math class"
     5
     6  Dim MathA As Integer
     7  Dim MathB As Integer
     8
     9  ' 相当于其他面向对象语言中的 set 方法
    10  Public Property Let A(numA As Integer)
    11      MathA = numA
    12  End Property
    13
    14  ' 相当于其他面向对象语言中的 get 方法
    15  Public Property Get A() As Integer
    16      A = MathA
    17  End Property
    18
    19  ' 相当于其他面向对象语言中的 set 方法
    20  Public Property Let B(numB As Integer)
    21      MathB = numB
    22  End Property
    23
    24  ' 相当于其他面向对象语言中的 get 方法
    25  Public Property Get B() As Integer
    26      B = MathB
    27  End Property
    28
    29  Function Add() As Integer
    30      Add = MathA + MathB
    31  End Function
  • 用来测试的 Main 模块, 这是个普通模块
     1  Option Explicit
     2
     3  Sub CallAnotherMod()
     4
     5      Dim mc As New MathCls
     6      mc.A = 2
     7      mc.B = 3
     8
     9      Debug.Print (mc.Add())
    10
    11  End Sub

总结

无论采用那种方式来封装, 要看需要封装的功能适合那种方式. 这 2 种方式就像函数式和面向对象编程一样, 没有谁高谁低, 各自有适合的场景.

原文地址:https://www.cnblogs.com/wang_yb/p/11613069.html

时间: 2024-11-04 04:28:36

VBA基础 - 函数和模块的相关文章

Excel函数应用教程 Excel VBA基础教程 WPS2013表格教程

热门推荐电脑办公计算机基础知识教程 Excel2010基础教程 Word2010基础教程 PPT2010基础教程 五笔打字视频教程 Excel函数应用教程 Excel VBA基础教程 WPS2013表格教程 更多>平面设计PhotoshopCS5教程 CorelDRAW X5视频教程 Photoshop商业修图教程 Illustrator CS6视频教程 更多>室内设计3Dsmax2012教程 效果图实例提高教程 室内设计实战教程 欧式效果图制作实例教程 AutoCAD2014室内设计 Aut

Excel函数应用教程 Excel VBA基础教程 WPS2013表格教程 更多>

热门推荐电脑办公计算机基础知识教程 Excel2010基础教程 Word2010基础教程 PPT2010基础教程 五笔打字视频教程 Excel函数应用教程 Excel VBA基础教程 WPS2013表格教程 更多>平面设计PhotoshopCS5教程 CorelDRAW X5视频教程 Photoshop商业修图教程 Illustrator CS6视频教程 更多>室内设计3Dsmax2012教程 效果图实例提高教程 室内设计实战教程 欧式效果图制作实例教程 AutoCAD2014室内设计 Aut

零基础python之4函数重用-函数与模块(附详细的步骤和程序)

4代码重用--函数与模块 重用代码是构建一个可维护系统的关键. 代码组是Python中对块的叫法. 对之前的vowels代码功能创建一个函数名为search_for_vowels( ) 在函数调用时结果: Bool内置函数,提供某个值时它会返回这个值计算为true还是false. 关于真假: Python中的每一个对象都有一个关联的真值,表示这个对象计算为true或false. 如果计算值为0.值None.空串或一个内置的数据结构,则为false. 任何非空的数据结构都是true. '''FUN

python模块基础之getpass模块(pycharm中无法使用。)

python模块基础之getpass模块 getpass模块提供了可移植的密码输入,一共包括下面两个函数: 1. getpass.getpass() 2. getpass.getuser() getpass.getpass([prompt[, stream]]) 提示用户输入一段密码,参数 prompt 用于提示用户开始输入,默认为'Password: '.在 Unix 上,该提示符被写入到类文件对象流中.参数 stream 默认为控制终端 (/dev/tty) 或入过前者不可用时为 sys.s

python基础31[常用模块介绍]

python基础31[常用模块介绍] python除了关键字(keywords)和内置的类型和函数(builtins),更多的功能是通过libraries(即modules)来提供的. 常用的libraries(modules)如下: 1)python运行时服务 * copy: copy模块提供了对复合(compound)对象(list,tuple,dict,custom class)进行浅拷贝和深拷贝的功能. * pickle: pickle模块被用来序列化python的对象到bytes流,从

C语言文件的读入与写入及C#基础函数学习[图]

C语言文件的读入与写入及C#基础函数学习[图]学了一学期的C语言,还不怎么会使用指针,文件的读入和写入也不能很顺利的写出来,说起来好惭愧.碰巧今天朋友让我帮他编写一个C语言程序,对他数模要用到的大量数据求平均值(每天不同时刻对某一物理量进行检测,持续几十天,求那些时刻测得的物理量的平均值).代码很简单,关键是要掌握怎样对文件进行读入和写入(当然对于菜鸡的我来说,懒惰让我在大一没有好好学习,正好趁着这个契机把文件的基本的操作学会:))分模块来编写还是很重要的,可以使程序看起来简洁明了.写了两个函数

VBA基础出发

一.什么是VBA,学习的原因是什么. Visual Basic for Applicaion(VBA)是Visual Basic的一种宏语言,主要用来扩展Windows的应用程序功能.在日常生活中,使用的word.excel虽然功能已经足够丰富,但是要真正的说会使用他们,那么不得不学习VBA,来提高office的更高的效率. 二.Excel VBA前期 常见问题1:"VBE6EXT.OLB 不能被加载","内存溢出". 解决方法:1.可以直接在office的安装目录

php基础-常量-变量相关的基础函数

注释语句 //单行 # 单行 /* 多行注释 */ /** * 文档注释 * */ 常量定义 自定义常量 常量名区分大小写 系统的魔术常量不区分大小写 __DIR__  __dir__ 变量定义 变量名是区分大小写 变量名声明时用$符号开头, 而且要符合变量名的命名规则 $i; var_dump($i); $i = 'ok'; var_dump($i); $i = "Hello"; var_dump($i); $i = 20; var_dump($i); $i = 20.5; var_

VBA自定义函数参数类型不符的错误

作者:iamlaosong 1.问题提出 编程中发现一个问题,系统总是提示编译错误,ByRef 参数类型不符, 可实际上参数定义没问题,原因在哪儿呢? 2.问题环境 假定函数定义如下: Function get_kind(addr As String) As Integer ...... End Function 调用过程: Sub check_address() Dim addr, new_addr(10000) As String ...... addr = new_addr(i) ....