第二个Excel文件打开时,工作表更改事件停止工作

时间:2017-06-02 11:06:34

标签: excel vba excel-vba

我正在使用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

由于

1 个答案:

答案 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等现在正在重新启动新打开的工作簿,工作表等。

所有隐式采用上下文的属性都会返回错误的值(取自不同的来源)。