2

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 テーブルで特定の変更を行うと、現在の行の下に新しい行が作成され、データのコピーが作成され、2 つの ID フィールドが両方の行を相互参照するため、それらが関連していることがわかります。

これは正常に動作しますが、リストがフィルター処理されてイベントが発生すると、ListRows.Add で次のエラーが発生します。

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

エラーを理解しました。最初にフィルターを削除して回避できると思います。しかし、それはユーザーにとって失礼であり、後でフィルターをやり直すことを強制します (これは複雑になる可能性があります)。

この問題に対するエレガントな解決策は何でしょうか? どうにかして新しい行を作成し、フィルターを保持する (または自動的に元に戻す) ことはできますか?

4

1 に答える 1

3

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

次の 2 つの問題に注意してください。

  1. フィルター処理されたリストに新しい行を追加する場合、新しい行がフィルター条件に一致しない場合、新しい行が表示されないことがあります。

  2. ListRow のどちらかの側に何かがある場合、新しいシート行がそれを壊す可能性があります。

于 2015-02-09T14:40:59.793 に答える