0

1)有人可以告诉我这段代码有什么问题吗?

2)我实际上需要这段代码在工作表更新上运行,但是@第一次加载工作簿,我正在使用Workbook_Open事件处理程序运行更新。这不会触发我的Worksheet_Change事件吗?有什么办法可以避免这种情况

Private Sub Worksheet_Change(ByVal Target As Range)

Dim ws As Worksheet
Dim rowCount As Integer

Set Worksheet = "datasheet"
Set rowCount = ws.Cells(Rows.Count, "A").End(xlUp)

If Not Intersect(Target, Range("M3:M" & CStr(rowCount))) Is Nothing Then
   MsgBox ("Hi")
End If
Else
If Not Intersect(Target, Range("T3:T" & CStr(rowCount))) Is Nothing Then
   MsgBox ("Hi")
End If
Else
If Not Intersect(Target, Range("X3:X" & CStr(rowCount))) Is Nothing Then
   MsgBox ("Hi")
End If
Else
If Not Intersect(Target, Range("AB3:AB" & CStr(rowCount))) Is Nothing Then
   MsgBox ("Hi")
End If
Else
If Not Intersect(Target, Range("AI3:AI" & CStr(rowCount))) Is Nothing Then
   MsgBox ("Hi")
End If

End Sub

当我使用这个处理程序更改我的数据时,我收到一个编译器错误,说“需要对象”。另一方面,如果我给出值而不是行数,我不会遇到任何问题。

4

2 回答 2

1

你有几个问题

  1. 根据 Sid 的评论,您应该使用rowCount = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
  2. 你应该不Set ws = Sheets("datasheet")使用Set Worksheet = "datasheet"
  3. 您的Else陈述是孤立的,因此会导致错误。如果您想在第一个“嗨”时退出而不是继续测试,您应该尝试这样的事情

席德已经涵盖了你的另一点。Boolean您可以为此使用变量

更新代码

rowCount这会在一行中测试第 3 行到行的 M、T、X、AB 和 AI 列的相交

Private Sub Worksheet_Change(ByVal Target As Range)

Dim ws As Worksheet
Dim rowCount As Long

Set ws = Sheets("datasheet")
rowCount = ws.Cells(Rows.Count, "A").End(xlUp).Row

If Not Intersect(Target, Range("M3:M" & CStr(rowCount) & ",T3:T" & CStr(rowCount) & ",X3:X" & CStr(rowCount) & ",AB3:AB" & CStr(rowCount) & ",AI3:AI" & CStr(rowCount))) Is Nothing Then MsgBox ("Hi")

End Sub
于 2012-10-23T06:20:27.153 回答
1

使用时我总是推荐这个Worksheet_Change

  1. 您不需要工作表名称。据了解,除非您尝试使用另一个工作表行作为参考,否则代码将在当前工作表上运行,正如 brettdj 在下面的评论中正确提到的那样。

  2. 每当您处理Worksheet_Change事件时。如果要将数据写入单元格,请始终关闭事件。这是必需的,以便代码不会进入可能的无限循环

  3. 每当您关闭事件时,请使用错误处理,否则如果您遇到错误,代码将不会在下次运行。

这是一个例子

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    On Error GoTo Whoa

    Application.EnableEvents = False

    '
    '~~> Rest of the code
    '

LetsContinue:
    Application.EnableEvents = True
    Exit Sub
Whoa:
    MsgBox Err.Description
    Resume LetsContinue
End Sub

因此,使用上面的代码,您的代码变为 (UNTESTED)

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim rowCount As Long

    On Error GoTo Whoa

    Application.EnableEvents = False

    With ActiveSheet
        rowCount = .Cells(.Rows.Count, "A").End(xlUp).Row
    End With


    If Not Intersect(Target, Range("M3:M" & rowCount)) Is Nothing Then
       MsgBox ("Hi")
    ElseIf Not Intersect(Target, Range("T3:T" & rowCount)) Is Nothing Then
       MsgBox ("Hi")
    ElseIf Not Intersect(Target, Range("X3:X" & rowCount)) Is Nothing Then
       MsgBox ("Hi")
    ElseIf Not Intersect(Target, Range("AB3:AB" & rowCount)) Is Nothing Then
       MsgBox ("Hi")
    ElseIf Not Intersect(Target, Range("AI3:AI" & rowCount)) Is Nothing Then
       MsgBox ("Hi")
    End If

LetsContinue:
    Application.EnableEvents = True
    Exit Sub
Whoa:
    MsgBox Err.Description
    Resume LetsContinue
End Sub

编辑

关于你的第二个问题。正如我在上面的评论中提到的,您可以使用公共变量来检查工作表更改事件是否是由工作簿打开引起的。

将此代码放在一个模块中。

Public WasWbOpened As Boolean

将此代码放在工作簿代码区域中

Option Explicit

Private Sub Workbook_Open()
    WasWbOpened = True
    '
    '~~> Rest of the code
    '
    WasWbOpened = False
End Sub

并将您的工作表更改事件更改为

Private Sub Worksheet_Change(ByVal Target As Range)
    If WasWbOpened = True Then Exit Sub

    Dim rowCount As Long

    On Error GoTo Whoa

    Application.EnableEvents = False

    With ActiveSheet
        rowCount = .Cells(.Rows.Count, "A").End(xlUp).Row
    End With


    If Not Intersect(Target, Range("M3:M" & rowCount)) Is Nothing Then
       MsgBox ("Hi")
    ElseIf Not Intersect(Target, Range("T3:T" & rowCount)) Is Nothing Then
       MsgBox ("Hi")
    ElseIf Not Intersect(Target, Range("X3:X" & rowCount)) Is Nothing Then
       MsgBox ("Hi")
    ElseIf Not Intersect(Target, Range("AB3:AB" & rowCount)) Is Nothing Then
       MsgBox ("Hi")
    ElseIf Not Intersect(Target, Range("AI3:AI" & rowCount)) Is Nothing Then
       MsgBox ("Hi")
    End If

LetsContinue:
    Application.EnableEvents = True
    Exit Sub
Whoa:
    MsgBox Err.Description
    Resume LetsContinue
End Sub
于 2012-10-23T06:29:39.983 回答