zoukankan      html  css  js  c++  java
  • 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 种方式就像函数式和面向对象编程一样, 没有谁高谁低, 各自有适合的场景.

  • 相关阅读:
    Spring Bean前置后置处理器的使用
    js用正则表达式查找中文
    wpf文字模糊
    Monster Audio 使用教程 (五) 添加区域效果器
    关于数据库锁的一些注意事项
    Monster Audio 使用教程(四)Wifi 远程遥控
    Monster Audio 使用教程(三)多音轨录音、播放
    Monster Audio 使用教程(二)效果参数的保存
    Monster Audio 使用教程(一)入门教程 + 常见问题
    wpf中实现快捷键
  • 原文地址:https://www.cnblogs.com/wang_yb/p/11613069.html
Copyright © 2011-2022 走看看