Makroyu nasıl hızlandırabilirim?

Katılım
6 Ağustos 2017
Mesajlar
98
Excel Vers. ve Dili
2010
İyi çalışmalar, boş hücrelerin bulunduğu satırları gizlemek için kullandığım bi makro var. Fakat 5972 satır kullanımda olduğu için excel baya bi zorlanıp, makronun işi bitirmesi 5 - 6 dk sürüyor. Bunu hızlandırmak için yapabileceğim bir şey var mı?
Kod:
Sub SatirGizle2()
Application.ScreenUpdating = False
With Sheets("Ayrıntılı Olay İcmali")
For I = 6 To 5972
If Cells(I, 4) = 0 Then Rows(I).EntireRow.Hidden = True
Next I
End With
Application.ScreenUpdating = True
End Sub
 

Ömer BARAN

Uzman
Katılım
8 Mart 2011
Mesajlar
13,002
Excel Vers. ve Dili
Office 2013 ( 32 bit ) TÜRKÇE
Merhaba.
Aşağıdaki kod'u deneyiniz.
D sütununda, 0 yerine BOŞ olan hücrelerin (formül olup sonucu BOŞ olanlar dahil) satırlarını gizlemek için,
kod'daki kırmızı renklendirdiğim kısmı If a(i, 1) = "" Then olarak değiştirebilirsiniz.
Rich (BB code):
Sub D_GIZLE()
Dim s1 As Worksheet, a(), adres As Range
Dim brn, i As Integer
Set s1 = Sheets("Ayrıntılı Olay İcmali")
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
s1.Rows.EntireRow.Hidden = False
    a = s1.Range("D6:D" & s1.Cells(Rows.Count, 4).End(3).Row).Value
    For i = 1 To UBound(a)
        If a(i, 1) = 0 Then
            brn = brn + 1
            If brn = 1 Then: Set adres = Cells(i + 5, 1)
            If brn > 1 Then: Set adres = Union(adres, Cells(i + 5, 1))
        End If
    Next i
    If brn > 0 Then adres.EntireRow.Hidden = True
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    MsgBox "İşlem tamamlandı." & vbLf & UBound(a) - brn & _
        " adet satır gizlendi.", vbInformation, "..:: Ömer BARAN ::.."
    Erase a: adres = Empty: Set s1 = Nothing: brn = Empty: i = Empty
End Sub
 
Son düzenleme:

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
41,327
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Hücre adresleri UNION komutu ile birleştirilirse daha sağlıklı olacaktır.
 

Ömer BARAN

Uzman
Katılım
8 Mart 2011
Mesajlar
13,002
Excel Vers. ve Dili
Office 2013 ( 32 bit ) TÜRKÇE
.
Evet Sayın AYHAN, satır adedi az olan belgede denemiştim ve sorun olmamıştı.
Önceki kod cevabımı güncelledim. Sayfayı yenileyerek önceki cevabımı kontrol ediniz.
.
 
Katılım
6 Ağustos 2017
Mesajlar
98
Excel Vers. ve Dili
2010
Merhaba.
Aşağıdaki kod'u deneyiniz.
D sütununda, 0 yerine BOŞ olan hücrelerin (formül olup sonucu BOŞ olanlar dahil) satırlarını gizlemek için,
kod'daki kırmızı renklendirdiğim kısmı If a(i, 1) = "" Then olarak değiştirebilirsiniz.
Rich (BB code):
Sub D_GIZLE()
Dim s1 As Worksheet, a(), adres As Range
Dim brn, i As Integer
Set s1 = Sheets("Ayrıntılı Olay İcmali")
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
s1.Rows.EntireRow.Hidden = False
    a = s1.Range("D6:D" & s1.Cells(Rows.Count, 4).End(3).Row).Value
    For i = 1 To UBound(a)
        If a(i, 1) = 0 Then
            brn = brn + 1
            If brn = 1 Then: Set adres = Cells(i + 5, 1)
            If brn > 1 Then: Set adres = Union(adres, Cells(i + 5, 1))
        End If
    Next i
    If brn > 0 Then adres.EntireRow.Hidden = True
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    MsgBox "İşlem tamamlandı." & vbLf & UBound(a) - brn & _
        " adet satır gizlendi.", vbInformation, "..:: Ömer BARAN ::.."
    Erase a: adres = Empty: Set s1 = Nothing: brn = Empty: i = Empty
