Genel Bakış
ChartObjects (gömülü grafik koleksiyonu), bir çalışma sayfasının üzerindeki tüm gömülü grafikleri temsil eden VBA koleksiyonudur. Koleksiyondaki her öğe bir ChartObject nesnesidir. Yeni grafik eklemek, grafikleri saymak, ada ya da sıra numarasına göre bulmak, taşımak, boyutlandırmak ve silmek için kullanılır.
Add yöntemi yeni bir ChartObject döndürür. Oluşan grafik başlangıçta boştur. Veriyi bağlamak için Chart.SetSourceData çağrılır.
Ayrı bir grafik sayfası (Charts koleksiyonu) ChartObjects içinde yer almaz. Bu koleksiyon yalnızca çalışma sayfası üzerine yerleşmiş grafikleri kapsar.
Tek bir ChartObject için sık kullanılan özellikler:
Tüm grafikleri dolaşmak için For Each döngüsü, silme gibi koleksiyonu değiştiren işlemler için ise sondan başa doğru çalışan bir For döngüsü kullanılır.
Makro çalıştıktan sonra sayfada F2 hücresinden başlayan bir sütun grafiği oluşur. Grafiğin adı C2 hücresinde (SatisGrafigi), sayfadaki toplam gömülü grafik sayısı ise D2 hücresinde (1) görünür. Makroyu ikinci kez çalıştırırsanız aynı ad yeniden verilemeyeceği için hata alırsınız. Bunu önlemek için grafiği eklemeden önce aynı adlı grafiği silmeniz gerekir.
Makro H sütunundan başlayarak alt alta üç grafik oluşturur. E2 hücresine ilk grafiğin adı (Grafik_Ocak), F2 hücresine bu grafiğin sol üst köşesinin bulunduğu hücre (H2) yazılır. İkinci ve üçüncü grafiğin bilgileri sırasıyla Grafik_Şubat, H12 ve Grafik_Mart, H22 hücrelerindedir. Koleksiyon eklenme sırasına göre dolaşıldığı için satırlar grafiklerin oluşturulma sırasını izler.
Grafik G2:L14 aralığını kaplayacak biçimde yerleşir. C2 hücresi grafiğin yerleştirildiği aralığı (G2:L14), D2 hücresi grafiğin nokta cinsinden genişliğini (324), E2 hücresi ise Placement değerini (1) gösterir. xlMoveAndSize sabiti 1 değerindedir. Bu ayar sayesinde G:L sütunlarının genişliğini ya da 2:14 satırlarının yüksekliğini değiştirdiğinizde grafik de hücrelerle birlikte taşınır ve boyutlanır.
Söz dizimi
ChartObjects, Worksheet nesnesinin bir yöntemidir. Tek bir grafiği ya da tüm koleksiyonu döndürür. Yeni grafik eklemek için koleksiyonun Add yöntemi kullanılır.
VBA
3 satır
Set co = Worksheets("Sayfa1").ChartObjects(Index)
Set kol = Worksheets("Sayfa1").ChartObjects
Set co = Worksheets("Sayfa1").ChartObjects.Add(Left, Top, Width, Height)
- Index: İsteğe bağlıdır. Grafiğin adı (metin) ya da sıra numarasıdır (1'den başlar). Birden çok grafik için Array ile ad dizisi verilebilir. Belirtilmezse tüm koleksiyon döner.
- Left: Add için zorunludur. Grafiğin sayfanın sol kenarına uzaklığı, nokta (point) cinsinden.
- Top: Add için zorunludur. Grafiğin sayfanın üst kenarına uzaklığı, nokta cinsinden.
- Width: Add için zorunludur. Grafiğin genişliği, nokta cinsinden.
- Height: Add için zorunludur. Grafiğin yüksekliği, nokta cinsinden.
Add yöntemi yeni bir ChartObject döndürür. Oluşan grafik başlangıçta boştur. Veriyi bağlamak için Chart.SetSourceData çağrılır.
ChartObjects, ChartObject ve Chart farkı
Üç kavram birbirine karıştırılır:- ChartObjects: Sayfadaki tüm gömülü grafiklerin koleksiyonudur.
- ChartObject: Tek bir gömülü grafiğin kapsayıcısıdır. Konum, boyut ve ad gibi sayfa üzerindeki görünümü bu nesneyle yönetilir.
- Chart: Grafiğin içeriğidir. Grafik türü, seriler, başlık ve eksenler ChartObject.Chart özelliği üzerinden ayarlanır.
Ayrı bir grafik sayfası (Charts koleksiyonu) ChartObjects içinde yer almaz. Bu koleksiyon yalnızca çalışma sayfası üzerine yerleşmiş grafikleri kapsar.
Önemli özellikler
ChartObjects koleksiyonunun özellikleri:- Count: Sayfadaki gömülü grafik sayısını verir.
- Item: Ad ya da sıra numarasıyla tek bir grafik döndürür. Varsayılan üyedir, bu yüzden ChartObjects(1) yazmak yeterlidir.
- Left, Top, Width, Height: Koleksiyon düzeyinde okunup yazıldığında bütün grafikleri birlikte etkiler.
- Visible: Grafikleri gösterir ya da gizler.
Tek bir ChartObject için sık kullanılan özellikler:
- Name: Grafiğin adı. Sayfa içinde benzersiz olmalıdır.
- Chart: Grafik içeriğine erişim sağlar.
- Left, Top, Width, Height: Konum ve boyut (nokta).
- TopLeftCell, BottomRightCell: Grafiğin sol üst ve sağ alt köşesinin bulunduğu hücreler.
- Placement: Hücreler değişince grafiğin davranışı: xlMoveAndSize (1) taşı ve boyutlandır, xlMove (2) yalnız taşı, xlFreeFloating (3) sabit kal.
- Locked: Sayfa korunduğunda grafiğin kilitli olup olmadığını belirler.
Önemli yöntemler
Sık kullanılan yöntemler şunlardır:- Add: Belirtilen konum ve boyutta yeni grafik ekler.
- Delete: Koleksiyondaki tüm grafikleri ya da tek bir ChartObject nesnesini siler.
- Select: Grafiği seçer. Çoğu işlem seçmeden yapılabilir, bu yüzden gerekmedikçe kullanmayın.
- Copy: Grafiği panoya kopyalar.
- Activate: Tek bir grafiği etkinleştirir.
- BringToFront, SendToBack: Üst üste duran grafiklerin sırasını değiştirir.
Tüm grafikleri dolaşmak için For Each döngüsü, silme gibi koleksiyonu değiştiren işlemler için ise sondan başa doğru çalışan bir For döngüsü kullanılır.
1. Yeni gömülü grafik ekleme
Aylık satış tablosunun yanına sütun grafiği ekleyeceksiniz. Kodu bir standart modüle yapıştırın. Makro, F2 hücresinin konumuna grafik ekler, adını ve sayfadaki grafik sayısını C2 ile D2 hücrelerine yazar.
VBA
25 satır
Option Explicit
Sub GrafikEkle()
Dim ws As Worksheet
Dim co As ChartObject
Set ws = ActiveSheet
' F2 hücresinin konumuna 320x200 nokta boyutunda grafik ekle
Set co = ws.ChartObjects.Add(Left:=ws.Range("F2").Left, Top:=ws.Range("F2").Top, Width:=320, Height:=200)
co.Name = "SatisGrafigi"
' Grafiğin türünü, verisini ve başlığını ayarla
With co.Chart
.ChartType = xlColumnClustered
.SetSourceData Source:=ws.Range("A1:B7")
.HasTitle = True
.ChartTitle.Text = "Aylık Satışlar"
.HasLegend = False
End With
' Sonuçları sayfaya yaz
ws.Range("C2").Value = co.Name
ws.Range("D2").Value = ws.ChartObjects.Count
End Sub
ChartObjects
Formülünü incelemek için bir hücre seçin.| A | B | C | D | |
|---|---|---|---|---|
| 1 | Ay | Satış | Grafik Adı | Grafik Sayısı |
| 2 | Ocak | 12.500 | SatisGrafigi | 1 |
| 3 | Şubat | 14.200 | ||
| 4 | Mart | 16.850 | ||
| 5 | Nisan | 15.300 | ||
| 6 | Mayıs | 18.400 | ||
| 7 | Haziran | 19.750 |
Satış GrafiğiExcelDepo v1.0.0
2. Grafikleri döngüyle ekleme ve dolaşma
Her ay sütunu için ayrı bir grafik oluşturup bunları alt alta dizeceksiniz. Kodu bir standart modüle yapıştırın. Makro önce sayfadaki eski grafikleri siler, üç grafik ekler, ardından For Each ile koleksiyonu dolaşıp her grafiğin adını ve sol üst köşesinin bulunduğu hücreyi E ve F sütunlarına yazar.
VBA
35 satır
Option Explicit
Sub GrafikleriSirala()
Dim ws As Worksheet
Dim co As ChartObject
Dim k As Long
Set ws = ActiveSheet
' Koleksiyonu değiştirirken sondan başa doğru silin
For k = ws.ChartObjects.Count To 1 Step -1
ws.ChartObjects(k).Delete
Next k
' Her ay sütunu için bir grafik ekle
For k = 1 To 3
Set co = ws.ChartObjects.Add(ws.Range("H2").Left, ws.Range("H2").Top + (k - 1) * 170, 300, 160)
co.Name = "Grafik_" & ws.Cells(1, k + 1).Value
With co.Chart
.ChartType = xlColumnClustered
.SetSourceData Source:=Union(ws.Range("A1:A6"), ws.Range(ws.Cells(1, k + 1), ws.Cells(6, k + 1)))
.HasTitle = True
.ChartTitle.Text = ws.Cells(1, k + 1).Value & " Satışları"
.HasLegend = False
End With
Next k
' Koleksiyonu dolaşıp ad ve konumu yaz
k = 2
For Each co In ws.ChartObjects
ws.Cells(k, 5).Value = co.Name
ws.Cells(k, 6).Value = co.TopLeftCell.Address(False, False)
k = k + 1
Next co
End Sub
ChartObjects
Formülünü incelemek için bir hücre seçin.| A | B | C | D | E | F | |
|---|---|---|---|---|---|---|
| 1 | Ürün | Ocak | Şubat | Mart | Grafik Adı | Konum |
| 2 | Tişört | 120 | 95 | 140 | Grafik_Ocak | H2 |
| 3 | Pantolon | 80 | 110 | 90 | Grafik_Şubat | H12 |
| 4 | Ceket | 45 | 60 | 70 | Grafik_Mart | H22 |
| 5 | Gömlek | 100 | 85 | 125 | ||
| 6 | Mont | 30 | 25 | 15 |
Ürün GrafikleriExcelDepo v1.0.0
3. Grafiği ada göre bulup aralığa sığdırma
Personel satış tablosunun yanına çubuk grafik yerleştirip G2:L14 aralığını tam kaplamasını sağlayacaksınız. Kodu bir standart modüle yapıştırın. Makro grafiği ekler, sonra ChartObjects içinden adıyla çağırıp konum ve boyutunu aralığa eşitler. Aralık adresini C2, grafik genişliğini D2, yerleşim değerini E2 hücresine yazar.
VBA
40 satır
Option Explicit
Sub GrafigiAraligaSigdir()
Dim ws As Worksheet
Dim co As ChartObject
Dim hedef As Range
Set ws = ActiveSheet
Set hedef = ws.Range("G2:L14")
' Aynı adlı grafik varsa hata vermemesi için önce sil
On Error Resume Next
ws.ChartObjects("PersonelGrafigi").Delete
On Error GoTo 0
' Grafiği ekle ve veriye bağla
Set co = ws.ChartObjects.Add(0, 0, 100, 100)
co.Name = "PersonelGrafigi"
With co.Chart
.ChartType = xlBarClustered
.SetSourceData Source:=ws.Range("A1:B9")
.HasTitle = True
.ChartTitle.Text = "Personel Satışları"
.HasLegend = False
End With
' Grafiği ada göre koleksiyondan çağırıp aralığa sığdır
With ws.ChartObjects("PersonelGrafigi")
.Left = hedef.Left
.Top = hedef.Top
.Width = hedef.Width
.Height = hedef.Height
.Placement = xlMoveAndSize
End With
' Sonuçları sayfaya yaz
ws.Range("C2").Value = hedef.Address(False, False)
ws.Range("D2").Value = Round(ws.ChartObjects("PersonelGrafigi").Width, 0)
ws.Range("E2").Value = ws.ChartObjects("PersonelGrafigi").Placement
End Sub
ChartObjects
Formülünü incelemek için bir hücre seçin.| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | Personel | Satış | Alan | Genişlik | Yerleşim |
| 2 | Ayşe Yılmaz | 48.500 | G2:L14 | 324 | 1 |
| 3 | Mehmet Demir | 37.250 | |||
| 4 | Fatma Kaya | 52.100 | |||
| 5 | Ali Çelik | 29.800 | |||
| 6 | Zeynep Arslan | 44.600 | |||
| 7 | Mustafa Şahin | 39.900 | |||
| 8 | Elif Aydın | 51.200 | |||
| 9 | Hasan Koç | 33.400 |
Personel SatışExcelDepo v1.0.0
Kullanırken dikkat edin
- Yalnızca çalışma sayfaları için geçerlidir: ChartObjects bir çalışma sayfası nesnesinin yöntemidir. Etkin sayfa bir grafik sayfasıysa ActiveSheet.ChartObjects hata verir. Kodda sayfayı Worksheets("Sayfa1") gibi açıkça belirtmek daha güvenlidir.
- Eklenen grafik başlangıçta boştur: ChartObjects.Add yalnızca boş bir grafik kapsayıcısı oluşturur. Grafik türünü ChartType ile, veriyi SetSourceData ile açıkça belirtin. Aksi halde grafik boş kalır.
- Konum ve boyut nokta cinsindendir: Left, Top, Width ve Height değerleri hücre sayısı değil, nokta (point) cinsindendir. Grafiği hücreye hizalamak için ilgili Range nesnesinin aynı adlı özelliklerini kullanın.
- Silerken sondan başa doğru ilerleyin: Tek tek silme yapan döngüde For k = ws.ChartObjects.Count To 1 Step -1 biçimini kullanın. Koleksiyon sıfırsa ChartObjects(1) çağrısı "dizin sınır dışında" hatası verir, bu yüzden önce Count değerini kontrol edin. Koleksiyon düzeyindeki Delete ise sayfadaki tüm gömülü grafikleri siler, kullanırken dikkatli olun.
- Ad benzersiz olmalıdır: Aynı sayfada iki grafiğe aynı ad verilemez. Koda adla erişeceğiniz grafiklere anlamlı ve benzersiz adlar verin. Grafik adlarını sayfadaki Giriş > Düzenleme > Bul ve Seç > Seçim Bölmesi (Home > Editing > Find & Select > Selection Pane) üzerinden de görebilirsiniz.
- Seçmeden çalışın: Grafik üzerinde işlem yapmak için Select ya da Activate çağırmak gerekmez. ChartObjects("Ad").Chart üzerinden doğrudan çalışmak hem daha hızlı hem daha kararlıdır.
- Shapes.AddChart2 ile ilişkisi: Excel 2013 ve sonrasında Shapes.AddChart2 yöntemiyle stilli grafik eklenebilir. Bu yolla eklenen grafik de sayfanın ChartObjects koleksiyonunda görünür. ChartObjects.Add ise tüm sürümlerde çalışan, daha sade bir yöntemdir.
- İlgili konular:
- ChartObject: Koleksiyondaki tek bir gömülü grafik nesnesi
- Chart: Grafiğin içeriği; tür, başlık, seriler ve eksenler
- SetSourceData: Grafiğin veri kaynağını belirleyen yöntem
- Shapes.AddChart2: Stilli grafik ekleme yöntemi
- SeriesCollection: Grafikteki veri serilerinin koleksiyonu
- Worksheet: ChartObjects yöntemini barındıran sayfa nesnesi
- Range.Left, Range.Top: Hücrenin sayfadaki konumunu nokta cinsinden verir
- For Each ... Next: Koleksiyonları dolaşan döngü yapısı
- Giriş > Düzenleme > Bul ve Seç > Seçim Bölmesi: Grafik adlarını görüntüleme