过滤列表时,ListRows.Add()会出错

时间:2015-02-09 13:14:22

标签: excel excel-vba listobject vba

我有一个从Worksheet_Change事件中调用的以下代码(适用于Excel 2007及更新版本):

Sub InsertRow(Movs As ListObject, currentRow As ListRow)
    Dim newRow As ListRow

    Set newRow = Movs.ListRows.Add(currentRow.index + 1) 'gives error when list is filtered

    ' below is my custom code, but you don't need to understand it to answer the question:
    Range("xMaxID") = Range("xMaxID") + 1
    newRow.Range.Columns(colID) = Range("xMaxID")
    CopyRow Movs, currentRow, newRow

End Sub

基本上,当用户在Excel表格中进行某些更改时,会在当前行下创建一个新行,其中包含一个数据副本,其中有两个ID字段交叉引用这两行,因此我知道它们是相关的

这样可以正常工作,但是当列表被过滤并且事件发生时,我在ListRows.Add上收到此错误:

Run-time error 1004: cannot shift cells in a filtered range or table

我理解错误,我想我可以解决它,首先删除过滤器;但这对用户来说很粗鲁,迫使他们事后重做过滤器(这可能很复杂)。

这个问题的优雅解决方案是什么?是否有可能以某种方式创建新行但保留(或自动恢复)过滤器?

1 个答案:

答案 0 :(得分:1)

感谢Rory的提示,一个好的答案是插入整个表格行,而不仅仅是Listrow

以下是更新后的代码:

Sub InsertRow(Movs As ListObject, currentRow As ListRow)
    Dim newRow As ListRow

    Movs.Range.Worksheet.Rows(currentRow.Range.Row + 1).Insert
    Set newRow = Movs.ListRows(currentRow.index + 1)

    '(...) rest of sub omitted

End Sub

注意两个可能的问题:

  1. 在筛选列表中添加新行时,如果新行与筛选条件不匹配,则可能不可见

  2. 如果您的ListRow两边都有任何内容,则新的工作表行可能会破坏它。