Excel Makro ile Akış Şeması Oluşturma

By | 29 Mart 2019

matlab-ornek1Akış şemaları bir çok alanda kullanılan grafik gösterimlerden biridir. Birbirini takip eden işleri ve rotalamayı pratik bir şekilde göstermek için kullanılır.

Excel’de bu iş için hazırlanmış pratik çözümler çok eski versiyonlardan beri mevcut. Bunları EKLE menüsünden bulup dilediğiniz şekilde kullanabilirsiniz.

Bu yazıda size VBA – makro üzerinden basit şekilde nesne oluşturmayı, nesnelere görsel ayar yapmayı ve bunları birbirine bağlamayı anlatmaya çalışacağım. Bunların hepsini VBA kodları ile yapacağız. Haydi başlayalım!

Şekil (Shape) Oluşturma

Excel’de bir shape oluşturmak için aşağıdaki kodu kullanabilirsiniz.

Burada Sayfa1 üzerinde 100,100 koordinatı sol üst köşe olan bir Rectangle (dikdörtgen) çiziyoruz. Dikdörtgenin genişliği 40, yüksekliği 80 değerinde. msoShapeOval ifadesi ile daire/oval, msoShapeCloud ifadesi ile bulut çizebilirsiniz. Sayfa1.Shapes.AddShape yazıp space tuşuna bastığınızda uzun bir liste açılacak. Oradan istediğiniz şekli bulabilirsiniz. Veya internet üzerinden bu ifadelerin ne olduklarını bulabilirsiniz. Buraya ekleyemem. Zira, çok uzun bir liste var.

Her bir nesnenin görsel ayarları için çok fazla parametre var. Zemin rengi düz mü, dolgu mu, imaj mı, boşluk mu? Kenar çizgisi ince mi, kalın mı, kesik çizgi mi, düz çizgi mi, rengi ne?…. çok teferruatlı bir alan burası. Hatta hazır şablon görünümler var Excel içerisinde gelen. Excel versiyonlarına göre farklılık gösterebilir bunlar. Ben en temel olanları anlatayım.

Nesne Kenar Çizgisi

Yukarıdaki nesne ekleme kodundan farklı bir şey yaptım. Burada bir nesneyi oluştururken aynı anda isim de verdim. Eğer isim vermeden nesne oluşturursanız Excel otomatik isim atayacaktır. Fakat bunun kodlama sırasında sıkıntıları olur. Bir sürü nesne içerisinden belli nesne yada nesneleri yakalamak isterseniz uğraşmanız gerekir. İsimleri kontrol altına alırsanız bu noktada daha az uğraşırsınız.

daire1 isimli bir Daire oluşturduk. Bunun Line özelliğine girip Line.Visible = msoTrue dedik. Bu kenar çizgisi olsun anlamında. msoFalse ise kenar çizgisi istemediğiniz anlamında. Bunlardan başka 3 seçenek daha geliyor. Tek tek deneyerek istediğiniz birini seçebilirsiniz. Aynı Line sınıfı içerisinde Weight ile çizgi kalınlığı ayarı var. Burada 1.5 değeri vererek çizgi kalınlığını ayarlıyoruz. Line içerisinde başka bir sürü ayar var. Mesela çizgi rengi için .ForeColor.RGB yazıp RGB renk kodları ile bir renk değeri verebilirsiniz. .ForeColor.RGB = RGB(255, 255, 0) değeri ile çizgi rengi sarı olacaktır.

Nesne Zemin Rengi

Zemin rengi için .Fill sınıfı .ForeColor  özelliğini kullanarak arkaplana sabit bir renk verebilirsiniz. Hatta aynı yerde gradyen renk geçiş ayarları, arkaplana resim veya desen koyma gibi özellikler mevcut. “Hiç bunlarla uğraşamam” diyorsanız aşağıdaki kod ile hazır bir arka plan stili çağırabilirsiniz.

 Nesne İçin Hazır Şablon Stiller Seçmek

Baktınız ki stil işi çok uğraştırıcı, “Ben bu şekilde tek tek uğraşamam, Excel’deki hazır şablonları kullanayım” derseniz aşağıdaki kod komple işinizi görecektir. Burada hepsini teker teker anlatamayacağım onlarca şablon var. Deneye deneye birini seçebilirsiniz. Bir nesne için komple hazır paket bunlar. Seç seç kullan.

Nesneleri Birbirine Bağlama

İki nesne arasında sabit bir bağlantı kurmaya geçelim. Siz nesneyi mouse ile hareket ettirdiğinizde bağlantı kopmayacak. Her zaman bağlantı çizgisi esneyerek, bağlantıyı koruyacak. Bu aslında Excel’in son versiyonlarında olan bir özellik. İki nesneyi manuel olarak bir çizgi ile bağlamak istediğinizde size Bağlantı (connect) noktası gösteriyor. Çok eski versiyonlarda var mıydı bilemiyorum. Şu an Excel 2010 üzerinde test edebildiğime göre en azından piyasada kurulu bir çok versiyonda geçerlidir diye düşünüyorum.

Öncelikle Bag adında bir bağlantı nesnesi oluşturalım. Bu nesne de bir shape olacak. Bunların bağlantı yapılacak nesneler ile aynı sayfada olduğundan emin olun. Sayfalar arasında bağlantı kurmaya çalışmayın. :)

