我正在使用Worksheet_SelectionChange
事件将单元格中的单元格切换为某些列中的复选标记。然后,如果检查该单元格,它将发送大量电子邮件。一切正常,直到我打开另一个在其代码中有worksheet_change
事件的excel文件。
我怎么能......
A)即使其他Excel电子表格打开,也要使这段代码正常工作?
或
B)改变我做校验标记的方式所以我不需要更改工作表? (有些东西和选择一个单元格一样快,可以添加到数千个单元格中。我正在看着你的表单控件复选框)
Public Sub Worksheet_SelectionChange(ByVal Target As Range)
With Target
Dim lastRow As Long
Dim rng As Range
Dim WholeRng As Range
Set rng = Cells
lastRow = rng.Find(What:="*", After:=rng.Cells(7), Lookat:=xlPart, LookIn:=xlFormulas, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase:=False).Row
Set WholeRng = Range(Cells(6, "D"), Cells(lastRow, "F"))
Application.EnableEvents = False
If .Column = 4 And (Target.Row >= 6 And Target.Row <= lastRow) Or _
.Column = 5 And (Target.Row >= 6 And Target.Row <= lastRow) Or _
.Column = 6 And (Target.Row >= 6 And Target.Row <= lastRow) Then
On Error Resume Next
If Asc(.Value) = 82 Then
.Font.Name = "Wingdings 2"
.Value = Chr(163)
Else
.Value = Chr(82)
End If
End If
End With
Application.EnableEvents = True
End Sub
由于
答案 0 :(得分:3)
这不是关于事件停止仅在您引用的不正确的对象的代码中工作。
示例:Range(Cells(6, "D"), Cells(lastRow, "F"))
这总是指ActiveWorksheet(未明确指出,因此隐式使用ActiveWorkbook)。因此,它会从您预期的不同位置获取数据。
你应该纠正你的代码,在每个这样的属性中添加隐式引用,即sht.Range(sht.Cells(6, "D"), sht.Cells(lastRow, "F"))
,其中sht是你需要的工作表。
当然sht应该作为参数传递或从Range中检索。
Rng = Cells
等。
编辑:
为了澄清 - 代码在1个工作簿中运行良好,如果打开另一个工作簿然后切换上下文 - ActiveWorkbook等现在正在重新启动新打开的工作簿,工作表等。
所有隐式采用上下文的属性都会返回错误的值(取自不同的来源)。