Một ý kiến nhỏ về sách lập trình VBA

Liên hệ QC

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:
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]
Qua thử nghiệm tôi thấy macro trên hình như có vài vấn đề cần xem xét:
  1. 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.
  2. 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]
Nhờ anh Hướng test lại thử xem sao nhé.
 

File đính kèm

Web KT

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

Back
Top Bottom