Gördünüz gibi Bag adında, Shape tipinde bir nesne tanımladık. Sonra AddConnector ile bu nesnenin bir Connector olduğunu set ettik. Set ederken bazı parametreler belirttik. Neler bunlar? msoConnectorStraight ifadesi düz çizgi şeklinde bağlantı çizer. msoConnectorElbow olursa düz ama ortadan kırık yapmış çizgi çizer. msoConnectorCurve  olursa eğri olarak bağlantı çizgisi çizer. Böylece bağlantı çizgi tipini burada oluşturmuş oluyoruz. Diğer 1 rakamları sayfaya yerleşim değerleri.

Öncelikle nesneyi oluştururken 1,1 koordinatına 1 birim uzunlukta olarak oluşturuyoruz. Buradaki ölçülerin bir önemi yok. Amacımız öyle ortaya bir nesne atmak. Sonra ince ayar çekeceğiz.

Kodun ikinci paragrafında kimler arasında bağlantı kurulacağı gösteriliyor. “nesne5″ ile “nesne27″ arasında bağlantı kurmak istediğimiz için .ConnectorFormat sınıfı içerisindeki .BeginConnect ve .EndConnect ifadelerine bunları tanımlıyoruz. Böylece bağlantının bir başlama ve bir bitme noktası tanımlanmış durumda. Yani yönü var.

excel-baglantiDikkat ederseniz, nesne isimlerini verdikten sonra yanlarında rakam da yazdık. Bunlar o nesnenin neresinden bağlantı kurulacağını gösterir. Her nesne için bağlantı noktaları tanımlanmıştır. Bu bağlantı noktaları 1’den başlayıp her nesnedeki toplam nokta sayısına kadar devam eder. Mesela daire şeklinde 8 tane nokta vardır. En üstteki 1 numara olup saat yönünün tersine doğru artar.

Bir şeklin toplam bağlantı sayısını bulmak için .ConnectionSiteCount özelliğini kullanabilirsiniz.

Artık bağlantıyı kurduk. Sayfada nesneleri mouse ile hareket ettirdiğinizde bağlantı çizgisinin de otomatik olarak esneyip – süneceğini ve daima bağlantıyı koruyacağını görebilirsiniz. Bağlantı çizgisine biraz ayar yapalım.

Yukarıdaki kodun son paragrafında çizgi başlangıç ve bitiş uçlarının şekli ve büyüklüğü ile çizginin rengi için yapılmış ayarlar mevcut. İfadelerin Türkçe anlamlarına bakarak da anlayabileceğiniz üzere, mesela, .EndArrowheadStyle ifadesi  okun bitiş ucunun tipini gösterir. Buna verilen msoArrowheadStealth değeri içi boş bir ok ucu oluşturur. Eğer içi dolu (üçgen) şeklinde ok isteseydik msoArrowheadTriangle değerini vermemiz gerekirdi. Başlangıç ucu değerleri için yukarıdaki End olan kısımları Begin olarak değiştirebilirsiniz. .BeginArrowheadStyle gibi. ForeColor.RGB ifadesi çizgi rengi içindir.

Burada küçük bir tüyo vereyim size. Diyelim ki, iki nesne arasında bağlantı kuracaksınız fakat nesnelerin konumları ile sizin çizdiğiniz çizgi çok kötü durdu. Yani biçimsiz iki noktadan bağlantı kurdunuz. Her nesnenin sayfadaki pozisyonuna göre uygun bağlantı noktasını nasıl bulacağınız uğraştırıcı bir iş. Aslında nesnelerin left-top değerlerini karşılaştırıp bu bunun sağında ve üstünde veya tam altında gibi basit çıkarımlar yapabilir ve buna uygun bağlantı noktasını seçebilirsiniz ama çok uğraştırıcı bir iş. Bunun yerine Excel VBA bize küçük bir pratiklik sunmuş. RerouteConnections özelliği. Bu özellik ile bir bağlantı oluşturduktan sonra sayfadaki konuma göre en uygun bağlantı noktalarının seçimini Excel’e bırakabilirsiniz.

Yukarıda en son verdiğim kodun en altına bu satırı eklediğinizde, siz 3 ve 7 nolu bağlantı noktalarını seçseniz bile Excel en uygun noktaları tekrar seçecektir. Excel’i yazan programcıların önünde bir kez daha saygıyla eğilmek istiyorum.

Hadi Pratik Bir Alt Yordam Yazalım

Bu aşamaya kadar sayfa üzerine nesne oluşturmayı, nesnelere görsel ayarlar yapmayı, nesneleri birbiriyle bağlamayı, bağlantılara görsel ayar vermeyi anlatmaya çalıştım. Şimdi sıra geldi bağlantı işlemleri için kullanabileceğiniz küçük bir altyordam yazmaya.

Baglanti adlı alt yordamımız iki parametre ile kullanır. kimden ve kime parametreleri. Bunlar birbirine bağlanacak nesne adlarını tutan string değişkenlerdir. Şu şekilde basit bir kullanımı olacaktır.

Bu haliyle, programınızda istediğiniz bir yerde iki nesne arasında bağlantı kurabilirsiniz. Akış şemasını oluşturacak elemanlar üzerinde bağlantıları bir döngü ile tarayarak birbirine bağlayabilirsiniz. Mesela aşağıda, 10 elemanlı bir listede bubble sort yöntemi ile tarama yapılıp bağlantı kurulması örneğini görebilirsiniz. Temsili olarak nesne isimlerinin nesne1, nesne2, nesne3… nesne10 olarak gittiğini varsayalım.

Umarım bu bilgiler faydalı olur. Başka bir konu anlatımında görüşmek üzere.

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir