我想确定对工作表的更改是否包含一个特定行中的单元格。我试过了
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.我该怎么做?
答案 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
不同的是
Sh
参数而不是活动工作表。触发事件的更改可能不是来自ActiveSheet。Range(...
)限定为Sh
[YahooID_Row]
是命名常量(而不是命名范围),因此将其用作索引答案 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