Bir çalışma kitabında belirlenen bölgelerdeki verilerle oluşturulan serileri kitaba kitap grafiklerine eklemek, grafiklerin serileri üzerinde düzenlemeler yapmak.
Bir grafiği temsil eden Chart nesnesinin SeriesCollection özelliğinden grafiği oluşturan veri serilerinin koleksiyonuna erişebilirsiniz.
Bu özellik aslında SeriesCollection türünden bir koleksiyon nesnesidir.
SeriesCollection nesnesinin Add fonksiyonuyla koleksiyona yeni bir seri eklersiniz.
Bu fonksiyonun zorunlu Source argümanıyla ekleyeceğiniz serinin veri kaynak bölgesini temsil eden Range türü nesneyi iletirsiniz.
İsteğe bağlı RowCol argümanıyla verilerin sıralanma yönünü belirlersiniz. Bu argüman için XlRowCol adlandırılmış değer grubunun seçeneklerini kullanırsınız:
Veriler satırlar boyunca yatay sıralanmışsa, xlRows değerini atarsınız.
Veriler sütunlar boyunca dikey sıralanmışsa, xlColumns değerini atarsınız. Varsayılan değer budur.
İsteğe bağlı SeriesLabels argümanına True değeri atarsanız, yatay sıralanmış veriler bölgesinin ilk sütununda ya da dikey sıralanmış verilerin ilk satırında seri adlarının bulunduğunu belirtmiş olursunuz.
Bir sütun grafiğinde her bir grupta yanyana sıralanmış sütunlar bir seridir. Bir çizgi grafiğinde ise her çizgi bir seridir. Bir XY dağıtım grafiğinde aynı kaynaktan gelen her veri grubu ayrı bir seri sayılır.
Yine isteğe bağlı CategoryLabels argümanıyla yatay sıralanmış veriler bölgesinin ilk satırında ya da dikey sıralanmış verilerin ilk sütununda kategori adlarının bulunduğunu belirtmiş olursunuz.
Kategoriler bir sütun grafiğindeki sütun serisi gruplarıdır; örneğin, öncekş örnekteki sütun grafiği resminde holding adları o grafiğin kategorileriydi, sektör adları da serilerdi.
SeriesCollection nesnesinin Extend fonksiyonuyla koleksiyonda var olan serilere yeni veriler eklersiniz.
Zorunlu Source argümanıyla ekleyeceğiniz verilerin kaynak bölgesini iletirsiniz.
İsteğe bağlı RowCol argümanıyla verilerin sıralanma yönünü belirlersiniz.
Yine isteğe bağlı CategoryLabels argümanıyla ekaynak bölgede yeni verilerin yanında yeni kategori adlarının bulunduğunu belirtmiş olursunuz.
SeriesCollection nesnesinin her üyesi bir grafik serisini temsil eden Series türü bir nesnedir.
Series türü bir nesnenin Name özelliğiyle nesnenin temsil ettiği grafik serisinin adını öğrenir veya belirlersiniz.
Grafik verileri bölgesi tanımlanırken seri adları olarak kullanılacak etiketleri içeren bir satır ya da sütunu dahil etmemişseniz, seri adlarını bu özellik aracılığıyla siz belirlemelisiniz.
MarkerStyle özelliği veri noktalarını temsil eden simgeleri seçmek içindir.
Bu özelliği çizgi veya XY dağıtım grafiklerinde veri noktalarını belli etmek için kullanabilirsiniz. Bu özelliğe atayabileceğiniz XlMarkerStyle değer seçeneklerinden bazıları şunlardır:
xlMarkerStyleCircle daire simgesi
xlMarkerStyleDiamond elmas (baklava) simgesi
xlMarkerStylePlus artı simgesi
xlMarkerStyleSquare kare simgesi
xlMarkerStyleTriangle üçgen simgesi
xlMarkerStyleAutomatic seçeneğiyle simgenin otomatik seçileceğini bildirmiş olursunuz. Grafik türü olarak XlLineMarker (simgeli çizgi grafiği) gibi simgeli bir tür seçmişseniz, Excel programı her seriye otomatik bir simge atar.
xlMarkerStyleNone seçeneği simge olmayacağını belirtmek içindir ki simgeli olmayan bir grafik türü için bu seçenek geçerlidir.
MarkerSize özelliği veri noktalarını temsil eden simge boyutunu belirlemek içindir. Bu özelliğe 2’den 72’e kadar değişebilen, punto cinsi bir sayısal değer atarsınız.
MarkerForegroundColor ve MarkerBackgroundColor özellikleriyle simgenin dış çerçeve ve iç renklerini belirlersiniz. Bu özelliklere RGB fonksiyonuyla kırmızı-yeşil-mavi katkı oranlarını vererek oluşturduğunuz bir renk kombinezonu atarsınız.
Points özelliğinden seriyi oluşturan noktalar koleksiyonuna erişirsiniz. Bu özelliğe bir sıra numarası vererek de serideki belli bir noktaya erişirsiniz. Bunlar yalnızca okunur özelliklerdir; eriştiğiniz nokta üzerinde değişiklik yapamazsınız, ama noktanın X ve Y değerlerini ya da etiketini vb. öğrenebilirsiniz.
Smooth özelliğine True değer atamışsanız, serinin kırık çizgilerle değil, yumuşatılmış, yani düzgünleştirilmiş eğriler bir şekilde gözükmesini sağlarsınız.
Bir Worksheet nesnesi tanımlayın ve onunla verileri içeren sayfaya erişin:
Dim verisayfa As Worksheet
Set verisayfa = Me.Worksheets("Veriler")
Ekleyeceğiniz veya erişeceğiniz bir grafiği ve onun bir serisini temsil edecek nesneler tanımlayın:
Dim grafik As Chart
Dim seri As Series
Çalışma kitabına yeni bir grafik ekleyin ve bir tür (diyelim, sütun grafiği) seçin:
Set grafik = Me.Charts.Add
grafik.ChartType = xlColumnClustered
Charts koleksiyon özelliğinin Add fonksiyonuyla eklediğiniz yeni grafrik başlangıçta boş olmayabilir. O an aktif bir hücre vardıysa Excel o hücreden başlayan bir bölgeyi otomatik seçecek ve grafiği oradaki verilerle oluşturacaktır. Sizin oluşturmadığınız serleri SeriesCollection koleksiyonundan bir döngüyle sildirebilirsiniz:
Do Until grafik.SeriesCollection.Count = 0
grafik.SeriesCollection(1).Delete
Loop
Artık tam boş olan grafiğe kendi serilerinizi eklersiniz. Bir döngüyle birden fazla seri ekleyecekseniz, seri kaynaklarını ve adlarını döngü sayaç değişkenini kullanarak belirlemelisiniz:
For yil = 2010 To 2015
Set seri = grafik.SeriesCollection.Add( Source:=verisayfa.Range(sektoradi & "_" & yil), RowCol:=xlRows)
seri.Name = yil
Next yil
Grafiğin veri kaynak bölgesini Chart nesnesinin SetSourceData fonksiyonuyla belirlerseniz, otomatik eklenmiş seriler olsa bile onları silmenize gerek kalmaz:
grafik.SetSourceData Source:=verisayfa.Range(sektoradi & "_2010"), PlotBy:=xlColumns
Oluşturduğunuz grafiğin serilerine veriler eklemek için Extend fonksiyonunu kullanabilirsiniz:
grafik.SeriesCollection.Extend Source:=verisayfa.Range(sektoradi & "_" & yil), RowCol:=xlColumns, CategoryLabels:=False
Grafiğiniz için simgeli bir tür seçmişseniz, seriler için simge belirleyecek komutlara gerek kalmaz:
grafik.ChartType = xlLineMarkers
Öte yandan, simgeleri kendi isteğine göre düzenlemekte de serbestsiniz:
seri.MarkerStyle = xlMarkerStyleCircle
seri.MarkerSize = 15
seri.MarkerForegroundColor = RGB(0, 0, 0)
seri.MarkerBackgroundColor = RGB(255, 255, 0)
Aşağıda son halini sunduğumuz altyordam son iki örnektir kullandığımız hayali sektör verilerini içeren çalışma kitabı üzerinde çalışacaktır. Bu altyordam sektörlerin ve firmaların farklı yıllara ait verilerini ait oldukları bölgelerden alıp alıp yeni oluşturduğu grafiklerin serilerine ekliyor.
Altyordam önce her sektör için ayrı bir gruplu sütun grafiği oluşturuyor. Bu grafiklerde her firma ayrı bir kategori, her yılın verisi de ayrı bir seri olarak ejkleniyor. Bölece her sütun grubu belli bir firmanın o sektörde elde ettiği ciroların karşılaştırılmasını sağlıyor.
Yıllara göre değişen verilerin sütun gruplarıyla değil de çizgi serileriyle oluşturulması tabi ki daha doğru olur. Bu nedenle altyordamımız işlerine farklı firmalar için yıllık ciro değişimlerini gösteren çizgi grafikleri oluşturarak devam ediyor. Bu çizgi grafiklerinde her sektöre ait veriler ayrı bir seri olarak yer alıyor. Farklı yıllara ait veriler ayrık bölgelerde yer aldığı için çizgi grafiği için veriler ilk olarak 2010 verileri bölgesinden alınıyor ve ilk oluşturulan grafikteki veriler sonraki yılların verileriyle adım adım genişletiliyor.
Kaynak Dosya: “SerilerleGrafiklerOlusturmak.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 SerilerleGrafiklerOlusturmak()
Dim verisayfa As Worksheet
Set verisayfa = Me.Worksheets("Veriler")
Dim grafik As Chart
'Bu silme döngüsü önceki denemelerde eklenmiş olan fragik sayfalarını kaldırmak için.
'İlk iş olarak silme işlemleri uyarı mesajlarını kısa bir süre için askıya alıyoruz.
Application.DisplayAlerts = False
For Each grafik In Me.Charts
grafik.Delete
Next
Application.DisplayAlerts = True
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 sektoradi As String
Dim sektorno As Integer, yil As Integer
Dim seri As Series
For sektorno = 1 To UBound(SektorAdlari, 1)
sektoradi = SektorAdlari(sektorno, 1)
Set grafik = Me.Charts.Add
grafik.ChartType = xlColumnClustered
grafik.Name = sektoradi & "(Sütun)"
'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 grafik.SeriesCollection.Count = 0
grafik.SeriesCollection(1).Delete
Loop
'Artık tam boş olan grafiğe kendi serilerinizi eklersiniz.
For yil = 2010 To 2015
Set seri = grafik.SeriesCollection.Add( Source:=verisayfa.Range(sektoradi & "_" & yil), RowCol:=xlRows)
seri.Name = yil
Next yil
grafik.Axes(xlCategory).CategoryNames = FirmaAdlari
grafik.Axes(xlCategory).HasTitle = True
grafik.Axes(xlCategory).AxisTitle.Text = "Firmalar"
grafik.HasTitle = True
grafik.ChartTitle.Text = sektoradi & " Sektörü Yıllık Cirolar"
Next sektorno
Dim yilno As Integer, Yillar(6) As Integer
For yilno = 0 To 5
Yillar(yilno) = 2010 + yilno
Next yilno
For sektorno = 1 To UBound(SektorAdlari, 1)
sektoradi = SektorAdlari(sektorno, 1)
Set grafik = Me.Charts.Add
grafik.ChartType = xlLineMarkers
grafik.Name = sektoradi & "(Çizgi)"
'Grafiğin veri kaynak bölgesini belirlerseniz, ilk yaratıldığında
'otomatik bölge seçimiyle grafiğe eklenmiş olan seriler zaten kaybolacaktır.
grafik.SetSourceData Source:=verisayfa.Range(sektoradi & "_2010"), PlotBy:=xlColumns
grafik.HasTitle = True
grafik.ChartTitle.Text = sektoradi & " Sektörü Yıllık Cirolar"
'İlk yılın verilerine sonraki yıl verilerini kendiniz eklersiniz.
For yil = 2011 To 2015
grafik.SeriesCollection.Extend Source:=verisayfa.Range(sektoradi & "_" & yil), RowCol:=xlColumns, CategoryLabels:=False
Next yil
Dim serino As Integer
For serino = 1 To grafik.SeriesCollection.Count
grafik.SeriesCollection(serino).Name = FirmaAdlari(1, serino)
grafik.SeriesCollection(serino).MarkerSize = 10
Next serino
grafik.Axes(xlCategory).CategoryNames = Yillar
Next sektorno
'İş (ya da pislik) olsun diye, son eklenen grafiğin son serisinin simgelerini düzenleyelim:
Set seri = grafik.SeriesCollection(4)
seri.MarkerStyle = xlMarkerStyleCircle
seri.MarkerSize = 15
seri.MarkerForegroundColor = RGB(0, 0, 0)
seri.MarkerBackgroundColor = RGB(255, 255, 0)
seri.Smooth = True
End Sub
Aşağıdaki resimde son serisinde komutlarla düzenlemeler yapılan çizgi grafiğini görüyorsunuz:
Bu çözüm örneğinde bir sayfa bölgesindeki verilerin iki boyutlu bir diziye aktarılmasını da göstermiş olduk. “Joker tür” diyebileceğimiz Variant türünden tanımladığımız FirmaAdlari ve SektorAdlari değişkenlerine aynı adları verdiğimiz bölgelerin değerlerini aktardık:
Dim FirmaAdlari As Variant, SektorAdlari As Variant
FirmaAdlari = verisayfa.Range("FirmaAdlari").Value2
SektorAdlari = verisayfa.Range("SektorAdlari").Value2
Tabi, bu bölgelerin değeri deyince bölgelerin kapsadığı hücrelerde yer alan birden fazla değeri aktarmış olduk ki onlar da iki boyutlu bir dizi oluşturacaktı. Variant türünden tanımladığımız değişkenler de sonuca göre iki boyutlu dizi rolü almış oldular.
Açıklama satırlarında belirttiğimiz gibi, “FirmaAdlari” bölgesi bir satırın komşu dört hücresini kapsadığı için tek satırı, ama dört sütunu, “SektorAdlari” bölgesi ise bir sütunun komşu üç hücresini kapsadığı için üç satırı, ama tek sütunu olan iki boyutlu dizilere dönüştüler.
Bir sektörün adını alırken sektör sıra numarasını dizinin satır numarası olarak kullandık:
sektoradi = SektorAdlari(sektorno, 1)
Bir firma adını alırken de firma sıra numarasını dizinin sütun numarası olarak kullanacaktık:
firmaadi = FirmaAdlari(1, firmano)