Code xóa toàn bộ các dòng và cột ẩn (ẩn = Filter) của tất cả các sheet trong 1 file (1 người xem)

Liên hệ QC

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

AnhThu-1976

Thành viên tích cực
Tham gia
17/10/14
Bài viết
1,061
Được thích
175
Thầy/cô, anh/chị cho em hỏi có Code nào xóa toàn bộ các dòng và cột ẩn của tất cả các sheet trong 1 file?
Em cảm ơn!
 
Thầy/cô, anh/chị cho em hỏi có Code nào xóa toàn bộ các dòng và cột ẩn của tất cả các sheet trong 1 file?
Em cảm ơn!
Bạn thử code này xem.
Mã:
Sub GPE()
    Dim Rng As Range, Ws As Worksheet
    
    For Each Ws In ThisWorkbook.Sheets
        For Each Rng In Ws.UsedRange
            If Rng.EntireRow.Hidden Then
                Rng.EntireRow.Delete
            ElseIf Rng.EntireColumn.Hidden Then
                Rng.EntireColumn.Delete
            End If
        Next Rng
    Next Ws
    MsgBox "Done", vbInformation, "GPE"
End Sub
 
Upvote 0
Bạn thử code này xem.
Mã:
Sub GPE()
    Dim Rng As Range, Ws As Worksheet
   
    For Each Ws In ThisWorkbook.Sheets
        For Each Rng In Ws.UsedRange
            If Rng.EntireRow.Hidden Then
                Rng.EntireRow.Delete
            ElseIf Rng.EntireColumn.Hidden Then
                Rng.EntireColumn.Delete
            End If
        Next Rng
    Next Ws
    MsgBox "Done", vbInformation, "GPE"
End Sub
For Each Rng In Ws.UsedRange như vậy là vòng lập phải duyệt quá nhiều. Ví dụ vùng UsedRange có 5 cột 10 dòng, vị chi tổng số ô là 50 ===> Bạn phải duyệt 50 lần trong vòng lập
Giải pháp: Duyệt theo số cột, cột nào bị ẩn thì xóa. Tiếp theo duyệt theo số dòng, dòng nào bị ẩn thì xóa. Theo như ví dụ nêu ở trên, với vùng UsedRange có 5 cột 10 dòng thì ta chỉ cần 5 lần lập theo cột + 10 lần lập theo dòng = tổng cổng 15 lần lập
(Lưu ý: duyệt ngược từ tổng số cột hoặc dòng đến 1 Step -1)
 
Upvote 0
Ứng dụng code ở bài # 2 cho file có khoảng 30 sheet thì thấy code chạy hoài không ra kết quả!
Để giới hạn lại số dòng hay cột ẩn khi chạy code thì số dòng trong các sheet không quá 5.000 dòng và số cột thì không quá cột CZ
 
Upvote 0
Ứng dụng code ở bài # 2 cho file có khoảng 30 sheet thì thấy code chạy hoài không ra kết quả!
Để giới hạn lại số dòng hay cột ẩn khi chạy code thì số dòng trong các sheet không quá 5.000 dòng và số cột thì không quá cột CZ
Dùng UsedRange thì tự Excel nó biết đâu là giới hạn rồi đó bạn
 
Upvote 0
Thầy/cô, anh/chị cho em hỏi có Code nào xóa toàn bộ các dòng và cột ẩn của tất cả các sheet trong 1 file?
Em cảm ơn!
Không bàn đến code, tôi có 1 thắc mắc rằng: Lý do gì bạn phải xóa những cells ẩn thay vì cho hiện nó ra? Việc xóa dòng, cột trong bảng tính đôi khi ảnh hướng nghiêm trọng đến các liên kết công thức nên bạn phải thật cẩn thận. Bởi macro đã chạy là không có chuyện Undo được đâu
 
