Em muốn xóa tất cả các Sheet đi chỉ để lại Sheet 1 thôi thì phải sửa Code thế nào ah

Liên hệ QC

Dauthivan

Thành viên tiêu biểu
Tham gia
15/8/08
Bài viết
565
Được thích
327
Em muốn tất cả các Sheet đều xóa đi cả, chỉ giữ lại Sheet1 mà thôi, nhưng viết Code chạy không được, xin nhờ mọi người giúp sửa cho:

PHP:
Sub Xoa()
Sheets("Sheet1").Move Before:=Sheets(1)
For i = 2 To Sheets.Count
Sheets(i).Delete
Next
End Sub
 
Em muốn tất cả các Sheet đều xóa đi cả, chỉ giữ lại Sheet1 mà thôi, nhưng viết Code chạy không được, xin nhờ mọi người giúp sửa cho:
PHP:
Sub Xoa()
Sheets("Sheet1").Move Before:=Sheets(1)
For i = 2 To Sheets.Count
Sheets(i).Delete
Next
End Sub
Nguyên nhân nằm ở chỗ vòng lặp For. Đây là vòng lặp có số lần biết trước. Như vậy, giả sử ban đầu có 10 sheet thì vòng lặp này phải chạy 9 lần, tức là từ Sheets(2) đến Sheets(10). Tuy nhiên, sau mỗi lần lặp, số sheet còn lại bị giảm đi 1, do đó vòng For không chạy được. Bạn cứ hình dung: Sau lần chạy thứ nhất thì số sheet còn lại chỉ là 9 thì lấy đâu ra Sheets(10) để mà xóa?!
Cách sửa:
PHP:
Sub Xoa()
    Sheets("Sheet1").Move Before:=Sheets(1)
    Application.DisplayAlerts = False 'Tắt chế độ cảnh báo (khi xóa Sheet)'
    Do
        Sheets(2).Delete
    Loop Until Sheets.Count = 1 'Khi nào chỉ còn 1 sheet thì dừng lại'
    Application.DisplayAlerts = True 'Bật lại chế độ cảnh báo'
End Sub
 
Upvote 0
Nguyên nhân nằm ở chỗ vòng lặp For. Đây là vòng lặp có số lần biết trước. Như vậy, giả sử ban đầu có 10 sheet thì vòng lặp này phải chạy 9 lần, tức là từ Sheets(2) đến Sheets(10). Tuy nhiên, sau mỗi lần lặp, số sheet còn lại bị giảm đi 1, do đó vòng For không chạy được. Bạn cứ hình dung: Sau lần chạy thứ nhất thì số sheet còn lại chỉ là 9 thì lấy đâu ra Sheets(10) để mà xóa?!
Cách sửa:
PHP:
Sub Xoa()
    Sheets("Sheet1").Move Before:=Sheets(1)
    Application.DisplayAlerts = False 'Tắt chế độ cảnh báo (khi xóa Sheet)'
    Do
        Sheets(2).Delete
    Loop Until Sheets.Count = 1 'Khi nào chỉ còn 1 sheet thì dừng lại'
    Application.DisplayAlerts = True 'Bật lại chế độ cảnh báo'
End Sub
Vòng lập For vẫn được chứ anh
PHP:
 Sub XoaSheets()
 On Error Resume Next
Application.DisplayAlerts = False
Sheets("Sheet1").Select
For i = ThisWorkbook.Sheets.Count To 2 Step -1
  Sheets(i).Delete
Next
Application.DisplayAlerts = True
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Em hiểu ra rồi, thì ra Next... For và Do.... Loop Until có cách dùng khác nhau, thế mà trước kia em hiểu bản chất của nó là một chỉ khác nhau ở hình thức thôi.

