在所有编程语言中,我们都有变量访问说明符,用于定义从何处可以访问已定义的变量。 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不能访问它们。

因此,该子遇到错误。

image

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,则可以正常工作。要使函数和子例程对模块私有,请在子和函数之前使用关键字“私有”。

image

注意:-默认情况下,模块中在任何子例程或函数之前声明的变量是模块专用的。您可以使用私人关键字。但是默认情况下,函数和子例程是公共的,并且可以由项目中的任何模块访问。要使函数和子例程对模块私有,必须使用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函数]这是仪表板的另一个重要功能。这可以帮助您汇总特定条件下的值。