Özellik ikonu

Shapes

İndirme izni yok

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.

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ı
Ş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.

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.
Resim eklemek için AddPicture (dosya yolu gerektirir), bağlayıcı için AddConnector kullanılır. Eklenen şekle hemen Name vermeniz, sonradan ada göre ulaşmanızı kolaylaştırır.

Ö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.
Shapes koleksiyonunun kendine ait bir olayı yoktur. Şekle tıklamaya tepki vermek için şeklin OnAction özelliğine bir makro atayın; hücre seçimi olayları (Worksheet_SelectionChange) şekle tıklamayı yakalamaz.

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.
ABCDE
1Şekil AdıOtomatik Şekil TürüSolÜstGenişlik
2Baslik_Kutusu136020120
3Yuvarlak_Isaret93608080
4Not_Kutusu5360180140
5Toplam3
Nesne ListesiExcelDepo v1.0.0
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.

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.
ABCDE
1ÜrünStokDurumŞekil AdıGösterge
2Kalem45YeterliDurum_2
3Defter12KritikDurum_3
4Silgi80YeterliDurum_4
5Dosya8KritikDurum_5
6Zımba25YeterliDurum_6
7Ataç Kutusu19KritikDurum_7
Durum PanosuExcelDepo v1.0.0
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.

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.
ABCD
1ŞekilSol Üst HücreSağ Alt HücreGenişlik
2Kutu_1G2H390
3Kutu_2G5H690
4Kutu_3G8H990
5Kutu_GrubuG2H990
6Gruptaki öğe sayısı3
Konum TablosuExcelDepo v1.0.0
Ş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.

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)
Ö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
10
İlk yayın
Güncel

Puanlar

0.00 Oylama 0 İnceleme
Geri
Üst