Genel Bakış
Shapes (Şekiller koleksiyonu), bir çalışma sayfasının üzerinde yüzen tüm çizim nesnelerini (şekil, metin kutusu, resim, çizgi, grup, düğme, grafik) tutan VBA koleksiyonudur. Worksheet.Shapes ile ulaşılır; nesne eklemenizi, ada ya da sıraya göre bulmanızı, biçimlendirmenizi, hücrelere göre konumlandırmanızı ve silmenizi sağlar.
Bir şekle ad ya da sıra numarasıyla erişirsiniz. Sıra numarası 1'den başlar ve şeklin üst üste dizilim (z-order) sırasını gösterir:
Şekiller hücrelerin içinde değil, hücrelerin üstündeki ayrı bir katmanda durur. Bu yüzden Left, Top, Width ve Height değerleri nokta (point) cinsindendir. Bir şekli hücreye hizalamak için hücrenin Left ve Top özelliklerini kullanın.
Makro önce sayfadaki eski şekilleri siler, sonra üç şekil ekler. Koleksiyon eklenme sırasıyla dolaşıldığı için ilk satıra Baslik_Kutusu, ikinci satıra Yuvarlak_Isaret, üçüncü satıra Not_Kutusu yazılır. B sütunu AutoShapeType kodudur: dikdörtgen için 1, oval için 9, yuvarlatılmış dikdörtgen için 5. Son satırda Toplam etiketinin yanında Shapes.Count sonucu (3) görünür.
Makro, stok değeri 20'nin altındaki ürünlere kırmızı, diğerlerine yeşil daire ekler. Daireler E sütunundaki ilgili satırın hücresine hizalanır ve Placement özelliği xlMove yapıldığı için satır yüksekliği değişince boyutları bozulmaz. Defter satırında durum Kritik, Kalem satırında Yeterli olarak yazılır. D sütununda her dairenin adı görünür; örneğin ilk daire Durum_2 adını taşır. Bu adlar sayesinde daireleri sonradan ws.Shapes("Durum_2") gibi çağırabilirsiniz.
Şekiller hücre kenarına hizalandığı için Kutu_1 şeklinin sol üst köşesi G2 hücresinde bulunur; sağ alt köşe ise H3 hücresine denk gelir. Diğer iki şekil için aynı bilgi sırasıyla G5 - H6 ve G8 - H9 olarak yazılır. Üç şekil gruplandıktan sonra tek bir nesne gibi davranır: Kutu_Grubu grubu G2 ile H9 arasındaki alanı kaplar ve 3 öğe içerir. Grup oluşunca tekil adlarla (Shapes("Kutu_1")) erişim kalkar; öğelere GroupItems üzerinden ulaşırsınız.
Shapes nedir
Shapes, bir Worksheet nesnesinin Shapes özelliğinden ulaşılan koleksiyondur. Koleksiyonun her öğesi bir Shape nesnesidir: otomatik şekiller (dikdörtgen, oval, ok), metin kutuları, çizgiler, resimler, gruplar, form denetimleri (düğme, onay kutusu), ActiveX denetimleri, grafikler ve not (açıklama) kutuları bu koleksiyonda yer alır. Bu nedenle Shapes.Count yalnız sizin çizdiğiniz şekilleri değil, sayfadaki tüm bu nesneleri sayar.Bir şekle ad ya da sıra numarasıyla erişirsiniz. Sıra numarası 1'den başlar ve şeklin üst üste dizilim (z-order) sırasını gösterir:
VBA
3 satır
Set s = ws.Shapes("Baslik_Kutusu") ' ada göre
Set s = ws.Shapes(1) ' sıraya göre
n = ws.Shapes.Count ' koleksiyondaki nesne sayısı
Söz dizimi
Yeni nesne eklemek için koleksiyonun Add... yöntemlerini kullanırsınız. En sık kullanılan yöntem AddShape'dir ve eklenen Shape nesnesini döndürür:
VBA
3 satır
Set shp = ws.Shapes.AddShape(Type, Left, Top, Width, Height)
Set tb = ws.Shapes.AddTextbox(Orientation, Left, Top, Width, Height)
Set ln = ws.Shapes.AddLine(BeginX, BeginY, EndX, EndY)
- Type: Şeklin türü (MsoAutoShapeType sabiti); zorunludur. Sık kullanılanlar: msoShapeRectangle (1, dikdörtgen), msoShapeDiamond (4, eşkenar dörtgen), msoShapeRoundedRectangle (5, yuvarlatılmış dikdörtgen), msoShapeOval (9, oval), msoShapeRightArrow (33, sağ ok).
- Left: Şeklin sol kenarının sayfanın sol kenarına uzaklığı, nokta cinsinden; zorunludur.
- Top: Şeklin üst kenarının sayfanın üst kenarına uzaklığı, nokta cinsinden; zorunludur.
- Width: Şeklin genişliği, nokta cinsinden; zorunludur.
- Height: Şeklin yüksekliği, nokta cinsinden; zorunludur.
- Orientation: Metin kutusunun yönü (msoTextOrientationHorizontal yatay); AddTextbox için zorunludur.
- BeginX, BeginY, EndX, EndY: Çizginin başlangıç ve bitiş koordinatları; AddLine için zorunludur.
Önemli özellikler
Shapes koleksiyonunun ve Shape nesnesinin sık kullanılan özellikleri:- Shapes.Count: Sayfadaki toplam nesne sayısı.
- Name: Şeklin adı; değiştirilebilir ve sayfada benzersiz olmalıdır.
- Type: Nesnenin genel türü; örneğin msoAutoShape (1), msoGroup (6), msoFormControl (8), msoPicture (13), msoTextBox (17).
- AutoShapeType: Otomatik şeklin biçim kodu (dikdörtgen, oval vb.).
- Left, Top, Width, Height: Konum ve boyut, nokta cinsinden.
- TopLeftCell, BottomRightCell: Şeklin sol üst ve sağ alt köşesinin bulunduğu hücre (Range nesnesi).
- Placement: Hücreler taşınınca ya da boyutlanınca şeklin davranışı: xlMoveAndSize (taşı ve boyutlandır), xlMove (yalnız taşı), xlFreeFloating (sabit kal).
- Fill, Line: Dolgu ve çizgi biçimi; örneğin Fill.ForeColor.RGB ve Line.Visible.
- TextFrame2.TextRange.Text: Şeklin içindeki metin.
- OnAction: Şekle tıklanınca çalışacak makronun adı.
- Visible: Şekli gösterir ya da gizler.
- AlternativeText: Erişilebilirlik için alternatif metin.
Önemli yöntemler ve olaylar
- AddShape, AddTextbox, AddLine, AddPicture, AddConnector: Yeni nesne ekler.
- Shapes.Range(Array(...)): Birden çok şekli ad ya da sıra dizisiyle bir ShapeRange olarak toplar; toplu biçimlendirme, hizalama ve Group için kullanılır.
- Group, Ungroup: Şekilleri gruplar ya da grubu çözer. Grubun içindekilere GroupItems ile ulaşırsınız.
- Delete: Şekli siler. Tüm şekilleri döngüyle silerken koleksiyonu sondan başa doğru dolaşın.
- Copy, Cut, Duplicate: Şekli panoya kopyalar, keser ya da çoğaltır.
- ZOrder: Şeklin üst üste sırasını değiştirir (öne getir, arkaya gönder).
- IncrementLeft, IncrementTop, ScaleWidth, ScaleHeight: Şekli göreli olarak kaydırır ya da ölçekler.
- SelectAll: Sayfadaki tüm nesneleri seçer; kodda seçmek çoğunlukla gereksizdir.
1. Şekil ekleme ve koleksiyonu listeleme
Aşağıdaki makro, sayfaya üç şekil ekler, her birine ad verir ve koleksiyonu For Each ile dolaşarak adlarını, kodlarını ve ölçülerini tabloya yazar. Kodu standart bir modüle (Ekle > Modül, Insert > Module) yapıştırın.
VBA
38 satır
Option Explicit
Sub SekilleriEkleVeListele()
Dim ws As Worksheet
Dim shp As Shape
Dim i As Long
Dim satir As Long
Set ws = ThisWorkbook.Worksheets("Nesne Listesi")
' Tekrar çalıştırmada eski şekilleri sondan başa doğru sil
For i = ws.Shapes.Count To 1 Step -1
ws.Shapes(i).Delete
Next i
' AddShape(Tür, Sol, Üst, Genişlik, Yükseklik)
Set shp = ws.Shapes.AddShape(msoShapeRectangle, 360, 20, 120, 40)
shp.Name = "Baslik_Kutusu"
Set shp = ws.Shapes.AddShape(msoShapeOval, 360, 80, 80, 80)
shp.Name = "Yuvarlak_Isaret"
Set shp = ws.Shapes.AddShape(msoShapeRoundedRectangle, 360, 180, 140, 50)
shp.Name = "Not_Kutusu"
' Koleksiyonu dolaş ve bilgileri tabloya yaz
satir = 2
For Each shp In ws.Shapes
ws.Cells(satir, 1).Value = shp.Name
ws.Cells(satir, 2).Value = shp.AutoShapeType
ws.Cells(satir, 3).Value = shp.Left
ws.Cells(satir, 4).Value = shp.Top
ws.Cells(satir, 5).Value = shp.Width
satir = satir + 1
Next shp
' Toplam nesne sayısı
ws.Cells(satir, 1).Value = "Toplam"
ws.Cells(satir, 2).Value = ws.Shapes.Count
End Sub
Shapes
Formülünü incelemek için bir hücre seçin.| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | Şekil Adı | Otomatik Şekil Türü | Sol | Üst | Genişlik |
| 2 | Baslik_Kutusu | 1 | 360 | 20 | 120 |
| 3 | Yuvarlak_Isaret | 9 | 360 | 80 | 80 |
| 4 | Not_Kutusu | 5 | 360 | 180 | 140 |
| 5 | Toplam | 3 |
Nesne ListesiExcelDepo v1.0.0
2. Hücreye hizalı durum göstergeleri
Stok tablosunda her ürünün yanındaki hücreye, stok düzeyine göre kırmızı ya da yeşil bir daire eklenir. Daire, hücrenin Left ve Top değerleriyle hizalanır. Kodu standart bir modüle yapıştırın.
VBA
38 satır
Option Explicit
Sub DurumIsiklariEkle()
Dim ws As Worksheet
Dim shp As Shape
Dim hedef As Range
Dim satir As Long
Dim sonSatir As Long
Dim i As Long
Set ws = ThisWorkbook.Worksheets("Durum Panosu")
' Daha önce eklenen Durum_ ile başlayan şekilleri sil
For i = ws.Shapes.Count To 1 Step -1
If Left(ws.Shapes(i).Name, 6) = "Durum_" Then ws.Shapes(i).Delete
Next i
sonSatir = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
For satir = 2 To sonSatir
' Dairenin konulacağı hücre (E sütunu)
Set hedef = ws.Cells(satir, 5)
Set shp = ws.Shapes.AddShape(msoShapeOval, hedef.Left + 4, hedef.Top + 2, hedef.Height - 4, hedef.Height - 4)
shp.Name = "Durum_" & satir
shp.Line.Visible = msoFalse
shp.Placement = xlMove
If ws.Cells(satir, 2).Value < 20 Then
shp.Fill.ForeColor.RGB = RGB(192, 0, 0)
ws.Cells(satir, 3).Value = "Kritik"
Else
shp.Fill.ForeColor.RGB = RGB(0, 150, 0)
ws.Cells(satir, 3).Value = "Yeterli"
End If
ws.Cells(satir, 4).Value = shp.Name
Next satir
End Sub
Shapes
Formülünü incelemek için bir hücre seçin.| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | Ürün | Stok | Durum | Şekil Adı | Gösterge |
| 2 | Kalem | 45 | Yeterli | Durum_2 | |
| 3 | Defter | 12 | Kritik | Durum_3 | |
| 4 | Silgi | 80 | Yeterli | Durum_4 | |
| 5 | Dosya | 8 | Kritik | Durum_5 | |
| 6 | Zımba | 25 | Yeterli | Durum_6 | |
| 7 | Ataç Kutusu | 19 | Kritik | Durum_7 |
Durum PanosuExcelDepo v1.0.0
3. Konumu okuma ve şekilleri gruplama
Makro, G2, G5 ve G8 hücrelerine birer dikdörtgen yerleştirir, her şeklin kapladığı hücre aralığını TopLeftCell ve BottomRightCell ile okur, ardından üç şekli Shapes.Range ile gruplar. Kodu standart bir modüle yapıştırın.
VBA
45 satır
Option Explicit
Sub SekilleriKonumlandirVeGrupla()
Dim ws As Worksheet
Dim shp As Shape
Dim grp As Shape
Dim hucre As Range
Dim i As Long
Dim satir As Long
Set ws = ThisWorkbook.Worksheets("Konum Tablosu")
' Eski şekilleri temizle
For i = ws.Shapes.Count To 1 Step -1
ws.Shapes(i).Delete
Next i
' G2, G5 ve G8 hücrelerine hizalı üç dikdörtgen ekle
For i = 1 To 3
Set hucre = ws.Cells(2 + (i - 1) * 3, 7)
Set shp = ws.Shapes.AddShape(msoShapeRectangle, hucre.Left, hucre.Top, 90, 30)
shp.Name = "Kutu_" & i
shp.TextFrame2.TextRange.Text = "Kutu " & i
Next i
' Her şeklin konum bilgisini tabloya yaz
For i = 1 To 3
Set shp = ws.Shapes("Kutu_" & i)
satir = i + 1
ws.Cells(satir, 1).Value = shp.Name
ws.Cells(satir, 2).Value = shp.TopLeftCell.Address(False, False)
ws.Cells(satir, 3).Value = shp.BottomRightCell.Address(False, False)
ws.Cells(satir, 4).Value = shp.Width
Next i
' Üç şekli grupla
Set grp = ws.Shapes.Range(Array("Kutu_1", "Kutu_2", "Kutu_3")).Group
grp.Name = "Kutu_Grubu"
ws.Cells(5, 1).Value = grp.Name
ws.Cells(5, 2).Value = grp.TopLeftCell.Address(False, False)
ws.Cells(5, 3).Value = grp.BottomRightCell.Address(False, False)
ws.Cells(5, 4).Value = grp.Width
ws.Cells(6, 2).Value = grp.GroupItems.Count
End Sub
Shapes
Formülünü incelemek için bir hücre seçin.| A | B | C | D | |
|---|---|---|---|---|
| 1 | Şekil | Sol Üst Hücre | Sağ Alt Hücre | Genişlik |
| 2 | Kutu_1 | G2 | H3 | 90 |
| 3 | Kutu_2 | G5 | H6 | 90 |
| 4 | Kutu_3 | G8 | H9 | 90 |
| 5 | Kutu_Grubu | G2 | H9 | 90 |
| 6 | Gruptaki öğe sayısı | 3 |
Konum TablosuExcelDepo v1.0.0
Kullanırken dikkat edin
- Koleksiyona yalnız şekiller girmez: Shapes.Count grafikleri, resimleri, form denetimlerini ve hücre notlarının kutularını da sayar. Tüm şekilleri silen bir döngü yazarsanız sayfadaki grafikleri ve düğmeleri de silersiniz. Güvenli olmak için silmeden önce Type değerini ya da adın başlangıcını kontrol edin.
- Silerken sondan başa dolaşın: Döngüde şekil silerken For i = ws.Shapes.Count To 1 Step -1 kullanın. Baştan sona giderseniz her silmede sıra numaraları kayar ve bazı şekiller atlanır.
- Olmayan şekil hata verir: Var olmayan bir ada başvurmak 1004 numaralı çalışma zamanı hatasına yol açar. Ad değiştirdiyseniz kodu da güncelleyin; ad kontrolü gerekiyorsa koleksiyonu For Each ile dolaşıp adı karşılaştırın.
- Ölçü birimi noktadır: Left, Top, Width ve Height değerleri nokta cinsindendir, hücre ya da piksel cinsinden değildir. Şekli hücreye oturtmak için hücrenin Left, Top, Width ve Height özelliklerini kullanın.
- Placement özelliğini bilinçli seçin: Varsayılan davranış genellikle şeklin hücrelerle birlikte taşınması ve boyutlanmasıdır. Filtreleme ya da satır gizleme sonrası şekillerin bozulmasını istemiyorsanız Placement özelliğini xlMove ya da xlFreeFloating yapın.
- Korumalı sayfa ve seçme gereksizliği: Nesneler korumalı sayfada kilitliyse ekleme ve silme hata verebilir; önce korumayı kaldırın. Şekil üzerinde işlem yapmak için Select kullanmanız gerekmez; doğrudan nesne değişkeni üzerinden çalışmak daha hızlı ve güvenlidir.
- İlgili konular:
- Shape nesnesi: Tek bir şeklin özellikleri ve yöntemleri
- ShapeRange: Birden çok şekli birlikte yönetme
- ChartObjects: Sayfadaki gömülü grafikler
- Worksheet nesnesi: Shapes özelliğinin bağlı olduğu nesne
- Range.Left, Range.Top: Hücreye göre konumlandırma
- For Each...Next: Koleksiyonu dolaşma
- OnAction: Şekle makro atama
- Ekle > Şekiller: Arayüzden şekil ekleme (Insert > Shapes)