Em định bỏ qua lỗi khi chỉ còn Sheet 1 bằng cách thêm On Error Resume Next nhưng sao không được hả anh?
PHP:
Sub Xoa()
    On Error Resume Next
    Sheets("Sheet1").Move Before:=Sheets(1)
    Application.DisplayAlerts = False 'Ta('t che^' ?o^. ca?nh báo (khi xóa Sheet)'
    Do
        Sheets(2).Delete
    Loop Until Sheets.Count = 1 'Khi nào chi? còn 1 sheet thì du+`ng la.i'
    Application.DisplayAlerts = True 'Ba^.t la.i che^' ?o^. ca?nh báo'
End Sub
 
Upvote 0
Vòng lập For vẫn được chứ anh
PHP:
 Sub XoaSheets()
 On Error Resume Next
Application.DisplayAlerts = False
Sheets("Sheet1").Select
For i = ThisWorkbook.Sheets.Count to 2 Step -1
  Sheets(i).Delete
Next
Application.DisplayAlerts = True
End Sub
Em đã chạy thử code này, thấy code xóa không hết sheet. Đó là chưa kể đến trường hợp code xóa mất Sheet1 vì không có câu lệnh nào "cấm" việc này cả. Trong code trên của tác giả, câu lệnh Sheets("Sheet1").Move Before:=Sheets(1) là vì lý do đó (đưa sheet1 lên đầu workbook, xóa từ sheet thứ 2 trở đi).
 
Upvote 0
Em hiểu ra rồi, thì ra Next... For và Do.... Loop Until có cách dùng khác nhau, thế mà trước kia em hiểu bản chất của nó là một chỉ khác nhau ở hình thức thôi.

Em định bỏ qua lỗi khi chỉ còn Sheet 1 bằng cách thêm On Error Resume Next nhưng sao không được hả anh?
PHP:
Sub Xoa()
    On Error Resume Next
    Sheets("Sheet1").Move Before:=Sheets(1)
    Application.DisplayAlerts = False 'Ta('t che^' ?o^. ca?nh báo (khi xóa Sheet)'
    Do
        Sheets(2).Delete
    Loop Until Sheets.Count = 1 'Khi nào chi? còn 1 sheet thì du+`ng la.i'
    Application.DisplayAlerts = True 'Ba^.t la.i che^' ?o^. ca?nh báo'
End Sub
Vậy thì khỏi cần Resume next luôn, thay vòng lặp trên bởi vòng lặp này:
PHP:
Do While Sheets.Count > 1
    Sheets(2).Delete
Loop
(kiểm tra số sheet rồi mới xóa, ngược lại vòng lặp trên)
 
Upvote 0
Hoặc có thể dùng code sau:

Mã:
Sub XoaSht()
Dim sht As Worksheet
Application.DisplayAlerts = False
For Each sht In ActiveWorkbook.Worksheets
   If sht.Name <> "Sheet1" Then
      sht.Delete
   End If
Next
Application.DisplayAlerts = True

End Sub
 
Upvote 0
Cảm ơn bác Viethoai đã cho em thêm một giải pháp, em sửa 1 chút kẻo nếu không đẩy Sheet 1 lên nó lại xóa mất tiêu
PHP:
Sub XoaSheets()
 On Error Resume Next
Application.DisplayAlerts = False
Sheets("Sheet1").Move Before:=Sheets(1)
For i = ThisWorkbook.Worksheets.Count To 2 Step -1
Sheets(i).Delete
Next
Application.DisplayAlerts = True
End Sub
 
Upvote 0
Cảm ơn bác Viethoai đã cho em thêm một giải pháp, em sửa 1 chút kẻo nếu không đẩy Sheet 1 lên nó lại xóa mất tiêu
PHP:
Sub XoaSheets()
 On Error Resume Next
Application.DisplayAlerts = False
Sheets("Sheet1").Move Before:=Sheets(1)
For i = ThisWorkbook.Worksheets.Count To 2 Step -1
Sheets(i).Delete
Next
Application.DisplayAlerts = True
End Sub
Ừ nhỉ, mình nhầm cái này rùi
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom