Makale Application Nesnesi

Bu Makale Yararlı Oldu mu?

  • Evet

  • Hayır


Sonuçlar yalnızca oylamadan sonra görülebilir.
Excel, nesneler hiyerarşisi üzerine kurulmuş bir Nesne Modeline sahiptir ve Application nesnesi de hiyerarşinin en tepesinde bulunur.

Application nesnesi Excel'in ta kendisidir ve bu yüzden de default nesnedir. Bu şu demek; bazı durumlarda bu ifadeyi yazmanıza gerek olmadan buna ait özellik ve metodları kullanabiliriz. Yani Application.ActiveWorkbook yazmak ile ActiveWorkbook yazmak arasında hiçbir fark yoktur. Ancak bazı durumlarda da Application'ı açıkça yazmak gerekir. Aslında bu konu Global sınıfı ile ilgili bir konudur. Eğer Excelin kendisiyle ilgili bir işlem olacaksa, o zaman Application'ı açıkça yazmamız gerekir. Meselâ Excel'den çıkış için Quit metodunu kullanmak, Excel'in ekrandaki boyutlarını ayarlamak gibi. Bununla beraber benim tavsiyem; Application'ı her durumda yazmanızdır, ancak olur da internette araştırma yaparken Application'ın yazılmadığını görürseniz de şaşırmayın. Aşağıda özellik ve metotların tanıtımında Application'ın yazılması gereken durumlar için bunu açıkça yazdım, diğer durumlar için yazmadım, ancak kod örneklerinde size verdiğim tavsiyeyi tuttum ve Application'ı hep yazmaya çalıştım.

Bu arada herhangi bir nesnenin Application özelliğini kullanarak da bu Application nesnesini elde edebiliriz. Daha teknik bir ifadeyle, bazı nesnelerde bulunan Application özelliği(property) Application tipinde değer döndürür, yani Application nesnesi elde edersiniz. Tabi bazen kullandığımız nesne Excel Nesne Modeline ait bir nesne değil de, meselâ bir Outlook nesnesi olabilir, böyle bir durumda Application özelliği kullandığınızda dönen değer tabiiki Excel değil, Outlook olacaktır.

Genel Görünüm ve Uygulama Seviyesi İşlemleri
Excel'in genelini ilgilendiren birçok üye mevcuttur. Bunların birçoğu File > Options'tan ulaşabileceğiniz ayarların VBA karşılıklarıdır. Önemlilerine, daha doğrusu kısa ve orta vadede kullanma ihtimaliniz olan üyelere bir bakalım.

Application.DisplayFullScreen özelliği:
Boolean tipinde değer döndürür.
True atandığında Ribbon olsun, durum çubuğu olsun hiçbir şey göstermez, sadece hücreler ve formül çubuğu görünür.

Application.DisplayFormulaBar özelliği:
Bu da Boolean tiplidir.
False atanırsa formül çubuğu gösterilmez.
Bunu bazen formülleri göstermemek için( koruma yaparak da sağlanır) bazen de DisplayFullScreen özelliği ile birlikte, ekranda maksimum alanda yer açmak kullanılır.

Application.DisplayStatusBar özelliği:
Bu da Boolean tiplidir.
En alttaki durum çubuğunu gösterir veya gizler. (Application.StatusBar özelliği ile karıştırılmamalıdır, bu ikincisinde durum çubuğunda yazan metni alırız veya metin yazarız.)

Application.DisplayScrollbars özelliği:
Bu da Boolean tiplidir.
Scrollbar'ları gösterir veya gizler.

Application.Interactive özelliği:
Boolean döndürür.
Diyelim ki; çok fazla copy-paste yapan bir makronuz var, kodunuz da uzun sürüyor, beklerken o sırada Word veya Outlook'ta vakit geçireyim dediniz. Outlook'ta yazdığınız bir metni kesip başka bir yere kopyalamaya karar verdiniz, ancak tam az önce de Excel VBA kodunuzda bir kesme işlemi yapmıştı, siz şimdi clipboarda Outlook metnini almış oldunuz ve kodunuz hızlıca akıp geçti, ve paste işlemini yaparken Excel'den aldığı parçayı değil, Outlook'taki metni yapıştırdı. İşte böyle bir durum olmasın diye bu tür işlemlerinizin olduğu kodlarınızın başına bu özelliği yazıp False değerini atayabilir, kodun sonunda bunu yine True'ya döndürebilirsiniz.
Örnek Kullanım
VBA:
Application.Interactive = False
'kodlarınız
Application.Interactive = True
Application.Quit metodu:
Excel'den çıkış için kullanılır.
Bu arada Excel'den çıkış yapılmasını yakalayacak bir olay yok maalesef. Bunu farklı yöntemlerle tespit eden bazı makaleler gördüm ama oldukça karışık olduğu için buraya almak istemedim. Ben şahsen, bunun yerine Personal.xlsb dosyasının kapanıp kapanmadığını, bu dosya içindeki Workbook_BeforeClose olayı ile yakalıyorum, bunun kapanması demek, zaten birçok durumda Excel'in kapanması demek oluyor, ki bu da işimi görüyor.

Application.StatusBar:
Görev çubuğuna mesaj yazmak için kullanılır. Özellikle kullanıcıları hem bilgilendirmek, hem de bilinçli bir şekilde mesaj kutusu çıkarmak istemediğinizde faydalıdır. (Bazen zamanlanmış işlerde arkadan gelen kodların takılmasını engellemek için, bazen de kullanıcılardan gelen "Bu kadar MsgBox çok can sıkıcı" itirazlarını ele almak için). Ancak unutulmamalıdır ki; MsgBox kadar da dikkat çekici değildir, hatta bazı durumlarda verdiğiniz mesaj gözden kaçabilir de. O yüzden kritik mesajları MsgBox ile vermenizi tavsiye ederim. Aşağıda bu özelliği ProgressBar olarak nasıl kullanıyoruz, onu da göreceğiz.

Object Browser veya MSDN üzerinden, uygulama seviyesinde yapılabilecek daha birçok ayarlama olduğunu görebilirsiniz, buraya önemli olduğunu düşündüklerimi aldım, diğerlerini siz de araştırabilirsiniz. Bunların çoğu Excel Seçenekler üzerinden yapacağınız ayarlamalara denk gelir. Ör: AutoRecover ayarı, AutoCorrect ayarı, dosyalar açıldığında linkleri update etsin mi ayarı gibi.

Kod Hızlandırıcılar

Aşağıdaki üç özellik, kodlarınızın başında False sonunda True olarak ayarlandığında performans kazanımı sağlar.

Application.ScreenUpdating özelliği:
Uzunca bir makro çalışırken ekranın gidip geldiğini, titrediğini görmüşsünüzdür(veya göreceksinizdir), hele hele farklı çalışma kitapları veya sayfalar arasında gidip gelme söz konusu ise, bu durum daha çok göze çarpar. Aslında tüm bu ekran hareketleri, genel süreci uzatan bir rol oynar, o yüzden bu ekran hareketini kapatarak kodunuzu hızlandırabilirsiniz. Bunu da bu özelliğe False değeri atayarak yapıyoruz. Kod bitmeden hemen önce açmayı unutmayın tabi.

Kod çok uzun sürüyorsa ScreenUpdating=False durumunda kullanıcılar Excel'in kitlendiğini düşünebilir, o yüzden arada bir hareket göstermek iyi olabilir. Bunu da DoEvents metodu ile yapabiliriz.

Örnek Kullanım
VBA:
'Genellikle bir döngü içinde daha mantıklıdır
Application.ScreenUpdating = False
    Do Until oldumu = True
        'ara kodlar
        DoEvents 'burda ekran tazelenir
    Loop
Application.ScreenUpdating = True
Application.DisplayAlerts özelliği:
Kodunuz çalışırken Excel bize bazı uyarılar çıkarabilir, bunlar da genelde can sıkıntısı yaratabilir. Özellikle zamanlanmış makrolarınız varsa ve bunların birinde bir sayfa silme, veya var olan dosya üzerine yazma gibi size uyarı çıkaran kodlar varsa, bu özelliğe False atamazsanız ekran ilk uyarıda takılı kalır ve sizin bir cevap vermenizi bekler. Eğer bir seri zamanlanmış kodunuz varsa, böyle bir durum kabul edilemez. O yüzden en faydalı bulduğum özelliklerden biri budur. Bu özelliğe False atandığında uyarılara varsayılan cevap verilir ve kod devam eder. Kod bittiğinde de bu özelliğe otomatik True değeri atanır.

