在VBA中变量的作用域
网友提问:


回答网友问题:
解决这个问题,需要理解变量作用域
关于作用域在AccessVBA第一季里有讲 通用所有VBA

Sub 是一个过程 ,你可以理解为,你是一家电脑生产商,但是配件不可能都是你自己的,你需要CPU时,Call intel 或者 Call AMD 让他们去生产
intel和AMD生产CPU是一系列的动作 ,
但是如果你需要一块CPU,就没必要call他们了,直接买一块不就好了?
当返回一个值时,我们没有必要用Sub,因为这样只会越来越麻烦
稍候我回答你的问题,我先说一个简单的案例
如下图所示

其实你想返回5,sub a 中定义了aa = 3 , 然后呼叫sub b 想得到他的bb= 2
在sub a中让aa+bb = 3+2 = 5
但是,bb是一个变量,他只在本sub中生效,你的sub a中没有对变量bb赋值所以他默认为0
为了解决这个问题
我们需要使用模块级作用域,让变量bb在本模块中都有效‘
方法是将变量定义写在本模块所有过程最前面

知识点在这里

但是函数和Sub是不一样的,这个问题我没必要写一个Sub b 直接在Sub a中对bb赋值就行了,如果这个过程比较复杂 都写在一个sub中不易维护,那我们可以写函数。
过程在什么时候用呢?打个比方,如果我需要在sub a 执行中删除表格所有空行,那这个删除空行的动作可以写成sub b 然后在Sub a中Call b 让他来执行这个动作。
假设你那边失火了,你打119,消防员来救火,这一系列的动作需要你呼叫119,你呼叫后由消防员来完成。
当我们需要一个值时,直接赋值或使用函数,值就好比是钱,钱不需要你呼叫,直接拿来用就可以了
函数名(参数)返回的就是函数返回的那个值

然后你会发现还是返回0

对,这就是刚才说的作用域,解决方法我们刚才也讲了

如果你要用Call并且将函数写成过程,方法是这样的


ExcelVBA教程:https://www.bilibili.com/video/BV1rt4y1a72y
AccessVBA教程:https://www.bilibili.com/video/BV1tf4y117Sh