tuan_anhbm
Thành viên thường trực




			
		- Tham gia
 - 16/7/09
 
- Bài viết
 - 253
 
- Được thích
 - 1,605
 
Hôm trước có nhờ người quen mua được cuốn  sách lập trình VBA - tác giả Phan Tự Hướng. Tôi rất thích cuốn sách này vì bao quát nhiều kiến thức bổ ích.
Tuy vậy có 1 chỗ muốn nhờ tác giả kiểm chứng lại xem sao:
Tại trang 254 - có 1 thủ tục xóa sheet rỗng:
	
	
	
		
Qua thử nghiệm tôi thấy macro trên hình như có vài vấn đề cần xem xét: 
Tôi thử edit như sau, không biết đã được chưa nhưng thấy cho kết quả như mong muốn:
	
	
	
		
Nhờ anh Hướng test lại thử xem sao nhé.
				
			Tuy vậy có 1 chỗ muốn nhờ tác giả kiểm chứng lại xem sao:
Tại trang 254 - có 1 thủ tục xóa sheet rỗng:
		Mã:
		
	
	[/FONT]
[COLOR=blue][FONT=Tahoma]Sub XoaSheetRong1()[/FONT][/COLOR]
[COLOR=blue][FONT=Tahoma]    Application.DisplayAlerts = False[/FONT][/COLOR]
[COLOR=blue][FONT=Tahoma]    For Each Cell In ActiveSheet.UsedRange           ‘(1)[/FONT][/COLOR]
[COLOR=blue][FONT=Tahoma]        If IsEmpty(Cell) Then                                  ‘(2)[/FONT][/COLOR]
[COLOR=blue][FONT=Tahoma]            ActiveSheet.Delete[/FONT][/COLOR]
[COLOR=blue][FONT=Tahoma]        End If[/FONT][/COLOR]
[COLOR=blue][FONT=Tahoma]    Next[/FONT][/COLOR]
[COLOR=blue][FONT=Tahoma]    Application.DisplayAlerts = True[/FONT][/COLOR]
[COLOR=blue][FONT=Tahoma]End Sub[/FONT][/COLOR]
[FONT=Tahoma]
	- Câu lệnh 1 có nghĩa: duyệt qua từng ô trong mảng chữ nhật có dữ liệu. Câu lệnh 2: Nếu cell đầu tiên là trống thì xóa sheet hiện hành -- > có thể rút gọn thành: “If IsEmpty(ActiveSheet.UsedRange) Then” (bỏ for/next). Tuy vậy vẫn chưa được vì: Nếu trong sheet có dữ liệu nhưng cell đầu tiên trống. vd: nếu ô A2 & B1 có dữ liệu (A1 trống) thì nó cũng xóa luôn sheet này.
 - Nó chỉ làm việc trên sheet hiện hành, không duyệt qua các sheet khác. Vì Next ở đây là Next với cell trong UsedRange chứ không phải với Sheet.
 
Tôi thử edit như sau, không biết đã được chưa nhưng thấy cho kết quả như mong muốn:
		Mã:
		
	
	[/FONT]
[COLOR=blue][FONT=Tahoma]Sub XoaSheetRong2()[/FONT][/COLOR]
[COLOR=blue][FONT=Tahoma]On Error Resume Next[/FONT][/COLOR]
[COLOR=blue][FONT=Tahoma]Application.DisplayAlerts = False[/FONT][/COLOR]
[COLOR=blue][FONT=Tahoma]So_sheet = ActiveWorkbook.Sheets.Count[/FONT][/COLOR]
[COLOR=blue][FONT=Tahoma]Sheets(1).Select[/FONT][/COLOR]
[COLOR=blue][FONT=Tahoma]For i = 1 To So_sheet[/FONT][/COLOR]
[COLOR=blue][FONT=Tahoma]    If WorksheetFunction.CountA(Cells) = 0 And ActiveWorkbook.Sheets.Count > 1 Then[/FONT][/COLOR]
[COLOR=blue][FONT=Tahoma]        ActiveSheet.Delete[/FONT][/COLOR]
[COLOR=blue][FONT=Tahoma]    Else: ActiveSheet.Next.Select[/FONT][/COLOR]
[COLOR=blue][FONT=Tahoma]    End If[/FONT][/COLOR]
[COLOR=blue][FONT=Tahoma]Next[/FONT][/COLOR]
[COLOR=blue][FONT=Tahoma]Application.DisplayAlerts = True[/FONT][/COLOR]
[COLOR=blue][FONT=Tahoma]End Sub[/FONT][/COLOR]
[FONT=Tahoma]
	
	
	  