Xóa các dòng, cột ẩn bằng VBA (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

Tunguyen

Thành viên mới
Tham gia
6/10/07
Bài viết
25
Được thích
2
Các bác chỉ em cách xóa các row hoặc các column ẩn bằng VBA với. Em cảm ơn .
Em đã tìm trên diễn đàn nhưng mà không thấy nên mới hỏi các bác.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Thử cái này xem:
Mã:
Sub DeleteHiddenRows()
    For j = 1 To 2542
        If Rows(j).Hidden Then
            Rows(j).Hidden = False
            Rows(j).Select
            Selection.EntireRow.Delete
        End If
    Next j
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Anh Tuấn ơi, code của anh khi áp dụng cho file có các dòng ẩn không liên tục thì còn sót lại dòng ẩn cuối cùng. Anh nghiên cứu V2.0 đi anh.
 
Upvote 0
Code này ko phải tự tôi làm mà là copy trên mạng... mới sửa xong.. Có điều sao nó ko xóa 1 phát luôn hết tất cả các row đang ẩn nhỉ
 
Upvote 0
Chào mọi người,

Code anh Tuấn không xóa hết hàng vì trong code cho biết "mũi Cà Mau" là ở hàng 2542 rồi nếu các hàng ẩn ờ dưới nữa thì vẫn không ảnh hưỡng (tức là không bị xóa).

Các bạn thữ code này nhá:

Sub DelHiddenRows()
Dim r As Range, k As Range
With ActiveSheet
Set r = .Range("A1:A" & .Cells.SpecialCells(xlCellTypeLastCell).Row)
Set k = r.SpecialCells(xlCellTypeVisible)
r.EntireRow.Hidden = False
k.EntireRow.Hidden = True
r.SpecialCells(xlCellTypeVisible).EntireRow.Delete
r.EntireRow.Hidden = False
End With
End Sub

Còn xóa các cột ẩn thì là:

Sub DelHiddenRows()
Dim r As Range, k As Range
With ActiveSheet
Set r = .Range("A1:A" & .Cells.SpecialCells(xlCellTypeLastCell).Column)
Set k = r.SpecialCells(xlCellTypeVisible)
r.EntireColumn.Hidden = False
k.EntireColumn.Hidden = True
r.SpecialCells(xlCellTypeVisible).EntireColumn.Delete
r.EntireColumn.Hidden = False
End With
End Sub

Mến
 
Upvote 0
Nó báo lỗi bạn Digita ơi.. (thông báo lỗi chỉ có duy nhất số 400.. ko biết là lỗi gì).. và nó chỉ Unhide chứ ko xóa gì cả
 
Upvote 0
digita đã viết:
Code anh Tuấn không xóa hết hàng vì trong code cho biết "mũi Cà Mau" là ở hàng 2542 rồi nếu các hàng ẩn ờ dưới nữa thì vẫn không ảnh hưỡng (tức là không bị xóa).
Không hẳn là dtới dòng thứ 2542. Tôi thử chỉ vài dòng từ 1 đến 10 thì nó cũng không xóa dòng ẩn cuối cùng.
 
Upvote 0
anhtuan1066 đã viết:
Nó báo lỗi bạn Digita ơi.. (thông báo lỗi chỉ có duy nhất số 400.. ko biết là lỗi gì).. và nó chỉ Unhide chứ ko xóa gì cả
Bác xem lại Excel của bác bị làm sao... Máy em chạy cái vèo, xóa tuốt, chỉ chừa những hàng không hide thôi.
 
Upvote 0
BNTT đã viết:
Bác xem lại Excel của bác bị làm sao... Máy em chạy cái vèo, xóa tuốt, chỉ chừa những hàng không hide thôi.
Chẳng biết nữa.. thử 3 máy tính rồi, đều báo lỗi và ko xóa dc thứ gì cả... Cũng thử trên 2 phiên bản Office: 2002 và 2003
Là sao ta?
 
Upvote 0
Theo mình code cua anhtuan1066 sẽ xóa sót dòng ẩn khi có 2 dòng ẩn kề nhau. Lý do: khi dòng ẩn trên bị xoá, dòng ẩn kề dưới sẽ thay thế dòng phía trên ( nghĩa là số dòng bị trừ 1) mà vòng lặp đã duyệt qua rồi. Thế nên dòng này không bị xoá.
Cách giải quyết: Cho vòng lặp chạy ngược từ dưới lên sẽ không bị trường hợp này.
 
Upvote 0
digita đã viết:
Còn xóa các cột ẩn thì là:

Trích:
Sub DelHiddenRows()
Dim r As Range, k As Range
With ActiveSheet
Set r = .Range("A1:A" & .Cells.SpecialCells(xlCellTypeLastCell).Column)
Set k = r.SpecialCells(xlCellTypeVisible)
r.EntireColumn.Hidden = False
k.EntireColumn.Hidden = True
r.SpecialCells(xlCellTypeVisible).EntireColumn.Delete
r.EntireColumn.Hidden = False
End With
End Sub
Mến
Cái xóa hàng thì được còn cái xóa cột thì không bác Digita ơi (mặc dù đã sửa dùm bác chữ Delete rồi)
 
Upvote 0
OK. Đã kiểm lại 2 code. Cái code 1 xóa hàng thì chạy ngon lành. Còn code 2 đúng là có lổi. Vì chưa nghĩ ra cách dùng theo cách specialcell, mình viết lại cái code xóa các cột ẩn dùng vòng lặp. Tuy chạy hơi lâu 1 chút nhưng thà chậm tí xíu nhưng chắc ăn.

Sub DelHiddenColumns()
For i = Cells.Columns.Count To 1
If Cells(1, i).EntireColumn.Hidden = True Then Cells(1, i).EntireColumn.Delete
Next
End Sub

Mến
 
Upvote 0
digita đã viết:
OK. Đã kiểm lại 2 code. Cái code 1 xóa hàng thì chạy ngon lành. Còn code 2 đúng là có lổi. Vì chưa nghĩ ra cách dùng theo cách specialcell, mình viết lại cái code xóa các cột ẩn dùng vòng lặp. Tuy chạy hơi lâu 1 chút nhưng thà chậm tí xíu nhưng chắc ăn.
Mến

Nó không báo lỗi nhưng cũng không nhúc nhích gì cả bác ơi.
 
Upvote 0
Bác BNTT ơi, tôi vẫn xoá được mà. Tất nhiên sau khi đã chỉnh lại code 1 chút.
Mã:
Sub DelHiddenColumns()
For i = Cells.Columns.Count To 1 Step -1
    If Cells(1, i).EntireColumn.Hidden = True Then
        Cells(1, i).EntireColumn.Hidden = False
        Cells(1, i).EntireColumn.Delete
    End If
Next
End Sub
Cái Step - 1 này học của bác Mr Okebab
 
Upvote 0
Món này khó vậy sao?
Tôi ko biết tạo code nhưng nghĩ thuật toán chắc phải là:
1> Đặt tên cho vùng ẩn
2> Unhide vùng vừa đặt tên
3> Select vùng ấy và xóa
Sao lại căng thế nhỉ?
 
Upvote 0
Cám ơn bạn Minhlev. Mình quên gõ cái step -1 vô. Thôi thì nhất quá tam vậy.

Sub DelHiddenColumns()
For i = Cells.Columns.Count To 1 Step -1
If Cells(1, i).EntireColumn.Hidden Then Cells(1, i).EntireColumn.Delete
Next
End Sub

Các bạn không cần giải ẩn trước khi xóa cột và cũng không cần name range. Code trên chỉ có 1 test duy nhất là nếu cột bị ẩn thì cho nó đi luôn. Chúc mọi người 1 cuối tuần hạnh phúc nha.

Mến.
 
Upvote 0
OK... cách của minhlev thì chạy tốt... sữa lại chút đỉnh thì thành xóa Row...
Code cuối cùng của Digita cũng chạy tốt... và theo ý bạn Digita thì code của minhlev có thể bỏ bớt dòng:
Cells(1, i).EntireColumn.Hidden = False
 
Upvote 0
anhtuan1066 đã viết:
OK... cách của minhlev thì chạy tốt... sữa lại chút đỉnh thì thành xóa Row...
Code cuối cùng của Digita cũng chạy tốt... và theo ý bạn Digita thì code của minhlev có thể bỏ bớt dòng:
Cells(1, i).EntireColumn.Hidden = False

Đúng vậy anh bạn ạ. Nhưng dùng vòng lặp để xóa hàng thì L....Â......U lắm. XL 2007 thì có đâu cả triệu hàng còn các phiên bãng trước thì 65536 hàng. Để kiểm tra từ hàng 1 thì chắc chờ hụt hơi. Nên xài cái code 1 nhanh hơn.


Mến
 
Upvote 0
Uh... đúng, nhưng cũng ko lâu lắm.. Tôi test thấy nó chỉ "khựng" lại vài giây thôi.. ko có vấn đề... Còn code 1 thì tôi thật sự ko chạy dc.. Nó báo lỗi và ko xóa gì cả.. Chỉ có code cuối cùng là OK
 
Upvote 0
digita đã viết:
Còn xóa các cột ẩn thì là:

Xin phép sửa code 2 của bác digita cho nó chạy, các bạn thử nhé.
Mã:
[COLOR=darkblue]Sub[/COLOR] DelHiddenCols()
    [COLOR=darkblue]Dim[/COLOR] r [COLOR=darkblue]As[/COLOR] Range, k [COLOR=darkblue]As[/COLOR] Range
    [COLOR=darkblue]With[/COLOR] ActiveSheet
        [COLOR=darkblue]Set[/COLOR] r = .Range(Cells(1, 1), Cells(1, .Cells.SpecialCells(xlCellTypeLastCell).Column))
        [COLOR=darkblue]Set[/COLOR] k = r.SpecialCells(xlCellTypeVisible)
        r.EntireColumn.Hidden = [COLOR=darkblue]False[/COLOR]
        k.EntireColumn.Hidden = [COLOR=darkblue]True[/COLOR]
        r.SpecialCells(xlCellTypeVisible).EntireColumn.Delete
        r.EntireColumn.Hidden = [COLOR=darkblue]False[/COLOR]
    [COLOR=darkblue]End[/COLOR] [COLOR=darkblue]With[/COLOR]
[COLOR=darkblue]End[/COLOR] [COLOR=darkblue]Sub[/COLOR]
Sub DelHiddenRows()

@AnhTuan bác vào VBE cdi chuyển đến code báo lỗi, rồi bác nhấn F8, nhấn từ từ đến khi nó thông báo lỗi thì bác post lên cho em biết nó báo lỗi tại dòng nào ạ.
 
Lần chỉnh sửa cuối:
Upvote 0
Oh... nó hứng lên thì báo lỗi... mà lỗi nhìn lạ lắm.. chỉ 1 khung hiện ra có số 400 vậy thôi.. còn trong code thì ko có dòng nào lỗi cả.. tuy nhiên nó vẩn xóa dc các cột ẩn... Và có khi bấm vài lần thì nó lại ko lỗi... chẳng hiểu
 
Upvote 0
Đoạn code trên sẽ báo lỗi nếu ta không có dòng nào hidden cả, đây là code để fix:

Mã:
[color=darkblue]Sub[/color] DelHiddenCols()
    [color=darkblue]Dim[/color] r [color=darkblue]As[/color] Range, k [color=darkblue]As[/color] Range
    [color=darkblue]With[/color] ActiveSheet
        [color=darkblue]Set[/color] r = .Range(Cells(1, 1), Cells(1, .Cells.SpecialCells(xlCellTypeLastCell).Column))
        [color=darkblue]Set[/color] k = r.SpecialCells(xlCellTypeVisible)
        [color=darkblue]If[/color] r.Cells.Count > k.Cells.Count [color=darkblue]Then[/color]
            r.EntireColumn.Hidden = [color=darkblue]False[/color]
            k.EntireColumn.Hidden = [color=darkblue]True[/color]
            r.SpecialCells(xlCellTypeVisible).EntireColumn.Del ete
            r.EntireColumn.Hidden = [color=darkblue]False[/color]
        [color=darkblue]End[/color] [color=darkblue]If[/color]
    [color=darkblue]End[/color] [color=darkblue]With[/color]
    [color=darkblue]Set[/color] r = [color=darkblue]Nothing[/color]
    [color=darkblue]Set[/color] k = [color=darkblue]Nothing[/color]
[color=darkblue]End[/color] [color=darkblue]Sub[/color]
 
Lần chỉnh sửa cuối:
Upvote 0
Anh down cái file này về nhá. Đóng XL rồi mở cái file này, bấm nút Ctrl & chọn 1 số dòng tùy ý rải rác khắp nơi. Làm ẩn chúng. Rồi chạy code DelHiddenRows và so sánh các con số ở cột A và số hàng. Các con số ấy so le ở các chổ các hàng ẩn bị xóa đó.

Còn nếu các hàng ẩn còn thì máy anh có vấn đề rồi.

Mến.
 

File đính kèm

Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Uh... file Book1 này thì ko báo lỗi gì cả... Còn cái mà tôi nói bị lỗi 400 ấy tôi có ẫn dòng và cột đàng hoàng.. nó vẫn lỗi...
 
Upvote 0
Đúng rồi bạn Sói Biển đã sửa code để xóa nhanh các cột ẩn. Code chạy rất ngon lành.

Cám ơn Sói Biển nha.

Mến
 
Upvote 0
Tìm hiểu về VBA

Tôi thấy mọi người hay nhắc đến VBA. Vậy VBA là gì? sử dụng như thế nào? Các bạn giải thích giúp tôi nhé
Thân!

Vấn đề không phải là dốt mà dốt mới là vấn đề!--=0
 
Upvote 0
Upvote 0
BNTT đã viết:
Cái xóa hàng thì được còn cái xóa cột thì không bác Digita ơi (mặc dù đã sửa dùm bác chữ Delete rồi)


Em chạy thử nó báo lỗi này :

Run-time error '1004':

No cells were found.

rồi nó báo lỗi ở hàng này
Mã:
Sub DelHiddenRows()
Dim r As Range, k As Range
With ActiveSheet
Set r = .Range("A1:A" & .Cells.SpecialCells(xlCellTypeLastCell).Column)
[COLOR="Red"][B]Set k = r.SpecialCells(xlCellTypeVisible)[/B][/COLOR]
r.EntireColumn.Hidden = False
k.EntireColumn.Hidden = True
r.SpecialCells(xlCellTypeVisible).EntireColumn.Delete
r.EntireColumn.Hidden = False
End With
End Sub
 
Upvote 0
Lỗi này xuất hiện khi trên file của bạn ko có dòng ẫn... Bạn thử ẩn 1 vài dòng rồi chạy lại code đi.. sẽ ko còn lỗi nữa đâu
Mà đúng ra là lỗi phải ở dòng 8 chứ nhỉ?
 
Upvote 0
Có dòng ẩn mà anh, em thử trên book1.xls của digita thì không báo lỗi, nhưng copy code sang file mới thì báo lỗi như trên.
 

File đính kèm

Upvote 0
Code này chỉ xóa dòng ẩn... Bạn ẩn luôn cột đương nhiên là báo lổi rồi...
 
Upvote 0
Tunguyen đã viết:
Em chạy thử nó báo lỗi này :

Run-time error '1004':

No cells were found.

rồi nó báo lỗi ở hàng này
Mã:
Sub DelHiddenRows()
Dim r As Range, k As Range
With ActiveSheet
Set r = .Range("A1:A" & .Cells.SpecialCells(xlCellTypeLastCell).Column)
[COLOR="Red"][B]Set k = r.SpecialCells(xlCellTypeVisible)[/B][/COLOR]
r.EntireColumn.Hidden = False
k.EntireColumn.Hidden = True
r.SpecialCells(xlCellTypeVisible).EntireColumn.Delete
r.EntireColumn.Hidden = False
End With
End Sub

Vì không có hàng ẩn nên nó mới báo lỗi. Để bẩy lổi này thì chỉ đặt 1 cái test để kiễm tra coi có hàng ẩn rồi mới tiếp tục.

Bạn thử cái code sửa lại dưới đây nha:

Sub DelHiddenRows()
Dim r As Range, k As Range
If Cells.Rows.Count - Cells.SpecialCells(xlCellTypeVisible).Count > 0 Then
With ActiveSheet
Set r = .Range("A1:A" & .Cells.SpecialCells(xlCellTypeLastCell).Row)
Set k = r.SpecialCells(xlCellTypeVisible)
r.EntireRow.Hidden = False
k.EntireRow.Hidden = True
r.SpecialCells(xlCellTypeVisible).EntireRow.Delete
r.EntireRow.Hidden = False
End With
Set r = Nothing
Set k = Nothing
Else
MsgBox "Khong co hang an."
End If

End Sub

Mến
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Digita xem lại nha! Nếu vừa có hàng ẩn, vừa có cột ẩn thì code này sẽ báo sai, nó sẽ báo rằng "Không có hàng ẩn"... Vô lý!
 
Upvote 0
anhtuan1066 đã viết:
Digita xem lại nha! Nếu vừa có hàng ẩn, vừa có cột ẩn thì code này sẽ báo sai, nó sẽ báo rằng "Không có hàng ẩn"... Vô lý!

Cám ơn anh bạn đã phá hiện lỗi trong code trên. Tôi quên 1 chữ rows nhỏ nên nó chạy không đúng thôi. Làm lại nhá:

Sub DelHiddenRows()
Dim r As Range, k As Range
If Cells.Rows.Count - Cells.SpecialCells(xlCellTypeVisible).Rows.Count > 0 Then
With ActiveSheet
Set r = .Range("A1:A" & .Cells.SpecialCells(xlCellTypeLastCell).Row)
Set k = r.SpecialCells(xlCellTypeVisible)
r.EntireRow.Hidden = False
k.EntireRow.Hidden = True
r.SpecialCells(xlCellTypeVisible).EntireRow.Delete
r.EntireRow.Hidden = False
End With
Set r = Nothing
Set k = Nothing
Else
MsgBox "Khong co hang de xoa."
End If
End Sub

Và để xóa cột ẩn thì:

Sub DelHiddenCols()
Dim r As Range, k As Range
If Cells.Columns.Count - Cells.SpecialCells(xlCellTypeVisible).Columns.Count > 0 Then
With ActiveSheet
Set r = .Range(Cells(1, 1), Cells(1, .Cells.SpecialCells(xlCellTypeLastCell).Column))
Set k = r.SpecialCells(xlCellTypeVisible)
If r.Cells.Count > k.Cells.Count Then
r.EntireColumn.Hidden = False
k.EntireColumn.Hidden = True
r.SpecialCells(xlCellTypeVisible).EntireColumn.Delete
r.EntireColumn.Hidden = False
End If
End With
Set r = Nothing
Set k = Nothing
Else
MsgBox "Khong co cot an de xoa."
End If
End Sub

Đã thữ qua chạy rất ngon lành.


Mến
 
Upvote 0
B1. Nhấn tổ hợp phím All+F11 / Hộp thoại Microsoft Visual Basic xuất hiện
Trong mục Project/ R_Click vào ThisWorkbook / View code
Trong mục View code dán dòng lệnh sau:

Sub DeleteHiddenRows()
Dim i As Long
Dim LastRow As Long
If WorksheetFunction.CountA(Cells) > 0 Then
LastRow = Cells.Find(What:="*", After:=[A1], _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious).Row
End If
For i = LastRow To 1 Step -1
If Cells(i, "A").RowHeight = 0 And _
Cells(i, "A").ColumnWidth <> 0 Then
Cells(i, "A").EntireRow.Delete
End If
Next i
End Sub

Sau đó Ctrl + S để save lại. Đóng cửa sổ MS Visual basic rồi quay lại file exel cần xóa hàng và cột ẩn
Chọn View / Macros / View macros/ D_click Thisworkbook.DeleteHiddenRows
Thế là xong.
Các bạn thử cái này xem nhé. Nếu hay thanks mình một cái nhé.
 
Upvote 0
Cảm ơn bạn nhé !

Nhờ bạn làm giúp tôi mấy vấn đề này dc ko?

* Trong file đính kèm : AP_223405

Nếu giá trị ở cột B =0 , thì ẩn dòng
và giá trị cả 2 cột B và C = 0, thì cũng ẩn dòng

Nhờ mọi ng nhé !

Cảm ơn nhiều !!!
 
Upvote 0
Cảm ơn bạn nhé !

Nhờ bạn làm giúp tôi mấy vấn đề này dc ko?

* Trong file đính kèm : AP_223405

Nếu giá trị ở cột B =0 , thì ẩn dòng
và giá trị cả 2 cột B và C = 0, thì cũng ẩn dòng

Nhờ mọi ng nhé !

Cảm ơn nhiều !!!
 
Upvote 0

Bài viết mới nhất

Back
Top Bottom