Ancak bu özellik iki durumda işe yaramaz.

  • Mesaj kutularında. Özellikle zamanlanmış makronuz varsa içinde mesaj kutusu kullanmamaya çalışın. Hata yönetimi işlemlerinde bile kullanmayın, onun yerine kendinize mail gönderebilir, StatusBarı kullanabilir veya Log kaydı tutabilirsiniz.

  • İçinde başka dosyalara link olan dosyalar açıldığında Linkleri update edeyim mi sorusu. Burda DisplayAlerts yerine Workbook.Open metodunun UpdateLinks parametresi kullanılır. Gerçi bunu da aşmanın bir yolu var, ama dikkatli kullanılmasında fayda var. Application.AskToUpdateLinks özelliğine False atanırsa linkler otomatik güncellenir, ve bu soru karşımıza çıkmaz, böylece her Workbook.Open metodunda tek tek Updatelinks özelliğine değer girmek zorunda kalmayız. Ama bazı durumlarda otomatik update olmasın isterseniz, bunu kullanmak yerine Workbook.Open metodunun Updatelinks parametresini kullanın.

Application.EnableEvents özelliği:
DisplayAlerts ile birlikte en çok değer verdiğim bir diğer özellik de budur. Hatta QuickAccess araç çubuğunda bu özelliği True ise False, False ise True yapan bir düğmem bile var.

Bu özellik, herhangi bir Event( Olay ) tetiklenmesin diye kullanılır. İki tür kullanım şekli olabilir.
  • Bir programın en başına False, en sonunda tekrar True olacak şekilde. Böylece tüm kod boyunca hiçbir olay tetkilenmez.
  • Bir döngü içinde satır silme, hücre değeri değiştirme gibi bir işlem vardır, ve sayfa modüllerin birinde Worksheet_Change olayınız da, sadece bu olay tetiklenmesin diye ilgili döngünün başına ve sonuna konur. Böylece döngüden çıkıldığında diğer olayların tetiklenme olabilmesine imkan verilmiş olur.
Ben çok faydalı bulduğum bu 3 özelliği bir prosedüre bağladım, ve birçok makroya girerken bunlara (bazen sadece ikisine) False değerini atıyorum, koddan çıkarken de tekrar True değerine döndürüyorum. Fonksiyon ve kullanım şekil aşağıdaki gibidir:

VBA:
'Ana prosedürü
Public Sub AlertUpdatingEvent(a As Boolean, u As Boolean, Optional e As Boolean = True)
    With Application
      .DisplayAlerts = a
      .ScreenUpdating = u
      .EnableEvents = e
    End With
End Sub

'Prosedürü çağırma şeklim
AlertUpdatingEvent False, False 'Son parametreyi eklemediğimi için default değeri olan True atanır.
Böylece sadece uyarıların çıkmasını ve ekran titreşimini engellemiş ama olaylar çalışsın istemiş oldum

Hesaplama, Zamanlama ve Bekleme

Bu başlıktaki konular her zaman olmamakla birlikte genelde bir arada kullanılmaktadırlar, en azından bir kullanım yakınlığı vardır diyebiliriz.

Hesaplama İşleri
Application.Calculation
özelliği:
Excel'in formüller için hesaplama yöntemini seçmenizi sağlar.
Excel'in bu özelliğini bildiğinizi varsayıyorum.

Bu özelliğin alabileceği 3 enumaration değeri vardır.

xlCalculationAutomatic

Varsayılan değer budur. Herhangi bir hücrede değişiklik olduğunda tüm workbooklarda formüller yeniden hesaplanır.

xlCalculationSemiautomatic

Tablo'lar dışında her şey otomatik hesaplanır.

xlCalculationManual

Hesaplama işlemi kapalıdır. Kullanıcı hesaplama yapana kadar da öyle kalır.



Özellikle büyük formüllü dosyalarda bir makro çalıştıracaksanız ve herhangi olumsuz bir etkisi olmayacaksa öncesinde hesaplama kapatılıp, makro bitmeden hemen önce de tekrar açılabilir.
VBA:
Application.Calculation = xlCalculationManual
    'burada diğer işleriniz yapılır
Application.Calculation = xlCalculationAutomatic
Calculate metodu: Tüm çalışma kitaplarındaki yeni, değişmiş ve volatile formüllerin hesaplanmasını sağlar. (o anda Manuel hesaplama seçimi yapıldıysa anlamlıdır, aksi halde zaten formüller hesaplanmıştır ve gerek yoktur) Calculation özelliğinin aksine bunda Application denmesine gerek yoktur. Örnek biraz aşağıda bulunmaktadır.

Application.CalculationState özelliği:
Hesaplamanın ne durumda olduğunu gösterir. Alabileceği değerleri bir kodla görelim.
VBA:
Sub ExcelTurkey()
    If Application.CalculationState = xlDone Then 'enumeration değeri 0
        MsgBox "Hesaplama Bitti"
    ElseIf Application.CalculationState = xlPending Then 'Görev çubuğunda "Calculate" yazar 'enumeration değeri 2
        MsgBox "Tetiklendi ama henüz hesaplama başlamadı"
    Else 'xlCalculating 'enumeration değeri 1
        MsgBox "Hesaplama devam ediyor 'Görev çubuğunda %sel bir oran görünür
    End If
End Sub
Done ve Calculating gayet aşikâr fakat Pending'i tam olarak anlamamış olabilirsiniz. Hani bazen Excel manuel hesaplama modundayken, formüllerden birine baz teşkil eden bir hücreyi değiştirdiğinizde en alttaki durum çubuğunda Calculate yazar, bazen de dosyanızda çok sayıda formül varsa Excel bu kadar formülle başa çıkamaz ve en altta yine Calculate yazar. İşte bu durum xlPending durumudur. Böyle durumlarda Excel'de hesaplama yapmak için Formulas menüsünden Calculate demek veya F9'a basmak gerekir.

Not: Bir de kısır döngülü formüllerde Calculate yazdığını görürsünüz, bu da bir xlPending durumudur ancak onun çözümü aşağıdakiler değil, kısır döngüye neden olan formülü düzeltmektir.

İnternette birçok forumda yaygın bir kullanım örneği olarak aşağıdaki kod parçası verilir. Deniyor ki; "kodunuz çalışmaya başlamıştır, büyük bir hesaplama yapıyordur, ancak daha hesaplama bitmeden bir sonraki satıra geçer, bu da hatalı sonuçlar neden olabilir, o yüzden aşağıdaki kod ile kodununzun aşağı satıra geçmesini engellersiniz".

VBA:
Application.Calculate 'hesaplamaya başladınız
Do While Application.CalculationState <> xlDone
     DoEvents
Loop
'kodun kalan kısmı
Halbuki Calculate metodu asynchoronus değildir, yani hesaplama bitmeden zaten bir sonraki satıra geçmez. O yüzden yukarıdaki tavsiye bence anlamsızdır. Ancak bir şekilde(forumlarda yardım isteyen diğer kişilerin başına gelen çok özel durumlarda, artık neyse o özel durumlar bilemiyorum) böyle bir şey olduğunu fark ederseniz bu kodu kullanabilirsiniz.

Bu arada şu farkı iyi anlamanız gerekiyor; Calculate metodunu uyguladığınızda sanki Excel'de F9'a basmış veya Calculation menüsünden Calculate butonuna basmış gibi olursunuz ve formüller yeniden hesaplanır ancak sayfanız o an hala Manuel modda kalmaya devam eder ve sonraki aşağı/sağa formül kaydırma işlemleri sonucunda formüller hesaplanmaz. Halbuki Calculation özelliğine xlAutomatic atayarak hem hesaplamayı açmış olursunuz, hem de statüyü kalıcı olarak otomatiğe çevirmiş olursunuz ve sonraki formül kaydırmalarda formüller hemen hesaplanır. Hangisi ihtiyacınıza uygunsa onu kullanmalısınız. Eğer ki; geçici bir hesaplama yapmak istiyorsanız Calculate metodunu, kalıcı hesaplama için ise Calculation özelliğini kullanabilirsiniz.

Önemli bir husus da şudur; Application, Worksheet ve Range nesneleri için var olan Calculate metodu Workbook için bulunmamaktadır. Ancak aşağıda gibi bir kod ile sadece ActiveWorkbook'un Calculation işlemini yapabilirsiniz.

VBA:
Sub ExcelTurkey()
    Dim ws As Worksheet
    Application.Calculation = xlManual
    For Each ws In ActiveWorkbook.Worksheets
        ws.Calculate
    Next
    Set ws = Nothing
End Sub
Application.CalculateFull:
Otomatik veya Manuel modda olun fark etmez, tüm formüllü hücreleri yeniden hesaplar. Calculate metodundan farklı olarak, sadece yeni, değişmiş ve volatil formülleri değil, tüm formül içeren hücreleri tekrar hesaplar. Bu yüzden genelde(her zaman değil) normal Calculate metoduna göre daha yavaştır. Durum çubuğunda ısrarla Calculate yazıyorsa yani xlPending durumundan bir türlü çıkamıyorsanız bunu kullanabilirsiniz. Klaveye kısayolu Ctrl+Alt+F9'dur.

Application.CalculateFullRebuild:
Bu metod CalculateFull ile aynı işi yapıyor gibi görünüyor, Excel 2007 ve sonrası kullanıcıların çok kullanacağı bir metod değildir. Özetle şunu diyebilirim ki, 2007 öncesi versiyonlarda aşırı formülden dolayı hesaplama zinciri bozulduysa ve F9 yaptığınız halde Excel hesaplama yapmıyorsa bu metod işe yarayacaktır. Ancak sanki tüm hücrelere formülleri tekrar girmek gibi iş yaptığı için CalculateFull'e göre biraz daha yavaştır.

Application.CalculationInterruptKey:
Hesaplamanın hangi tuşla iptal edileceğini söyler.
Bunun pratik kullanımı, Personal.xlsb'nin Workbook_Open makrosu içine yazma şeklindedir.
Ben şahsen sadece ESC tuşuna(xlEscKey) basıldığında hesaplamanın iptal edilmesini istiyorum, size de bunu öneririm. Zirâ, eliniz yanlışlıkla bir ok tuşuna değse bile o anda %90'larda olan hesaplama tekrar %0'dan başlayacaktır.

Genel öneriler
  • Önce normal Calculation yapın. Sonra durumu kontrol edin, hâlâ xlPendingse CalculateFull uygulayın.
  • Kod hızlandırıcılar bölümündeki 3 özelliğe bazen bu Calculation'ı da ekleyerek daha hızlı kod çalıştırabilirsiniz. Ancak kullanımı konusunda dikkatli olmak gerekir, zirâ arada bir yerlerde formül çekme/uzatma ve sonra Copy-Paste işlemi varsa Calculation sonucunda hatalı durumlar oluşabilir.
VBA:
Sub ExcelTurkey()
    AlertUpdatingEvent False, False, False
    Application.Calculation = xlCalculationManual
    'kodlar buraya gelir

    'arada bir açmak gerekebilir
    ActiveSheet.Calculate 'duruma göre Application.Calculate veya Range("...").Calculate
    If Application.CalculationState=xlPending then Application.CalculateFull
    'tekrar kapatalım
    Application.Calculation = xlCalculationManual
    'diğer kodlar

    'çıkışta tekrar eski haline getiriyoruz
    AlertUpdatingEvent True, True, True
    Application.Calculation = xlCalculationAutomatic
End Sub
Son olarak Calculate işlemlerinin VBA ve Excel ilişkilerini tekrar şöyle bir özetleyelim:

İşlem

Excel

VBA

Tüm Kitapları hesaplatmak

Calculation>Calculate(veya F9)

Application.Calculate

Aktif sayfayı hesaplatmak

Calculation>Calculate Sheet(Shift+F9)

ActiveSheet.Calculate

AktiveWorkbook hesaplatmak

-

Döngü içinde Sheet.Calculate

Belli bir Range'i hesaplatmak

-

Range.Calculate

Full hesaplama yapmak

Ctrl+Alt+F9

Application.CalculateFull



Calculation için örnek bir senaryo
Şimdi diyelim ki; departmanınızdaki kişilerin kullanması için çok sayfalı ve çok formüllü bir Excel dosyası hazırladınız. İlk sayfada tek sayfalık bir karne/skorkart tarzı bir şey var, diğer sayfalarda ise toplu listeler. Hepsi de datayı gizli bir sayfadan alıyor.

Liste sayfalarında çok fazla satır ve sütun ve hep ÇOKETOPLA tarzı formüller olduğu için bunlarda sort veya filter işlemleri çok ağır olmaktadır, zirâ bu iki işlem de Calculation tetikleycisidir.

