Bir Excel çalışma sayfasına (gömülü) grafikler eklemek.
Bir çalışma sayfasını temsil eden Worksheet nesnesinin ChartObjects özelliği o sayfa üzerindeki grafik nesneleri, yani gömülü grafikler koleksiyonunu temsil eder.
ChartObjects özelliği aslında ChartObjects türünden bir koleksiyon nesnesidir.
ChartObjects özelliği aracılığıyla Add fonksiyonunu çağırarak sayfa üzerine yeni bir grafik nesnesi eklersiniz. Bu fonksiyona sırasıyla aşağıdaki argümanları sağlarsınız:
Left argümanı zorunlu olup, grafik kutusunun sol kenar konumunu belirlemek içindir. Sayfa sol kenarından uzaklığı punto cinsinden verirsiniz.
Top argümanı isteğe bağlı olup, grafik kutusunun üst konumunu belirlemek içindir. Sayfa üst kenarından uzaklığı punto cinsinden verirsiniz.
Width argümanı zorunlu olup, grafik kutusunun genişliğini belirlemek içindir. Punto cinsinden bir boyut değeri verirsiniz.
Height argümanı isteğe bağlı olup, grafik kutusunun yüksekliğini belirlemek içindir. Punto cinsinden bir boyut değeri atarsınız.
ChartObjects koleksiyonunun her bir üyesi sayfa üzerindeki bir grafik nesnesini temsil eden ChartObject türü bir nesnedir.
Sayfa üzerindeki bir grafik nesnesine, sayfayı temsil eden Worksheet nesnesinin ChartObjects özelliğine bir sıra numarası ekleyerek erişebilirsiniz.
Bir ChartObject nesnesi grafiğin kendisini değil, sayfaya gömülecek şekilde kutulanmış halini temsil eder. Bu kutu içerisindeki asıl grafiğe ChartObject nesnesinin Chart özelliğinden erişebilirsiniz.
Bu Chart özelliği üzerinde Chart türüne ait özellik ve davranışları kullanarak kutu içerisindeki grafiği düzenleyebilirsiniz.
ChartType özelliğiyle grafik türünü belirlersiniz.
ChartTitle özelliği aracılığıyla grafik başlığını düzenlersiniz.
HasTitle özelliğine True değeri atayarak grafiğin bir başlığı olmasını sağlarsınız.
Axes fonksiyonundan eksenlerden birine erişebilirsiniz.
SetSourceData fonksiyonuyla da grafiğin veri kaynağı bölgesini belirlersiniz.
Tabi SeriesCollection özelliğinden de grafiğin serilerine erişip onlar üzerinde düzenlemeler yapabilirsiniz..
ChartObject nesnesinin Visible özelliğiyle de sayfa üzerindeki grafik kutusunun görünürlüğünü düzenleyebilirsiniz. True/False değerlerinden birini alır ki varsayılan değer görünür olduğunu belirten ilkidir.
Bir Worksheet nesnesi tanımlayın ve onunla verileri içeren sayfaya erişin:
Dim verisayfa As Worksheet
Set verisayfa = Me.Worksheets("Veriler")
Grafik kutularını başka bir sayfaya yerleştirecekseniz, o sayfaya da bir başka Worksheet nesnesiyle erişebilirsiniz:
Dim grafiksayfa As Worksheet
Set grafiksayfa = Me.Worksheets("SütunGrafikleri")
Bir ChartObject nesnesi tanımlayarak sayfadaki bir grafik kutusuna erişebilirsiniz:
Dim grafikkutu As ChartObject
Yeni ekleyeceğiniz bir grafik kutusu için koordinatlar vermelisiniz. Bir döngüyle birden fazla kutu ekletecekseniz, kutuları alt alta mı, yan yana mı yerleştireceğinize karar verin ve koordinatları döngü sayacını kullanarak belirleyin:
For firmano = 1 To UBound(FirmaAdlari, 2)
Set grafikkutu = grafiksayfa.ChartObjects.Add(100, (firmano - 1) * 400, 450, 350)
…
Next firmano
Grafik türünü belirlerken, kutu içerisindeki grafiğe Chart özelliğinden erişmeniz gerekecektir:
grafikkutu.Chart.ChartType = xlColumnClustered
Grafiğe seriler eklemek istediğinizde de seriler koleksiyonuna yine bu Chart özelliğinden erişmelisiniz:
For yil = 2010 To 2015
Set seri = grafikkutu.Chart.SeriesCollection.Add( _
Source:=verisayfa.Range(firmaadi & "_" & yil), _
RowCol:=xlColumns)
seri.Name = yil
Next yil
Aşağıdaki altyordam yine hayali holdinglerin sektör cirolarını içeren çalışma kitabı üzerinde çalışıyor. Çalışma kitabına elle eklediğimiz üç ayrı grafik sayfasına gruplandırılmış sütun grafikleri, XY dağıtım grafikleri ve son olarak pasta grafikleri ekliyor.
Kaynak Dosya: "SayfalaraGrafiklerEklemek.xlsm"
Unutmayın; kitap veya ekran satırına sığmayan komut satırları alta sarkmış olabilir. Siz onları tek satır olarak yazacaksınız!
Sub SayfalaraGrafiklerEklemek()
Dim verisayfa As Worksheet
Set verisayfa = Me.Worksheets("Veriler")
Dim FirmaAdlari As Variant, SektorAdlari As Variant
'Aşağıdaki komutla "FirmaAdlari" bölgesindeki adların bir dizisini elde ederiz.
'Sonuç ad sayısı kadar sütunu ama tek satırı olan iki boyutlu bir dizidir.
FirmaAdlari = verisayfa.Range("FirmaAdlari").Value2
'Aşağıdaki komutla "SektorAdlari" bölgesindeki adların bir dizisini elde ederiz.
'Sonuç ad sayısı kadar satırı ama tek sütunu olan iki boyutlu bir dizidir.
SektorAdlari = verisayfa.Range("SektorAdlari").Value2
Dim grafiksayfa As Worksheet
'İlk olarak "SütunGrafikleri" sayfasına sütun grafikleri ekleyelim:
Set grafiksayfa = Me.Worksheets("SütunGrafikleri")
Dim grafikkutu As ChartObject
'Bu silme döngüsü önceki denemelerde eklenmiş olan grafik kutularını kaldırmak için.
For Each grafikkutu In grafiksayfa.ChartObjects
grafikkutu.Delete
Next
Dim firmaadi As String
Dim firmano As Integer, yil As Integer
Dim seri As Series
'Sütun grafiklerini firmaların yıllık sektör cirolarını birleştirerek oluşturacağız.
For firmano = 1 To UBound(FirmaAdlari, 2)
firmaadi = FirmaAdlari(1, firmano)
Set grafikkutu = grafiksayfa.ChartObjects.Add(100, (firmano - 1) * 400, 450, 350)
grafikkutu.Chart.ChartType = xlColumnClustered
'Grafik yarattığınızda aktif bir hücre vardıysa, yeni grafik
'o hücreden başlayan bir bölgedeki verilerle oluşturulur.
'O grafikte gözüken veri serilerini silmeniz gerekecektir.
Do Until grafikkutu.Chart.SeriesCollection.Count = 0
grafikkutu.Chart.SeriesCollection(1).Delete
Loop
'Artık tam boş olan grafiğe kendi serilerinizi eklersiniz.
For yil = 2010 To 2015
Set seri = grafikkutu.Chart.SeriesCollection.Add(Source:=verisayfa.Range(firmaadi & "_" & yil), RowCol:=xlColumns)
seri.Name = yil
Next yil
grafikkutu.Chart.Axes(xlCategory).CategoryNames = SektorAdlari
grafikkutu.Chart.Axes(xlCategory).HasTitle = True
grafikkutu.Chart.Axes(xlCategory).AxisTitle.Text = "Sektörler"
grafikkutu.Chart.HasTitle = True
grafikkutu.Chart.ChartTitle.Text = firmaadi & " Yıllık Cirolar"
Next firmano
'Şimdiyse "XYGrafikleri" sayfasına X-Y dağıtım grafikleri ekleyelim:
Set grafiksayfa = Me.Worksheets("XYGrafikleri")
'(Çizgi grafiklerinden nasıl farklı olduklarını görün diye yapıyoruz bunu)
'Bu silme döngüsü önceki denemelerde eklenmiş olan grafik kutularını kaldırmak için.
For Each grafikkutu In grafiksayfa.ChartObjects
grafikkutu.Delete
Next
Dim yilno As Integer, Yillar(6) As Integer
For yilno = 0 To 5
Yillar(yilno) = 2010 + yilno
Next yilno
Dim sektoradi As String, sektorno As Integer
'XY grafiklerini sektörlere göre yıllık ciroları birleştirerek oluşturacağız.
For sektorno = 1 To UBound(SektorAdlari, 1)
sektoradi = SektorAdlari(sektorno, 1)
Set grafikkutu = grafiksayfa.ChartObjects.Add(100, (sektorno - 1) * 400, 450, 350)
grafikkutu.Chart.ChartType = xlXYScatterLines 'Grafik serilerini 2010 yılı verileriyle oluşturalım.
grafikkutu.Chart.SetSourceData Source:=verisayfa.Range(sektoradi & "_" & 2010), PlotBy:=xlColumns
'Sonraki yılların verileriyle serileri genişletelim.
For yil = 2011 To 2015
grafikkutu.Chart.SeriesCollection.Extend Source:=verisayfa.Range(sektoradi & "_" & yil), RowCol:=xlColumns, CategoryLabels:=False
Next yil
Dim serino As Integer
For serino = 1 To grafikkutu.Chart.SeriesCollection.Count
grafikkutu.Chart.SeriesCollection(serino).Name = FirmaAdlari(1, serino)
grafikkutu.Chart.SeriesCollection(serino).MarkerSize = 10
grafikkutu.Chart.SeriesCollection(serino).XValues = Yillar
grafikkutu.Chart.SeriesCollection(serino).MarkerForegroundColor = RGB(0, 0, 0)
grafikkutu.Chart.SeriesCollection(serino).Format.Line.ForeColor.RGB = RGB(0, 0, 0)
Next serino
grafikkutu.Chart.Axes(xlCategory).CategoryNames = Yillar
grafikkutu.Chart.Axes(xlCategory).HasMajorGridlines = True
grafikkutu.Chart.Axes(xlCategory).MajorGridlines.Border.Color = RGB(155, 155, 200)
grafikkutu.Chart.Axes(xlCategory).MinimumScale = 2010
grafikkutu.Chart.Axes(xlCategory).MaximumScale = 2015
grafikkutu.Chart.Axes(xlValue).HasMajorGridlines = True
grafikkutu.Chart.Axes(xlValue).MajorGridlines.Border.Color = RGB(155, 155, 200)
grafikkutu.Chart.HasTitle = True
grafikkutu.Chart.ChartTitle.Text = sektoradi & " Sektörü Yıllık Cirolar"
Next sektorno
'Son olarak "PastaGrafikleri" sayfasına pasta grafikleri ekleyelim:
Set grafiksayfa = Me.Worksheets("PastaGrafikleri")
'Bu silme döngüsü önceki denemelerde eklenmiş olan grafik kutularını kaldırmak için.
For Each grafikkutu In grafiksayfa.ChartObjects
grafikkutu.Delete
Next
For yil = 2010 To 2015
'Pasta grafikleriyle her sektördeki paylaşımı yanyana göstereceğiz:
For sektorno = 1 To UBound(SektorAdlari, 1)
sektoradi = SektorAdlari(sektorno, 1)
Set grafikkutu = grafiksayfa.ChartObjects.Add((sektorno - 1) * 300, (yil - 2010) * 300, 275, 275)
grafikkutu.Chart.ChartType = xlPie
grafikkutu.Chart.SetSourceData Source:=verisayfa.Range(sektoradi & "_" & yil), PlotBy:=xlRows
grafikkutu.Chart.SeriesCollection(1).Name = yil & " Yılı " & sektoradi & " Ciroları"
grafikkutu.Chart.SeriesCollection(1).XValues = FirmaAdlari
grafikkutu.Chart.ApplyDataLabels (xlDataLabelsShowLabelAndPercent)
grafikkutu.Chart.HasLegend = False
Next sektorno
Next yil
End Sub
Çizgi grafiklerinden nasıl farklılaştıklarını göresiniz diye bu örnekte XY dağıtım grafiklerini eklemeyi gösterdik. Aşağıdaki resimde göreceğiniz gibi, bir XY grafiğinde veri noktalarını temsil eden simgeler x değerlerini gösteren yatay eksen tikleriyle hizalanmıştır. Halbuki çizgi grafiğinde simgeler kategori etiketleriyle hizalanmış olurlardı ki bu da yatay eksen tiklerinin arasında kaldıkları anlamına gelirdi.
XY dağıtım grafikleri eklerken bazı yeni özellikleri de kullandık. İlgilenecek kadar sabrınız varsa, buyrun, okuyun:
Grafikteki her seri için veri noktalarındaki değerlerin hangi X değerlerine karşılık geldiğini ayrıca belirtmemiz gerekti:
grafikkutu.Chart.SeriesCollection(serino).XValues = Yillar
Evet, bu örneğimizde her serinin her noktası 2010-2015 yıllarına ait verilerdi, yani X değerleri aynıydı, ama genel anlamda bir XY dağıtım grafiğinde veri noktaları hep aynı X değerleriyle gelmeyebilir.
XY grafiklerinde veri noktaları çizgilerle birleştirilsin diye grafik türünü
grafikkutu.Chart.ChartType = xlXYScatterLines
şeklinde belirledik.
Halbuki bir çizgi grafiğinde çizgiler zaten olurdu da, veri noktalarını gösteren simgeler de olsun diye xlLineMarkers türünü tercih etmemiz gerekirdi.
XY grafiklerinde çizgi rengini belirlemeyi de gösterdik. Bunun dolambaçlı bir yoldan yapıldığını anlamışsınızdır.
Bir seriyi temsil eden Series nesnesinin genel biçimlendirme özelliklerini Format özelliğinden belirlersiniz. Bu aslında ChartFormat türü bir nesnedir.
Format özelliğinden eriştiğiniz ChartFormat nesnesine ait Line özelliği seri çizgisini biçimlendirmek içindir. Bu özellik değeri de aslında LineFormat türünden bir nesnedir.
Line özelliğinden eriştiğiniz LineFormat nesnesinin ForeColor özelliğiyle de çizgi rengini belirleyebilirsiniz. Bu özellik değeri de aslında ColorFormat türü bir nesnedir. Biz bu nesnenin RGB özelliğine değer atarken çizgi rengini üç renk kombinezonuyla siyah olarak belirledik.
XY grafiklerinde yatay eksen başlangıç ve bitiş X değerlerini ekseni temsil eden Axis nesnesinin MinimumScale ve MaximumScale özelliklerini kullanarak, verilerin başlangıç ve bitiş yıllarını seçtik.
grafikkutu.Chart.Axes(xlCategory).MinimumScale = 2010
grafikkutu.Chart.Axes(xlCategory).MaximumScale = 2015
Nedense XY grafiğinin normalde gözükmeyen ana ölçek çizgilerini yine Axis nesnesinin HasMajorGridLines özelliğine True değer atayarak görünür kıldık:
grafikkutu.Chart.Axes(xlValue).HasMajorGridlines = True
Ölçek çizgilerini biçimlendirmek için ekseni temsil eden Axis nesnesinin MajorGridLines özelliğine eriştik.
Bu özellik değeri aslında GridLines türü bir nesnedir.
GridLines türünün Border özelliği ölçek çizgilerini birer kenarlık olarak temsil eder.
o Zaten tahmin etmişsinizdir; Border özelliği de Border türü bir nesnedir. Bunun da çizgi rengini belirmek için Color özelliği vardır. Biz ölçek çizgilerini bu özellik aracılığıyla renklendirdik:
grafikkutu.Chart.Axes(xlValue).MajorGridlines.Border.Color = RGB(155, 155, 200)
Oluşturduğumuz XY grafiklerinden birini aşağıda görüyorsunuz:
Bu örnek çözümdeki pasta grafikleriyle her yıl için üç ayrı sektörde elde edilen toplam cironun dört hayali holding arasında nasıl paylaşıldığını göstermiş olduk. Bunlardaki farklılıkları da kısaca özetleyelim:
Pasta grafik türü için yalnızca tek bir veri serisi vardır.
Serideki veri değerlerinin etiketlerini seriyi temsil eden Series nesnesinin XValues özelliğinden belirlersiniz. Bizim örneğimizde verilerin ait olduğu firma adları dizisini kullandık:
grafikkutu.Chart.SeriesCollection(1).XValues = FirmaAdlari
Pasta dilimlerinde veri değerini gösteren etiketler olsun diye kutu içerisindeki grafiği temsil eden Chart nesnesinin ApplyDataLabels fonksiyonunu kullanırsınız.
Bu fonksiyon argüman olarak XlDataLabelsType adlandırılmış değerler grubundan bir seçenek kabul eder. Bunlardan bazıları şunlardır:
xlDataLabelsShowLabel seçeneğiyle her dilim üzerinde dilimin temsil ettiği veri noktasının etiketinin gözükmesini sağlarsınız.
xlDataLabelsShowLabelAndPercent seçeneğiyle hem veri etiketinin, hem de verinin yüzdelik oranının görünmesini sağlarsınız. Biz örneğimizde bu seçeneği tercih ettik.
xlDataLabelsShowPercent seçeneğiyle veri değerinin yüzdelik oran olarak gözükmesini sağlarsınız.
xlDataLabelsShowValue seçeneği verinin kendi değerinin gözükmesi içindir.
xlDataLabelsShowNone seçeneği dilim üzerinde hiçbir bilgi gözükmemesi içindir ki normaldeki durum (galiba?) budur.
Oluşturduğumuz pasta grafiklerinden birkaçını aşağıda görüyorsunuz: