首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

每次在子vba中使用时更改变量结果

在VBA(Visual Basic for Applications)中,如果你在子程序(Subroutine)中更改了变量的值,但发现这些更改没有在调用该子程序的地方体现出来,这通常是因为变量的作用域问题。

基础概念

作用域:在编程中,作用域决定了变量的可见性和生命周期。VBA中的变量作用域主要有以下几种:

  1. 局部变量:在Sub或Function内部声明的变量,只能在该Sub或Function内部访问。
  2. 模块级变量:在模块的通用声明部分(不在任何Sub或Function内部)声明的变量,可以在整个模块中访问。
  3. 全局变量:在标准模块的顶部声明,并使用Public关键字,可以在整个VBA项目中的任何位置访问。

问题原因

如果你在子程序中更改了一个局部变量的值,这个更改只会在该子程序内部有效。一旦子程序执行完毕,局部变量的值就会丢失,因此在调用子程序的地方看不到任何更改。

解决方案

  1. 使用模块级变量: 在模块的通用声明部分声明一个变量,这样它就可以在整个模块中被访问和修改。
  2. 使用模块级变量: 在模块的通用声明部分声明一个变量,这样它就可以在整个模块中被访问和修改。
  3. 通过参数传递变量: 将变量作为参数传递给子程序,并使用ByRef关键字确保传递的是变量的引用而不是副本。
  4. 通过参数传递变量: 将变量作为参数传递给子程序,并使用ByRef关键字确保传递的是变量的引用而不是副本。
  5. 使用全局变量(不推荐): 如果确实需要在整个项目中共享变量,可以使用Public关键字声明全局变量,但这种方法应谨慎使用,因为它可能导致代码难以维护和调试。
  6. 使用全局变量(不推荐): 如果确实需要在整个项目中共享变量,可以使用Public关键字声明全局变量,但这种方法应谨慎使用,因为它可能导致代码难以维护和调试。

应用场景

  • 模块级变量适用于需要在多个子程序之间共享数据,但又不希望这些数据在整个项目范围内都可见的情况。
  • 通过参数传递变量是最常见和推荐的做法,因为它保持了数据的封装性和模块的独立性。
  • 全局变量适用于需要在整个项目中共享数据的情况,但应尽量避免使用,以减少潜在的冲突和维护难度。

通过上述方法,你可以有效地管理和传递VBA中的变量,确保在子程序中所做的更改能够在需要的地方正确反映出来。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Excel VBA解读(143): 在自定义函数中使用整列引用时,如何更有效率?

学习Excel技术,关注微信公众号: excelperfect Excel用户经常发现在公式中使用整列的引用很方便,这样可避免每次添加新数据时都必须调整公式。...在VBA用户自定义函数中处理此问题的标准方法是获取整列引用和已使用单元格区域的交叉区域,以便用户自定义函数只需处理实际使用的整列的一部分。...下面的示例VBA代码处理交叉区域,然后返回输入区域中的行数和已使用区域中的行数的较小者。...然后,只有为每个工作表请求已使用单元格区域的第一个用户自定义函数使用时间来查找已使用的单元格区域,并且(假设计算本身不会改变已使用的单元格区域)将总是检索正确的数字。...注意,只能在Excel 2002及更高版本的用户自定义函数中使用Range.Find,并且除了命令宏或COM之外,不能在XLL中使用Find方法。

3K20

过程(五)可选参数和可变参数

在vba过程中,通过在形参前面加上Optional关键字来设置该形参为可选参数,在过程内部通过使用ismissing函数可测试调用程序是否传递了可选参数。...---- 二、可变参数 上面介绍可选参数时,可以发现在定义过程时,不管是固定参数还是可选参数,都已经制定了参数的个数,那么在VBA中还可以定义可变参数,即参数的个数在定义时时未知的。...可变参数为一个数组,过程中使用lbound函数和Ubound函数获得数组的下标的上下界。然后通过for循环把每个元素进行累加,并将累加结果保存到第一个参数t中,返回给调用程序。...创建test1过程,用call语句调用sum1过程,定义了整型变量i,用于获得子过程运算的结果。(省略关键字是按地址传递。)...在调用时,参数传递将参数i的地址传递给sum1子过程的形参t,将后面1,2,3,4,5,6作为一个数组传递给intnum()数组。在子过程中计算数组中所有元素的和。