Çözüm şöyle olabilir:
Dosyanın Workbook_Activate(Neden Workbook_Open olmadığını az sonra belirteceğim) olayında, dosya açılır açılmaz Calculation'ı xlManual yapan kodu ekledim, ve bir MsgBox ile bunu kullanıcıya bildiriyorum.(MsgBox sinir bozucu gelirse Statusbar'a da yazdırabilirsiniz). Karne sayfasına gelince ise Worksheet_Change eventine yazdığım kod ile sadece belli hücreler değiştiğinde hesaplama yapmasını sağlıyorum. Kullanıcı olur da o sırada başka dosyalarda işlem yapmak isterse Workbook_Deactivate olayına, hesaplamayı tekrar otomatik yapan bir kod yazdım ki, kullanıcı o sırada hesaplamanın kapatıldığını unutup diğer dosyalarda formül uzatma gibi işler yaparsa hep aynı sonucun yazdığını görüp şaşırmasın. Hatta ortalama bir kullanıcı Excelin Calculation özelliğinden bihaberdir bile diyebiliriz. Kodlar şöyle:
VBA:
Private Sub Workbook_Activate()
    Application.Calculation = xlCalculationManual
    Application.StatusBar = "Dosya aktive olduğu için Calculation yine geçici olarak Manuel yapıldı"
End Sub

Private Sub Workbook_Deactivate()
    Application.Calculation = xlCalculationAutomatic
    Application.StatusBar = "Başka dosyayı açtığınız için Calculation tekrar otomatik yapıldı"
End Sub
Application.Volatile metodu:
Standart Excel formülleri size yeterli gelmediğinde, Kullanıcı Tanımlı Fonksiyonlar olarak adlandırılan KTF UDF yazabilirsiniz, yani kendi fonksiyonlarını oluşturup hücrede kullanabilirsiniz.. Bazı standart fonksiyonların anlık yenilendiğini, yani; herhangi bir tetiklenme durumunda (hücreye gir çık yapma gibi) yeniden hesaplandığını görürsünüz, sizin de oluşturacağınız KTF'ler böyle bir durumda çalışsın isteyebilirsiniz, bu gibi durumlarda Application.Volatile metodunu kullanabilirsiniz.

Application.OnTime metodu:
Site boyunca zaman zaman programlanmış işlerden veya İngilizce tabiri ile işleri zamanlamadan bahsediyorum, mutlaka dikkatinizi çekmiştir. İşte bu işi bu harika metot ile başarıyorum. Genel kullanım şeklini aşağıda veriyorum ama bu konuyla ilgili uzunca bir örneğe sayfanın en altında ayrı bir bölüm ayırdım.

Şimdi metodun genel yazımına bakmadan önce görevini açıkça belirtelim: Bir prosedürün belirli bir anda çalışmasını sağlar, ki bu tanım bize onu asıl amacı dışında (ama faydamıza olacak şekilde) kullanacağımızı da söylemektedir, yani Wait ve Sleep metotları yerine. Bunlara da hemen bu metottan sonra değineceğiz.

