概要

对于一般的 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 种方式就像函数式和面向对象编程一样, 没有谁高谁低, 各自有适合的场景.

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

  1. python基础,函数,面向对象,模块练习

    ---恢复内容开始--- python基础,函数,面向对象,模块练习 1,简述python中基本数据类型中表示False的数据有哪些? #  [] {} () None 0 2,位和字节的关系? # ...

  2. Python基础之函数和模块

    函数的基本使用 函数的定义:把具有独立功能的代码块组织成一个小模块,在需要的时候调用.或者说,函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数的使用:1.定义函数:2.调用函数 ...

  3. 零基础学python之函数与模块(附详细的代码和安装发布文件过程)

    代码重用——函数与模块 摘要:构建函数,创建模块,安装发布文件,安装pytest和PEP 8插件,确认PEP8兼容性以及纠错 重用代码是构建一个可维护系统的关键. 代码组是Python中对块的叫法. ...

  4. python基础-----函数/装饰器

    函数 在Python中,定义一个函数要使用def语句,依次写出函数名.括号.括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回. 函数的优点之一是,可以将代码块与主程 ...

  5. 十八. Python基础(18)常用模块

    十八. Python基础(18)常用模块 1 ● 常用模块及其用途 collections模块: 一些扩展的数据类型→Counter, deque, defaultdict, namedtuple, ...

  6. VBA基础之Excel 工作薄(Book)的操作(三)

    三. Excel 工作薄(Book)的操作1. Excel 创建工作薄(Book) Sub addWorkbook() Workbooks.Add End Sub 2. Excel 打开工作薄(Boo ...

  7. Python基础-包与模块

    Python基础-包与模块 写在前面 如非特别说明,下文均基于Python3 摘要 为重用以及更好的维护代码,Python使用了模块与包:一个Python文件就是一个模块,包是组织模块的特殊目录(包含 ...

  8. Excel VBA基础教程

    https://www.w3cschool.cn/excelvba/excelvba-basics.html Excel VBA语言基础 VBA语言的基础认识 详解VBA编程是什么 excel处理录制 ...

  9. Python学习教程(Python学习视频_Python学些路线):Day06 函数和模块的使用

    Python学习教程(Python学习视频_Python学些路线):函数和模块的使用 在讲解本章节的内容之前,我们先来研究一道数学题,请说出下面的方程有多少组正整数解. $$x_1 + x_2 + x ...

随机推荐

  1. iOS: 创建静态库,实现自己的API私有使用

    一.介绍 在开发中经常使用到第三方的静态框架,格式基本上就是.framework和.a格式的.使用时,会发现我们只能使用无法修改,这就是静态框架的一个好处,私有性.内部实现的代码只有公开者本人知晓,对 ...

  2. 创 PHP RSA2 签名算法

        什么是RSA2 ? RSA2 是在原来SHA1WithRSA签名算法的基础上,新增了支持SHA256WithRSA的签名算法. 该算法比SHA1WithRSA有更强的安全能力. 为了您的应用安 ...

  3. ASP.NET 数据绑定

    控件绑定数据源控件手动方式: DataSourceID = 数据源控件名称下拉框绑定 A.设置Datasource B.DataTextField="name"' //显示的值 C ...

  4. jquery中的ajax请求到php(学生笔记)

    首先ajax的基本语法基础.(必须得引入一个jquery文件,下面的例子展示用了网上的jquery文件,要联网.) 2.请求成功(复制代码运行观察效果) <!DOCTYPE html> & ...

  5. shell 编程练习题2

    需求1:使用root用户清空/var/log/messages日志,并每次执行保留最近100行 ​ 1.必须是root用户 ​ 2.需要保留最后100行 [root@manager if]# cat ...

  6. 并发—JVM内部机制和外部机制处理方法

    并发常见的编程场景,一句话概括就是,需要协调多个线程之间的协作,已保证程序按照自己原本的意愿执行.那么究竟应该如何协调多个线程? 这个问题比较宽泛,一般情况下,我们按照方式的纬度去简单区分,有以下两种 ...

  7. jsp表单更新数据库

    和插入语句相似,表单传值,在另一个页面接收数据并连接数据库进行更新: 语句如下: <% request.setCharacterEncoding("UTF-8"); Stri ...

  8. HTTP 压测工具wrk简介

    前段时间项目压测,看到开发命令行下使用这个命令进行压测非常简洁.方便,萌发了学习的兴趣,这里仅做简单介绍. 安装 wrk支持大多数UNIX系统,不支持Windows.需要操作系统支持LuaJIT和Op ...

  9. js绑定事件代理的坑

    js通过事件代理的方式绑定跳转事件,我这里的逻辑是把click事件绑定在最外层container上面,如果e.target包含我已经写好的class,则执行跳转逻辑.但是这种方式好像只能是在点击的元素 ...

  10. 升鲜宝V2.0_杭州生鲜配送行业,条码标签管理之批量打印标签与分配配送任务相关操作说明_升鲜宝生鲜配送系统_15382353715_余东升

       升鲜宝V2.0_杭州生鲜配送行业,条码标签管理之批量打印标签与分配配送任务相关操作说明_升鲜宝供应链管理生鲜配送系统    题外话,随着国家对食材安全这个行业重视性越来越强,最近国家又出具了一些 ...