Soru "DELETE" ve "BACKSPACE" tuşlarının oluşturduğu Problem !

ERMAN SAYINALP

Altın Üye
Katılım
11 Eylül 2008
Mesajlar
173
Excel Vers. ve Dili
Excel 2016 Türkçe
Altın Üyelik Bitiş Tarihi
08-09-2027
Merhaba,

Kullanılmakta olan bir "Analiz" adlı Çalışma Kitabının "Sayfa1" 'i Veri Tabanını oluşturmakta, diğer sayfalar ise içeriğindeki Fonksiyonlar yardımıyla ve Sayfa1' deki verileri kullanarak Matematiksel sonuçlar oluşturmakta ve Analiz yapmaktadır.

Veri Tabanı olarak kullanılan "Sayfa1", "A1:Z1000" aralığından oluşmaktadır.

Kullanıcıların gönderdiği veriler, gönderdikleri Excel Sayfalarından Kopyalanarak, söz konusu "Analiz" adlı Çalışma Kitabının "Sayfa1" ine Yapıştırılarak, gerekli çalışma yürütülmektedir.

Sorun olan şudur;

Kullanıcılar, Veri Tabanı bilgisi oluşturacak sayfalarını hazırlarken, hücrelerdeki eski verilerini "DELETE" tuşu kullanarak silmek yerine, "BACKSPACE" tuşu ile sözde silme yöntemini kullandıklarında, hücre içi boşalmış (silinmiş) gibi gözükse de veri tortusu bıraktığından, Analiz yapacak olan Çalışma Kitabının, ilgili Fonksiyonları hatalı sonuç üretmekte yada sonuç üretememektedir.

İstediğim Makro ise şudur;

Gelen Veri Tabanı bilgisini içeren sayfa içeriği hazırlanırken, "Backspace" tuşu ile silme işlemine maruz kalmışsa, Kopyala-Yapıştır sonrası Analiz Çalışma Kitabının, Sayfa1'ini temizlemek için,

"A1:Z1000" aralığındaki, içi boş gözüken hücreleri tek komutla "Delete" edebilen MAKRO'ya ihtiyacım bulunmaktadır.

Umarım, izah edebilmişimdir, zira bu anlatımı örnekleyebilecek bir çalışma hazırlamam mümkün değildir.

Değerli yardımlarınızı beklemekteyim. Saygılarımla.
 

YUSUF44

Destek Ekibi
Destek Ekibi
Katılım
4 Ocak 2006
Mesajlar
12,084
Excel Vers. ve Dili
İş : Ofis 365 - Türkçe
Ev: Ofis 365 - Türkçe
Aşağıdaki satırı dener misiniz?

Range("A1:Z1000").SpecialCells(xlCellTypeBlanks).ClearContents

Olmazsa bu problemin olduğu bir örnek dosya paylaşın ki yazacağımız kodu deneyebilelim.
 

ERMAN SAYINALP

Altın Üye
Katılım
11 Eylül 2008
Mesajlar
173
Excel Vers. ve Dili
Excel 2016 Türkçe
Altın Üyelik Bitiş Tarihi
08-09-2027
Aşağıdaki satırı dener misiniz?

Range("A1:Z1000").SpecialCells(xlCellTypeBlanks).ClearContents

Olmazsa bu problemin olduğu bir örnek dosya paylaşın ki yazacağımız kodu deneyebilelim.
Merhaba,

Maalesef ihtiyaç duyduğum temizleme işemini gerçekleştirmemektedir. Konuya ilişkin ÖRNEK Dosya hazırladım, umarım daha açıklayıcı olmuştur.
 

Ekli dosyalar

Korhan Ayhan

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

C++:
Option Explicit

Sub Bos_Hucreleri_Temizle()
    Dim Veri As Range, Alan As Range
    
    For Each Veri In Range("A1:G237")
        If Len(Veri.Value) = 0 Then
            If Alan Is Nothing Then
                Set Alan = Veri
            Else
                Set Alan = Union(Alan, Veri)
            End If
        End If
    Next
    
    If Not Alan Is Nothing Then Alan.ClearContents
    
    MsgBox "İşleminiz tamamlanmıştır.", vbInformation
End Sub
 

ERMAN SAYINALP

Altın Üye
Katılım
11 Eylül 2008
Mesajlar
173
Excel Vers. ve Dili
Excel 2016 Türkçe
Altın Üyelik Bitiş Tarihi
08-09-2027
Deneyiniz.

C++:
Option Explicit

Sub Bos_Hucreleri_Temizle()
    Dim Veri As Range, Alan As Range
   
    For Each Veri In Range("A1:G237")
        If Len(Veri.Value) = 0 Then
            If Alan Is Nothing Then
                Set Alan = Veri
            Else
                Set Alan = Union(Alan, Veri)
            End If
        End If
    Next
   
    If Not Alan Is Nothing Then Alan.ClearContents
   
    MsgBox "İşleminiz tamamlanmıştır.", vbInformation
End Sub

Korhan bey merhaba,

Her zaman Hızır gibi yetişiyorsunuz, teşekkür ederim. Şimdi size 2 sorum var, şöyle ki;