ApplicationObject.OnTime(EarliestTime, ProcedureName, LatestTime, Schedule

Tam açıklaması şöyle oluyor; ProcedureName ismindeki makro EarlistTime'da başlasın, o sırada başka bir makro çalışıyorsa veya Excel'i meşgul eden başka bir şey varsa da LatestTime'a kadar çalıştırmayı denesin. Eğer LatestTime belirtilmezse, Excel'in meşguliyeti bitene kadar bekler ve sonra çalıştırır. Yani eğer, "Kod,programladığım saatten en geç 1 saat içinde çalışsın, yoksa çalışmasının bir anlamı yok, çünkü o rapor artık işe yaramaz olur" dediğiniz bir durum varsa bu parametreyi "EarliestTime + 1 Saat" olarak belirtebilirsiniz, aksi durumda boş bırakın. Schedule parametresi default değeri True'dur ve genelde yazılmaz, zamanladığınız bir prosedürü iptal etmek için bu değere False atarsınız.

Önemli Not: Excel'den her çıkış yaptığınızda, tüm schedule programı sonlanır. Eğer, tekrarlı yani bittikten sonra yeniden plânlanan programınız varsa Excel'i hep açık bırakmanız gerekir, ki benim bilgisayarımda olan budur, bence bu metottan verim almanın en güzel yolu onu tekrarlı bir şekilde kullanmaktır. Şimdi küçük bir örnek bakalım, siz sonra buradan daha detaylı örneği incelersiniz.

Örnek Kullanım
VBA:
Sub Ornek()
    Application.OnTime Now + TimeSerial(0, 0, 3), "Calistir" 'Asynhronous metottur
    MsgBox "beklemeden çalıştım"
End Sub
 
Sub Calistir()
    MsgBox "selam"
End Sub
Örnekte gördüğünüz üzere Calistir makrosunun çalıştırılacağı zamanı Run tuşuna bastıktan 3 sn sonra çalıştıracak şekilde parametrik verdim. Yani burada spesifik bir saat belirtmek yerine, şimdiye(Now) referansla bir saat de verebiliyoruz. Örnek gösterimler şöyle olabilir.
VBA:
Application.OnTime "22:30:00"
Application.OnTime Now + TimeValue("00:10:00") 'Şimdiden 10 dk sonra
Application.OnTime Now + TimeSerial(0,10,0) 'Bu da aynı. TimeSerial'de saat, dakika ve saniye virgülle ayrılır
Application.Wait metodu:
Programın belirli bir süre durmasını(beklemesini) sağlar. Peki neden? Neden programınızın bir süre durmasını bekleyesiniz ki? İşte örnek senaryolar olmayınca maalesef makro öğrenimi çok zor olmaktadır. Önce gelin nasıl kullanılacağına , sonra nedenine bakalım.

VBA:
Sub Bekle()
   Application.Wait (Now + TimeValue("0:00:10")) 'Synhronous metoddur
   MsgBox "bekleyip çalıştım"
   Call Mesaj
End Sub
 
Sub Mesaj()
    MsgBox "selam"
End Sub
Bu metot Boolean döndürdüğü için belirli bir zaman geçip geçmediğini kontrol etmek için de kullanılır.

VBA:
If Application.Wait(Now + TimeValue("0:00:10")) Then
    '10 sn geçtiyse. = True demeye gerek görmeyebiliyoruz, _
    önceki konuları hatırlayacak olursanız
    Application.Speech.Speak "Zaman doldu"
    'Evet, Excel 2013'ten itibaren artık konuşuyor
End If

Dosya ve Klasör işlemleri

Bazen kullanıcıdan, üzerinde işlem yapılacak bir dosya veya klasör seçmesini isteriz. Bazı durumlarda seçilen dosya ile sadece işlem yapılırken bazen dosyanın açılması sağlanır. Bu bölümde anlatılan konular genel olarak, seçilen dosyayı açma veya bir şekilde dosya/klasör ismi elde etme amacıyla kullanılan işlemlerle ilgilidir. Daha genel olarak tüm dosya işlemlerini şurada ele alıyor olacağız. Kullanıcıdan dosya/klasör bilgisi istemenin en ilkel yolu bunu bir InputBox'la sormak olacaktır, ancak şükür ki VBA'da bunu yapmamızı sağlayan daha iyi yöntemler var. Şimdi bunlara bakalım:

Application.FileDialog özelliği:
2002 yılında gelen bu özellik bundan daha önce var olan GetOpenFilename ve GetSaveAsFileName özelliklerinin gelişmiş halidir. O yüzden bu ikisinin artık çok kullanmaya gerek yok, ama başka kodlarda görmeniz durumunda ne olduğunu bilmeniz için onlara da kısaca değineceğiz. Bu özelliğin FileDialogType şeklinde tek bir parametresi vardır ve o da MsoFileDialogType sabitlerinden biri olabilir. Bunlar:

msoFileDialogFilePicker

Dosya seçtirir, path dahil tam ismini döndürür. (Örnek; C:\Hedefler\Satış\2016.xlsx)

msoFileDialogFolderPicker

Klasör seçtirir, path dahil tam ismini döndürür. (Örnek; C:\Hedefler\Satış)

msoFileDialogOpen

Açılacak dosyayı seçtirir. (onu açmaz, sadece seçtirir)

msoFileDialogSaveAs

Farklı Kaydet dialog kutusunu açar, dosyayı kayderken ismin ne olacağını girmenizi sağlar. (dosyayı kaydetmez,sadece isim ve adres belirlersiniz)



Örnek Kullanım
VBA:
Sub Dosyaislemlerim()
    Dim i As Byte, fd As FileDialog
     Set fd = Application.FileDialog(msoFileDialogFilePicker)
    With fd
          .AllowMultiSelect = True
          .Title = "Silinecek dosyaları seçin"
      .    Show
        For i = 1 To .SelectedItems.Count
            Kill .SelectedItems(i) 'buradaki kill metodunu sonra göreceğiz, şimdilik sadece sdosya silmeye yaradığını bilin
        Next
    End With
End Sub
Application.GetOpenFilename ve Application.GetSaveAsFilename:

Application.GetOpenFilename( FileFilter, FilterIndex, Title, ButtonText, MultiSelect )

Bunda FileDialog'da olduğu gibi bir nesne yaratmaya gerek yok, doğrudan kullanılabilir. Bundan dönen değer üç şey olabilir. Seçim yapılmadıysa False(Boolean) veya tek bir dosya seçim yapıldıysa dosyanın tam adını (path dahil) veren bir String ya da çoklu seçim yapıldıysa bir dizi. O yüzden dönüş tipi Variant'tır ve tanımlanırken de böyle tanımlanmalıdır.

Yine FileDialog'da olduğu gibi burada da doğrudan dosya açma veya kaydetme yok sadece dosya ismi elde edilir, sonrasında ayrı bir satırda dosya açma işlemi yapılır.

VBA:
Sub ExcelTurkey()
    Dim filtreler As String, başlık As String, dosya As Variant
    filtreler = "Excel dosysaları(*.xls*),*.xls*, Tüm dosylar (*.*),*.*"
    başlık = "Açılacak dosyayı seçin"
    dosya = Application.GetOpenFilename(filtreler, 5, başlık, , True)
    If IsArray(dosya) Then 'multi parametresini true belirlediğimiz için _
    öncelikle dizi olup olmadığını kontrol etmemiz lazım.
        For Each a In dosya
            Workbooks.Open (a)
        Next a
    Else
        If dosya = False Then
            MsgBox "seçim yapılmadı"
        Else
            Workbooks.Open dosya
        End If
    End If
End Sub

Diğer üyeler

Application.ActivateMicrosoftApp metodu:
Bu metot, başka bir MS Office uygulamasını açar. Eğer halihazırda ilgili uygulama açıksa onu aktive eder, yoksa yenisini yaratır ve açar. Ancak bunu bu şekilde doğrudan kullanmak yerine ilgili Office uygulamasını nesne olarak oluşturup onun Nesne modeline ulaşmak istemeniz durumunda ise (ki daha çok bu yöntemi kullanacaksınız) farklı bir yöntem kullanılır. Aşağıdaki örnek kodda Word uygulaması açılmakta.
VBA:
Application.ActivateMicrosoftApp xlMicrosoftWord
Application.OnKey metodu:
Excel, bir makroyu kaydederken bize bunu bir kısayol tuşuna atayıp atamayacağımız konusunda bir imkan sunar, ancak bunun bir sınırı vardır ki o da sadece Ctrl tuşunu kullanmak zorunda olmamızdır ve bu da bir noktadan sonra yetersiz kalmaya başlıyor. İşte bu noktada OnKey metodu yardıma koşuyor, bununla istediğiniz tuş kombinasyonlarına atama yapabiliyorsunuz ve bu tuşlara bastığınızda bir olay tetiklenmiş gibi istediğiniz makro çalışmaya başlıyor.

Bu tuş kombinasyonu, sadece mevcut Excel oturumunda geçerli olmaktadır. Excel, kapatılıp tekrar açıldıktan sonra kullanılamazlar. Süreklilik kazandırmak için bunları Personal.xlsb dosyanızın Workbook_Open makrosuna yazabilirsiniz.
VBA:
Private Sub Workbook_Open()
  Application.CalculationInterruptKey = xlEscKey
  Application.OnKey "+^{F}", "Calculationlar"
End Sub
Application.Version:
Bu özellikle Excel'in versiyonunu öğreniyoruz. Böylece kullanıcının Excel versiyonuna göre davranışımızı değiştirebiliyoruz. Mesela 2010 versiyonu ile birlikte gelen Slicer'larla ilgili bir işlemi 2007 ve öncesi kişilerde yapmaya çalışırsak hata alırız. Keza, Slicerlar 2010'da geldi ama sadece Özet tablolarda kullanılmak üzere gelmişti. Table'lar üzerinde kullanımı 2013 versiyonuyla geldi. Bu yüzden bir Table üzerinde Slicer kullanımı olacaksa yine hata alınır.
 
Son düzenleme:
Admin

Yorumlar

Üst Alt