Hafızaya alınan değişkenlerin boşaltılması

Orion1

Uzman
Uzman
Katılım
1 Mart 2005
Mesajlar
21,072
Beğeniler
262
Excel Vers. ve Dili
Win7 Home Basic TR 64 Bit

Ofis-2010-TR 32 Bit
#22
Şöyle.:cool:
satir = 0
 

Ömer BARAN

Uzman
Uzman
Katılım
8 Mart 2011
Mesajlar
13,047
Beğeniler
742
Excel Vers. ve Dili
Office 2013 ( 32 bit ) TÜRKÇE
#23
Bildiğim kadarıyla a = Empty şeklinde yazıldığında da sonuç değişmez.
Örneğin aşağıdaki kodu çalıştırırsanız sonucun aynı oldu görülebilir.
Rich (BB code):
Sub deneme()
Dim a As Long, b As Long
    a = 5000
    b = 1000
    a = Empty: b = 0
If a = b Then  MsgBox "SONUÇ AYNI:" & vbLf & "a değişkeni: " & a & vbLf & "b değişkeni: " & b
End Sub
Konuyla ilgili olabilecek genel bir şey yazayım (ahkam kesecek bilgim olduğunu söyleyemem elbette ama tecrübi sonuç) :
-- VBA ekranında iken, VIEW menüsünden LOCALS WINDOW'u seçtiğinizde, VBA ekranının sağ alt tarafından bir bölünmüş ekran kısmı oluşur.
-- Bir makro kodu F8 tuşuyla adım adım çalıştırdığınızda, değişkenlerin aldığı değerleri ve değişken türlerini görebilirsiniz.
Yapılan Dim ... As ..... tanımlaması, değişkene atanan değer ile uyumsuz ise HATA alırsınız zaten.
 
Katılım
31 Aralık 2005
Mesajlar
3,734
Beğeniler
125
Excel Vers. ve Dili
Office 2019 (64 bit) - Türkçe
#24
Bir değişkenin bellekteki ömrü declare edildiği bölge kadardır. Öncesinde yapılan Emty, Nothing, vbNullString gibi atamalar yalnızca değerini değiştirir.
Bölgeden çıkıldığında bellekten kendiliğinden silinir.
 
Katılım
17 Nisan 2015
Mesajlar
42
Beğeniler
1
Excel Vers. ve Dili
2016 OFFİCE
#25
Demek, sub ile end sub arasında dim as a variant veya başka biri long olsun...Bu sub ile and sub arasında işlem end sub ile bittiğinde otamatik çıkması oluyorsa bu işlem çokda önemli değil o zaman.
 
Katılım
8 Mart 2011
Mesajlar
13,047
Beğeniler
742
Excel Vers. ve Dili
Office 2013 ( 32 bit ) TÜRKÇE
#26
Zeki Bey yazmışsa doğrusu odur.
23 numaralı cevapta da belirtmiştim: "ahkam kesecek bilgim olduğunu söyleyemem" diye.
.
 

Haluk

Özel Üye
Katılım
7 Temmuz 2004
Mesajlar
7,169
Beğeniler
555
Excel Vers. ve Dili
32 Bit 2010 - İngilizce
#27
Zeki Beyin dediği ideal şartlarda doğrudur ancak; yazılan kodlarda doğru dürüst bir hata denetimi yapılmazsa, herhangi bir hata oluşup da kodun çalışması beklenmedik bir şekilde durduğunda, özellikle CreateObject metodu ile oluşturulan uygulamalar (Internet Explorer, Excel, Word ....) bilgisayarın belleğini meşgul etmeye devam ederler ve bu da performansı ciddi bir şekilde etkiler. Bu nedenle hata denetimi yapıp, bu tür nesneleri boşaltmak gerekir.

.
 
Katılım
31 Aralık 2005
Mesajlar
3,734
Beğeniler
125
Excel Vers. ve Dili
Office 2019 (64 bit) - Türkçe
#29
CreateObject metodu ile oluşturulan uygulamalar (Internet Explorer, Excel, Word ....)
Maalesef aynı fikirde değilim üstad. Şöyle ki; CreateObject ile çağrılan parantez içindeki nesneler ayrı birer proses olarak başlar. Her prosesin de bellek alanı da diğer proseslerden ayrıdır. Bunu görev yöneticisinde de görebiliriz. Yani demek istediğim, CreateObject ile başlatılan bir Excel uygulamasının çalışma kitabındaki hücreler doldurulsa, resimler eklense bile kendi prosesine ait bellek alanı şişecektir. Yanılıyor muyum yoksa? Bu şekilde düşünmeme neden olan detay aşağıdaki gibi:

Microsoft VBA dökümanlarında Object (nesne) tipi şöyle tanımlanmış:
DataType : Object
Storage Size : 4 bytes (Bu bilginin eksik olduğunu düşünme nedenimi aşağıda açıklayacağım)
Range : Any Object Reference

Bu açıklamaya göre Object değişkeninin bir veri değil de, referans bellek adresi (pointer) tuttuğunu anlıyorum. Bu da pointer (bellek adresi) nin 4 byte, yani bir Long tam sayısına işaret ediyor.