Upvote 0
Ứng dụng code ở bài # 2 cho file có khoảng 30 sheet thì thấy code chạy hoài không ra kết quả!
Để giới hạn lại số dòng hay cột ẩn khi chạy code thì số dòng trong các sheet không quá 5.000 dòng và số cột thì không quá cột CZ
Viết theo ý bài #3, bạn chạy thử xem:
PHP:
Public Sub GPE()
Dim Ws As Worksheet, Col As Long, Rws As Long, I As Long
For Each Ws In ThisWorkbook.Worksheets
    With Ws
        Col = .UsedRange.Columns.Count
        Rws = .UsedRange.Rows.Count
        For I = Col To 1 Step -1
            If .Cells(1, I).EntireColumn.Hidden = True Then .Cells(1, I).EntireColumn.Delete
        Next I
        For I = Rws To 1 Step -1
            If .Cells(I, 1).EntireRow.Hidden = True Then .Cells(I, 1).EntireRow.Delete
        Next I
    End With
Next Ws
End Sub
 
Upvote 0
Lý do gì bạn phải xóa những cells ẩn thay vì cho hiện nó ra?
Em hay kết xuất 1 số sheet gởi cho khách hàng, các sheet này em ẩn đi những gì không cần thiết (tính toán phụ), nhưng khi họ mở file ra và unhide thì họ thắc mắc!
Và cũng có nhiều người thắc mắc tại sao không xóa nó đi mà che lại!...
Việc xóa dòng, cột trong bảng tính đôi khi ảnh hưởng nghiêm trọng đến các liên kết công thức nên bạn phải thật cẩn thận.
Vì các dòng và cột ẩn là tính toán phụ trợ (ví dụ kiểm tra số liệu trên bản chính có đúng không) nên nó sẽ không ảnh hưởng gì hết ạ.
 
Upvote 0
Em hay kết xuất 1 số sheet gởi cho khách hàng, các sheet này em ẩn đi những gì không cần thiết (tính toán phụ), nhưng khi họ mở file ra và unhide thì họ thắc mắc!
Và cũng có nhiều người thắc mắc tại sao không xóa nó đi mà che lại!...

Vì các dòng và cột ẩn là tính toán phụ trợ (ví dụ kiểm tra số liệu trên bản chính có đúng không) nên nó sẽ không ảnh hưởng gì hết ạ.
Người ta phải giữ bản gốc lại làm chứng. Chỉ copy phần không ẩn sang file khác thôi.
 
Upvote 0
Bạn đảo thứ tự xóa dòng trước xem sao, không biết trong mấy cái "ẩn" của bạn có gì.
PHP:
        For I = Rws To 1 Step -1
            If .Cells(I, 1).EntireRow.Hidden = True Then .Cells(I, 1).EntireRow.Delete
        Next I
        For I = Col To 1 Step -1
            If .Cells(1, I).EntireColumn.Hidden = True Then .Cells(1, I).EntireColumn.Delete
        Next I
 
Lần chỉnh sửa cuối:
Upvote 0
File đang ở chế độ filter chứ đâu phải ẩn gì chứ. Thêm cái ShowAllData vào:
Mã:
Public Sub GPE()
Dim Ws As Worksheet, Col As Long, Rws As Long, I As Long
For Each Ws In ThisWorkbook.Worksheets
    With Ws
      If .FilterMode = True Then .ShowAllData
        Col = .UsedRange.Columns.Count
        Rws = .UsedRange.Rows.Count
        For I = Col To 1 Step -1
            If .Cells(1, I).EntireColumn.Hidden = True Then .Cells(1, I).EntireColumn.Delete
        Next I
        For I = Rws To 1 Step -1
            If .Cells(I, 1).EntireRow.Hidden = True Then .Cells(I, 1).EntireRow.Delete
        Next I
    End With
Next Ws
End Sub
 
Upvote 0
File đang ở chế độ filter chứ đâu phải ẩn gì chứ. Thêm cái ShowAllData vào:
Mã:
Public Sub GPE()
Dim Ws As Worksheet, Col As Long, Rws As Long, I As Long
For Each Ws In ThisWorkbook.Worksheets
    With Ws
      If .FilterMode = True Then .ShowAllData
        Col = .UsedRange.Columns.Count
        Rws = .UsedRange.Rows.Count
        For I = Col To 1 Step -1
            If .Cells(1, I).EntireColumn.Hidden = True Then .Cells(1, I).EntireColumn.Delete
        Next I
        For I = Rws To 1 Step -1
            If .Cells(I, 1).EntireRow.Hidden = True Then .Cells(I, 1).EntireRow.Delete
        Next I
    End With
Next Ws
End Sub
Híc! Cắm đầu vào code mà không xem file.
Yêu cầu xóa dòng ẩn "phá sản", chẳng có dòng nào bị Hide.
 
Upvote 0
Nếu là yêu cầu "XÓA NHỮNG DÒNG ẨN DO FILTER" thì đó lại là bài toán hoàn toàn khác + code khác
Vì em nghỉ Filter để ẩn dòng thì nó # ẩn dòng, nên em mới hỏi
Xin lỗi vì đã làm mất thời gian của các thầy & anh
Vậy cho em hỏi có cách nào xóa các dòng hoặc cột mà đã ẩn = Filter không ạ!
 
Upvote 0
Vì em nghỉ Filter để ẩn dòng thì nó # ẩn dòng, nên em mới hỏi
thì đúng là nó khác mà
Vậy cho em hỏi có cách nào xóa các dòng hoặc cột mà đã ẩn = Filter không ạ!
Code theo nguyên tắc:
- Xét xem sheet có ở chế độ filter không, nếu không có thì thoát
- Set vùng đang hiện vào 1 biến (rngFilter chẳng hạn)
- ShowAll data
- Ẩn vùng rngFilter
- Xóa phần còn lại trên bảng tính
- Cho hiện tất cả
Xong
(Tức là đảo ngược quá trình: vùng đang hiện thì ta cho ẩn và vùng đang ẩn thì cho hiện ra. Xong xóa thằng đang hiện)
 
Upvote 0
Vì em nghỉ Filter để ẩn dòng thì nó # ẩn dòng, nên em mới hỏi
Xin lỗi vì đã làm mất thời gian của các thầy & anh
Vậy cho em hỏi có cách nào xóa các dòng hoặc cột mà đã ẩn = Filter không ạ!
Chạy code
Mã:
Sub GPE()
  Dim Ws As Worksheet, i As Long
  Dim cRng As Range, rRng As Range
  For Each Ws In ThisWorkbook.Worksheets
    With Ws.UsedRange
      For i = 1 To .Columns.Count
        If .Cells(1, i).EntireColumn.Hidden = True Then
          If cRng Is Nothing Then Set cRng = .Cells(1, i) Else Set cRng = Union(cRng, .Cells(1, i))
        End If
      Next i
      For i = 1 To .Rows.Count
        If .Cells(i, 1).EntireRow.Hidden = True Then
          If rRng Is Nothing Then Set rRng = .Cells(i, 1) Else Set rRng = Union(rRng, .Cells(i, 1))
        End If
      Next i
      If Ws.FilterMode = True Then Ws.ShowAllData
      If Not cRng Is Nothing Then cRng.EntireColumn.Delete: Set cRng = Nothing
      If Not rRng Is Nothing Then rRng.EntireRow.Delete: Set rRng = Nothing
    End With
  Next Ws
End Sub
 
Upvote 0
Chạy code
Mã:
Sub GPE()
  Dim Ws As Worksheet, i As Long
  Dim cRng As Range, rRng As Range
  For Each Ws In ThisWorkbook.Worksheets
    With Ws.UsedRange
      For i = 1 To .Columns.Count
        If .Cells(1, i).EntireColumn.Hidden = True Then
          If cRng Is Nothing Then Set cRng = .Cells(1, i) Else Set cRng = Union(cRng, .Cells(1, i))
        End If
      Next i
      For i = 1 To .Rows.Count
        If .Cells(i, 1).EntireRow.Hidden = True Then
          If rRng Is Nothing Then Set rRng = .Cells(i, 1) Else Set rRng = Union(rRng, .Cells(i, 1))
        End If
      Next i
      If Ws.FilterMode = True Then Ws.ShowAllData
      If Not cRng Is Nothing Then cRng.EntireColumn.Delete: Set cRng = Nothing
      If Not rRng Is Nothing Then rRng.EntireRow.Delete: Set rRng = Nothing
    End With
  Next Ws
End Sub
Bạn cho hỏi thêm có cách nào xóa luôn các dòng hay cột đang Group (đang Group, nghĩa là đang ở chế độ hide )không?
 
Upvote 0
Web KT

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

Back
Top Bottom