AnhThu-1976
Thành viên tích cực


- Tham gia
- 17/10/14
- Bài viết
- 1,065
- Đượ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!
Em cảm ơn!
Bạn thử code này xem.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!
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ậpBạ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
Dùng UsedRange thì tự Excel nó biết đâu là giới hạn rồi đó bạnỨ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
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 đâuThầ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!
Viết theo ý bài #3, bạn chạy thử xem:Ứ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
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
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!Lý do gì bạn phải xóa những cells ẩn thay vì cho hiện nó ra?
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 ạ.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.
Nhờ Thầy xem lại giúp em, em cảm ơn!.Cells(1, I).EntireColumn.Delete
Em gởi file đính kèmBạn đưa cái file chạy lỗi lên đây xem.
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.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 ạ.
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ì.Em gởi file đính kèm
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
File đang ở chế độ filter chứ đâu phải ẩn gì chứ. Thêm cái ShowAllData vào:Em gởi file đính kè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.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
Hi... Hi... em thấy nhưng cứ.. kệ. 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ácYêu cầu Ẩn dòng "phá sản", chẳng có dòng nào bị Hide.
Vì em nghỉ Filter để ẩn dòng thì nó # ẩn dòng, nên em mới hỏiNế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
thì đúng là nó khác màVì em nghỉ Filter để ẩn dòng thì nó # ẩn dòng, nên em mới hỏi
Code theo nguyên tắc: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 codeVì 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 ạ!
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?Chạy codeMã: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
Có file thì có thể làm đượcBạ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?
Ví dụ file có 2 sheet có group và 1 sheet không group, và mỗi sheet được group khác nhau!Có file thì có thể làm được
Code của mình xóa được mà, bạn chạy thửVí dụ file có 2 sheet có group và 1 sheet không group, và mỗi sheet được group khác nhau!
Bạn thử: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?
Sub Del_Rows()
Dim i, LR, Rng
Set Rng = ActiveSheet.UsedRange
LR = Rng.Rows.Count
For i = 1 To LR
If Rng.Rows(i).OutlineLevel > 1 Then
Rng.Rows(i).EntireRow.Delete
i = i - 1
End If
Next
End Sub
Sub Del_Colums()
Dim i, LC, Rng
Set Rng = ActiveSheet.UsedRange
LC = Rng.Columns.Count
For i = 1 To LC
If Rng.Columns(i).OutlineLevel > 1 Then
Rng.Columns(i).EntireColumn.Delete
i = i - 1
End If
Next
End Sub
Thật ra với gợi ý ở bài trên của mình thì không cần phải for next gì cảChạy codeMã: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
Cách nầy rất hay, tính để cho bạn ra tay cho trọn vẹnThật ra với gợi ý ở bài trên của mình thì không cần phải for next gì cả
Sub GPE()
Dim Ws As Worksheet, i As Long
Dim Rng As Range, tmpRng As Range
On Error Resume Next
For Each Ws In ThisWorkbook.Worksheets
With Ws.UsedRange
Set Rng = .SpecialCells(xlCellTypeVisible)
If Ws.FilterMode = True Then Ws.ShowAllData
.EntireColumn.Hidden = False
Rng.EntireRow.Hidden = False
Rng.EntireColumn.Hidden = True
.SpecialCells(xlCellTypeVisible).EntireColumn.Delete
Rng.EntireColumn.Hidden = False
Rng.EntireRow.Hidden = True
.SpecialCells(xlCellTypeVisible).EntireRow.Delete
Rng.EntireRow.Hidden = False
End With
Next Ws
On Error GoTo 0
End Sub
Khi chạy code thì báo lỗi "Run time error 438" "Object doesn't support this property or method "Bạn thử:PHP:Sub Del_Rows() Dim i, LC, Rng Set Rng = ActiveSheet.UsedRange LR = Rng.Rows.Count For i = 1 To LR If Rng.Rows(i).OutlineLevel > 1 Then Rng.Rows(i).EntireRow.Delete i = i - 1 End If Next End Sub Sub Del_Colums() Dim i, LC, Rng Set Rng = ActiveSheet.UsedRange LC = Rng.Columns.Count For i = 1 To LC If Rng.Columns(i).OutlineLevel > 1 Then Rng.Colums(i).EntireColumn.Delete i = i - 1 End If Next End Sub
Rng.Colums(i).EntireColumn.Delete
Bạn để ý hình dưới đóng khung màu đỏ thiếu chữ n.Khi chạy code thì báo lỗi "Run time error 438" "Object doesn't support this property or method "
tại dòngTôi đã google để khắc phục nhưng không được, nhờ bạn hướng dẫn thêm!PHP:Rng.Colums(i).EntireColumn.Delete
Có vài vấn đề cần bàn:Cách nầy rất hay, tính để cho bạn ra tay cho trọn vẹn. Bạn gợi ý nên mình viết luôn
Mã:Sub GPE() Dim Ws As Worksheet, i As Long Dim Rng As Range, tmpRng As Range On Error Resume Next For Each Ws In ThisWorkbook.Worksheets With Ws.UsedRange Set Rng = .SpecialCells(xlCellTypeVisible) If Ws.FilterMode = True Then Ws.ShowAllData .EntireColumn.Hidden = False Rng.EntireRow.Hidden = False Rng.EntireColumn.Hidden = True .SpecialCells(xlCellTypeVisible).EntireColumn.Delete Rng.EntireColumn.Hidden = False Rng.EntireRow.Hidden = True .SpecialCells(xlCellTypeVisible).EntireRow.Delete Rng.EntireRow.Hidden = False End With Next Ws On Error GoTo 0 End Sub
.SpecialCells(xlCellTypeVisible)
.resize(,1).SpecialCells(xlCellTypeVisible)
Private Sub DelInvisibleFilter(ByVal SourceRange As Range)
Dim rngFilter As Range
On Error Resume Next
With SourceRange
If .Parent.FilterMode = False Then Exit Sub
If .Rows.Count < 3 Then Exit Sub
Application.ScreenUpdating = False
Set rngFilter = .Resize(, 1).SpecialCells(xlCellTypeVisible)
.Parent.ShowAllData
rngFilter.EntireRow.Hidden = True
.Resize(, 1).SpecialCells(xlCellTypeVisible).EntireRow.Delete
.EntireRow.Hidden = False
End With
Application.ScreenUpdating = True
End Sub
Sub Main()
Dim wks As Worksheet
For Each wks In ThisWorkbook.Worksheets
DelInvisibleFilter wks.UsedRange
Next
End Sub
Nếu chỉ xét 1 cột thì anh phải đảm bảo cột đó đang không ẩn.Có vài vấn đề cần bàn:
1> Vấn đề 1:
SpecialCells khá tốn năng lượng nên phải tính toán tối ưu. Ví dụ ta có 1000 dòng x 10 cột, trong đó có 100 ẩn, vậy ta còn lại 900 dòng hiện. Khi ấy SpecialCells(xlCellTypeVisible) sẽ tính toán trên 900 x 10 = 9000 cells
Mà như ta đã biết thì 1 dòng bị ẩn thì tất cả các cells trên dòng đó cũng ẩn. Vậy có phải ta xét cell đầu tiên thôi sẽ tiết kiệm hơn không? Tức thay vì:
Ta sửa thành:Mã:.SpecialCells(xlCellTypeVisible)
thì theo ví dụ trên SpecialCells chỉ tính toán trên 900 cells mà thôi (thay vì 9000 cells)Mã:.resize(,1).SpecialCells(xlCellTypeVisible)
2> Vấn đề 2:
Dòng trên bảng tính bị ẩn bởi nhiều nguyên nhân. Nếu muốn giải quyết tất cả thì ta nên viết Function/Sub làm từng công việc cụ thể chứ không nên "ôm đồm" mọi thứ
-------------------------------
Từ những ý trên tôi sẽ viết 1 Sub có tham số truyền để giải quyết riêng cho chuyện xóa dòng ẩn khi filter như sau:
Mã:Private Sub DelInvisibleFilter(ByVal SourceRange As Range) Dim rngFilter As Range On Error Resume Next With SourceRange If .Parent.FilterMode = False Then Exit Sub If .Rows.Count < 3 Then Exit Sub Application.ScreenUpdating = False Set rngFilter = .Resize(, 1).SpecialCells(xlCellTypeVisible) .Parent.ShowAllData rngFilter.EntireRow.Hidden = True .Resize(, 1).SpecialCells(xlCellTypeVisible).EntireRow.Delete .EntireRow.Hidden = False End With Application.ScreenUpdating = True End Sub
Với bài toán xóa cột ẩn cũng sẽ làm gần tương tựMã:Sub Main() Dim wks As Worksheet For Each wks In ThisWorkbook.Worksheets DelInvisibleFilter wks.UsedRange Next End Sub
Mình nghỉ nên bỏ dòng lệnhCó vài vấn đề cần bàn:
1> Vấn đề 1:
SpecialCells khá tốn năng lượng nên phải tính toán tối ưu. Ví dụ ta có 1000 dòng x 10 cột, trong đó có 100 ẩn, vậy ta còn lại 900 dòng hiện. Khi ấy SpecialCells(xlCellTypeVisible) sẽ tính toán trên 900 x 10 = 9000 cells
Mà như ta đã biết thì 1 dòng bị ẩn thì tất cả các cells trên dòng đó cũng ẩn. Vậy có phải ta xét cell đầu tiên thôi sẽ tiết kiệm hơn không? Tức thay vì:
Ta sửa thành:Mã:.SpecialCells(xlCellTypeVisible)
thì theo ví dụ trên SpecialCells chỉ tính toán trên 900 cells mà thôi (thay vì 9000 cells)Mã:.resize(,1).SpecialCells(xlCellTypeVisible)
2> Vấn đề 2:
Dòng trên bảng tính bị ẩn bởi nhiều nguyên nhân. Nếu muốn giải quyết tất cả thì ta nên viết Function/Sub làm từng công việc cụ thể chứ không nên "ôm đồm" mọi thứ
-------------------------------
Từ những ý trên tôi sẽ viết 1 Sub có tham số truyền để giải quyết riêng cho chuyện xóa dòng ẩn khi filter như sau:
Mã:Private Sub DelInvisibleFilter(ByVal SourceRange As Range) Dim rngFilter As Range On Error Resume Next With SourceRange If .Parent.FilterMode = False Then Exit Sub If .Rows.Count < 3 Then Exit Sub Application.ScreenUpdating = False Set rngFilter = .Resize(, 1).SpecialCells(xlCellTypeVisible) .Parent.ShowAllData rngFilter.EntireRow.Hidden = True .Resize(, 1).SpecialCells(xlCellTypeVisible).EntireRow.Delete .EntireRow.Hidden = False End With Application.ScreenUpdating = True End Sub
Với bài toán xóa cột ẩn cũng sẽ làm gần tương tựMã:Sub Main() Dim wks As Worksheet For Each wks In ThisWorkbook.Worksheets DelInvisibleFilter wks.UsedRange Next End Sub