Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在公共函数(Excel VBA)中声明变量_Vba_Excel - Fatal编程技术网

在公共函数(Excel VBA)中声明变量

在公共函数(Excel VBA)中声明变量,vba,excel,Vba,Excel,我有几个公共函数,它们在另一个函数中被依次调用。。。大概是这样的: Public Sub func1() Operation 1 End Sub Public Sub func2() Operation 2 End Sub Public Sub func3() Operation 3 End Sub Sub Execute() Call func1() Call func2() Call func3() End Sub Dim LastRow as Long La

我有几个公共函数,它们在另一个函数中被依次调用。。。大概是这样的:

Public Sub func1()
  Operation 1
End Sub

Public Sub func2()
  Operation 2
End Sub

Public Sub func3()
  Operation 3
End Sub

Sub Execute()
  Call func1()
  Call func2()
  Call func3()
End Sub
Dim LastRow as Long
LastRow = Sheets("Project_Name").Cells(Rows.count, "B").End(xlUp).row
我想了解的是,如果我在每个函数中声明一个公共变量,比如:

Public Sub func1()
  Operation 1
End Sub

Public Sub func2()
  Operation 2
End Sub

Public Sub func3()
  Operation 3
End Sub

Sub Execute()
  Call func1()
  Call func2()
  Call func3()
End Sub
Dim LastRow as Long
LastRow = Sheets("Project_Name").Cells(Rows.count, "B").End(xlUp).row
假设我可以在
func1()
中声明一次,并在
func2()
func3()
中使用它,这样安全吗

或者我必须在每个函数中声明它3次


谢谢

这里有一个全局变量,您可以在
func1
中赋值(尽管我会更改这些名称,因为它们是sub)。注意,公共变量在SUB之外的模块顶部声明。我已将一个子系统的名称更改为
my_Execute
,因为
Execute
让我想起了许多编程语言中的一个关键字

Option Explicit
Public a As Long

Public Sub func1()
    a = 1
End Sub

Public Sub func2()
    MsgBox a
End Sub

Public Sub func3()
    MsgBox a    
End Sub

Public Sub my_Execute()
    func1
    func2
    func3
End Sub

在本地声明一次,并通过值(ByVal)作为参数传递全部。注意:这里它在
my_Execute
中本地声明,然后作为参数传递给其他sub

Option Explicit

Public Sub func1(ByVal a As Long)
   MsgBox "func1 " & a
End Sub

Public Sub func2(ByVal a As Long)
    MsgBox "func2 " & a
End Sub

Public Sub func3(ByVal a As Long)
    MsgBox "func3 " & a
End Sub

Public Sub my_Execute()
    Dim a As Long
    a = 1
    func1 a
    func2 a
    func3 a
End Sub

通过
ByRef
以便可以在途中更改
a

Option Explicit
Public Sub func1(ByRef a As Long)
   a = a + 1
End Sub

Public Sub func2(ByRef a As Long)
    a = a + 2
End Sub

Public Sub func3(ByRef a As Long)
     a = a + 3
End Sub

Public Sub my_Execute()
    Dim a As Long
    a = 1
    func1 a
    func2 a
    func3 a
    MsgBox a
End Sub


关于ByRef和ByVal的信息,这里有一个全局变量,您可以在
func1
中赋值(尽管我会更改这些名称,因为它们是sub)。注意,公共变量在SUB之外的模块顶部声明。我已将一个子系统的名称更改为
my_Execute
,因为
Execute
让我想起了许多编程语言中的一个关键字

Option Explicit
Public a As Long

Public Sub func1()
    a = 1
End Sub

Public Sub func2()
    MsgBox a
End Sub

Public Sub func3()
    MsgBox a    
End Sub

Public Sub my_Execute()
    func1
    func2
    func3
End Sub

在本地声明一次,并通过值(ByVal)作为参数传递全部。注意:这里它在
my_Execute
中本地声明,然后作为参数传递给其他sub

Option Explicit

Public Sub func1(ByVal a As Long)
   MsgBox "func1 " & a
End Sub

Public Sub func2(ByVal a As Long)
    MsgBox "func2 " & a
End Sub

Public Sub func3(ByVal a As Long)
    MsgBox "func3 " & a
End Sub

Public Sub my_Execute()
    Dim a As Long
    a = 1
    func1 a
    func2 a
    func3 a
End Sub

通过
ByRef
以便可以在途中更改
a

Option Explicit
Public Sub func1(ByRef a As Long)
   a = a + 1
End Sub

Public Sub func2(ByRef a As Long)
    a = a + 2
End Sub

Public Sub func3(ByRef a As Long)
     a = a + 3
End Sub

Public Sub my_Execute()
    Dim a As Long
    a = 1
    func1 a
    func2 a
    func3 a
    MsgBox a
End Sub


关于ByRef和ByVal的信息

您可以在全局声明一次或在本地声明三次,或者先声明,然后作为参数传递给以后的用户。这取决于你对这个变量做了什么。另外,删除Call关键字。不需要。你能给我一个你如何在全球范围内声明的例子吗?还有一个关于如何首先声明并稍后作为参数传递的示例?您可以全局声明一次或局部声明三次,或者先声明并稍后作为参数传递。这取决于你对这个变量做了什么。另外,删除Call关键字。不需要。你能给我一个你如何在全球范围内声明的例子吗?还有一个关于如何先声明然后作为参数传递的示例?如果您需要进一步的解释/澄清,请让我知道。谢谢-我认为第一种方法(全局var)是最有效和最优雅的。你认为呢?这真的取决于你将如何处理这个变量。阅读以下内容:如果您需要进一步的解释/澄清,请让我知道。谢谢-我认为第一种方法(全局var)是最有效和优雅的。你认为呢?这真的取决于你将如何处理这个变量。阅读以下内容: