[EXCEL] 좁히고 있는 테이블을 행 삭제하려고 하면 런타임 오류 1004가 나왔으므로 대책

4723 단어 ExcelExcelVBA

하고 싶은 일



테이블을 필터링하여 표시된 레코드를 삭제합니다.
이것을 VBA에서 실행한다.

■ 샘플 테이블


이 테이블을 스즈키로 좁히고 행 삭제하고 싶다.



했던 일



아래 코드를 실행해 보았다. ※오류 처리는 제외하고 있습니다.

샘플
Sub sample()
    Dim tb As ListObject
    Set tb = ListObjects("テーブル1")
    tb.Range.AutoFilter Field:=2, Criteria1:="鈴木"
    tb.DataBodyRange.SpecialCells(xlCellTypeVisible).EntireRow.Delete
End Sub

그런데, Delete시에 1004 런타임 에러가 발생하는 경우가 있었다.
발생하는 조건을 조사한 결과, 스즈키로 좁혀 실행하면 에러가 나오고, 사토에서 좁혀 실행하면 에러가 나오지 않는 것을 알았기 때문에 거기에서 원인을 찾았다.

원인(아마)



삭제할 범위가 떨어져 있으면 오류가 나오는 것 같습니다.tb.DataBodyRange.SpecialCells(xlCellTypeVisible).EntireRow 의 Address를 보면 스즈키의 경우는 "$2:$2,$4:$4,$7:$7" 가 되어 있었다.
사토의 경우는 "$5:$6" 가 되어 있었다.

손으로 행 삭제할 때에도 이 거동을 볼 수 있으므로 그런 일일 것이라고 해석.

↓ 스즈키의 행을 복수 선택하면 삭제할 수 없다.


↓사토의 행을 정리해 복수 선택하면 삭제할 수 있다.


대응



행을 지정하면 실패하지만 셀을 선택하면 범위가 멀어져도 삭제할 수 있는 것 같다.

↓ 스즈키의 셀만 선택.


그래서 셀 선택으로하기 위해 EntireRow를 제외.
또 「행 전체를 삭제합니까?」라고 하는 다이얼로그가 나오므로 표시되지 않게 전후로 Application.DisplayAlerts를 변경시킨다.

이것으로 침착했다.

샘플
Sub sample()
    Dim tb As ListObject
    Set tb = ListObjects("テーブル1")
    tb.Range.AutoFilter Field:=2, Criteria1:="鈴木"
    Application.DisplayAlerts = False
    tb.DataBodyRange.SpecialCells(xlCellTypeVisible).Delete
    Application.DisplayAlerts = True
End Sub

좋은 웹페이지 즐겨찾기