确定工作表更改是否特定于行

时间:2012-08-19 02:22:05

标签: excel vba excel-vba

我想确定对工作表的更改是否包含一个特定行中的单元格。我试过了

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

    Dim i As Integer

    If ActiveSheet.Name = "Yahoo" Then
        If Not Intersect(Target, Range(Cells([YahooID_Row], 1), Cells([YahooID_Row], 999))) Is Nothing Then

        Else

        End If
    End If

End Sub

YahooID_Row是一个命名的整数常量。

我一直遇到运行时错误1004.我该怎么做?

3 个答案:

答案 0 :(得分:0)

这假设您只对发生更改的行感兴趣(并且不关心列)。它找到范围对象中的第一行和最后一行,并检查它们之间是否有YahooID_Row

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

    dim firstRow, lastRow as double    
    firstRow = target.Rows(1).Row
    lastRow = target.Rows(target.Rows.Count).Row
    if (YahooID_Row >= firstRow and YahooID_Row =< lastRow) then
        msgbox "Change in the YahooID row"
    end if

End Sub

如果您希望消除额外的代码行,也可以将第一行/最后一行声明和计算直接移到if语句中。

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

    if (YahooID_Row >= target.Rows(1).Row and YahooID_Row =< target.Rows(target.Rows.Count).Row) then
        msgbox "Change in the YahooID row"
    end if

End Sub

答案 1 :(得分:0)

使用您尝试过的策略,这是您的代码的工作版本

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    If Sh.Name = "Yahoo" Then
        If Not Intersect(Target, Sh.Rows([YahooID_Row])) Is Nothing Then

        Else

        End If
    End If

End Sub

不同的是

  1. 检查Sh参数而不是活动工作表。触发事件的更改可能不是来自ActiveSheet。
  2. 将表格参考(Range(...)限定为Sh
  3. 由于[YahooID_Row]是命名常量(而不是命名范围),因此将其用作索引
  4. 检查整行而不仅仅是前999列

答案 2 :(得分:0)

如果您有一张纸,那么您可以直接使用Worksheet_Change(ByVal Target As Range)检查行与目标之间的交叉点。如果有多张纸,则只使用Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

以下代码代码位于您要进行检查的工作表代码区域中。 `

此外,如果您打算写入单元格,请确保设置Application.EnableEvents = False以防止可能的无限循环,并使用正确的错误处理将其再次设置为True

Option Explicit

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

    Dim YahooID_Row As Long

    '~~> Row 5
    YahooID_Row = 5

    Application.EnableEvents = False

    If Not Intersect(Target, Rows(YahooID_Row)) Is Nothing Then
        '
        '~~> You rest of the code goes here
        '
    End If

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