Genel Bakış
ThisWorkbook (Application.ThisWorkbook), VBA kodunun içinde bulunduğu çalışma kitabını gösteren salt okunur bir özelliktir ve bir Workbook nesnesi döndürür. Başka bir kitap etkinleştirilse bile kod her zaman kendi kitabına başvurabilir; bu yüzden makro yazarken en güvenli başvuru yollarından biridir. Aynı ad, Proje Gezgini'ndeki ThisWorkbook kod modülünün de adıdır ve Workbook_ olayları bu modüle yazılır.
Makro çalıştıktan sonra Tutar sütunu doldurulur; örneğin ilk satırın tutarı 1.860,00, ikinci satırın tutarı 1.275,00 olur. Her satırda adet ile birim fiyat çarpılmıştır. Sayfaya ActiveWorkbook yerine ThisWorkbook üzerinden ulaşıldığı için, makro çalışırken başka bir kitap etkin olsa bile veriler doğru kitaba yazılır.
Kitaptaki sayfa sayısı 3, ilk sayfanın adı Satış Özeti olarak yazılır. ThisWorkbook ile ActiveWorkbook aynı kitabı gösteriyorsa B4 hücresinde DOĞRU sonucunu görürsünüz. Başka bir kitap etkinken makroyu çalıştırırsanız bu sınama Yanlış (False) döner; çünkü ThisWorkbook her zaman kodun bulunduğu kitaptır.
Örnekte Adet hücreleri başta boştur; kurulum makrosu bu hücrelere değer yazdığında Workbook_SheetChange olayı tetiklenir ve Tutar sütunu, adet ile birim fiyatın çarpımıyla dolar. Sayfaya elle bir adet girdiğinizde de aynı şey olur. Olay yordamı ThisWorkbook modülünde olduğu için kitaptaki her sayfa için çalışır; bu yüzden Sh.Name ile yalnızca Stok Takip sayfası işlenmiştir.
Söz dizimi
Özellik, Application nesnesine bağlıdır; Excel içinden çalışan kodda Application yazmak zorunlu değildir.
VBA
3 satır
Set kitap = Application.ThisWorkbook
' Kısa yazım (aynı sonucu verir)
Set kitap = ThisWorkbook
- Application (ifade): Application nesnesini temsil eden ifade; isteğe bağlıdır, yazılmazsa içinde bulunulan Excel uygulaması kullanılır.
- Dönüş değeri: Kodun bulunduğu çalışma kitabını gösteren bir Workbook nesnesi. Özellik salt okunurdur, yani ThisWorkbook değerine başka bir kitap atayamazsınız.
- Parametre: Özelliğin parametresi yoktur; sonrasında Worksheets, Names, Close gibi Workbook üyelerini nokta ile kullanırsınız.
ThisWorkbook ile ActiveWorkbook farkı
ActiveWorkbook, o anda ekranda etkin olan kitabı gösterir ve kullanıcı başka bir pencereye geçtiğinde değişir. ThisWorkbook ise makronun yazıldığı kitabı gösterir ve etkin pencere değişse de aynı kalır.- Tek kitapla çalışırken: İkisi çoğunlukla aynı kitabı gösterir.
- Birden çok kitap açıkken: Başka bir kitabı Workbooks.Open ile açıp etkinleştirdiğinizde ActiveWorkbook o kitaba geçer, ThisWorkbook ise makro kitabınız olarak kalır.
- Eklenti (.xlam) içinde: ThisWorkbook eklentinin kendi dosyasını gösterir; kullanıcının üzerinde çalıştığı kitap için ActiveWorkbook kullanılır.
Önemli üyeler ve kullanım yerleri
ThisWorkbook bir Workbook nesnesi döndürdüğü için o nesnenin tüm üyelerini kullanabilirsiniz:- Worksheets / Sheets: Kitaptaki sayfalara adla ya da sıra numarasıyla erişim sağlar.
- Names: Kitaptaki tanımlı adları verir.
- Name: Kitabın dosya adını verir.
- Saved: Kitapta kaydedilmemiş değişiklik olup olmadığını belirtir.
- Save, Close, Activate: Kitabı kaydeden, kapatan ya da etkinleştiren yöntemlerdir.
ThisWorkbook modülü ve olay yordamları
Visual Basic Düzenleyicisi'ni Alt+F11 ile açın; Proje Gezgini'nde (Project Explorer) Microsoft Excel Nesneleri > ThisWorkbook öğesine çift tıklayın. Kitap düzeyindeki olay yordamları bu modüle yazılır; standart modüle yazılırsa çalışmaz.- Workbook_Open: Kitap açıldığında çalışır.
- Workbook_BeforeClose: Kitap kapanmadan önce çalışır.
- Workbook_SheetChange: Kitaptaki herhangi bir sayfada hücre değeri değiştiğinde çalışır; değişen sayfa Sh, hücre aralığı Target parametresiyle gelir.
- Workbook_SheetSelectionChange: Herhangi bir sayfada seçim değiştiğinde çalışır.
1. Kendi kitabınızdaki sayfaya güvenle yazma
Satış listesinde her satırın tutarını adet ile birim fiyatı çarparak hesaplamak istiyorsunuz. Kodu Alt+F11 ile açtığınız Visual Basic Düzenleyicisi'nde Ekle (Insert) > Modül (Module) ile eklediğiniz standart modüle yapıştırın. Kod, hangi kitap etkin olursa olsun ThisWorkbook üzerinden kendi kitabındaki sayfaya ulaşır.
VBA
16 satır
Option Explicit
Sub TutarHesapla()
Dim ws As Worksheet
Dim son As Long, i As Long
' Etkin kitap ne olursa olsun, kodun bulunduğu kitaptaki sayfa alınır
Set ws = ThisWorkbook.Worksheets("Satış Özeti")
' A sütunundaki son dolu satırı bul
son = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
For i = 2 To son
ws.Cells(i, "E").Value = ws.Cells(i, "C").Value * ws.Cells(i, "D").Value
Next i
End Sub
ThisWorkbook
Formülünü incelemek için bir hücre seçin.| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | Ay | Ürün | Adet | Birim Fiyat | Tutar |
| 2 | Ocak | Defter | 120 | 15,50 | 1.860,00 |
| 3 | Ocak | Kalem | 300 | 4,25 | 1.275,00 |
| 4 | Şubat | Defter | 90 | 15,50 | 1.395,00 |
| 5 | Şubat | Dosya | 60 | 22,00 | 1.320,00 |
| 6 | Mart | Kalem | 250 | 4,25 | 1.062,50 |
| 7 | Mart | Klasör | 40 | 38,75 | 1.550,00 |
Satış ÖzetiExcelDepo v1.0.0
2. Kitap bilgilerini okuma ve ActiveWorkbook ile karşılaştırma
Aşağıdaki makro, ThisWorkbook'un döndürdüğü Workbook nesnesinden bilgi okur ve sonuçları B sütununa yazar. Kodu standart bir modüle yapıştırın. Son satırda Is işleciyle ThisWorkbook'un etkin kitapla aynı nesne olup olmadığı sınanır.
VBA
15 satır
Option Explicit
Sub KitapBilgisi()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Kontrol")
' Kitaptaki çalışma sayfası sayısı
ws.Range("B2").Value = ThisWorkbook.Worksheets.Count
' Kitaptaki ilk sayfanın adı
ws.Range("B3").Value = ThisWorkbook.Worksheets(1).Name
' ThisWorkbook ile etkin kitap aynı nesne mi?
ws.Range("B4").Value = (ThisWorkbook Is ActiveWorkbook)
End Sub
ThisWorkbook
Formülünü incelemek için bir hücre seçin.| A | B | |
|---|---|---|
| 1 | Kontrol | Sonuç |
| 2 | Çalışma sayfası sayısı | 3 |
| 3 | İlk sayfanın adı | Satış Özeti |
| 4 | ThisWorkbook etkin kitap mı? | DOĞRU |
KontrolExcelDepo v1.0.0
3. ThisWorkbook modülünde olay yordamı
Stok sayfasında Adet sütununa (B) değer girildiğinde Tutar sütununun (D) otomatik hesaplanmasını istiyorsunuz. Aşağıdaki kodu Proje Gezgini'nde ThisWorkbook öğesine çift tıklayıp açılan kod penceresine yapıştırın; olay yordamı kitaptaki tüm sayfalar için çalıştığından sayfa adı kontrol edilir. Kod, Tutar yazılırken olayın yeniden tetiklenmemesi için Application.EnableEvents özelliğini geçici olarak kapatır.
VBA
22 satır
Option Explicit
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim alan As Range
Dim hucre As Range
' Yalnızca Stok Takip sayfasındaki değişiklikler işlenir
If Sh.Name <> "Stok Takip" Then Exit Sub
Set alan = Intersect(Target, Sh.Range("B2:B11"))
If alan Is Nothing Then Exit Sub
On Error GoTo Bitir
Application.EnableEvents = False
For Each hucre In alan.Cells
Sh.Cells(hucre.Row, "D").Value = hucre.Value * Sh.Cells(hucre.Row, "C").Value
Next hucre
Bitir:
Application.EnableEvents = True
End Sub
ThisWorkbook
Formülünü incelemek için bir hücre seçin.| A | B | C | D | |
|---|---|---|---|---|
| 1 | Ürün | Adet | Birim Fiyat | Tutar |
| 2 | Çay Bardağı | 10 | 12,50 | 125,00 |
| 3 | Tabak Seti | 25 | 85,00 | 2.125,00 |
| 4 | Cezve | 8 | 47,90 | 383,20 |
Stok TakipExcelDepo v1.0.0
Kullanırken dikkat edin
- ThisWorkbook yalnızca kodun bulunduğu kitabı gösterir: Başka bir dosyayı yönetecekseniz onu bir Workbook değişkenine atayın (örneğin Workbooks koleksiyonundan ya da Workbooks.Open sonucundan). ThisWorkbook başka bir kitaba çevrilemez.
- Sayfa başvurularında ThisWorkbook kullanın: Worksheets ya da Range başvurusunu kitap belirtmeden yazarsanız Excel etkin kitabı kullanır. Birden çok kitap açıkken bu, verilerin yanlış kitaba yazılmasına yol açabilir. Kendi sayfalarınız için başvuruyu ThisWorkbook.Worksheets ile başlatmak güvenlidir.
- Eklentilerde davranış: Kod bir Excel eklentisinde (.xlam) çalışıyorsa ThisWorkbook eklenti dosyasının kendisidir; kullanıcının açık kitabı değildir. Kullanıcı kitabı için ActiveWorkbook kullanın ve işlemden önce null olup olmadığını denetleyin.
- Olay yordamlarının yeri: Workbook_Open, Workbook_SheetChange gibi olay yordamları yalnızca ThisWorkbook modülünde çalışır. Standart modüle yazılırsa sıradan bir yordam olur ve olay oluştuğunda tetiklenmez. Olayları dışarıdan çağırmak yerine içinde değişiklik yapan yordamlarda Application.EnableEvents özelliğini kapattıysanız hata durumunda da yeniden açtığınızdan emin olun.
- Kod adı ile ThisWorkbook: ThisWorkbook, Excel'in kitaba verdiği sabit kod adıdır ve sayfa kod adları (Sheet1 gibi) gibi kitap adından bağımsızdır. Kitabı yeniden adlandırsanız ya da farklı kaydetseniz de kod içindeki ThisWorkbook başvurusu çalışmaya devam eder.
- İlgili konular:
- ActiveWorkbook: Etkin çalışma kitabını döndüren özellik.
- Workbooks: Açık tüm kitapların koleksiyonu; Open ve Add yöntemleri.
- Workbook nesnesi: Name, Saved, Close, Save gibi kitap üyeleri.
- Worksheets ve Sheets: Kitaptaki sayfa koleksiyonları.
- Workbook_Open ve Workbook_SheetChange: ThisWorkbook modülündeki kitap olayları.
- Application.EnableEvents: Olayların geçici olarak kapatılması.
- ActiveSheet ve Me: Etkin sayfa ile içinde bulunulan modülün nesnesi.