Excel的VBA变量的作用域
在所有编程语言中,我们都有变量访问说明符,用于定义从何处可以访问已定义的变量。 Excel VBA也不例外。 VBA也具有范围说明符。这些作用域说明符可用于设置Excel VBA中变量的可见性/范围。
在Excel VBA中,我们有三种类型的范围说明符:
。程序级别。专用模块级。公共-项目级别=== VBA过程级别变量范围只能在该过程/函数中访问在子例程中声明的变量。它们具有过程级别范围。它们通常用Dim关键字声明。如果模块是隐式选项,则它们可能尚未声明,而是直接使用。
在下面的示例中,我们有一个子例程范围测试,该测试具有变量x和y。当我们运行第一个子例程时,它将完美运行并输出X和Y的和
Option Explicit Sub scopeTest() Dim x, y As Integer ' Procedure level variable in VBA x = 2 y = 3 Debug.Print x + y End Sub Sub sum() x = 5 y = 7 Debug.Print x + y End Sub
|但是,当您运行子例程sum时,会引发一个错误,即未声明该变量。为什么?因为X和Y对过程scopeTest是私有的,并且子例程sum不能访问它们。
因此,该子遇到错误。
VBA私有变量-模块级作用域当您要声明一个需要在整个模块中访问的变量时,则可以在任何子例程或函数之前,在模块顶部将该变量声明为私有。
默认情况下,模块中任何子例程之前声明的变量均为Private。即使使用Dim关键字声明它们。但具体来说,使用Private关键字是明智的。
以下两个过程位于同一模块,即模块1中。
上面的两个函数可以很好地运行,因为变量x和y是该模块的私有变量。
Option Explicit 'Module level variable in VBA. Both variables x and y are private to this module. and 'can be accessed from any sub or function within this module. Dim x As Integer Private y As Integer Sub scopeTest() 'This can be accessed from any module in the project x = 2 y = 3 Debug.Print x + y End Sub Private Sub sum() ' This can't be accessed from other modules x = 5 y = 7 Debug.Print x + y End Sub
重要:保留在x和y中的最后一个值,直到在整个模块中。如果我们先运行sub scopeTest并且不初始化sub sum中的x和y值并运行它,则x和y的初始值将保持不变。
下面的子例程在一个单独的模块(模块2)中定义。当我尝试从另一个模块访问变量时,VBA过程(或函数)遇到错误。
但是,如果我尝试从模块2中的模块1调用子例程sum,则可以正常工作。要使函数和子例程对模块私有,请在子和函数之前使用关键字“私有”。
注意:-默认情况下,模块中在任何子例程或函数之前声明的变量是模块专用的。您可以使用私人关键字。但是默认情况下,函数和子例程是公共的,并且可以由项目中的任何模块访问。要使函数和子例程对模块私有,必须使用Private关键字。 ===公共变量-项目级别范围正如我们在上述示例中所了解的,函数和子例程默认情况下是公共的,可以从任何模块访问但是变量不是。若要使变量可从Excel VBA中的任何模块访问,请使用Public关键字。*要在项目中声明公共变量,您必须在模块顶部声明它们,然后再使用public关键字在任何函数或子例程之前进行声明。下面的代码写在模块1中。
并且此子例程在另一个模块(模块2)中。
这次,它运行完美。
Option Explicit 'Project level variable in VBA. Public x As Integer Public y As Integer Public Sub scopeTest() 'This can be accessed from any module in the project x = 2 y = 3 End Sub Private Sub sum() ' This can't be accessed from other modules x = 5 y = 7 Debug.Print x + y End Sub
首先,我调用了子程序scopeTest。由于scopeTest是公共的,因此被调用。它初始化x和y的值。接下来,我们将x和y相乘。由于scopeTest子例程已使用值2和3对其进行了初始化,因此我们得到的结果为6。好的,这就是您可以在Excel中使用变量作用域说明符来控制Excel VBA项目中变量,函数和子例程的可见性的方式。
我试图以最简单的方式来解释VBA的访问说明符。我希望这是可以解释的。如果您对本文有任何疑问或任何其他与VBA相关的疑问,请在下面的评论部分中问我。我会很高兴从您这里来。
Option Explicit Sub mul() Call scopeTest 'Call sum ' it won't work as it is private to the module 1 Debug.Print x * y End Sub
相关文章:
link:/在vba中的单元格范围行和列是什么,byref和byval参数之间的差异是vba面试问题[ByRef和ByVal参数]
|何时一个参数作为ByRef参数传递给另一个子或函数,然后发送实际变量的引用。对变量副本所做的任何更改都将反映在原始参数中。
`链接:/ files-workbook-and-worksheets-in-vba-delete-sheets-without-confirmation-prompts-using-vba-in-microsoft-excel [在不使用确认提示的情况下删除表,在Microsoft Excel中使用VBA进行提示]您正在使用VBA删除工作表,就知道您在做什么。您想告诉Excel不要显示此警告并删除该死的表。
链接:/在vba中添加文件/工作簿和工作表,并在Microsoft-excel中使用vba添加并保存新工作簿[在Microsoft Excel 2016中使用VBA添加和保存新工作簿]] |在此代码中,我们首先创建了对工作簿对象的引用。然后,我们使用一个新的工作簿对象对其进行了初始化。这种方法的好处是您可以轻松地对此新工作簿进行操作。像保存,关闭,删除等一样,link:/ menus-toolbars-status-bar-in-vba-在Microsoft Excel中使用vba-显示状态栏上的消息[Excel VBA状态栏]`Excel中的状态栏可用作代码监视器。当您的VBA代码冗长且您使用VBA执行多项任务时,通常会禁用屏幕更新,以免看到屏幕闪烁的“ link:/ general-topics-in-vba-turn-off-warning-messages- using-vba-in-microsoft-excel [在Microsoft Excel 2016中使用VBA关闭警告消息]
|此代码不仅禁用VBA警报,而且还提高了代码的时间效率。让我们看看如何。
热门文章:
50 Excel快捷方式以提高生产率更快地完成任务。这50个快捷键将使您在Excel上的工作速度更快。
Excel中的VLOOKUP函数在Excel 2016中为COUNTIF使用此惊人的功能对条件进行计数。您无需过滤数据即可计算特定值。
Countif功能对于准备仪表板至关重要。
链接:/ excel-formula-and-function-excel-sumif-function [如何在Excel中使用SUMIF函数]这是仪表板的另一个重要功能。这可以帮助您汇总特定条件下的值。