4 byte'lık bellek işgali yanlış demeyelim de, eksik desek daha doğru olur. Çünkü, ObjPtr fonksiyonu, Object tipindeki değişkenin bellek adresini almak için kullanılmakta. Bu fonksiyon 64 bit Excel' de LongPtr yani 8 byte lık tamsayı döndürür. Bu nedenle Object değişkeni mimariye göre 4 veya 8 byte lık bellek alanı kullandığını düşünüyorum.

Umarım bu uzun açıklamayı okuyan başta Haluk Bey olmak üzere diğer forum dostlarının canını sıkmamışımdır. :) Herkes için faydalı olması dileğiyle...
 

Haluk

Özel Üye
Katılım
7 Temmuz 2004
Mesajlar
7,169
Beğeniler
555
Excel Vers. ve Dili
32 Bit 2010 - İngilizce
#30
Üstadım; pratik (uygulama) bilgin kadar teorik bilgine ben her zaman hayranımdır, bunu da forumdaki bazı arkadaşlarla yaptığım sanal ve/veya yüz-yüze görüşmelerde her zaman dile getirmişimdir.

Klasik bir cevap olarak algılanmasını istemem ancak, benzer şeylerden bahsediyoruz ama herhalde ben tam olarak ifade edemedim... Zaten, imzamda da belirttiğim gibi; anlatmak, yazmaktan daha zor gelir bana :)

CreateObject ile oluşturulan bir nesne gayet tabii ki ayrı bir proses olarak başlar, buna kimsenin bir itirazı olamaz. Hatta, CreateObject ("Excel.Application") bile, kodun başlatıldığı Excel oturumundan/prosesinden ayrı bir proses olarak çalışır.

Ancak; Visible özelliği False olan bu prosesler, kodun hata ile karşılaştığı durumlarda eğer sonlandırılıp boşaltılmazlarsa, yine bilgisayarın ram'ini kullanmaya devam ederler, "Visible = False" olması durumunda da kullanıcı bunun farkında olamaz. Kod hata verdiğinde bu olayı, bilgisayarın Görev Yöneticisi ekranından da görebiliriz. Bu durumla en çok, Internet Explorer nesnesinin oluşturulduğu ve sunucunun cevap vermediği ve/veya benzeri durumlarda karşılaşırız. Web sitelerindeki tablolardan anlık olarak veri çekmek için sunuculara yollanan isteklerde bilinçsizce yazılan On Error Resume Next gibi ifadeler bu tip durumlara sıkça yol açar.

Umarım sıkıcı olmamışımdır, okuyan herkese selam ve sevgiler....

.
 
Katılım
31 Aralık 2005
Mesajlar
3,734
Beğeniler
125
Excel Vers. ve Dili
Office 2019 (64 bit) - Türkçe
#31
Hmm, ben nesneyi çağıran prosesin kaynak kullanımını artırıyor gibi algıladım. Konuyu yok yere uzattım, kusura bakmayın.
 

Orion1

Uzman
Uzman
Katılım
1 Mart 2005
Mesajlar
21,072
Beğeniler
262
Excel Vers. ve Dili
Win7 Home Basic TR 64 Bit

Ofis-2010-TR 32 Bit
#32
bilinçsizce yazılan On Error Resume Next gibi ifadeler bu tip durumlara sıkça yol açar.

.
Hocam ,Bu kodu yazanlar var.Ben yazdığım kodlarda mümkün olduğu kadar kullamıyom.
Çünkü hata veren satırı göremiyom.Bu çok tehlikeli bir kod.Kullansam bile hemen bu satırın 2 satır altına on error goto 0 yazıyorum.
 

Haluk

Özel Üye
Katılım
7 Temmuz 2004
Mesajlar
7,169
Beğeniler
555
Excel Vers. ve Dili
32 Bit 2010 - İngilizce
#33
Hmm, ben nesneyi çağıran prosesin kaynak kullanımını artırıyor gibi algıladım. Konuyu yok yere uzattım, kusura bakmayın.
Rica ederim üstad, ben düşüncemi tam olarak aktaramamıştım. Ondandır....

Hocam ,Bu kodu yazanlar var.Ben yazdığım kodlarda mümkün olduğu kadar kullamıyom.
Çünkü hata veren satırı göremiyom.Bu çok tehlikeli bir kod.Kullansam bile hemen bu satırın 2 satır altına on error goto 0 yazıyorum.
Aynen öyle, Evren Bey...... Antibiyotiği (On Error Resume Next) kullanırken, vitamin (On Error GoTo 0) ile beraber kullanmak gerekir.

.
 
Katılım
17 Nisan 2015
Mesajlar
42
Beğeniler
1
Excel Vers. ve Dili
2016 OFFİCE
#34
Bu konuya bir konu daha edeyim yada başka bir sayfa açarak fikir teatisi yapalım isterseniz... Çakışmalar ile alakalı bir konu açabiliriz. Site kullanmayı pek bilemiyorum. buradan bu konuya dahil ederek yapabiliriz. Çakışmaların önüne geçmek için neler yapabiliriz. değerli yorumlarınızı okumak isterim..Bende araştırma yaparak buraya yazacağım inşallah.
 
Üst