4.8K20
  • Excel VBA解读(139): 用户定义函数计算了多次

    问题是计算引擎仅在计算公式/自定义函数之后才执行此重新计算,因此在每次重新计算时包含自定义函数的公式会计算多次。 下面是一个非常简单的示例,你可以在工作簿中试试。...由函数向导引起的多个用户定义函数重新计算 每当将函数向导与用户定义函数一起使用时,用户定义函数会被多次调用,因为在输入函数的参数时,函数向导使用评估动态显示函数的结果。...只有在输入或更改用户定义函数时,才会重新计算该函数。...条件格式公式中的用户定义函数 每次包含条件格式的屏幕部分被重新绘制或重新计算时,都会评估条件格式规则中的公式(可以通过在条件格式设置规则中使用的用户定义函数中使用Debug.Print语句来证明这一点)...,因此,总的来说,在条件格式中使用用户定义函数可能不是一个好主意。

    1.8K30

    过程(六)Function函数过程

    2、在函数过程内,通过给函数名赋值来返回计算结果。如果函数结构中没有函数名=表达式1的语句,则该函数使用时会返回一个默认值,数值函数返回值为0,字符串函数返回值为空字符串。...通常不使用sub过程来返回值,但在介绍Sub过程中使用传地址方式传递参数时,可以通过变量来得到结果。当时的演示例图如下: 通过传地址方式传递参数,调用jisuan过程,变量b的值改变。...三、调用Function函数 有两种方法调用Function函数,一种是在工作表的公式中使用,即像普通Excel函数一样使用。另一种是从VBA的另一个过程里调用。...在公式中输入=jisuan(单元格引用)来计算前面的数字,结果都是+1之后的结果。(参数和返回值都是整型变量。) 这种方式也可以帮助更好的理解函数,理解之后可以针对需求创建复杂的函数。...新建一个sub过程,定义变量h为integer整型变量,调用函数过程,与调用其他内置函数类似,通过h = jisuan(2)即可,得到计算后的结果为3,赋值给h,在立即窗口中显示。

    2.3K20

    Excel VBA编程

    Double # currency @ string $ 声明变量可以不指定变量类型:在VBA中声明变量是,如果不确定会将类型的数据存储在变量中,可以在声明变量时,只定义变量的名字,而不是变量的类型。...,可以在模块开头,输入“Option Explicit” 变量的作用域 按作用域划分,VBA中的变量可以划分为本地变量,模块变量和公共变量。...作用域 描述 单个过程 在一个过程中使用dim或者static语句声明的变量,作用域为本过程,即只有声明变量的语句所在的过程能够使用它,这样的变量,称为本地变量 单个模块 在模块的第一个过程之前使用dim...end function 无论function过程包含多少代码,要执行多少计算,都应该将最后的计算结果保存在过程名称中,这相当于其他语言中的函数return内容 使用自己定义的函数 在Excel中使用...在工作表中使用控件 添加表单控件 2.

    45.8K33

    再见 VBA!神器工具统一 Excel 和 Python

    经常给大家推荐好用的数据分析工具,也收到了铁子们的各种好评。这次也不例外,我要再推荐一个,而且是个爆款神器。...这样以后每次都可以复用实现相同功能,简直不要太香!...更改输入会导致调用函数,并且计算出的输出会实时更新,这与我们期望的一样。 4. 替代VBA VBA脚本所需的功能函数,在Python中均有相同的API。...弄清楚如何使用Excel对象模型进行操作的一种好方法是记录VBA宏,然后将该宏转换为Python。 下图中尝试将当前选择单元格更改颜色。 ?...Excel和Python共享数据 在Excel中使用Python绘图 从Excel调用Python函数 替代VBA脚本 不得不说这个工具是真的香,喜爱Python的同学可以不用学习VBA了,Python

    5.5K11

    太骚了!Python模型完美切换SAS,还能这么玩。。

    而SAS需付费,且费用较高,一般互联网公司无法承担,更多的是在银行等传统金融机构中使用,不过这两年由于Python太火,原本使用SAS的也开始逐渐转向Python了。...具体的方案就是先将Python模型转换为VBA代码,然后再将VBA代码更改为 SAS脚本,曲线救国。 如何使用m2cgen? 我直接用一个例子说明下如何操作。...改动的地方不多,主要包括:删除在SAS环境中不能使用的代码,像上面结果中的Module xxx,Function yyy ,Dim var Z As Double,还有在语句结尾加上;,这些为的就是遵循...使用字典将InputVector与变量名称映射到输入数据集中,一次性更改所有InputVector。...如果铁子们有更多好玩的方法,欢迎文章下面留言 ? 。

    1.5K20

    一文快入VBA——一个VBA数据处理小程序的解析

    现在我们来归纳下程序中使用到的ExcelVBA技能点。 程序的定义,VBA程序的定义以Sub开头,以End Sub结尾,方法名加括号,不区分大小写。...结果的输出,程序的输出方式是Debug.Print,这是一种非常实用的输出函数,比Msgbox要方便的多,也是VBA调试程序必备的。...循环的方法,一般而言,循环的方法主要有while,for两大类,在本例中使用的For Each能够更好地遍历区域内的每一个单元格,是一种比较简单省事的循环方法。...调用子程序的方法,因为是子方法,所以需要使用到Call。 条件语句,VBA的标准套路是If…Then …End If。如果中间需要添加别的,直接就是Else If。 数组的使用和循环。...VBA提供数组动态变动的方法,因此在变量的时候,无需对长度进行定义,比如Dim string0。

    2.5K70

    SQL语言初识

    SQL查询是指用户直接使用SQL语句创建的查询,可以在Access的SQL视图中查看,包括联合查询、传递查询、数据定义查询和子查询四种。 ?...数据定义查询:使用SQL的数据定义语句在查询过程中创建、删除、更改表或者在创建数据库中的索引 子查询:嵌套在其他查询中的SQL Select语句。...它可以在大多数关系型数据库中使用,如Oracle、Microsoft SQL Server、MySQL、Sybase、DB2等等。...在设计视图和数据表视图间切换,可以看到查询后的结果,在两种视图中间有SQL视图,就有本次查询的SQL语句。 ?...2、在VBA代码中使用 SQL语言不仅可以单独使用,还可以在大部分的编程语言中使用。比如在Access的VBA编辑器中,后期如果讲到VBA再做说明。 ? ?

    1.6K20

    VBA掌握循环结构,包你效率提高500倍

    2.这些掌握了,你才敢说自己懂VBA 3.VBA变量5年踩坑吐血精华总结 4.VBA中重要的强制申明,谁看谁明白 我们先看上次分享的案例题目。...在「单元格B2」输入不同的行号,点击「显示答案」按钮,计算「F列」和「H列」对应行号的乘积,并将每个乘积结果加上公共值「单元格B4」的50,将最终结果显示在相应的单元格。...在《变量》分享那篇文章,我们将这些变化的行号数字更改为「变量」,用x代替,程序被精简为这样: 那时,我们通过将「单元格B2」的值赋值给「变量x」,然后手动变更「单元格B2」的值,从而变更「变量x」的值,...」的地方,由于此时「变量 x = 2」仍然符合「X 从 1 变为 10 每次增加1」这个区间,因此程序接着运行,一直等到「变量 x = 11」的时候,程序会跳出循环,执行下一个语句。...2.代码排版 按照马斯洛的需求层次理论,我们在达到一定的需求层次之后,会追求更高的需求层次。 那么,这句话应用到VBA代码领域就是:在我们掌握了一定的代码基础之后,我们就希望掌握更强的VBA技能。

    29530

    VBA掌握循环结构,包你效率提高500倍

    2.这些掌握了,你才敢说自己懂VBA 3.VBA变量5年踩坑吐血精华总结 4.VBA中重要的强制申明,谁看谁明白 image.png 我们先看上次分享的案例题目。...在「单元格B2」输入不同的行号,点击「显示答案」按钮,计算「F列」和「H列」对应行号的乘积,并将每个乘积结果加上公共值「单元格B4」的50,将最终结果显示在相应的单元格。...在《变量》分享那篇文章,我们将这些变化的行号数字更改为「变量」,用x代替,程序被精简为这样: image.png 那时,我们通过将「单元格B2」的值赋值给「变量x」,然后手动变更「单元格B2」的值,...我们可以看到此时程序自动返回「循环开始」的地方,由于此时「变量 x = 2」仍然符合「X 从 1 变为 10 每次增加1」这个区间,因此程序接着运行,一直等到「变量 x = 11」的时候,程序会跳出循环...2.代码排版 按照马斯洛的需求层次理论,我们在达到一定的需求层次之后,会追求更高的需求层次。 那么,这句话应用到VBA代码领域就是:在我们掌握了一定的代码基础之后,我们就希望掌握更强的VBA技能。

    1.6K00

    Excel编程周末速成班第24课:调试和发布应用程序

    如果没有OptionExplicit,则仅将拼写错误的变量名视为新变量,并且结果很可能是bug。...在这种情况下,VBA将显示一个警告对话框。 使用监视 监视使你能够在执行期间确定程序变量的值。检查变量的最简单方法是在中断模式下。...只需将鼠标指针停留在代码中变量的名称上,VBA就会弹出一个带有当前值的小窗口。如果这还不够,VBA提供了更复杂的监视工具。 VBA可以在程序调试期间监视任何变量或表达式的值。...监视表达式可以是任何VBA表达式,例如程序变量、对象属性或函数调用。通过设置监视,你可以关注变量或属性的值以查看其是否以及何时更改。 可以使用多种方法来使用监视表达式: 可以监视其值。...图24-3:监视窗口显示所有已定义的监视 当执行为其定义监视的程序时,每次程序中断时,监视窗口中的数据都会更新。 提示:如果看不到“监视窗口”,从VBA编辑器菜单中选择“视图——监视窗口”。

    5.8K10

    Jupyter Notebooks嵌入Excel并使用Python替代VBA宏

    在Jupyter笔记本上完全用Python编写Excel函数,并进行实时测试。开发完一个有用的可重用函数后,将其添加到PyXLL Python项目中。这样你每次使用Excel时都可以使用相同的函数。...当Jupyter笔记本在Excel中运行时,所有其他方法(例如,使用XLCell类,Excel的COM API甚至xlwings)仍然可用。 提示:可以为魔术函数的结果分配一个变量!...在Excel中使用Python图(matplotlib / plotly等) 关于数据处理的一大优点是可用的功能强大的绘图程序包。...更改输入会导致调用函数,并且计算出的输出会实时更新,这与你期望的一样! 在Excel中使用Python而不是VBA的脚本 你是否知道在VBA中可以执行的所有操作也可以在Python中完成?...尝试进行诸如获取当前选择和更改单元格内部颜色之类的操作。弄清楚如何使用Excel对象模型进行操作的一种好方法是记录VBA宏,然后将该宏转换为Python!

    6.4K20

    VBA代码库09:增强的CELL函数和INFO函数

    例如,下面的公式: =CELL("filename",A1) 在我的示例工作簿中返回: D:\01....NameOf函数的代码如下: ' 返回工作表名,工作簿名或工作簿路径 ' 或者, 返回应用程序名、版本、标题、状态栏、用户名、组织名或当前打印机 ' 或者, 返回环境变量"COMPUTERNAME" 或...此外,两个参数都声明为ByVal,确保在函数中的更改不会影响到传递给它的参数。函数返回Variant型的结果,表示指定的Target的This的名称。...例如,公式: =nameof(" book ") 在我的示例中返回结果为: VBACodeLibrary09.xlsm 下面的公式: =nameof("Help") 输出可以在函数中使用的所有长格式文本值...如果在VBA中使用NameOf函数,那么参数Target必须是Range对象如Range(“A1”)或Cells(1)或ActiveCell。

    4.6K10

    Excel编程周末速成班第3课:Excel对象模型

    使用命名参数,则没有必要——仅包括要更改其默认值的那些可选参数。 对象引用的重要性 要使用对象,你需要对其进行引用。只是在代码中用于引用对象的名称。...= Sheets(“销售数据”) 假设已将变量MyWorksheet创建为可以容纳工作表引用的变量类型(在第4课中将学习这个知识点),注意使用Set关键字,这在赋值对象引用时是必需的。...在Excel中编程时,Application对象始终可用作隐式引用。 Workbook对象有几个直接的子对象,其中最重要的是Workbooks集合。...有关详细信息,请参考VBA的在线帮助。 另一种方法SaveCopyAs使你可以使用新名称保存工作簿的副本,而无需更改打开的工作簿的名称。...Nothing的实用性 在某些情况下,对象变量不引用任何对象:它不引用任何内容,并且VBA具有特殊关键字Nothing来表示此对象。

    5.1K30

    VBA数组(二)声明数组

    一、数组的分类 1、按维度划分 在上节中已经具体的介绍了VBA数组维度的概念。那么可以通过维度来划分数组,在VBA中数组供支持最大60维的数组,最常用的就是一至三维数组。...二、声明数组 在使用变量时,都需要先声明变量,同样在使用VBA数组时,首先也要声明数组,让系统在内存中为它分配一片连续的内存空间。...声明数组的语句和声明变量语句一样,包括有Dim(过程级变量)、Private(声明模块级变量)、Public(声明工程级变量)和Static(声明静态变量)语句来声明。...具体后面介绍数组的使用时会再详细说明。) 数组中的元素就可以表示为数组名称(第一维索引号),索引号的范围在下界和上届之间。...首先在用户窗体、模块或者过程中使用dim或public语句声明一个没有下标的数组。比如: dim myarray() 然后在程序过程中使用ReDim语句重新定义该数组的大小。

    3.5K20

    Worksheet工作表对象基础

    二、工作表对象集合 在vba代码中,单个对象与对象集合都常用到,工作表对象集合sheets和worksheets集合用于批量处理的情况。...3、工作表对象名称codename 在新增工作表时,excel会默认新增工作表name和对象名称codename相同。在日常使用时通常会更改工作表的name属性,比如上图“表格1”表格2和汇总表等。...所以在引用工作表时也可以直接使用工作表对象名称codename。例如汇总表可以直接用sheet3来表示。 codename属性是只读,通常较少去更改它,但它可以工作表的属性窗格中去更改。...(点击vba工程中的sheet1,下侧会显示工作表sheet1的属性窗格,(名称)就是codename,就可以手工修改(建议没有需求不要更改)。...工作表的usedrange属性,表示工作表中使用过的单元格。(单元格常用属性篇四) 由于相关内容难度不大,这里不再重复介绍,可通过链接查看原文。 ---- 本节主要介绍了工作表对象的引用方法。

    2.6K10

    用于处理图表&图形的VBA代码大全1

    标签:VBA 图表和图形是Excel最好的功能之一,它们非常灵活,可以用来进行一些非常高级的可视化。本文可以作为在Excel中使用VBA绘制图表的指南。...本文中的代码示例演示了使用VBA处理最常见的图表选项,很好地利用这些代码,自动创建和修改图表。...注意,在Excel 2013中,对图表引擎和文档对象模型进行了许多更改,例如AddChart2方法取代了AddChart方法。因此,本文中提供的一些代码可能无法用于Excel 2013之前的版本。...Chart对象、图表和图表工作表 在Excel的对象层次模型中,许多东西存在于许多地方。例如,图表可以是工作表中的嵌入式图表,也可以是单独的图表工作表。 1.在工作表本身,可以找到图表对象。...创建一个引用ChartObject内的图表的变量: Dim cht As Chart Set cht = Sheets("Sheet1").ChartObjects("Chart 1").Chart 创建一个引用工作表内图表的变量

    71320
    领券