End Sub
İlginiz için teşekkür ederim. İlgili kodu kendi çalışmama yeni uyarlayabildim. Bi sorunla karşılaşmadım. Saniyesinde makro sonuçlanıyor. Gerçekten çok teşekkürler. Bir sorunla karşılaştığımda çözümleye bilmem ve diğer sayfalarıma uygulayabilmem için kodunuzu açıklayabilir misiniz? ÖZellikle satır sütun değiştirmek istediğimde sanırım burada bir değişiklik yapmam lazım?
Kod:
    a = s1.Range("D6:D" & s1.Cells(Rows.Count, 4).End(3).Row).Value

    For i = 1 To UBound(a)

        If a(i, 1) = 0 Then

            brn = brn + 1

            If brn = 1 Then: Set adres = Cells(i + 5, 1)

            If brn > 1 Then: Set adres = Union(adres, Cells(i + 5, 1))
 

Ömer BARAN

Uzman
Katılım
8 Mart 2011
Mesajlar
13,002
Excel Vers. ve Dili
Office 2013 ( 32 bit ) TÜRKÇE
Tekrar merhaba.
Dikkat ederseniz a değişkenine atanan değerler D6'dan D sütunu son dolu hücreye kadarki alanda yer alan değerler.
Gizleme işlemi için kontrol yapılırken For...Next döngüsü 1'den başlayıp a değişkenine atanan değer adetine kadar devam ediyor.
Burada, alan D6'dan başlıyor ancak kontrol 1'den başlıyor kısmı anlaşılmayabilir.

1'den başlayan i değişkeni, a değişkenine atanan değerlerin kaçıncısı olduğunu gösteriyor.

Koşula uyan i değişkenine ( i'nin değeri + 5 ilgili hücrenin adresi oluyor) göre hücre adresleri adres değişkeninde biriktiriliyor.
adres değişkenine alınan adreslerin sütunlarının bir önemi yok, Cells(i+5, 1) /// Cells(i+5, 4) /// Cells(i+5, "A") /// Cells(i+5, "D") şeklinde de olabilir)
çünkü işlem için gerekli olan bu adreslerin sütun numaraları değil satır numaraları.
Buraya kadar, sayfada herhangi bir işlem yapılmış değil, döngü ile koşula uyan hücrelerin adreslerini biriktirmiş oluyoruz.

Gizleme işlemi TEK hamlede (biriktirilen adreslerin satırlarını gizle) If brn > 0 Then adres.EntireRow.Hidden = True
kod satırıyla yapılıyor. Zaten kod'un hızlı sonuç vermesini sağlayan da gizleme işleminin tek hamlede yapılması.

Umarım anlaşılır olmuştur.
.
 
Katılım
6 Ağustos 2017
Mesajlar
98
Excel Vers. ve Dili
2010
Tekrar merhaba.
Dikkat ederseniz a değişkenine atanan değerler D6'dan D sütunu son dolu hücreye kadarki alanda yer alan değerler.
Gizleme işlemi için kontrol yapılırken For...Next döngüsü 1'den başlayıp a değişkenine atanan değer adetine kadar devam ediyor.
Burada, alan D6'dan başlıyor ancak kontrol 1'den başlıyor kısmı anlaşılmayabilir.

1'den başlayan i değişkeni, a değişkenine atanan değerlerin kaçıncısı olduğunu gösteriyor.

Koşula uyan i değişkenine ( i'nin değeri + 5 ilgili hücrenin adresi oluyor) göre hücre adresleri adres değişkeninde biriktiriliyor.
adres değişkenine alınan adreslerin sütunlarının bir önemi yok, Cells(i+5, 1) /// Cells(i+5, 4) /// Cells(i+5, "A") /// Cells(i+5, "D") şeklinde de olabilir)
çünkü işlem için gerekli olan bu adreslerin sütun numaraları değil satır numaraları.
Buraya kadar, sayfada herhangi bir işlem yapılmış değil, döngü ile koşula uyan hücrelerin adreslerini biriktirmiş oluyoruz.

Gizleme işlemi TEK hamlede (biriktirilen adreslerin satırlarını gizle) If brn > 0 Then adres.EntireRow.Hidden = True
kod satırıyla yapılıyor. Zaten kod'un hızlı sonuç vermesini sağlayan da gizleme işleminin tek hamlede yapılması.

Umarım anlaşılır olmuştur.
.
Çok teşekkür ederim zaman ayırıp yardımcı oldunuz, bilgilerinizi benimle paylaştınız. Gayet anlaşılır olmuş sağolun. İyi çalışmalar dilerim.
 
Katılım
12 Mayıs 2016
Mesajlar
361
Excel Vers. ve Dili
Ofis 2019- 32 Bit - Türkçe
Ömer Kod gayet hızlı bir şekilde satırları gizliyor. Tek butonla tekrar gizli satırları göstermek için nasıl bir kod ilave edilebilir.
 

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
41,327
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Deneyiniz.

Kod:
Sub Goster ()
Cells.EntireRows.Hidden = False
End Sub
 
Üst