Hỏi về Macro xoá vùng dữ liệu

Liên hệ QC

feelingyes

Thành viên tiêu biểu
Tham gia
24/9/07
Bài viết
459
Được thích
395
Nghề nghiệp
Economic
Chào các Huynh GPE (chúc một ngày thứ 7 vui vẻ)
-Em có một file 31 sheet (1,2,3,4....31)
-Các sheet ngày là giống nhau về form
-Hàng ngày em phải nhập liệu vào sheet tương ứng
-Khi hết tháng em copy file cũ (ví dụ file tháng 3, em copy và sửa thành file tháng 4)
-Khi đó em phải thủ công xoá từng sheet 1

Em có Macro như sau
Sub Del()
'
' Del Macro
' Macro recorded 05/04/2008 by HVC
'
' Keyboard Shortcut: Ctrl+Shift+D
'
Application.ScreenUpdating = False
Sheet("1").Select
Range("L15,C15:C18,C21:C26,C30").Select
Selection.ClearContents
Sheets("2").Select
Range("L15,C15:C18,C21:C26,C29").Select
Selection.ClearContents
Sheets("3").Select
Range("L15,C15:C18,C21:C26,C29").Select
Selection.ClearContents
Sheets("4").Select
Range("L15,C15:C18,C21:C26,C29").Select
Selection.ClearContents
Sheets("5").Select
End Sub
Nhưng nếu mà làm đến 31 thì dài lắm
Các Huynh chỉ giúp em vòng lặp với

Xin cám ơn các Huynh
 
Bạn nhớ sửa Range lại cho phù hợp

PHP:
Sub Del()
    Application.ScreenUpdating = False
    For i = 1 To 31
        Sheets(i).Select
        Range("A1:F100").Select
        Selection.ClearContents
    Next i
    Sheets(1).Select
    Range("A1").Select
    Application.ScreenUpdating = True
End Sub
 
Upvote 0
Bạn thử code này xem.
Sub Del()
Dim Msg, Style, Title, Help, Ctxt, Response, MyString
Msg = ("Ban có muon xóa het so lieu thang này không?")
Style = vbYesNo + vbCritical + vbDefaultButton1
Title = "Feelingyes - Thong bao"
Help = "DEMO.HLP"
Ctxt = 1000
Response = MsgBox(Msg, Style, Title, Help, Ctxt)
If Response = vbYes Then
For i = 1 To Worksheets.Count
Sheets(i).Activate
Range("L15,C15:C18,C21:C26,C29").Select
Selection.ClearContents
Next i
Else
End If
Sheet5.Activate
End Sub
 
Upvote 0
To: Salam,
Bạn chú ý cho đoạn code của bạn
Mã:
Sub Del()
Dim Msg, Style, Title, Help, Ctxt, Response, MyString
Msg = ("Ban có muon xóa het so lieu thang này không?")
Style = vbYesNo + vbCritical + vbDefaultButton1
Title = "Feelingyes - Thong bao"
Help = "DEMO.HLP"
Ctxt = 1000
Response = MsgBox(Msg, Style, Title, Help, Ctxt)
If Response = vbYes Then
For i = 1 To Worksheets.Count
Sheets(i).Activate
[B]Range("L15,C15:C18,C21:C26,C29").Select[/B]
Selection.ClearContents
Next i
Else
End If
Sheet5.Activate
End Sub
Trong lập trình VBA, bạn không nên dùng phương thức Select.
Ngoài ra phương thức ClearContent chỉ cần trả về đối tượng Range là được.
Như vậy chương trình của bạn sẽ nhanh hơn nữa.
Ngoài ra, trong quá trình xóa nếu ta không thiết lập
Mã:
Application.Calculation = xlCalculationManual
vào đầu thủ tục thì cũng sẽ làm chậm chương trình. Nhưng bạn nhớ trả về Auto vào cuối thủ tục.
Mã:
Application.Calculation = xlCalculationAutomatic

Lê Văn Duyệt
 
Lần chỉnh sửa cuối:
Upvote 0
Cám ơn Bác nhiều. Quả là chạy tít mù luôn.
 
Upvote 0
Cám Ơn Code của Anh Salam
Cám ơn sự nhắc nhỏ của anh LeVanDuyet

Code chạy tít mù thật!

