经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » VB.Net » 查看文章
VBA基础 - 函数和模块
来源:cnblogs  作者:wang_yb  时间:2019/10/8 9:27:23  对本文有异议

概要

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

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

函数

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

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

Sub 和 Function 的示例如下:

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

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

模块

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

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

一般模块

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

  • Main 模块:

    1. 1 Option Explicit
    2. 2
    3. 3 Sub CallAnotherMod()
    4. 4 Debug.Print "2 + 3 = " & (Add(2, 3))
    5. 5 Debug.Print "2 * 3 = " & (Multiply(2, 3))
    6. 6
    7. 7 End Sub
  • MyMath 模块:

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

    1. 2 + 3 = 5
    2. 2 * 3 = 6

类模块

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

  • 新建一个类模块, 和新建普通模块的步骤一样, 只是新建之前选择的类型是 类模块
  • 比如我们新建一个 MathCls 的类模块:

    1. 1 Option Explicit
    2. 2
    3. 3 ' 常量, class说明
    4. 4 Const MathClsName = "math class"
    5. 5
    6. 6 Dim MathA As Integer
    7. 7 Dim MathB As Integer
    8. 8
    9. 9 ' 相当于其他面向对象语言中的 set 方法
    10. 10 Public Property Let A(numA As Integer)
    11. 11 MathA = numA
    12. 12 End Property
    13. 13
    14. 14 ' 相当于其他面向对象语言中的 get 方法
    15. 15 Public Property Get A() As Integer
    16. 16 A = MathA
    17. 17 End Property
    18. 18
    19. 19 ' 相当于其他面向对象语言中的 set 方法
    20. 20 Public Property Let B(numB As Integer)
    21. 21 MathB = numB
    22. 22 End Property
    23. 23
    24. 24 ' 相当于其他面向对象语言中的 get 方法
    25. 25 Public Property Get B() As Integer
    26. 26 B = MathB
    27. 27 End Property
    28. 28
    29. 29 Function Add() As Integer
    30. 30 Add = MathA + MathB
    31. 31 End Function
  • 用来测试的 Main 模块, 这是个普通模块

    1. 1 Option Explicit
    2. 2
    3. 3 Sub CallAnotherMod()
    4. 4
    5. 5 Dim mc As New MathCls
    6. 6 mc.A = 2
    7. 7 mc.B = 3
    8. 8
    9. 9 Debug.Print (mc.Add())
    10. 10
    11. 11 End Sub

总结

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

原文链接:http://www.cnblogs.com/wang_yb/p/11613069.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号