Genel Bakış
Shape (Şekil), bir çalışma sayfasındaki dikdörtgen, ok, metin kutusu, resim, düğme ya da grafik gibi çizim katmanı nesnelerinden her birini temsil eden VBA nesnesidir. Nesnenin konumunu, boyutunu, rengini, metnini ve görünürlüğünü kodla okuyup değiştirmenizi sağlar. Sayfadaki tüm şekiller Worksheet.Shapes koleksiyonunda toplanır.
AddShape yönteminin parametreleri:
Makro şekli ekledikten sonra adını B2 hücresine (RaporKutusu), tür kodunu B3 hücresine (1), genişliğini B4 hücresine (120) ve yüksekliğini B5 hücresine (40) yazar. B3 hücresindeki sayı, otomatik şekil türünü gösteren MsoShapeType sabitine karşılık gelir. Genişlik ve yükseklik punto cinsindendir.
Döngü şekilleri eklendikleri sırayla dolaşır. İlk şeklin adı Kutu1, türü 1 ve sol üst hücresi $F$2 olarak yazılır; ikinci şekil için Oval1, 1, $F$5, üçüncü şekil için Metin1, 17, $H$2 değerleri oluşur. Metin kutusunun tür kodunun otomatik şekillerden farklı olduğuna dikkat edin: Type özelliği nesnenin genel türünü verir.
Her satır için E sütununun üzerine bir çubuk yerleştirilir. İlk çubuğun adı Cubuk_Defter, genişliği 60,0 puntodur; sonraki ürünler için Cubuk_Kalem, Cubuk_Silgi, Cubuk_Dosya, Cubuk_Ataş adları ve 40,0, 75,0, 30,0, 47,5 genişlikleri oluşur. Placement özelliği xlMove yapıldığı için, satırlar eklenip silindiğinde çubuklar hücreyle birlikte taşınır ama boyutları değişmez.
Shape nesnesine erişim
Şekiller hücrelerin üzerinde yüzen nesnelerdir ve Shapes koleksiyonu üzerinden adıyla ya da sıra numarasıyla seçilir. Yeni şekil eklemek için de aynı koleksiyonun yöntemleri kullanılır. Aşağıdaki kod parçası başlıca yolları gösterir:
VBA
4 satır
Set shp = Worksheets("Sayfa1").Shapes("RaporKutusu")
Set shp = ActiveSheet.Shapes(1)
Set shp = ActiveSheet.Shapes.AddShape(Type, Left, Top, Width, Height)
Set shp = ActiveSheet.Shapes.AddTextbox(Orientation, Left, Top, Width, Height)
- Type: Şeklin türü; msoShapeRectangle, msoShapeOval, msoShapeRoundedRectangle gibi MsoAutoShapeType sabitlerinden biridir; zorunludur.
- Left: Şeklin sol kenarının sayfanın sol kenarına uzaklığı, punto cinsinden; zorunludur.
- Top: Şeklin üst kenarının sayfanın üst kenarına uzaklığı, punto cinsinden; zorunludur.
- Width: Şeklin genişliği, punto cinsinden; zorunludur.
- Height: Şeklin yüksekliği, punto cinsinden; zorunludur.
Önemli özellikler
- Name: Şeklin adıdır. Atamazsanız Excel kendisi "Dikdörtgen 1" gibi bir ad verir; koddan erişmek için anlamlı bir ad atamak iyi olur.
- Type: Nesnenin genel türünü verir (otomatik şekil, metin kutusu, resim, grup vb.). Yalnızca okunur.
- AutoShapeType: Otomatik şekillerde şeklin çizim biçimini belirtir.
- Left, Top, Width, Height: Konum ve boyut; birim puntodur.
- TopLeftCell, BottomRightCell: Şeklin sol üst ve sağ alt köşesinin bulunduğu hücreyi Range olarak verir.
- Fill: Dolgu özellikleri; örneğin Fill.ForeColor.RGB ile dolgu rengi atanır.
- Line: Kenar çizgisi özellikleri; Line.Visible, Line.Weight gibi.
- TextFrame2: Şeklin içindeki metne erişir; TextFrame2.TextRange.Text metni okur ve yazar.
- Placement: Şeklin hücrelerle birlikte nasıl davranacağını belirler: xlMoveAndSize, xlMove ya da xlFreeFloating.
- Visible: Şekli gösterir ya da gizler.
- LockAspectRatio: Boyutlandırırken en boy oranının korunup korunmayacağını belirler.
- Rotation: Şeklin dönme açısıdır.
- OnAction: Şekle tıklandığında çalışacak makronun adını tutar.
- AlternativeText: Erişilebilirlik için alternatif metin.
Önemli yöntemler ve olaylar
- Delete: Şekli siler.
- Duplicate: Şeklin bir kopyasını oluşturur ve yeni Shape nesnesini döndürür.
- Select: Şekli seçer; kodlarda seçmeye gerek kalmadan doğrudan nesne üzerinde çalışmak daha hızlı ve güvenlidir.
- Copy, Cut: Şekli panoya kopyalar ya da keser.
- IncrementLeft, IncrementTop: Şekli verilen punto kadar yatay ya da dikey kaydırır.
- ScaleWidth, ScaleHeight: Boyutu bir oranla ölçekler.
- Flip: Şekli yatay ya da dikey çevirir.
- ZOrder: Şeklin üst üste sırasını değiştirir; örneğin msoBringToFront.
1. Şekil ekleme ve özelliklerini okuma
Bu örnek, etkin sayfaya yuvarlatılmış dikdörtgen ekler, adını, rengini ve metnini ayarlar, sonra bazı özelliklerini B sütununa yazar. Kodu standart bir modüle yapıştırın ve örnek sayfa etkinken çalıştırın.
VBA
24 satır
Option Explicit
Sub SekilEkle()
Dim ws As Worksheet
Dim shp As Shape
Set ws = ActiveSheet
' Önceki çalıştırmadan kalan şekil varsa sil
On Error Resume Next
ws.Shapes("RaporKutusu").Delete
On Error GoTo 0
' Yuvarlatılmış dikdörtgen ekle (Left, Top, Width, Height: punto)
Set shp = ws.Shapes.AddShape(msoShapeRoundedRectangle, 200, 20, 120, 40)
shp.Name = "RaporKutusu"
shp.TextFrame2.TextRange.Text = "Rapor"
shp.Fill.ForeColor.RGB = RGB(0, 112, 192)
' Özellikleri hücrelere yaz
ws.Range("B2").Value = shp.Name
ws.Range("B3").Value = shp.Type
ws.Range("B4").Value = shp.Width
ws.Range("B5").Value = shp.Height
End Sub
Shape
Formülünü incelemek için bir hücre seçin.| A | B | |
|---|---|---|
| 1 | Özellik | Değer |
| 2 | Ad | RaporKutusu |
| 3 | Tür (Type) | 1 |
| 4 | Genişlik | 120 |
| 5 | Yükseklik | 40 |
Şekil EkleExcelDepo v1.0.0
2. Sayfadaki şekilleri döngüyle listeleme
Bu örnek önce sayfadaki tüm şekilleri siler, sonra bir dikdörtgen, bir oval ve bir metin kutusu ekler. Ardından For Each döngüsüyle her şeklin adını, türünü ve sol üst köşesinin bulunduğu hücreyi B, C ve D sütunlarına yazar. Dikkat: kod, kullandığınız sayfadaki tüm şekilleri siler; gerçek çalışma dosyanızda denemeyin. Kodu standart bir modüle yapıştırın.
VBA
30 satır
Option Explicit
Sub SekilleriListele()
Dim ws As Worksheet
Dim shp As Shape
Dim i As Long
Dim satir As Long
Set ws = ActiveSheet
' Sayfadaki tüm şekilleri sondan başa doğru sil
For i = ws.Shapes.Count To 1 Step -1
ws.Shapes(i).Delete
Next i
' Üç farklı şekil ekle ve adlandır
With ws
.Shapes.AddShape(msoShapeRectangle, .Range("F2").Left, .Range("F2").Top, 80, 30).Name = "Kutu1"
.Shapes.AddShape(msoShapeOval, .Range("F5").Left, .Range("F5").Top, 60, 60).Name = "Oval1"
.Shapes.AddTextbox(msoTextOrientationHorizontal, .Range("H2").Left, .Range("H2").Top, 100, 24).Name = "Metin1"
End With
' Her şeklin bilgisini satır satır yaz
satir = 2
For Each shp In ws.Shapes
ws.Cells(satir, 2).Value = shp.Name
ws.Cells(satir, 3).Value = shp.Type
ws.Cells(satir, 4).Value = shp.TopLeftCell.Address
satir = satir + 1
Next shp
End Sub
Shape
Formülünü incelemek için bir hücre seçin.| A | B | C | D | |
|---|---|---|---|---|
| 1 | Sıra | Şekil Adı | Tür Kodu | Sol Üst Hücre |
| 2 | 1 | Kutu1 | 1 | $F$2 |
| 3 | 2 | Oval1 | 1 | $F$5 |
| 4 | 3 | Metin1 | 17 | $H$2 |
Şekil ListesiExcelDepo v1.0.0
3. Hücre değerine göre çubuk şekilleri çizme
Bu örnek her ürünün satış değerine göre E sütunundaki ilgili satırın üzerine bir dikdörtgen çizer. Genişlik satış değerinin yarısı kadar puntodur. Şekillerin adı ve genişliği C ve D sütunlarına yazılır. Çalıştırmadan önceki kalıntıları temizlemek için yalnızca adı "Cubuk_" ile başlayan şekiller silinir. Kodu standart bir modüle yapıştırın.
VBA
29 satır
Option Explicit
Sub CubukCiz()
Dim ws As Worksheet
Dim shp As Shape
Dim r As Long
Dim i As Long
Set ws = ActiveSheet
' Daha önce çizilmiş çubukları temizle
For i = ws.Shapes.Count To 1 Step -1
If Left(ws.Shapes(i).Name, 6) = "Cubuk_" Then ws.Shapes(i).Delete
Next i
' Her ürün satırı için bir çubuk çiz
For r = 2 To 6
Set shp = ws.Shapes.AddShape(msoShapeRectangle, _
ws.Cells(r, "E").Left + 2, _
ws.Cells(r, "E").Top + 2, _
ws.Cells(r, "B").Value * 0.5, _
ws.Cells(r, "E").Height - 4)
shp.Name = "Cubuk_" & ws.Cells(r, "A").Value
shp.Line.Visible = msoFalse
shp.Fill.ForeColor.RGB = RGB(0, 150, 80)
shp.Placement = xlMove
ws.Cells(r, "C").Value = shp.Name
ws.Cells(r, "D").Value = shp.Width
Next r
End Sub
Shape
Formülünü incelemek için bir hücre seçin.| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | Ürün | Satış | Şekil Adı | Genişlik (punto) | Çubuk |
| 2 | Defter | 120 | Cubuk_Defter | 60,0 | |
| 3 | Kalem | 80 | Cubuk_Kalem | 40,0 | |
| 4 | Silgi | 150 | Cubuk_Silgi | 75,0 | |
| 5 | Dosya | 60 | Cubuk_Dosya | 30,0 | |
| 6 | Ataş | 95 | Cubuk_Ataş | 47,5 |
Çubuk ŞekillerExcelDepo v1.0.0
Kullanırken dikkat edin
- Birim puntodur: Left, Top, Width ve Height değerleri piksel ya da santimetre değil, punto cinsindendir. Şekli bir hücreye hizalamak için hücrenin Left, Top, Width ve Height değerlerini kullanın.
- Shapes koleksiyonu her şeyi içerir: Koleksiyonda yalnızca çizdiğiniz şekiller değil; düğmeler, resimler, grafikler ve metin kutuları da bulunur. Tüm şekilleri silen ya da değiştiren bir döngü yazarken Type ya da Name ile süzmezseniz beklemediğiniz nesneler de etkilenir.
- Silerken sondan başa doğru gidin: Döngüyle şekil silerken For i = ws.Shapes.Count To 1 Step -1 yapısını kullanın. Baştan sona giderseniz her silmeden sonra numaralar kayar ve bazı şekiller atlanır.
- Ad vermeyi unutmayın: Ad atamazsanız Excel sıra numaralı bir ad verir ve adlar dil sürümüne göre değişir. Koddan güvenle erişmek için Name özelliğine sabit bir ad atayın. Aynı adı ikinci kez verirseniz hangi nesneye erişileceği belirsizleşebilir; bu nedenle yeni şekil eklemeden önce eskisini silin.
- Select kullanmayın: Şekli seçip sonra Selection ile işlem yapmak yavaştır ve sayfa etkin değilse hata verir. Şekli değişkene atayıp doğrudan özelliklerini değiştirin.
- Metin için TextFrame2 tercih edin: Excel 2007 ve sonrasında şekil metni için TextFrame2.TextRange daha geniş biçimlendirme olanağı sunar. Eski TextFrame.Characters yapısı da çalışır ama sınırlıdır.
- Korumalı sayfa: Sayfa korumalıysa ve şekil kilitliyse şekli değiştirmeye çalışan kod hata verir. Gerekirse sayfanın korumasını kaldırıp işlemden sonra yeniden koruyun.
- İlgili konular:
- Shapes: Sayfadaki tüm şekilleri tutan koleksiyon.
- ShapeRange: Birden çok şekli birlikte yönetme.
- ChartObject: Gömülü grafikleri yönetme.
- Worksheet.Pictures: Resim nesneleri.
- Range.Left, Range.Top: Hücre konumu.
- OnAction: Şekle makro atama.
- Ekle > Şekiller (Insert > Shapes): Arayüzden şekil ekleme.