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
。您是否确定在打开事件中正确设置了它?另外,为什么要在书籍打开时而不是在工作表更改期间尝试获取范围?是否因为数据可能会更改,并且您希望确保在任何人添加/删除任何内容之前获取范围?