Code em sửa lại như sau
Sub Del()
Application.ScreenUpdating = False
'Application.Calculation = xlCalculationManual
Dim Msg, Style, Title, Help, Ctxt, Response, MyString
Msg = ("Ban có muon xóa het so lieu thang này không?")
Style = vbYesNo + vbCritical + vbDefaultButton1
Title = "Feelingyes - Thong bao"
Help = "DEMO.HLP"
Ctxt = 1000
Response = MsgBox(Msg, Style, Title, Help, Ctxt)
If Response = vbYes Then
For i = 1 To Worksheets.Count
Sheets(i).Activate
Range("L15,C15:C18,C21:C26,C29").ClearContents
Next i
Else
End If
Sheet1.Activate
Application.ScreenUpdating = True
End Sub

Cám ơn cách Huynh
 
Lần chỉnh sửa cuối:
Upvote 0
Sau đó bạn có thể thiết lập lại automatic mà.
 
Upvote 0
Tôi xin góp ý một chút
Code của các bạn dùng Sheets(i).Activate đôi khi sẽ gây ra lỗi vì vì trong Sheets(i) thì i là Index.
Nhưng trong code tại #1 của bạn Fellingyes thì bạn đặt tên cho sheet là i (i là Name).
Hai cái i này sẽ khác nhau nếu ta đã xoá đi 1 hoặc nhiều sheet rồi tạo lại, hoặc đặt tên không trùng với Index của sheet...

Mình đưa thêm 1 thuật toán khác là Group các sheet này lại rồi mới xoá (chỉ xoá 1 lần), vì vậy chắc chắn chương trình sẽ chạy nhanh hơn!
Mã:
Public Sub Vidu()
On Error GoTo thoat
With Application
    .ScreenUpdating = False
    .Calculation = xlCalculationManual
End With
Dim shtName()
Dim shtA, dem

[COLOR=red]For Each shtA In Worksheets
    If shtA.Name < 30 Then
        dem = dem + 1
        ReDim Preserve shtName(1 To dem)
        shtName(dem) = shtA.Name
    End If
Next shtA[/COLOR]
[COLOR=red]Sheets(shtName).Select
[/COLOR]
[COLOR=red]Range("L15,C15:C18,C21:C26,C29").Select
Selection.ClearContents[/COLOR]
 
Sheets("5").Select
thoat:
With Application
    .ScreenUpdating = True
    .Calculation = xlCalculationAutomatic
End With
End Sub
 
Upvote 0
Cám ơn anh NVSON, quả thật em không để ý đến sự trùng lặp này

Trong code của anh
Range("L15,C15:C18,C21:C26,C29").Select
Selection.ClearContents
------------------------------ta gộp thành
Range("L15,C15:C18,C21:C26,C29").ClearContents
thì sẽ nhanh hơn anh nhỉ?

Anh NVSON ơi anh giúp em hiểu đoạn code này của anh với
ReDim Preserve shtName(1 To dem)
shtName(dem) = shtA.Name
ReDim có phải là khai báo lại không? còn Preserve là gì anh?

Một chút nữa

Sao em không thấy anh khai báo gì cho Dim gì (đại khái như as worksheet chẳng hạn?


Cám ơn anh trước nhé
 
Lần chỉnh sửa cuối:
Upvote 0
Anh NVSON ơi anh giúp em hiểu đoạn code này của anh với
Trích:

ReDim Preserve shtName(1 To dem)
shtName(dem) = shtA.Name
ReDim có phải là khai báo lại không? còn Preserve là gì anh?
Khi ta thay đổi kích thước của biến kiểu mảng, ta dùng ReDim
Khi thay đổi kích thước của mảng mà không làm mất dữ liệu ta dùng thêm từ khoá Preserve.
(Hình như trên GPE cũng đã giải thích vấn đề này rồi).

Không hiểu sao khi tôi gộp 2 dòng lệnh đó thành 1 dòng lệnh thì chương trình lại không xoá dữ liệu, cũng chẳng hiện thông báo gì (lúc đó tôi không dùng On error...).

Một chút nữa

Trích:
Dim shtName()
Dim shtA, dem
Sao em không thấy anh khai báo gì cho Dim gì (đại khái như as worksheet chẳng hạn?
Đôi khi làm chỉ là HD cơ bản thôi, các bạn phải hoàn thiện chứ.
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom