在另一个模块Excel VBA中调用时,公共变量值重置

问题描述 投票:0回答:2

在Excel中,我有两个模块,比如说module1和module2。

在module1中,我声明了一个公共变量:

Public offsetNumber As Integer

在sub中,我为'offsetNumber'变量赋一个数字。

offsetNumber = 2
Msgbox offsetNumber

这成功显示数字2。

现在,在module2中,我尝试调用变量offsetNumber。

Msgbox offsetNumber

但是,显示的值为0,而不是2。

如何将变量值从module1转移到module2?

UPSTATE:

我尝试过module1.offsetNumber并检查“require variable declarations”。我还检查过以确保该值没有被覆盖(至少在module1中)。

为了更深入,这就是我的module1目前的结构:

Public offsetNumber as Integer

Sub **********

Dim .... (declare variables)
Activecell.EntireRow.Select
currentRow = ActiveCell.Row
offsetNumber = currentRow - 48
Msgbox offsetNumber (returns correct value)

........... (misc code)

Msgbox offsetNumber (returns correct value)

End Sub

这就是我的module2的结构:

Sub *********

Dim ..... (declare variables)

.............. (misc code)

Msgbox offsetNumber (returns 0)

For rowCounter = 2 to lastRow
    If Sheets("****").Cells(rowCounter, 3) = ****** Then
        Sheets("****").Activate
        Rows(rowCounter + offsetNumber).Select
    End If
Next rowCounter

End Sub

在执行module1后的“立即”窗口中,显示以下行

? offsetNumber 

返回值0。

解:

这对我有用:

模块1:

Public globalOffsetNumber as Integer

Sub **********

Dim .... (declare variables)
Activecell.EntireRow.Select
currentRow = ActiveCell.Row
offsetNumber = currentRow - 48
globalOffsetNumber = offsetNumber (new line)

Msgbox offsetNumber (returns correct value)

........... (misc code)

Msgbox offsetNumber (returns correct value)

End Sub

模块2:

Sub *********

Dim ..... (declare variables)

.............. (misc code)

Msgbox globalOffsetNumber (now returns correct value)

For rowCounter = 2 to lastRow
    If Sheets("****").Cells(rowCounter, 3) = ****** Then
        Sheets("****").Activate
        Rows(rowCounter + globalOffsetNumber).Select
    End If
Next rowCounter

End Sub
excel vba excel-vba reference global
2个回答
1
投票

对于在一个模块中声明为可在另一个模块中访问的公共变量,您无需执行任何操作。试试这个实验:

在模块1中有:

Option Explicit
Public s As String

Sub setvar()
    s = "Hi"
End Sub

在模块2中有:

Sub readvar()
    Debug.Print s
End Sub

如果您首先运行setvar然后立即运行readvar,您应该会在即时窗口中看到“Hi”。

我的猜测是你在运行你的第一个子程序之后但在运行第二个子程序之前以某种方式重置项目。


0
投票

我添加了相同的问题,不要在模块2中放置“Public s As String”。定义重置变量。

© www.soinside.com 2019 - 2024. All rights reserved.