1- Option Explicit başlangıçlı KODLAMALAR nereye monte edilir ? ( Sayfaya yada Module ) Module ise, "Option Explicit" satırı, Module içindeki bir önceki Kodlama alanına geçiyor.

2- Yukarıda yazdığınız Kodlamanın tepkime süresi çok uzun, ben komut başına "Application.Calculation = xlManual" komut sonuna "Application.Calculation = xlAutomatic" ekledim, bu haliyle bile işlemin tamamlanması 4 dakika sürdü, bişey yapılabilir mi ?

Teşekkür ederim.
 

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
41,527
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Kodu modüle ekleyiniz.

Option Explicit ifadesi her zaman modülün ilk satırında ve bir adet olmalıdır. Bu satırın altına Sub ile başlayan kodlar yazılabilir. Bu ifade kodların içinde yapılan tanımlamaları (Dim) zorunlu kılar. Genelde kod yazmaya yeni başlayan herkese kullanmasını tavsiye ederim.

Kod yüksek satırlı veride yavaş çalışabilir. Hızlı çalışması için aşağıdaki kodu deneyiniz.

C++:
Option Explicit

Sub Bos_Hucreleri_Temizle()
    Dim Veri As Variant, Son As Long, X As Long
    Dim Y As Integer, Say As Long, Zaman As Double
    
    Zaman = Timer
    
    Son = Cells(Rows.Count, 1).End(3).Row
    Veri = Range("A1:G" & Son).Value2
    
    ReDim Liste(1 To UBound(Veri, 1), 1 To UBound(Veri, 2))
    
    For X = LBound(Veri) To UBound(Veri)
        Say = Say + 1
        For Y = 1 To UBound(Veri, 2)
            If Len(Veri(X, Y)) = 0 Then
                Liste(Say, Y) = Empty
            Else
                Liste(Say, Y) = Veri(X, Y)
            End If
        Next
    Next
    
    If Say > 0 Then Range("A1").Resize(Say, UBound(Veri, 2)) = Liste
    
    MsgBox "İşleminiz tamamlanmıştır." & Chr(10) & Chr(10) & _
           "İşlem süresi ; " & Format(Timer - Zaman, "0.00") & " Saniye", vbInformation
End Sub
 

ERMAN SAYINALP

Altın Üye
Katılım
11 Eylül 2008
Mesajlar
173
Excel Vers. ve Dili
Excel 2016 Türkçe
Altın Üyelik Bitiş Tarihi
08-09-2027
Kodu modüle ekleyiniz.

Option Explicit ifadesi her zaman modülün ilk satırında ve bir adet olmalıdır. Bu satırın altına Sub ile başlayan kodlar yazılabilir. Bu ifade kodların içinde yapılan tanımlamaları (Dim) zorunlu kılar. Genelde kod yazmaya yeni başlayan herkese kullanmasını tavsiye ederim.

Kod yüksek satırlı veride yavaş çalışabilir. Hızlı çalışması için aşağıdaki kodu deneyiniz.

C++:
Option Explicit

Sub Bos_Hucreleri_Temizle()
    Dim Veri As Variant, Son As Long, X As Long
    Dim Y As Integer, Say As Long, Zaman As Double
   
    Zaman = Timer
   
    Son = Cells(Rows.Count, 1).End(3).Row
    Veri = Range("A1:G" & Son).Value2
   
    ReDim Liste(1 To UBound(Veri, 1), 1 To UBound(Veri, 2))
   
    For X = LBound(Veri) To UBound(Veri)
        Say = Say + 1
        For Y = 1 To UBound(Veri, 2)
            If Len(Veri(X, Y)) = 0 Then
                Liste(Say, Y) = Empty
            Else
                Liste(Say, Y) = Veri(X, Y)
            End If
        Next
    Next
   
    If Say > 0 Then Range("A1").Resize(Say, UBound(Veri, 2)) = Liste
   
    MsgBox "İşleminiz tamamlanmıştır." & Chr(10) & Chr(10) & _
           "İşlem süresi ; " & Format(Timer - Zaman, "0.00") & " Saniye", vbInformation
End Sub
Korhan bey,

KODLAMA'nın bu versiyonu çok hızlı ve güzel olmuş. Yaklaşık 2.40 sn. tepkime süresi var. Ancak, benden kaynaklı bir sorunum oluştu, şöyle ki;

Ben söz konusu ihtiyacıma çözüm aramak adına, bir ÖRNEK üzerinden açıklamaya çalışmıştım. Dolayısıyla, gerçek sayfadaki aralıklarda çalışırken problem oluştu.

Gerçek Sayfadaki aralık açıklaması:

* C3 : M12 aralığı KİLİTLİ ve SAYFA KORUMALI
* C13 : M9999 aralığı KİLİTSİZ ve SAYFA KORUMALI (Temizlenecek Alan burasıdır)
* A1 : M10000 aralığında yukarıdaki özellikler dışındaki aralıklar KİLİTLİ ve SAYFA KORUMALI (Şekillendirmeler)
* Sayfa görseli aşağıdaki RESİM'dir.

