2016-04-13 16 views
2

Belirli bir makroyu her çalıştırdığımda çoğunun silineceği çok çalışma sayfası olan bir çalışma kitabım var. Silinecek çalışma sayfalarının sayısı 1 ile 150 arasında değişir.Çoklu çalışma sayfalarını silmek için daha hızlı yöntem

Şu anda aşağıdaki makro bölümünün bölümü, 78 çalışma sayfasını silmek için yaklaşık 215 saniyedir. Daha hızlı yapmanın bir yolu var mı? 60'lardan az sayıda benzer çalışma sayfası için çalışma zamanı var mı?

For Each WrkSh In MainFile.Worksheets 
    If WrkSh.Index > 5 Then 
    WrkSh.Delete 
    End If 
Next WrkSh 


MainFile.Sheets("Input").Unprotect 
MainFile.Sheets("Buyers").Unprotect 
MainFile.Sheets("Template").Visible = True 
MainFile.Sheets("Holidays").Visible = True 


With MainFile.Sheets("Input") 
    .Range("A10:A200").ClearContents 
    .Range("E11:N200").Clear 
End With 

With MainFile.Sheets("Buyers") 
    .Range("A10:B40").ClearContents 
    .Range("C11:J40").Clear 
End With 

DÜZENLEME:

İşte kodun ilgili bölümdür Ben ana kod başında bu Application.ScreenUpdating = False var.

+0

Sayfaları silmeden önce hesaplama yapmayı denediniz mi, daha sonra sıfırlanmalı mı? – Rory

cevap

0

SEÇENEK 1 Sayfaları gruplandırabilir ve bunları grup olarak silebilirsiniz. Bu daha hızlı olabilir; test edebilirsin.

Dim arrDelete() As String 
ReDim arrDelete(MainFile.Worksheets.Count) 

Dim index As Long 
For Each WrkSh In MainFile.Worksheets 
    If WrkSh.index > 5 Then 
     arrDelete(index) = WrkSh.Name 
     index = index + 1 
    End If 
Next WrkSh 

ReDim Preserve arrDelete(index - 1) 

Application.DisplayAlerts = False 
MainFile.Sheets(arrDelete).Delete 
Application.DisplayAlerts = True 

SEÇENEK 2 Eğer, yeni bir çalışma kitabına bu sayfaları kopyalayabilirsiniz tutmak ve eski çalışma kitabını silmek istediğiniz sayfaları dışında hiçbir bağlantı varsa. Bu muhtemelen en güvenli seçenek değildir, ancak bazı durumlarda işe yarayabilir.

+0

Teşekkürler. Dizi yöntemi çalışma süresini ortalama 4 saniyeye kısaltmıştır. – Chiso

1

Application.ScreenUpdating = False kullanıyor musunuz?

+0

Evet, öyleyim. '.DisplayAlerts = False ' – Chiso

0

Kodunuzun bu soruna neden olan bölüm olduğundan emin misiniz? Durumunuzu hızla yeniden oluşturdum ve neredeyse anında çalışıyor.

+0

dahil. Kodu, hangi işlemlerin çok zaman aldığını öğrenmek için zamanlayıcıları kullanarak bölümlere ayırdım. Ayrıca, daha önce çok yavaş koşuyordu ve "Wrksh.Delete" vurgulanacaktı. – Chiso

0
Sub test() 
    Dim a(), sh As Worksheet 

    ReDim a(1 To Sheets.Count - 5) 
    For Each sh In ThisWorkbook.Sheets 
     If sh.Index > 5 Then a(sh.Index - 5) = sh.Name 
    Next sh 

    Sheets(a).Delete 
End Sub 
İlgili konular