Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何修复';下标超出范围';Excel VBA中出错:获取表的更改事件中目标单元格的行号_Excel_Vba - Fatal编程技术网

如何修复';下标超出范围';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
。对,但我认为错误发生在它上面,当条件被测试时。我不是