excel 初始化公共模块级变量

dpiehjr4  于 2023-05-08  发布在  其他
关注(0)|答案(2)|浏览(163)

我的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

但毫无结果。我在语法中遗漏了什么吗?或者这应该以一种完全不同的方式来完成?

izj3ouym

izj3ouym1#

看起来不像是在调用myrow()
调用myrow()或在工作簿打开时通过在ThisWorkbook模块中添加事件处理程序直接设置变量:

Option Explicit

Private Sub Workbook_Open()
    lastrow = Worksheets(2).Cells(Rows.Count, "A").End(xlUp).Row
    'or
    myrow
End Sub
z18hc3ub

z18hc3ub2#

在VBA中定义为Const将不起作用,因为它们不能在运行时初始化,需要在编译时定义Const。
为了避免End-命令被反复执行,您只需检查是否已经设置了该值

If lastrow = 0 Then lastrow = Worksheets(2).Cells(Rows.Count, "A").End(xlUp).Row

将lastrow定义为global意味着该语句将被放置在代码中的任何地方,因此使用函数的想法是好的。如果我和你一样,我会将函数本身命名为lastrow,并重命名变量--现在剩下的代码根本不需要修改。

Dim myLastRow as Long

Public Function lastrow()
    If myLastRow  = 0 Then 
        myLastRow = Worksheets(2).Cells(Rows.Count, "A").End(xlUp).Row
    End If

    lastrow = myLastRow 
End Function

现在仍然会留下myLastRow作为全局变量。如果你想避免这种情况(并强制代码独占使用该函数),将其声明为Static局部变量。

Public Function lastrow()
    Static myLastRow as Long 
    If myLastRow = 0 Then 
        myLastRow = Worksheets(2).Cells(Rows.Count, "A").End(xlUp).Row
    End If
    lastrow = myLastRow 
End Function

相关问题