Özellik ikonu

ChartObjects

İndirme izni yok

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.

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.
ABCD
1AySatışGrafik AdıGrafik Sayısı
2Ocak12.500SatisGrafigi1
3Şubat14.200
4Mart16.850
5Nisan15.300
6Mayıs18.400
7Haziran19.750
Satış GrafiğiExcelDepo v1.0.0
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.

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.
ABCDEF
1ÜrünOcakŞubatMartGrafik AdıKonum
2Tişört12095140Grafik_OcakH2
3Pantolon8011090Grafik_ŞubatH12
4Ceket456070Grafik_MartH22
5Gömlek10085125
6Mont302515
Ürün GrafikleriExcelDepo v1.0.0
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.

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.
ABCDE
1PersonelSatışAlanGenişlikYerleşim
2Ayşe Yılmaz48.500G2:L143241
3Mehmet Demir37.250
4Fatma Kaya52.100
5Ali Çelik29.800
6Zeynep Arslan44.600
7Mustafa Şahin39.900
8Elif Aydın51.200
9Hasan Koç33.400
Personel SatışExcelDepo v1.0.0
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.

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
Örneklerdeki makroların tamamı indirilebilir Excel dosyasındadır (.xlsm). Dosyayı açtıktan sonra makroları etkinleştirin, ardından Alt + F11 ile Visual Basic Düzenleyicisi'nde kodları inceleyebilir ve Alt + F8 ile çalıştırabilirsiniz.
Yazar
ExcelDepo
İndirme sayısı
0
Gösterim
13
İlk yayın
Güncel

Puanlar

0.00 Oylama 0 İnceleme
Geri
Üst