216398

Değerli yardımlarınızı rica ederim.
 

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
41,527
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Kod içinde adresler belliydi. Kendinizde düzeltebilirsiniz.

C++:
Option Explicit

Sub Bos_Hucreleri_Temizle()
    Dim Veri As Variant, X As Long
    Dim Y As Integer, Say As Long, Zaman As Double
    
    Zaman = Timer
    
    Veri = Range("C13:M9999").Value2
    
    ReDim Liste(1 To UBound(Veri, 1), 1 To UBound(Veri, 2))
    
    For X = LBound(Veri) To UBound(Veri)
        Say = Say + 1
        For Y = 1 To UBound(Veri, 2)
            If Len(Veri(X, Y)) = 0 Then
                Liste(Say, Y) = Empty
            Else
                Liste(Say, Y) = Veri(X, Y)
            End If
        Next
    Next
    
    If Say > 0 Then Range("C13").Resize(Say, UBound(Veri, 2)) = Liste
    
    MsgBox "İşleminiz tamamlanmıştır." & Chr(10) & Chr(10) & _
           "İşlem süresi ; " & Format(Timer - Zaman, "0.00") & " Saniye", vbInformation
End Sub
 
Katılım
24 Nisan 2005
Mesajlar
3,652
Excel Vers. ve Dili
Office 2016 EN 64 Bit
Altın Üyelik Bitiş Tarihi
25/05/2022
Kod içinde adresler belliydi. Kendinizde düzeltebilirsiniz. ...
Range("C13").Resize(Say, UBound(Veri, 2)) = Liste

.resize ile veri aktarım denememde satır sayısı olarak problem yaşamıştım.
60000 satır mıydı, 200000 bin satır mıydı tam hatırlamıyorum. Bu tür bir sorun yaşadınız mı?
 

ERMAN SAYINALP

Altın Üye
Katılım
11 Eylül 2008
Mesajlar
173
Excel Vers. ve Dili
Excel 2016 Türkçe
Altın Üyelik Bitiş Tarihi
08-09-2027
Kod içinde adresler belliydi. Kendinizde düzeltebilirsiniz.

C++:
Option Explicit

Sub Bos_Hucreleri_Temizle()
    Dim Veri As Variant, X As Long
    Dim Y As Integer, Say As Long, Zaman As Double
   
    Zaman = Timer
   
    Veri = Range("C13:M9999").Value2
   
    ReDim Liste(1 To UBound(Veri, 1), 1 To UBound(Veri, 2))
   
    For X = LBound(Veri) To UBound(Veri)
        Say = Say + 1
        For Y = 1 To UBound(Veri, 2)
            If Len(Veri(X, Y)) = 0 Then
                Liste(Say, Y) = Empty
            Else
                Liste(Say, Y) = Veri(X, Y)
            End If
        Next
    Next
   
    If Say > 0 Then Range("C13").Resize(Say, UBound(Veri, 2)) = Liste
   
    MsgBox "İşleminiz tamamlanmıştır." & Chr(10) & Chr(10) & _
           "İşlem süresi ; " & Format(Timer - Zaman, "0.00") & " Saniye", vbInformation
End Sub

Korhan bey merhaba,

Verdiğim zahmete karşın emeklerinize teşekkür ederim. İnanınız ki, sizlerin bu KOD'lama yardımlarınızdan ziyadesiyle istifade ediyorum, dolayısıyle sadece kopyala-yapıştır mantığıyla kullanmayıp, eklemeler çıkarmalar da yapabiliyorum. Kendi dosyamın dinamiklerine uygun hale getirmek üzere değişikler yapıyorum, Kod içindeki adreslerin de düzeltilmesi bunlara dahil. Bu düzeltmeleri yapmama rağmen KOD çalışması hatalı olmuştu. İşlem tamamlandığında veri sayfasındaki verilerin satırlarını kaydırıp, anlamsız bir hale büründüryordu. Bu bakımdan, sizden tekrar yardım istemiştim.

Son gönderdiğiniz haliyle kullandığım da sorunun düzeldiğini görüyorum. Önceki KOD'lamanızla son gönderdiğiniz KOD'lamayı karşılaştırdığımda,

Dim Veri As Variant, Son As Long, X As Long satırını Dim Veri As Variant, X As Long şeklinde değiştirdiğinizi
Son = Cells(Rows.Count, 1).End(3).Row satırını da kaldırdığınızı gördüm.

Sanırım bu değişiklik KOD'un çalışmasını da düzeltmiş.

Değerli yardımlarınıza tekrar teşekkür eder, sizlerin desteğine her daim ihtiyacım olduğunu bilmenizi isterim.
 

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
41,527
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Alan adresini belirttiğiniz için kod içindeki gerekmeyen satırları kaldırdım.

Sizin yaptığınız düzeltmede kaydırma yapmasının sebebi kodun en sonundaki RESIZE içeren satır olabilir. Buradaki hücre, verinin ilk yazılacağı hücreyi temsil etmektedir.

İyi akşamlar.
 
Üst