如何修复';下标超出范围';Excel VBA中出错:获取表的更改事件中目标单元格的行号
我有一个工作表更改事件,它在表列的每个单元格更改时执行一个操作。对于该特定操作,我需要找到目标单元格的行号。我在工作表更改事件中有以下代码片段:如何修复';下标超出范围';Excel VBA中出错:获取表的更改事件中目标单元格的行号,excel,vba,Excel,Vba,我有一个工作表更改事件,它在表列的每个单元格更改时执行一个操作。对于该特定操作,我需要找到目标单元格的行号。我在工作表更改事件中有以下代码片段: If Not Intersect(Target, tbl.ListColumns(5).DataBodyRange) Is Nothing Then Application.EnableEvents = False row_num = tbl.ListRows(Target.Row - tbl.HeaderRowRange.Row).I
If Not Intersect(Target, tbl.ListColumns(5).DataBodyRange) Is Nothing Then
Application.EnableEvents = False
row_num = tbl.ListRows(Target.Row - tbl.HeaderRowRange.Row).Index
Application.EnableEvents = True
End If
我有一个单独的宏,只需单击按钮即可刷新同一个表
Sub Refresh()
Application.EnableEvents = False
ActiveSheet.ListObjects("Table1").Refresh
Application.EnableEvents = True
End Sub
宏运行正常并返回右侧的行数
。但是,只有在刷新表时,第一个代码段中的Target.Row
值才会设置为与该表标题行相同的行号,从而使Row_num
为空并返回“下标超出范围”错误
为什么会这样?通过指定仅当目标单元格与该表列的DataodyRange相交时才执行该操作,该操作是否仅适用于该列数据部分的更改(不包括标题和总计)?因此,我必须在测试后撤销初始答案,并采用完全不同的方式 通过指定仅当目标单元格 与该表列的DataodyRange相交(如果不起作用) 仅适用于列数据部分的更改(不包括标题和 总数) 正确,当
目标
在表1
Application.EnableEvents = False
row_num = tbl.ListRows(Target.Row - tbl.HeaderRowRange.Row).Index
Application.EnableEvents = True
但是,只有在刷新表时,表中的Target.Row值
第一个代码段设置为与该代码段的标题行相同的行号
表,从而使row_num为空,并从
距离误差
没错。假设您所说的是真的,并且刷新后Target.Row=tbl.headerrorrange.Row
。然后,您的代码设计为不会分配行数
,因为上面的代码不会执行
为什么会这样
我能让您的代码生成超出范围错误的唯一方法是当我执行@BigBen在其最后评论中提到的操作时。如果我在标题行或其上方选择了一个卖出,然后扩展我的选择以在第5列数据bodyrange中包含一个单元格,那么我将得到您的错误。您可以测试这是否是您在
Target.Cells.Count中遇到的问题 所以在测试之后,我不得不撤销我最初的答案,走一条完全不同的路
通过指定仅当目标单元格
与该表列的DataodyRange相交(如果不起作用)
仅适用于列数据部分的更改(不包括标题和
总数)
正确,当目标
在表1
Application.EnableEvents = False
row_num = tbl.ListRows(Target.Row - tbl.HeaderRowRange.Row).Index
Application.EnableEvents = True
但是,只有在刷新表时,表中的Target.Row值
第一个代码段设置为与该代码段的标题行相同的行号
表,从而使row_num为空,并从
距离误差
没错。假设您所说的是真的,并且刷新后Target.Row=tbl.headerrorrange.Row
。然后,您的代码设计为不会分配行数
,因为上面的代码不会执行
为什么会这样
我能让您的代码生成超出范围错误的唯一方法是当我执行@BigBen在其最后评论中提到的操作时。如果我在标题行或其上方选择了一个卖出,然后扩展我的选择以在第5列数据bodyrange中包含一个单元格,那么我将得到您的错误。您可以测试这是否是您在Target.Cells.Count中遇到的问题 只是澄清一下,如果您添加一个Debug.Print Target.Row
(在循环之外),它不会返回正确的行号?它会返回工作表的行号。对,但是您说Target.Row
与表的标题行是同一行号。这是真的还是假的?换句话说,您是否有Target.Row
和tbl.headerrorrange.Row
的示例值?我应该澄清,只有在刷新表时,它才会崩溃-Target.Row
以某种方式被检测为标题行单元格,并且由于Row_num
的方式(表行号)返回错误计算,结果为行数=0
。如果我不刷新-Target,宏运行正常。Row
返回更改单元格的工作表行号,使用该行号标识右侧的Row_num
。是否在工作表更改事件中刷新它?只是澄清一下,如果添加Debug.Print Target.Row
(在循环外部),它没有返回正确的行号?它返回工作表的行号。对,但是您说Target.row
与表的标题行是相同的行号。这是真的还是假的?换句话说,您是否有Target.Row
和tbl.headerrorrange.Row
的示例值?我应该澄清,只有在刷新表时,它才会崩溃-Target.Row
以某种方式被检测为标题行单元格,并且由于Row_num
的方式(表行号)返回错误计算,结果为行数=0
。如果不刷新-Target.Row
返回已更改单元格的工作表行号,使用该行号标识右侧的Row_num
。是否在工作表更改事件中刷新它?但问题行是Row_num=tbl.ListRows(Target.Row-tbl.headerrorwrange.Row).Index
…这不是我读到的。我读到“row_num为空”,错误位置不明确。好吧,其中唯一一行包含row_num
,就是我提到的那一行。。。它也是其中唯一一行带有Target.Row
。对,但我认为错误发生在它上面,当条件被测试时。我不是