我的VBA模块有多个子程序。在大多数情况下,我计算最后一个非空行,以避免加载不需要的单元格。
一旦代码第一次检查了当前工作簿中第二个工作表的最后一个非空单元格,变量的值在使用子例程对工作表进行更改的整个过程中保持不变。所以我尝试只声明和初始化它一次,而不是每个子例程都声明和初始化一次。
宣言的作用是:
Option Explicit
Public lastrow As Long
Public Sub CleanOrderNumbers()
With Worksheets(2)
Dim range As range
lastrow = .Cells(Rows.Count, "A").End(xlUp).Row
Set range = .range("A2:A" & lastrow)
range.Replace What:="#", Replacement:="OrdNo"
End With
End Sub
然而,我也想只初始化一次变量,避免重复Cells(Rows.Count, "A").End(xlUp).Row
。
我试过使用一个函数或一个sub来处理初始化。
Option Explicit
Public lastrow As Long
Public Function myrow()
lastrow = Worksheets(2).Cells(Rows.Count, "A").End(xlUp).Row
'alternatively as a constant?
'Const lastrow As Integer = Worksheets(2).Cells(Rows.Count, "A").End(xlUp).Row
End Function
Public Sub CleanOrderNumbers()
With Worksheets(2)
Dim range As range
Set range = .range("A2:A" & lastrow)
range.Replace What:="#", Replacement:="OrdNo"
End With
End Sub
但毫无结果。我在语法中遗漏了什么吗?或者这应该以一种完全不同的方式来完成?
2条答案
按热度按时间izj3ouym1#
看起来不像是在调用
myrow()
?调用
myrow()
或在工作簿打开时通过在ThisWorkbook
模块中添加事件处理程序直接设置变量:z18hc3ub2#
在VBA中定义为Const将不起作用,因为它们不能在运行时初始化,需要在编译时定义Const。
为了避免
End
-命令被反复执行,您只需检查是否已经设置了该值将lastrow定义为global意味着该语句将被放置在代码中的任何地方,因此使用函数的想法是好的。如果我和你一样,我会将函数本身命名为
lastrow
,并重命名变量--现在剩下的代码根本不需要修改。现在仍然会留下
myLastRow
作为全局变量。如果你想避免这种情况(并强制代码独占使用该函数),将其声明为Static
局部变量。