2012-10-20 73 views
9

Tôi đang cố gắng chạy macro chọn các ô trống trong cột bảng và xóa toàn bộ hàng.Excel VBA - Xóa các hàng trống trong bảng

Tập lệnh dưới đây thực hiện mọi thứ ngoại trừ phần xóa, nhắc nhở run-time error 1004 - "Delete method of Range class failed".

Bất kỳ ý tưởng nào về cách khắc phục sự cố này? Cảm ơn

Sub test() 
Range("Table1[[New]]").Activate 
Selection.SpecialCells(xlCellTypeBlanks).Select 
Selection.EntireRow.Delete 
End Sub 

Trả lời

7

Câu hỏi hay! Nếu không có một bảng, .EntireRow.Delete luôn hoạt động, nhưng bên trong một bảng có vẻ như không.

này hoạt động:

Sub Test() 
    Dim Rng As Range 
    On Error Resume Next 
    Set Rng = Range("Table1[[New]]").SpecialCells(xlCellTypeBlanks) 
    On Error Goto 0 
    If Not Rng Is Nothing Then 
    Rng.Delete Shift:=xlUp 
    End If 
End Sub 
+1

Đây là giải pháp phù hợp với bảng, nhưng bạn nên thêm kiểm tra lỗi (như mỗi câu trả lời Brettdj) trong trường hợp không có hàng trống được tìm thấy –

+1

sao tôi thay đổi nội dung các câu trả lời và sai thêm kiểm tra – fthiella

+0

Điều này hoạt động hoàn hảo. Cảm ơn bạn. – user91240192094

1

Bạn thực sự có thể làm điều đó trong một pass, nhưng cần phải sử dụng đối tượng ListObjectDataBodyRangeListColumns nó thuộc tính:

Sub ClearBlankCellsInColumnNew() 
Dim rngBlanks As Excel.Range 

With Worksheets("Sheet1").ListObjects("Table1") 
    On Error Resume Next 
    Set rngBlanks = Intersect(.DataBodyRange, .ListColumns("New").Range).SpecialCells(xlCellTypeBlanks) 
    On Error GoTo 0 
    If Not rngBlanks Is Nothing Then 
     rngBlanks.Delete 
    End If 
End With 
End Sub 
+0

Phương pháp này vẫn mang lại cho tôi lỗi Thời gian chạy 1004: mặc dù hơi khác nhau, nói rằng" Thao tác không được phép. Thao tác đang cố gắng di chuyển các ô trong bảng trên trang tính của bạn. ") – user91240192094

+0

Có một bảng khác bên dưới chúng ta đang nói về cái gì? Nếu vậy, bạn nên suy nghĩ về việc thay đổi thiết kế để không có bảng xếp chồng lên nhau. Tôi hy vọng bạn sẽ nhận được cùng một thông báo nếu bạn làm điều này trong Excel, mà không có VBA. Ngoài ra, nếu có, xin vui lòng cho nó một thử trên một bảng không có bảng khác ở trên hoặc dưới nó. Nếu không, tôi có thể bị bối rối :). –

+0

Xin chào Doug - chỉ một bảng trong bảng tính. – user91240192094

1

Bước 1: Thực hiện một helper trong bảng nơi bạn kiểm tra bất kỳ trường trống nào trong hàng đó. Ví dụ, nếu bạn có 3 cột trong bảng của bạn: A (Giá), B (Số lượng) và C (Chi phí), bạn sẽ thêm cột D thứ tư và đặt tên là "Bất kỳ Khoảng trống" nào? Phương trình sẽ là =IF(OR(ISBLANK([@Price]),ISBLANK([@Quantity]),ISBLANK([@Cost])),"Yes","No")

Điều đó sẽ cho bạn một cột để lọc để xem tất cả các khoảng trống.

Bước 2: Trong VBA sau đó bạn sẽ làm như sau:

Range("MyTableNameHere").AutoFilter Field:=Range("MyTableNameHere[Any Blanks?]").Column, Criteria1:="Yes" 
Application.DisplayAlerts = False 
Range("MyTableNameHere").ListObject.DataBodyRange.SpecialCells(xlCellTypeVisible).Delete 
Application.DisplayAlerts = True 
Range("MyTableNameHere").AutoFilter Field:=Range("MyTableNameHere[Any Blanks?]").Column 

này về cơ bản được lọc để các hàng bạn muốn xóa trong bảng sử dụng cột helper, chọn tất cả các dữ liệu hiển thị trong bảng và tháo bàn. Tôi đã tìm kiếm xung quanh làm thế nào để xóa tất cả các hàng có thể nhìn thấy trong một bảng và tìm thấy điều này và fiddled xung quanh cho đến khi tôi đã tìm ra rằng điều này sẽ làm việc. Lấy nó và kết hợp nó với một cột helper để chọn tất cả các hàng với bất kỳ khoảng trắng nào có vẻ giống như những gì bạn muốn.

0

Thích ứng với câu trả lời trước:

On Error Resume Next 
Set Rng = ListObjects(1).DataBodyRange.SpecialCells(xlCellTypeBlanks) 
On Error GoTo 0 
If Not Rng Is Nothing Then 
Rng.Delete Shift:=xlUp 
End If