Excel 公共/全球范围似乎并非始终可用

Excel 公共/全球范围似乎并非始终可用,excel,vba,global-variables,public,worksheet,Excel,Vba,Global Variables,Public,Worksheet,我希望在更改特定单元格时让工作表运行宏 我使用了下面的代码来初始化确定哪些单元格将导致宏运行的范围,但是这个范围的生存期似乎不是应用程序的寿命 Public ChangeCellList As Range Private Sub Workbook_Open() With Sheets("Program") For i = 7 To .Cells(Rows.Count, "E").End(xlUp).Row If Not IsEmpty(.Cells(i, "E"))

我希望在更改特定单元格时让工作表运行宏

我使用了下面的代码来初始化确定哪些单元格将导致宏运行的范围,但是这个范围的生存期似乎不是应用程序的寿命

Public ChangeCellList As Range

Private Sub Workbook_Open()

With Sheets("Program")
    For i = 7 To .Cells(Rows.Count, "E").End(xlUp).Row
        If Not IsEmpty(.Cells(i, "E")) Then
            If ChangeCellList Is Nothing Then
                Set ChangeCellList = .Range("E" & i)
            Else
                Set ChangeCellList = Union(ChangeCellList, .Range("E" & i))
            End If
        End If
    Next i
End With
End Sub
可能存在的问题如能提供以下方面的建议,我将不胜感激:

1) 声明公共变量的正确位置(例如模块1/本工作簿/表1?)

2) 我认为这是一个坏主意,但如果我只是在工作表_Change()子中初始化此范围,会不会对性能造成太大影响

这是发生错误的代码:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Fill As Long
Dim StartWeek As Integer
Dim Duration As Integer

'***Error due to ChangeCellList is nothing***
If Not Application.Intersect(ChangeCellList, Range(Target.Address)) _
 Is Nothing Then
    With Sheets("Program")
        Fill = Sheets("macroData").Range("C1").Interior.Color

        StartWeek = InputBox("Please enter the Start Week of this Activity", "Start Week")
        Duration = InputBox("Please Enter the Duration of this Activity", "Duration")

        StartCol = StartWeek + 9

        For k = 0 To Duration - 1
            .Cells(Target.Row, StartCol + k).Value = 1
            .Cells(Target.Row, StartCol + k).Interior.Color = Fill
            .Cells(Target.Row, StartCol + k).Font.Color = Fill
        Next k
    End With
End If

End Sub

与您的问题无关,但
范围(Target.Address)
Target
@Comintern完全相同。谢谢。也不太可能解决问题,但您需要限定
行。用工作表计数
。只需在
.Cells(Rows.Count,“E”).End(xlUp).Row
之前添加一个
即可将其链接到“程序”表。否则,
行数
将根据活动工作表的内容计算。此外,打开工作簿后,在即时窗口(按VBA编辑器中的
CTRL+G
)中,键入
?ChangeCellList.Address
。我希望它返回全局变量。这至少有助于确定它是否存储在
Workbook Open
sub.@BruceWayne啊,是的,我没有发现那个打字错误。实际上,它通常不会产生效果,因为程序表是唯一的活动表,但我想最好是有更健壮的代码。您是否使用
F8
?在
Open
事件的第一行放置一个“Stop”(停止)块,然后按
F8
遍历它,您应该能够看到是否/何时设置了
ChangeCellList
。您是否确定在
打开事件中正确设置了它?另外,为什么要在书籍打开时而不是在工作表更改期间尝试获取范围?是因为数据可能会更改,并且您希望确保在任何人添加/删除任何内容之前获取范围吗?与您的问题无关,但是
range(Target.Address)
Target
@Comintern完全相同。谢谢。也不太可能解决此问题,但是您需要限定
行。使用工作表计数
。只需在
.Cells(Rows.Count,“E”).End(xlUp).Row
之前添加一个
即可将其链接到“程序”表。否则,
行数
将根据活动工作表的内容计算。此外,打开工作簿后,在即时窗口(按VBA编辑器中的
CTRL+G
)中,键入
?ChangeCellList.Address
。我希望它返回全局变量。这至少有助于确定它是否存储在
Workbook Open
sub.@BruceWayne啊,是的,我没有发现那个打字错误。实际上,它通常不会产生效果,因为程序表是唯一的活动表,但我想最好是有更健壮的代码。您是否使用
F8
?在
Open
事件的第一行放置一个“Stop”(停止)块,然后按
F8
遍历它,您应该能够看到是否/何时设置了
ChangeCellList
。您是否确定在
打开事件中正确设置了它?另外,为什么要在书籍打开时而不是在工作表更改期间尝试获取范围?是否因为数据可能会更改,并且您希望确保在任何人添加/删除任何内容之前获取范围?