Bu siteye giriş yaparak Çerez kullanımını kabul etmiş oluyorsunuz. İşbu sitede; çerez olarak, sadece son giriş tarihiniz ve eğer üye olursanız oturum statünüz tutulacaktır. Bunlar dışında başka hiçbir bilgi tutulmamaktadır. Çerezler için detaylı bilgi için buraya tıklayınız.
ANLADIM

DUYURULAR

Yeni eklenen ve/veya güncellenen sayfaları görmek için buraya tıklayınız.

Güncel ödev ve test listesini görmek için buraya tıklayınız.

Sitede yapılan iyileştirmeAer ve hata düzeltmelerine ait tüm bilgilendirmeleri görmek içinburaya tıklayınız.

Baş
Udemy
Konular
Son
Konular
DiziFormulleriveSumproduct
FormulasMenusuFonksiyonlar
Excel
Excel Formulas Menüsü(Fonksiyonlar) 7

Dizi Formülleri ve Sumproduct

Buraya kadar konuları sırayla okuyarak geldiyseniz şimdi formüllerde ustalaşma zamanınız geldi demektir. Çünkü burada artık olmayanı görme, zihninizde canlandırma kabiliyeti kazanacaksınız.

Bu formüllerle birkaç aşamada, genelde yardımcı kolonlar aracılığıyla, yaptığınız işlemleri tek bir formülle yapar hale geleceksiniz. Bu sitede çeşitli yerlerde belirttiğim gibi, o anki ihtiyaca göre bazen şık olmayan ama daha hızlı olan yöntemi seçmek gerekebilir. Yani uzun uzun dizi formülü yazmak yerine geçici bir pivot table veya başka araçlarla daha hızlı ilerleyeceğinizi düşünüyorsanız ve aciliyetiniz de varsa öyle ilerleyin. Ama mesela kalıcı bir dashboard/karne/scorecardv.s tasarlıyorasnız veya çıktı alınacak bir sayfa üzerinde çalışıyorsanız veya bulduğunuz değeri başka bir formül içinde kullanacaksanız işinizi tek seferde bitirmeye çalışmanız gerekecektir, ki bu durumların çoğunda bu sayfada öğrendiklerinizi kullanabilirsiniz.

Sayfa başlığında olmamakla birlikte Veritabanı fonskiyonlarını da konu bütünlüğü açısından burada ele alıyor olacağız.

NOT:Örneklerin birçoğunda normal hücre alanlarından(range) ziyade kolay anlaşılırlık adına Table veya Name'ler kulanılmış olup, bu konularda bilgi sahibi değilseniz öncelikler bunları incelemenizi tavsiye ederim. 

Bu sayfadaki örneklerin hepsini bulacağınız örnek dosyayı buradan indirebilirsiniz. Ayrıca Microsoftun şu sayfasında da dizilere ait detaylı bilgiler bulabilirsiniz, gerçi ben oldukça detaylı bir içerik hazırladım ama yine de gözatmak isteyen meraklı kullanıcılar bakabilirler.

Dizi Formülleri

Nedir?

Birden çok değerden oluşan kümelere dizi, bu dizileri kullanan formüllere de dizi formülü diyoruz.

Dizi formülleri ikiye ayrılmaktadır:

  • Tek hücreye girilen ve tek değer döndüren formüller. Bunlar da kendi içinde üçe ayrılalır.
    • Doğal dizi formülleri(SUM, AVERAGE gibi dizi kabul eden ama aslında dizi formülü olmayan formüller)
    • Control + Shift + Enter(CSE) tuş kombinasyonuyla girilen dizi formülleri
    • SUMPRODUCT gibi parametre olarak her zaman birden çok dizi alıp bunlarla işlem yapan veya INDEX, OFFSET gibi bazen dizi formülü şeklinde davranan yerel fonksiyonlar. Bunlar CSE'ye ihtiyaç duymazlar
  • Çoklu hücre grubuna girilip çok değer döndüren fomrüller. Bunlar da kendi içinde birkaç gruba ayrılır
    • Yerel Excel fonksiyonları(TRANSPOSE, LINEST v.s)
    • Yine CSE kombinasyonuyla manuel girilen formüller

Detaylar

Diziden kasıt, tek bir eleman değil de bir grup elemandır. Mesela bir formülün girdisi olarak 1 sayısını ele alalım. Bu tek bir değerdir. Ancak bazen 1 ve 2 nin aynı anda formüle girmesini isteriz. İşte böyle bir durumda dizi formülü kullanırız.

Dizi elemanları formüle manuel olarak girilebileceği gibi, bunları döndürecek başka bir formülle birlikte de girilebilir, veya belirli bir alan seçilebilir. Son olarak formül girişi bitince CTRL+SHIFT+ENTER(CSE) tuş kombinasyonuna basılır. Bu tuşlara basıldıktan sonra formül süslü parantezler yani "{ }" karakterleri arasına sarmalanır. Bu süslü parantezlerin elle girilmemesi çok önemli, yoksa hata alırsınız. CSE'ye basınca kendiliğinden gelirler.

Örnek girişleri aşağıdaki gibi gösterebiliriz

  • Sabit giriş:{1;2;5;10} ({ } ile manuel girilenlerde CSE yapmaya gerek yoktur)
  • Hücre referansı:A2:A10
  • Formül sonucu:TRANSPOSE(A2:A10)

1.Kullanım şekli:Çok sonuç döndürme

Çoklu sonuç döndürmek için belirli bir alanı seçip oraya tek bir formül gireriz ve sonra CSE tuşuna basarız. Aşağıdaki görüntüde C2:C11 seçilmiş, hepsine A2:A11*B2*B11 formülü girilip CSE tuşlarına basılmıştır. Böyle bir kullanımda tüm hücrelerde aynı formül yer alır. Dizi formülü içieren hücrelerden herhangi biri silinemez veya değiştirilemez, değiştirilmesi teklif dahi edilemez. Silmek için hepsini birden seçip silmelisiniz.

Avantaj

Bu kullanım şeklinin en büyük avantajı, Excelin tek bir formülü hesaba katmaya çalışmasıdır. Yukardaki örneğin alternatifi ne olurdu? C2 hücresine A2*B2 girip onu aşağı doğru kaydırmak. Ama bu durumda 10 çeşit formül olurdu ve Excel bu 10 formülü ayrı ayrı hesaplardı. Az sayıdaki satırlar için önemsiz bir detay olabilir ama çok satırlı dosyalarda büyük performans katkısı sağlar. Özellikle calculation işleminin geçici olarak durudulup tekrar açıldığı durumlarda çok faydalı olabilir. Ayrıca diskte de daha az yer kaplar. 5000 Dikey eksenden oluşan bir kümeyi dizi formülü ile kaydettiğimde 137 KB yer kaplarken, klasik formül girip aşağı kaydırarak kaydedince 159 KB yer kaplamaktadır.

NOT:Aşırı fazla dizi formülü ise tam tersi etki yaparak performans sorunu yaratır. O yüzden Genel Değerlendirme bölümüde belirtildiği üzere dikkatli kullanılmalıdırlar.

Transpoze işlemi

Dikey konumdaki A2:A10 arasındaki değerleri yatay şekilde(veya yataydakileri dikey şekilde) bir yere yazdırma işlemi bir dizinin transpozesini almak diye adlandırılır. Yatay veya dikey dönüşüm için TRANSPOSE fonksiyonu kullanılır.

Aşağıdaki J1:J3 arasındaki değerleri L1:N1 arasına girmek için L1:N1 seçilip ve aşağıdaki formül girilir.

={TRANSPOSE(J1:J3)}

Formülü değiştirmek

Dizi formülleri değiştirilmek istendiğinde tüm blok seçilir, sonra F2 tuşuna basılarak ilk hücrenin içindeki formül değişim moduna getirilir, değişiklik yapılır ve yine CSE kombinasyonuna basılır.

2.kullanım şekli:Tek hücre girişi

Benim dizi formüllerinde ağırlık vermek istediğim versiyon aslında bu versiyondur. Önce bu kullanım şeklinin neyin alternatifi olduğunu görelim.

Yukardaki örneği düşünün. Çarpım kolonundaki rakamların toplanmasını isteseydik, bunları toplamamız gerekirdi. Yani önce C kolonunda A ve B'yi çarpıp sonra da bunları toplayarak 2 iş yapardık. Bunun yerine şu formül işimizi görecektir.

{=SUM(A2:A11*B2:B11)}

Aslında bu işlem için başka bir fonksiyon var: SUMPRODUCT, bunu aşağıda ayrıca göreceğiz.

Başka bir örneği inceleyelim. Yine Dizi formüllerinin olmadığı dünyadayız, şimdi yukarıdaki rakamların yanına bir de fark kolonu ekleyelim ve bunlardan en küçüğünü MIN(D2:D12) ile bulalım. Sonuç: -140

Dizi formüllerinin olduğu bir dünyada ise bunu şu dizi formülü ile elde ederiz.

{=MIN(B2:B11-A2:A11)}

F9 tuşu

F9 tuşu ile formül editleme modundayken formülün bir kısmını seçip sadece o kısmın sonucunu görebiliyoruz. Bu tuşu daha çok uzun formüllerde belli bir kısmın ara sonucunu görmek için kullanırız. Aynı mantıkla dizi formüllerinde de belli bir kısmın döndürdüğü diziyi görmek adına da kullandığımızda oldukça faydalı olmaktadır. Özellikle dizi formüllerini yeni öğrenirken bunu sık sık kullanıp eldeki dizinin neye benzediğini görmeniz açısından kritik bir ihtiyaçtır.

Mesela şu formüldeki ilgili kısmı seçip,

F9'a basınca sonuç aşağıdaki gibi olmaktadır

VE/VEYA operatörleri ile  Boolean(TRUE/FALSE) işlemler

Konuşma dili vs Formül dili

Konuşma dili ile kasttetiğimiz şey her zaman formül diline aynı şekilde girilmediği için bu farktan bahsetmek istedim. Eğer hali hazırda SQL ile veya Business Objects gibi bir raporlama aracıyla rapor çekiyorsanız kriter alanına değerleri girerken bu farka dikkat etmiş olmalısınız.

Şimdi, formül dilindeki VE, konuşma dilinde iyelik eki olarak düşünülmelidir. Konuşma dlindeki "Akdeniz bölgesinin 2010 satışları" formülde "Bölge=Akdeniz VE Yıl=2010" olarak işleme girilir.

Keza formül dilindeki VEYA ise konuşma dilinde garip bir şekilde "ve" olarak kullanlmaktadır. O yüzden burdaki karışıklığa özel dikkat etmeniz gerekir. Mesela konuşma dilince "2010 ve 2011" satışları derken formüle "Yıl=2010 VEYA Yıl=2011" satışları olarak girilmelidir.

İkisinin karışımına da örnek verebiliriz. Akdeniz bölgesinin 2010 ve 2011 satışları dersek, Bölge=Akdeniz VE (Yıl=2011 VEYA Yıl=2012) şeklinde işleme girecektir.

VE/VEYA operatörleri

Yukarda anlatılan VE işlemini parantezler arasında "*" işareti ile sağlarken VEYA işlemini "+" işareti ile sağlarız. Bu şekilde bu dizide ilgili koşulları sağlayan kaç eleman olduğunu bulmuş oluruz. Eğer formül içinde çarpılıp toplanacak sayısal bir blok yok ise dizi formülleri bu haliyle COUNTIF(S) alternatifi olarak karşımıza çıkar. Sayısal blok da işleme girerse o zaman da SUMIF(S) alternatifi olur.

Şimdi aşağıdaki örnek üzerinden gidecek olursak(Örnek tabloda Ürün3 de vardır, ancak resim uzun çıkmasın diye biraz kırptım);

Önce VE örneğine bakalım: Bölge1'in şube sayısı:

=SUM((bölgeler="Bölge1")*(ürünler="Ürün1"))
//veya aynı formül sum+if ile aşağıdaki gibi iyazılabilir
=SUM(IF((bölgeler="Bölge1")*(ürünler="Ürün1");1))

Bölge1in Ürün1deki toplamı

=SUM((bölgeler="Bölge1")*(ürünler="Ürün1")*satışlar)

Bölge1in, Ürün1 ve 2 toplamı ise

=SUM((bölgeler="Bölge1")*((ürünler="Ürün1")+(ürünler="Ürün2"))*satışlar)

Bu örneklerde sondaki "satışlar" olmazsa COUNTIFS, olursa SUMIFS işlemi yapılmaktadır.

Nasıl işliyor?

Aritmetik işlemlerde BOOLEAN değer(yani TRUE/FALSE) döndüren sonuçlar sırayla 1/0 değerlerine dönüştürülür. Bilindiği gibi 0'la çarpım hep 0'dır, 1'le çarpımlar da çarpılan değerlerin toplamını verir. Eğer çarpılanlar yine 0/1den oluşan dizilerse sonucun COUNTIFS, sayısal blok çarpılıyorsa da SUMIFS olduğunu belirtmiştik.

Mesela yukardaki son örnekte "bölgeler=Bölge1" eşitliğini F9 ile çözümlemeye çalıştığımızda aşağıdaki gibi görürüz.

Bunların sayısal karşılığı 1/0 ama bunları şu anda F9 ile göremiyoruz. Bunları 1/0 görmek için biraz aşağıdaki teknikleri uygulamanız lazım gelir. İlgili tekniklerden biri uygulandığında çıkan sonuç aşağıdaki gibidir.

{1;1;1;1;1;1;0;0;0;0;1;1;1;1;1;1;0;0;0;0;1;1;1;1;1;1;0;0;0;0}

Ürünlü kısmın 0/1 karşılığı ise şöyledir:
{1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;0;0;0;0;0;0;0;0;0}

Satışların ise zaten direkt kendisi gelir:
{101;155;224;229;108;433;213;337;341;324;387;112;143;247;146;174;412;439 ;204;370;327;212;329;232;341;267;268;355;252;386}

Son olarak da tüm bunlar birbiriyle çarpılır, çarpımda 0 olan kısımlar elenir, geriye sadece 1*1*SatışRakamı olan kısımlar kalır ve bunlar toplanır. Örneğin ilk grup 1*1*101 şeklinde hesaba girer.

TRUE/FALSE'ı sayısal değere çevirme yöntemleri

TRUE ve FALSE'ın sayısal karşılığının 1 ve 0 olduğunu görmüştük. Bunu yukarda doğrudan koşullu ifadelerin parantezler içinde çarpımı örneğinde gördük. Çarpımın olmadığı ve parametre ayracı olan ";"  ile kullanıldığı durumlarda ise aşağıdaki yöntemler uygulanır.

İlk yöntemde -- ifadesi aslında iki kere -1le çarpım anlamına gelmektedir, yani ifadeyi aritmetiksel bir işleme tabi tutunca 1/0 haline dönüşmektedir. 3. ve 4. yöntemde de benzer mantık bulunmaktadır. 2. yöntem ise direkt bu amaçla üretilmiş bir fonksiyon olup TRUE/FALSE'ları 1/0'a çevirir.

Şimdi aşağıdaki tabloya bakalım.

18'nden büyük olan kaç kişi var diye bakacağız.

=SUM(--(G2:G9>18))

--'yi de kapsayacak şekilde seçip F9 yaparsak 1/0 karşılıkları görünür.

Sonuç 5 olacaktır.

IF'li formüller

Aşağıdaki tabloya göre Mağaza1'in toplam satış tutarını bulmak SUMIF fonksiyonu ile oldukça kolaydır. SUMIF'in olmadığı bir dünyada(gerçi hemen herkesteki Excel versiyonu bu formülü destekler diye düşünüyorum) ise bunun alternatifi nasıl yazılır ona bakalım.

{=SUM(IF(Table2[Mağaza]=F3;Table2[Tutar]))}

Gördüğünüz gibi SUMIF'e oldukça benzemekte. Evet, artık herkeste SUMIF vardır diyoruz ama peki ya MINIF? Böyle bir fonksiyon 2016'ya kadar gelmedi. 2016'daki de MINIF değil çoklu kriteri desteklemesi adına MINIFS olarak geldi(Office 365 paketi değilse Excel 2016 olsa bile bu formül desteklenmez)

O halde tek alternatifimiz dizi formülü yazmak olacaktır.

=MIN(IF(Table2[Mağaza]=F3;Table2[Tutar]))

IF'li kısım bize {218;299;180;474;413;478;306;298;310;487;117;472;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE} dizisini döndürür, sonra MIN ile de bunlardan en küçüğünü elde ederiz.

Ekli dosyada MAXIF, SMALLIF MINIFS alternatifleri de bulunmaktadır.

Ardışık sayı üretmek

Özellikle SMALL ve LARGE başta olmak üzere bazı fonksiyonlarda 1 ile X arası ardışık sayıları kullanmak gerekebilmektedir. Bunlar az ise elle {1;2} gibi girilebilir. Ancak çoksa veya sayısı baştan bilinmeyip başka hücrelerdeki değerlere göre dinamik olarak belirleniyorsa başka bir çözüm bulmamız gerekir.

Bu amaç için ROW fonksiyonunu dizi şeklinde kullanırız. Mesela aşağıdaki formülü K8:K10 arasına girip CSE yaparsak bize sırayla 1,2,3 değerlerini verir.

{=ROW(1:3)}

Ancak bu yöntemin bi sakıncısı var, o da A1:A3 arasına bir satır açılırsa bu formül sapıtır. Kendiiniz de deneyip görebilirsiniz. Mesela en tepeye, 1.satırın üstüne yeni kolon açılırsa az önce 1,2,3 gördüğümüz değerle3 2,3,4 olur. 

İşte bu sapma olmasın diye INDIRECT fonksiyonunu da formüle dahil ederiz.

=ROW(INDIRECT(1&":"&3))

Bunun kullanımıyla ilgili bir örneği aşağıda çeşitli örneklerin bulunduğu kısımda görebilirsiniz.

NOT:Eğer sonucu dikey eksene yazdıracaksanız veya dikey eksendeki bir bölgeye kriter olarak sokacaksanız ROW, yatay eksende kullanacaksanı COLUMN kullanırsınız.

Rakamların yönü

Bu ön bilgiyi şimdi veriyorum, ancak şuan için birşeyi fade etmemesi çok yüksek. Sadece şağıdaki örnekeri görürken, niye burda böyle de şurda şöyle diye soracağınızı tahmi nettiğim için şimdiden vermek isteim. O örneklere geldiğinizde daha iyi bir kavrayış iin bu kısma tekrar gelip bakın.

  • Çoklu değerler girilirken manuel girilirlerse { } işaretleri arasına ";" ayracıyla ayrılarak girilirler. SUM(SUMIF(Tablo[Bölge];{"Bölge1";"Bölge2"};Tablo[Satış]))
  • Eğer giriş manuel değil de bir hücre grubundan alınacaksa
    • İfadeler ";" parametre ayracıyla giriliyorsa hücre grubunun yönü önemli değildir.
      Yatay:=SUM(SUMIF(Tablo[Bölge];G49:H49;Tablo[Satış]))
      Dikey:=SUM(SUMIF(Tablo[Bölge];G51:G52;Tablo[Satış]))
    • İfadeler "*" işaretiyle çarpılacaksa hücre grubunun yatay olması gerekir. Dikey hücre grupları TRANSPOSE edilmelidir.
      Yatay:=SUMPRODUCT((Tablo[Bölge]=G49:H49)*(Tablo[Satış]))ış]))
      Dikey:=SUMPRODUCT((Tablo[Bölge]=TRANSPOSE(G51:G52))*(Tablo[Satış]))

Dinamik Diziler(Yeni!!!)

Eylül 2018'de Micorosft efsane bi işe imza attı. Hesaplama motorunu değiştirdi. Ve Excel kullanıcılarının hayatını kökten değiştirecek bir yapıyı hizmete soktu. Dinamik Diziler(Dynamic arrays)

Öncelikle şunu belirteyim, bu özellikten sadece Office 365'i olan kullanıcılar faydalanabiliyor. O yüzden maalesef ben dahi bunu 2 yıl sonra farkedebildim. Zira iş yerimdeki PC'mde Office 365 kurulu değil.

Peki nedir bu dinamik diziler, ne işe yarar? Aslında bizi iki şeyden kurtarıyorlar: Dizi formülü yazarken hedef alanı uygun sayıda hücre olacak kadar seçmekten ve CSE kombinasyonuna basmaktan. Siz formülü yazdığınızda formül otomatikman aşağı "dökülüyor". Evet buna dökülmek(spill) diyorlar. FILTER, SORT, UNIQUE gibi efsane fonksiyonlar da cabası. Aşağıda bunların nasıl çalıştığını gif animasyon olarak görebilirsiniz. Ben örnek olarak UNIQUE'i aldım. Siz de diğerlerini deneyebilirsiniz. Şu an çok detaylarına girecek vaktim yok ancak bi ara hepsi için detaylı örnekler koymayı düşünüyorum. O zamana kadar Microsoft'un kendi sayfasından ve/veya diğer kaynaklardan faydalanabilirsiniz.

dinamik diizi

SUMPRODUCT

SUMPRODUCT size ilk başta o kadar da ahım şahım bir fonksiyon gibi gelmeyebilir, ama Excel'in dizilerle nasıl çalıştığını anladıktan sonra bu fonksiyonun da hakkını vermeye başlıyorsunuz.

Öncelikle SUMPRODUCT kendi başına bir dizi formülüdür. Yani bir formül oluşturduktan sonra CSE kombinasyonuna basmanız gerekmez. Aslında tek bir kullanım şekli olmakla birlikte ben tamamen kendi kafama göre 2 gruba ayırdım; Klasik ve klasik olmayan kullanımı diye.

Klasik kullanım

Diyelim aşağıdaki gibi Kredi tutarı ve faiz oranlarından oluşan bir liste var, ve siz ağırlıklı ortalama faizi bulmak istiyorsunuz. Aritmetik ortalama alırsanız hata yaparsınız, zira içerde büyük hacimli ama düşük faizli bir kredi varsa genel toplamı aşağı çekmesi gerekir. Fakat aritmetik ortalama, hacimlerin büyüklüğünü dikkate almadığı için yanıltıcı olacaktır. O yüzden aritmetik ortalama yerine ağırlıklı ortalama alınması gerekmektedir.

Ağırlık ortalama için SUMPRODUCT'ın olmadığı dünyada D kolonunda yardımcı bir kolon açılıp Faiz*Tutar çarpımı bulunur, Sonra D kolonunun toplamı B kolonunun toplamına bölünür.   

=SUM(D2:D11)/SUM(B2:B11)

İşte SUMPRODUCT sizi bu yardımcı kolondan kurtarır.

=SUMPRODUCT(B2:B11;C2:C11)/SUM(B2:B11)

Fonskiyonun yaptığı iş bu dizileri çarpıp toplamaktır. Yukarıdaki örnekte her satırdaki Faiz ve Tutarı çarpıyor ve bütün bu çarpımları topluyor.

Gördüğünüz üzere SUMPRODUCT parametre olarak diziler alıyor ve tüm diğer fonksiyonlarda olduğu gibi parametre ayracı olarak ";" işaretini kullanıyor. Ancak SUMPRODUCT'ı VE operatörü olan "*" ile de kullanabiliyoruz. Ve operatörü kullanıyor olmak demek, koşul arıyouz demektir, yani diziyi formüle olduğu gibi sokmak yerine belli koşulda olanları istiyoruz demektir. Gerçi "*" ile kullanıldığında koşul belirtilmese de yine çalışır ama bu şekilde anlamsızdır, zira bunun için ";" versiyonu zaten vardır. Bu arada ";" ile kullanıdığında diziler parantez içine alınmazken "*" ile kullanıldığında parantez içine alınırlar.

=SUMPRODUCT((B2:B11)*(C2:C11))/SUM(B2:B11)

Klasik olmayan kullanım şekil

Şimdi fonksiyonumuz buraya kadar gereksiz görünebilir, zira "*" versiyonunun yaptığı işi SUM fonksiyonunu dizi formülü olarak kullanarak da gerçekleştirebilirdik. Hatta yukarıdaki örneklerinden birinde yapmıştık. Bu örnekte kullanımı aşağıdaki gibi olacaktır.:

{=SUM((B2:B11)*(C2:C11))/SUM(B2:B11)}

NOT:Buradan itibaren aşağıda görülen SUMPRODUCT'ın "*" verisyonlarının tamamı SUM-Dizi formülü şeklinde de yapılabilir olup, tekrardan kaçınmak için alternatifler arasında bu ayrıca gösterilmeyecektir.

Hele hele SUMIF, COUNTIF ve bunların "S" ile biten çoklu koşul türevleri çoğu durumda SUM-Dizi formüllerini gereksiz bıraktığı gibi SUMPRODUCT'ı da gereksiz bırakmış gibi düşünülebilir. Ancak yukarda belirttiğim gibi Excel'in dizilerle çalışma şeklini ve SUMPRODUCT'ın kullanım şeklini anladıktan sonra bunun ne kadar gerekli bir fonksiyon olduğunu göreceksiniz.

DİKKAT:SUMPRODUCT'ı tüm kolon seçimlerinde(Ör:A:A) kullanmamaya çalışın, çoğunlukla hata döndürür. Sadece ilgili alanda(ÖR:A2:A20) kullanın.

Veritabanı(Database) fonksiyonları

Şimdi dizi formüllerine kısa bir ara veriyoruz ve birçok durumda gerek dizi formüllerine gerek SUMPRODUCT'a alternatif olmaları sebebiyle Veritabanı fonksiyonlarına bakıyoruz. Bu konudan sonra hepsini birden tekrar ele alacağız ve en son da bir karşılaştırma yapacağız.

Veritabanı fonksiyonları, bir liste üzerinde çalışırken, birden çok kritere göre toplam/adet/min/max aldırma gibi istatistiki işlemler yapmayı sağlar.

Genel syntax'ı şöyledir: Fonksiyon(veritabanı, field(işlem yapılacak alan), kriter alanı)

Veritabanı ifadesi gözünüzü korkutmasın. Bu aslında herhangi bir hücre grubudur veya Table/Name şeklindeki özel bir hücre grubudur. Veritabanı olarak gösterilen alanın ilk satırının başlık olması gerekir.

İşlem yapılacak alan: İlgili kolonun veritabanında kaçıncı kolon olduğu veya doğrudan onun başlığıdır.(Veritabanı A kolonundan başlamıyorsa mesela D kolonunda başlıyorsa ve işlem alanı G kolonundaysa 7 değil 4 girilir. DEFGHIJKLM)

Kriter alanında ne konacağını tahmin ediyorsunuz:Kriterler. Kriterler tıpkı Advanced Filter kurallarında olduu gibi girilir. Aynı satırdakiler VE olarak, farklı satırdakiler VEYA olarak algılanır. Kriter alanı birbirine komşu hücrelerden oluşmalıdır.

NOT:Bu fonksiyonlar joker elemanları destekler. Herhangi bir karakter için "?", birden çok karakter için "*" karakteri kullanılır. Ayrıca case-sensitive değildirler.

Şimdi aşağıdaki tablo üzerinden bir örnek yapalım.

Kriter alanımız da aşağıdaki gibi olsun. Bu 3 hücre de combobox şeklindedir ve olası değerleri içermektedir. (Kriterler sadece I ve J kolonunda. K kolonundaki bilgiyi formü içinde ayrıca kullanacağız)

Aradığımız şey: Marmara1 bölgesinin 2013 satışları toplamı olsun.

Formülümüz şöyledir.

=DSUM(A1:F19;MATCH(K2;A1:F1;0);I1:J2)

Farkettiyseniz Field parametresini dinamik bir şekilde hesapladık, yani bunu kullanıcıya manuel girdirtmek yerine K2 hücresindeki combobox'tan seçtirdik.

Bu arada bu fonksiyonların joker karakterleri de desteklediğini söylemiştik. Kriter alanını aşağıdaki gibi girersek, Marmara ile başlayan tüm bölgeleri işleme sokar.

Diğer önemli Veritabanı fonksiyonları DCOUNT, DAVERAGE, DMIN VE DMAX'tır. Bunların D'siz versiyonlarını biliyorsanız ne işe yaradıklarını  anlamışsınızdır, bilmiyorsanız önce onlara gözatmanızı tavsiye ederim. Tekrardan kaçınmak adına bunlarla ilgili örnek yapmaya gerek duymuyorum.

1 Boyutlu tablolarda çalışmak

Aşağıdaki gibi matrisyel formda ama yatay ekseni tek kolondan oluşan tablolarla çalışmak oldukça kolaydır. Bunlarda dikey eksen bir kolondan da birkaç kolondan da oluşabilir.

Bunlara, yatay eksende 1 kolon olduğu için 1 boyutlu tablolar diyoruz. Aslında bunu sadece ben diyorum. MSDN dökümantasyonunda yer alan bir sınıflandırma değil yani. Şimdi bu tür tablolarda ne tür işlemler yapabiliyoruz, karşılaştırmalı olarak göreceğiz.

Önemli Not (2 boyutlu tablolar için de geçerlidir)

Aşağıda göreceğiniz gibi, elde edilmeye çalışılan şey ve bunlara ulaşılan yöntem sayısı çok fazla olabilir. Ben elimden geldiğince çok farklı kombinasyonlara değinmeye çalıştım. Ör: Yöntem olarak SUMPRODUCT'ı vermişimdir ama bunun ";" versiyonu da "*" versiyonu da var, hatta bir de VEYA kriteri için "+" operatörlü kullanımı var. Ayrıca çoklu kriterlerin yatay eksenden oluşan bir alandan mı(ör:J1:L1), dikey eksenden oluşan bir alandan mı(ör:J1:J3), yoksa formüle manuel mi(ör:{1;2;3}) girilmesi de kombinasyon sayısını artırmaktadır.

O yüzden tüm kombinasyonları buraya almak çok mantıklı olmayacaktır. Bunun yerine yöntemlerde çeşitlendirme yapmayı tercih ettim. Mesela SUMPRODUCT'ın çoklu kriter örneğini manuel girerken, başka bir fonksiyon alternatifinde yatay eksenden aldım, başkasında ise dikeyden aldım, böylece gereksiz tekrardan kaçınmaya çalıştım. Gerçi buradaki örneklerin bulunduğu excel dosyayı indiriseniz orada bu tekrarların bazısını görebilirsiniz, ama orada bile tüm kombinasyonlar(tahminimce 100ün üzerinde) yok. Bu sayfayı tamamen hatmettikten sonra gereken kombinasyonları siz duruma göre oluşturuyor olabilmelisiniz.

Ayrıca yukarda belirtildiği gibi SUMPRODUCT'ın alternatifi olarak SUM'ın "*"'lı dizi formülünü ise kullanmaktan tamamen kaçındım, örnek dosyada da bulamayacaksınız. Yukarıda sadece bir kere verdim. SUMPRODUCT'lı her case için teorik olarak onu da kullanabileceğinizi bilmenizi isterim(ama SUMPRODUCT varken çok da gerek yok açıkçası)

Son olark burada yapacağımız neredeyse tüm örneklerde kriterler Data Validation'la yapılmış comboboxlar içinden seçiliyor olacakır. Zira kriter değiştirmek istediğimizde formülün içinde bunu değişitrmek yerine kriterin dinamik olarak bir hücreden beslenmesi daha profesyonelcedir.  Bununla beraber bazı örneklerde özellikle çoklu değer girilmesi gereken durumlarda manuel kriter girişi de yapılacaktır. 

A)Dikey eksendeki kolon(lar)da aranan şey 1 adetse

1)Dikey eksende tek kolon var

Eğer, aranan değer bir kez geçiyorsa VLOOKUP veya INDEX/MATCH ile arana değer bulunurken, birden çok kez geçiyorsa SUMIF kullanılarak eşleşenlerin toplamı alınır. Bunlarla ilgili örnekler Lookup fonksiyonları ve istatistiki fonksyionlar sayfalarında fazlasıyla yapılmıştır.

2)Dikey eksende çok kolon var

Dikey eksendeki aranan değerler bir kez geçiyorsa INDEX-MATCH'in dizi formülü olmak zorundadır. Bunu da yine Lookup fonksiyonları sayfasında çok kriterli vlookup olarak görmüştük.

Eğer aranan kriterler çok kez geçiyorsa o zaman birkaç alternatifimiz var. Aşağıdaki örnek üzerinden gidelim.

Bölge2'nin(F33 hücresinde) 2.dönem(G33 hücresinde) satışlarını toplayalım. Formül anlaşılırlığı açısından aşağıda göreceğiniz üzere sırasıyla şu Name tanımlamalarını yaptım: bölgeler, dönemler ve tutarlar.

=SUMIFS(Tutarlar;bölgeler2;F33;dönemler;G33)  //2007 sonrası için SUMIFS
{=SUM(IF((bölgeler2=F33)*(dönemler=G33);Tutarlar))} //SUM+IF dizi formülü
=SUMPRODUCT(--(bölgeler2=F33);N(dönemler=G33);Tutarlar) //SUMPRODUCT ";" ile
=SUMPRODUCT((bölgeler2=F33)*(dönemler=G33)*Tutarlar) //SUMPRODUCT "*" ile
=DSUM(alanfordsum;3;F32:G33)

B)Dikey eksendeki kolon(lar)da aranan şey 1'den çoksa

Dikey eksende birden çok şey aramak, konuşma dilinde "ve", formül dilinde ise VEYA şeklinde algılanır ve eğer ayrı ayrı formüle girecekse "+" işaretiyle girer. Ayrı ayrı girmeyip dizi(manuel veya hüre gurubundan) olarak da girebilir; o zaman fakrlı yöntemler işletilir.

1)Dikey eksende tek kolon var

Aşağıdaki tablo üzerinden gidecek olursak, öncelikle dikey eksende iki kolon olduğunu görüyorsunuz ancak biz tek kolon üzerinden işlem yapacağımız için bunu tek kolonlu bir dikey eksen gibi düşünebilirsiniz.

Şimdi böyle bir tabloda Bölge1 ve Bölge2nin satılarını toplamak istiyoruz. Birçok alternatif olmakla birlikte biz burada birkaçını vereceğiz, kalanına Excel dosya içinden bakabilirsiniz.

=SUM(SUMIF(Tablo[Bölge];{"Bölge1";"Bölge2"};Tablo[Satış])) //Bölge kriteri manuel
=SUMPRODUCT((Tablo[Bölge]=G49:H49)*(Tablo[Satış]))
=DSUM(Tablo[#All];3;F54:F56)
=SUMPRODUCT(((Tablo[Bölge]=G49)+(Tablo[Bölge]=H49))*Tablo[Satış]) //Formül dilinde VEYA

Bu yöntemlerin genel değerlendirmesi aşağıda yapıldığı gibi, Excel dosya içinde de her yöntemin artı ve eksikleri belirtilmeye çalışılmıştır.

2)Dikey eksende çok kolon var

Şimdi ise dikey eksenimizde işlem yapacağımız iki kolon var, ve ayrıca bu iki kolondan da iki kriter birden seçeceğiz. Gördüğünzü gibi işler gittikçe zorlaşıyor.

İşler zorlaşıyor ama alternatifler tükenmiyor. Aşağıda yine 1-2 alternatif verilmiş, diğer alternatifler dosya içinde bırakılmıştır.

=DSUM(Tablo9[#All];3;F66:G68)
=SUM(SUMIFS(Tablo9[Satış];Tablo9[Bölge];{"Bölge1";"Bölge2"};Tablo9[Yıl];"<2012"))
{=SUMPRODUCT((Tablo9[Bölge]=TRANSPOSE(F67:F70))*(Tablo9[Yıl]=TRANSPOSE(H67:H70))*(Tablo9[Satış]))}

Gördüğünzü gibi TRANSPOSE kullanmı olan formüllerde ana fonksiyonumuz SUMPRODUCT olsa bile CSE işlemi yapmamız gerekmektedir.

DSUM'da ise farkettiyseniz 2012'yi iki kere yazmamız gerekti. F67:G67 ile, Bölge1'in 2012'sini alırken, F68:G68 ile de Bölge2'nin 2012'sini almış oluyoruz. Eğer G68'e 2012 yazmazsak Bölge1in 2012si ile Bölge2nin tüm yıllarını toplardı. Bunları excel dosyada deneyip görebilirsiniz.

NOT:Ekli dosyadan da göreceğiniz üzere alternatif yöntemler arasında kötü alternatifler de bulunabilir ve bunlar hiç denenmemelidir. (Teorik olarak kullanılabilseler bile). Çünkü şuanda bile 2 bölge * 2 dönem=4 kombinasyon varken 3 bölge 3 dönem olduğunda 9 kombinasyon olacaktır ki, bu 9 tane manuel kriter girmek demek olacaktır. İkili/üçlü sumifler, Sumproduct'ın veya görevi gören "+" operatörüyle kullanımı bu kötü alternatifler arasındadır.

2 Boyutlu matrisyel tablolarda çalışmak

Aşağıdaki gibi 2 boyutlu matrisyel yapıdaki tablolarla da sık sık çalışıyorsanız bu kısım tam size göre. Bu tablolarda dikey eksen bir veya birkaç kolondan oluşabilirken yatay eksen ise çok kolondan oluşur. Şimdi bu tür tablolarda ne tür işlemler yapabiliyoruz, karşılaştırmalı olarak göreceğiz.

UYARI:1 boyutlu tablolara bakmadan direkt buraya geldiyseniz oradaki "önemli notu" okumanızı tavsiye ederim.

A)Dikey Eksenin 1 kolondan oluştuğu durumlar

1)Kriter:Dikey eksenden 1 değer, yatay eksenden 1 değer; dikey eksendeki değer bir kez geçiyor (Kesişim değeri)

Kesişim bulma örneklerini daha önce lookup fonksiyonlarını incelerken görmüştük. Şimdi onlara bir alterantif olarak da SUMPRODUCT geliyor. Tabi SUMPRODUCT diğerlerinden farklı olarak çok satır ve sütunda kesişenlerin toplamını da alabiliyor, onları da sonraki maddelere göreceğiz.

 

Yukarda M2'nin Ürün3'teki satış rakamını bulmak istiyoruz. Formülümüz şöyle olacaktır.J8'de Mağaza seçimi, K8'de Ürün seçimi yapılıyor olsun. Ayrıca formül okunurluğu adına Name'ler kullanılmıştır.

=SUMPRODUCT((Mağazalar=J8)*(Ürünler3=K8)*Tutarlar3)

İlk iki parantezli grubun önüne -- koyduktan sonra F9 yapınca görüntü aşağıdaki gibi oluyor. Son parantezli grupta ise değerler var, hepsi birbiriyle çarpılınca yanlızca 2.satır 3.sütundaki değer sıfırlanmadan kalır, o da aradığımız değerdir, yani 532.

{0;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0}*{0\0\1\0} 

Bir diğer alternatif de SUMIF+OFFSET+MATCH kombinasyonudur.

=SUMIF(Mağazalar;J8;OFFSET(Mağazalar;0;MATCH(K8;Ürünler3;0)))

Mağazalar kolonunda M2'yi arattırıyoruz, toplam işlemini hangi kolonda yapacağımızı ise Mağaza kolonunu referans verip Ürün3'ün bu referanstan sonraki kaçıncı kolonda geçtiğini buldurarak dolaylı şekilde bulduruyoruz. Bunu da bu sıra numarasını, OFFSET'in ikinci parametresi olarak vererek buldurmuş oluyoruz.

2)Kriter:Dikey eksenden 1 değer, yatay eksenden 1 değer; dikey eksendeki değer birden çok kez geçiyor. (Kesişenlerin toplamı)

Diyelim ki aşağıdaki bir tablomuz var. Bölge1'e ait Ürün3 satışları görmek istiyoruz. (Dikey eksende Bölge-Mağaza olmak üzere 2 kolon olmasına rağmen biz sadece Bölge kolonu üzerinden işlem yapacağımız için bu tablo bu kategoriye uygundur)

Şimdi Alternatiflerimize bakalım.

 

Burada klasik SUMIF yapabiliriz. Tabi ürün adı değişken olacağı için OFFSET-MATCH ikilisinden yararlanırız. Baz olarak Mağazayı alıp bunun kaç kolon sağında olduğunu dinamik bir şekilde buldurabiliriz.

J12'de Bölge, K12'de ürünlere ait Comboboxlar olduğu gözününde bulundurulursa;

=SUMIF(bölgeler3;J12;OFFSET(Mağazalar;0;MATCH(K12;Ürünler3;0)))

Bir diğer alternatif de SUMPRODUCT kullanmak olacaktır

=SUMPRODUCT((bölgeler3=J12)*(Ürünler3=K12)*Tutarlar3)

Burada da yaptığımız normal kesişim formülü yazmak gibidir aslında, sadece birden fazla eşleşme olduğunda sonuçlar toplanmış oluyor, o kadar.

Ve tabiki yine Veritabanı fonksiyonları kullanılabilir.

=DSUM(B6:G24;MATCH(K12;B6:G6;0);J11:J12)

3)Kriter:Dikey eksenden 1 değer, yatay eksenden çok değer; yatay eksendeki kriterler yanyana değil(dikey eksendeki değer 1 veya daha çok kez geçebilir)

2.maddedeki tabloyu kullanacağız. Bu tabloda Bölge2'nin Ürün2 ve ürün4 toplamını bulacağız. Böyle saçma şey olur mu demeyin, olur. Ör:Bankacılık dünyasından bir örnek düşünecek olursak Vadeli TL ve Vadesiz TL olabilir,ve biz Toplam TL mevduat bulmak istiyor olabiliriz .

Bu tabloda kriter alanımızın aşağıdaki gibi olduğunu gözönünde bulunduralım.

Şimdi, hatırlayalım, konuşma dilindeki "Ürün2 ve Ürün4"'ün formül dili karşılğı Ürün2 VEYA Ürün4 idi. VEYA operatörümüz de + işaretiydi. O halde ilk formülümüz aşağıdaki gibi olacaktır.

=SUMPRODUCT((bölgeler3=J17)*((Ürünler3=K17)+(Ürünler3=K18))*Tutarlar3)

Bir diğer alternatif de Ürün2 ve Ürün4 toplamından oluşan yardımcı kolon oluşturmaktır ama bu çok kötü bir alternatiftir. Zira burdaki amacımız yardımcı kolon oluşturmadan işlerimizi halletmektir, üstelik yardımcı kolonlar da genelde daha anlamlı içeriğe sahiptirler; tüm ürünlerin toplamı gibi mesela. İki ürünün toplamından oluşan bir yardımcı kolon pek iyi bir fikir değil.

Başka bir alternatif ise aşağıdaki gibi olabilir

{=SUMPRODUCT((bölgeler3=J17)*(Ürünler3=TRANSPOSE(K16:K19))*(Tutarlar3))}

Burada dikkat ettiyseniz ürünleri alırken sadece iki ürünü seçemiyoruz. Eğer yatay kolondan ürün eşleştirmek istiyorsak tüm ürünlerin sırasına ve sayısına uygun bir kriter dizesini formüle sokmalıyız. Burda 4 ürün var ve sırası Ürün1,Ürün2,Ürün3 ve Ürün4 şeklinde. Biz de K16'da sanki Ürün1, K18'de de sanki Ürün3 varmış gibi düşünerek 4 hücrelik bir alan seçmek durumundayız, bunlardan sadece K17 ve K19'dakiler eşleşeceği için doğru sonucu elde etmiş oluruz. Bu sırada kriter listeleri hazırlamak zahmetli olabileceği için uygulaması biraz zor olabilir ama kriterleri tek tek girmemek adına da kolaylık sağlar.

Dikkat edilecek bir diğer husus da, kriteler dikey eksende olduğu için bunları TRANSPOSE ile çevirmemiz gerektiğidir.

Son yöntemimiz yine SUMPRODUCT ile. Bunda da kriterler elle girilir. Eğer sabit bir fomrül olacaksa ve comboboxlardan değiştirme ihtiyacı olmayacaksa bu yöntem de uygulanabilir.

=SUMPRODUCT(--ISNUMBER(MATCH(Ürünler3;{"Ürün2";"Ürün4"};0))*(bölgeler3=J17)*(Tutarlar3))

Bunda ürünler MATCH ile eşleşiyormu diye kontrol edilip, eşleşenlere eşleşme sırası, eşleşmeyenlere N/A atanmış olur. Sonra bunlar ISNUMBER ile TRUE ve FALSE değerlerine, son olarak da -- ile 1 ve 0'a dönüştürülür. Bunların hepsini aşama aşama aşağıda görebilirsiniz.

MATCH'li kısım-->{#N/A\1\#N/A\2}
ISNUMBER'lu kısım-->{FALSE\TRUE\FALSE\TRUE}
--'li kısım-->{0\1\0\1}

4)Kriter:Dikey eksenden 1 değer, yatay eksenden çok değer; yatay eksendeki kriterler yanyana(dikey eksendeki değer 1 veya daha çok kez geçebilir)

Komşu hücrelerin toplanması sözkonusu olduğunda bir VE işlemi yoktur, tek bir alan(range) işleme girmektedir. Aslında 3.maddeden farklı bir yöntem bulunmamaktadır. Ordaki 3 yöntem aynen uygulanabilir. Yani özeetle komşu olma durumuna özgü ayrı bir yöntem bulunmamaktadır.

Bu maddenin özel durumu olarak "tüm ürünler" düşünülebilir. Yani Bölge2'nin 4 ürün toplamını almak istiyoruz diyelim. Bunun için Yardımcı kolon olarak en sağda bi toplamı kolonu oluşturulup basit SUMIF yapılabilir. Acil çözümler için oldukça geçerlidir. Ancak kalıcı ve şık çözümler için yine SUMPRODUCT'a ihtiyacımız vardır.

J27'de Bölge comoboboxı olduğunu düşünürsek,

=SUMPRODUCT((bölgeler3=J27)*Tutarlar3)

Yeri gelmişken önemli bir hususu belirtmekte fayda var: SUMPRDOCUT'ın çok kolonlu durumlarda sadece"*"lı versiyonunun kullanılabilmesidir. ";"li versiyonu hata verir.

Bir diğer önemli husus da SUMIF'in çok kolonlu kullanımında hata vermemesi ancak yanlış sonuç döndürmesi, çünkü sadece ilk kolonun sonucunu döndürür.

=SUMIF(Table14[Yıl];2010;Table14[[Ürün1]:[Ürün4]]) //hatalı sonuç

B)Dikey Eksenin çok kolondan oluştuğu durumlar

Dikey eksende birden çok kolondan seçim yapmak konuşma dilinde iyelik eki, formül dilinde ise VE kriteri olup bununla ilgili ne yapılacağını dizi formülleri bölümünde görmüştük. Yukardaki 4 madde için 4 farklı versiyon yapılabilir ama biz burada sadece bir tanesini yapacağız.

Şimdi aşağıdaki tabloyu örnek alalım.

Bölge 2'nin 2014teki Ürün1 ve Ürün3 toplamını arıyoruz. Kriter bölgesi aşağıdaki gibidir.

Burdaki alternatiflerimiz şöyledir:

=SUMPRODUCT((bölgeler4=J38)*(yıllar4=K38)*((ürünler4=L38)+(ürünler4=L39))*tutarlar4)=SUM(IF(Table14[Bölge]="Bölge2";IF(Table14[Yıl]<2013;Table14[[Ürün2]:[Ürün3]]))) //Çok kriter olursa çok sayıa içiçe if olacağı için yazımı zorlaşır
=SUMPRODUCT((bölgeler4=J38)*(yıllar4=K38)*(ürünler4=TRANSPOSE(L38:L40))*tutarlar4)

C)Dikey Eksenden çok değer seçimi

Bu kategori için de sadece tek bir örnek yapılacak olup yukardaki örneklere göre çeşitlendirme yapılabilir. Ekli dosyadan da diğer alternatifleri görebilir, orada bulunmayan alternatifler üzerinde kendiniz de çalışarak pratik yapabilirsiniz.

Yukarıdaki son tabloyu örnek alalım. Burda Bölge1 ve Bölge2'nin 2014 toplamını bulmak istiyoruz. İki alternatifimiz şöyle olacaktır. (Q49:Q50'de Bölge1 ve 2 var, R49'da 2014)

=SUMPRODUCT(--ISNUMBER(MATCH(bölgeler4;Q49:Q50;0))*(yıllar4=R49)*tutarlar4)
=SUM(SUMIFS(H34:H51;bölgeler4;Q49:Q50;yıllar4;R49)) //SUMIFS ile yardımcı kolon

Artık iyice kanıksamış olduğunuzu düşündüğüm için fomrülü tek tek açıklamaya gerek duymuyorum.

D)Farklı kolonlarda VEYA işlemi uygulamak

İlginç bir durum da VEYA(formül diliyle) kriterinin farklı kolonlarda uygulandığı durumlardır. Şimdiye kadar VEYA kriterini hep aynı kolon üzerinde uyguladık; Bölge1 VEYA Bölge2, Ürün1 VEYA Ürün2 demek gibi.

Aşağıdaki örneklerde ise farklı kolonlarda VEYA şartı aranacak.

1)Kesişmeyen VEYA'lar

Bu tabloda Personel Tipi=Gişe olan veya Miy tipi BMIY olan kişilerin 4 üründeki toplam satışını arıyoruz. Bunda, önceki örneklere göre çok fakrlı bir durum yok. VEYA koşulumuzu "+" operatörü ile kurgulayarak formülümüzü yazalım.(I57'de Gişeci, J57de BMIY yazmakta)

=SUMPRODUCT(((perstip=I57)+(miytip=J57))*satış)

2)Kesişen VEYA'lar

Bu sefer iki sertifikadan herhangi birine sahip Miylerin toplam satışlarını bulmak istiyoruz. Bunda da yardımcı kolonlar kullanılabilir, hatta iki sertifkanın yanına bir kolon daha açılıp, "ikisi de E ise 1 değilse 0" denip, SUMIF uygulanabilir, ama bunlar bizim için çirkin yöntemler. Biz daha şık olan alternatife bakalım. Ama öncesinde bir üstteki yöntemin aynısını uygularsak nasıl hata yapacağımızı görelim.

=SUMPRODUCT(((cert1="E")+(cert2="E"))*certsatış)

Eğer iki operatörün toplandığı parantezi seçip F9 yaparsak sonucun {2;1;2;2;0;2;0;0;2;2;1;0;1;1;2;0;0;1} olduğunu görürüz. Evet elimizde 0/1den başka 2'ler de olduğunu görüyoruz, çünkü aynı anda iki kriteri sağlayan satırlar 2 döndürüyor. Bizim bunları 1'e döndürmemiz lazım. Bunun için de belki bir önceki sayfada gördüğünüz ama belki hiç dikkat etmediğiniz, ve belki de görüp "işime yaramaz dediğiniz" SIGN fonksiyonu yardımımıza koşar. SIGN ile sayıların işaretini alıyorduk, pozitifler 1, negatifler -1, 0'lar 0 oluyor, tam da aradığımız şey.

=SUMPRODUCT(SIGN((cert1="E")+(cert2="E"))*certsatış)

Genel değerlendirme

Şimdiye kadar gördüğümüz üzere belli bir amacı yerine getirmek için çeşitli alternatifler var. Kimisi şık çözümler sunarken kimisi şık olmayan ama daha hızlı çözümler sunabilmekte. Şimdi, hangi durumlarda hangi alternatifleri kullanabileceğimizin bir özetini vermek istiyorum.

  • Mümkün olduğunda Excel versiyonunuzun desteklediği yerel fonksiyonaları kullanın. SUMIFS(2007 ve sonrası), MINIFS(2016 ve sonrası) gibi
  • Ayrı bir kriter alanı yaratmak sıkıntı değilse bunu yaratın ve Database fonksiyonlarını kullanın. Özelikle Data Validation ile comboboxlardan yararlanacaksanız bu fonksiyonlar çok kullanışlı olmaktadır. Çünkü hem daha hızlı çalışırlar hem de yazılışları basittir. (Hız etkisini bir iki hücreli çalışmalarda hissetmeyebilirsiniz ama çok fazla dizi formülünüz varsa bunları Database fonksyionlarına çevirmenizi öneririm). Buların en önemli eksikliği çok kolon üzerinde işlem yapamıyor oluşlarıdır. Kriterler manuel girilecekse Database fonksiyonları kullanılamaz.
  • Yatay eksenden çok kolon üzerinde işlem yapılacaksa SUMPRODUCT uygun alternatiftir.
  • Database Fonksiyonu kullanılamayan durumlarda mümkünse SUMPRODUCT kullanın, SUM-dizi tarzıdaki dizi formüllerini terih etmeyin.
  • TRANSPOSE kullanımı veya bir şekilde dizi üreten diğer durumlarda formül bitiminde CSE yapılacaksa SUMPRODUCT yerine dizi formüllerini kullanabilirsiniz.

Çeşitli örnekler

0 hariç en küçük sayı

Yapmamız gerek şey, 0'dan büyük hücreleri dizi şeklinde elde edip bunlara MIN işlemi uygulamak.

{=MIN(IF(A2:J2>0;A2:J2))}

Bunun bir altenratifi de SMALL ile dizi formülü yapmadan da aşağıdaki gibi yazılabilir. 0'dan kaç tane var diye bakıyorum, çıkan sonucun bir fazlası x olsun. x. küçük elemanı getir diyorum.

=SMALL(A2:J2;COUNTIF(A2:J2;0)+1)

En küçük 3 elemanın kendisi ve bunların toplamı

Bu örnekte çoklu hücre seçimi yaparak 3 hücreye en küçük 3 elemanı gireceğiz.

{=SMALL(A2:J2;COLUMN(INDIRECT(1&":"&3)))} //Kolon sıra numarası ile
{=SMALL(A2:J2;COLUMN(INDIRECT("A:C")))} //Kolon başlığı olan harflerle 

Bu 3 elemanın toplamını ise ya bu 3 sonucu toplatarak buluruz veya tek seferde yapmak istersek aşağıdaki formülü gireriz.

{=SUM(SMALL(A2:J2;COLUMN(INDIRECT("A:C"))))}

Farkettiyseniz değerleri ayrı ayrı yazdırıraen hem 1:3 hem de A:C şeklinde girebiliyoruz ancak toplam aldırırken sade A:C versiyonu işe yaramakta.

Hatalı değer içeren alanlarda toplama yapmak

Bildiğiniz gibi bir kolonda/satırda N/A gibi değerler varsa SUM fomrülnün sonucu da N/A olmakta, aşağıaki durum çubuğunda da değer görünmemektedir. Adetlerde sorun yok, nları direkt sayar, ama hatalı kaç kayıt var bunu görmek için dizi formül yazmmız lazım. Bunları da aşağıdaki gii

=SUM(IF(ISERROR(D9:D11);1)) //Hatalı kayıt sayısı
=SUM(IF(ISERROR(D9:D11);0;D9:D11)) //Hatasızların toplamı

Bir alandaki benzersiz değerleri saydırmak

Yine yukarıdaki tabloyu kullanalım.

Burada toplam 10 sayı var, bunlardan 157 iki kere geçiyor, o yüzden benzersiz sayı adedi 9'dur. Bunu bulmak için izleyeceğimiz yol FREQUENCY formülünü dizi formülü şeklinde kullanıp her rakamın kaç kez geçtiğini bulmak, sonra bunların 0'dan büyük olup olmadığını kontrol edip TRUE/FALSE döndürmek, en sonunda bu TRUE/FALSEları da -- ile 1/0'a dönüştürüp toplamak olacaktır.

Tabi burada FREQUENCY'nin işleyişini iyi bilmek gerekiyor. İstatistik formüllerinde gördük ki, bu fonksiyon değerlerin sıklığını ele alırken, bir değeri ilk kez gördüğü yerde onun frekansını yazar, sonrakilerde 0 yazar.

{=SUM(--(FREQUENCY(A2:J2;A2:J2)>0))}

Formülün çözümlemesi şöyle:

* FREQUENCY kısmı: {2;1;1;0;1;1;1;1;1;1;0} dizisini döndürü
* Dizi>0: {TRUE;TRUE;TRUE;FALSE;TRUE;TRUE;TRUE;TRUE;TRUE;TRUE;FALSE} döndürür
* --'li kısım: {1;1;1;0;1;1;1;1;1;1;0} döndürür
Sonuç:9

Bu işlemin bir diğer alternatifini de bir alt örnekte göreceğiz

Bir alandaki benzersiz değerleri saydırmak-2

Diyelim ki şubelere mevduat spread hedefi vereceğiz. Yöneticiniz sizden 800 şube için en fazla 8 çeşit spread hedefi vermenizi istemiş olsun. Yani şubeler öyle gruplanalacak ki ens onunda bu 8 grup hedften birinde yer alacaklar.

Örneği basitleştirmek adına biz 20 şube baz alalım. İlk olarak da aşağıdaki gibi bir çalışma yaptınız, şimdi kontrol etmek istiyoruz, kaç çeşit hedef var diye.

Bunu yapmanın iki kötü yolundan biri Remove Duplicates yapıp, diğeri de Pivot table uygulayıp saymak olacaktır. Kötüler çünkü ilkinde isediğiniz sayıya gelene kadar her defasında işlemi yenilemeniz, ikincisinde ise pivot tabloyu refresh etmeniz gerekir.

İyi yöntemler ise bir hücreye formül yazmak olacaktır. FREQUENCY ile dizi formülü yazmayı önceki örnekte görmüştük, tekrar yazmayacağız ancak ekli dosyada bulabilirsiniz. Diğer dizi formülü ise aşağıdaki gibi olacaktır

{=SUM(1/COUNTIF(B2:B21;B2:B21))}

Formülü çözümleyelim

* COUNTIF'li kısım: {2;3;2;1;1;3;3;1;2;1;1;1;1;3;2;3;1;1;3;1}
* 1/COUNTIF:{0,5;0,333333333333333;0,5;1;1;0,333333333333333;0,333333333333333;1;0,5;1;1;1;1
;0,333333333333333;0,5;0,333333333333333;1;1;0,333333333333333;1}
* Sonuç:14

Formülün mantığı şöyle: İlgili alanı kendisiyle COUNTIF'e tabi tutarak her değerden o alanda kaç tane olduğunu buluyoruz. Sonra farklı değerlerin toplamının 1 olması için bunların 1'e bölünmüş halini alıyoruz. Mesela 11,9'dan 3 tane var(kalın kırmızılı olanlar). Bunları toplayınca 1 yapıyor. Diğerlerini de aynı şekilde toplayınca 1 yapar. Tek olanlar zaten 1 olduğu için 1/1=1 yapıyoruz. Sonuç olarak hepsini toplayınca da aradığımız sonuç olan 14'e ulaşıyoruz.

Bir alandaki en uzun metin

Diyelim ki bir alanda girilmiş çeşitli açıklamalar var. Siz bunlardan en detaylısını yani en çok karatkter içeren olanı arıyorsunuz.

Formülümüz aşağıdaki gibidir.

{=OFFSET(A2;MATCH(MAX(LEN(A2:A5));LEN(A2:A5);0)-1;0)}

Bu formülün çözümlemesi de şöyledir

* Dizi1=LEN(A2:A5): {8;10;13;9}
* X=Max(Dizi1): 13 //Bunları en büyüğü
* Y=MATCH(X;Dizi1;0): 3 //13'ün bu dizdeki sırası
* OFFSET(A2;Y-1;0) //A2'den 2 satır aşağı
* Sonuç:Açıklama 1231

RANKIF ve RANKIFS

Bunu daha önceden COUNTIFS ile yapmıştık, şimdi aynısını SUMPRODUCT ile yapmakta.

Yamak istediğimiz şey her bölgenin şubelerini hacimsel büyüklüğüne göre boy sırasına dizmek.

=SUMPRODUCT((bölge=A2)*(C2<rakam))+1

NOT:Bu yöntem de tıpkı COUNTIFSte olduğu gibi daha ok koşul eklenerek RANKIFS olarak da çalışabilir.

En yüksek/düşük x Rakam Toplamı - En yüksek/düşük x rakam hariç Toplam

Aşağıdaki listeden 2 nolu şubenin Para çekme işlemindeki en düşük 3 işleminin toplamını almak istiyoruz.

Formülümüz şöyledir. (F2'de şube kodu olarak 2, G2'de de "Para çek" yazıyor)

{=SUM(SMALL(IF(A2:A161=F2;IF(B2:B161=G2;C2:C161));ROW(INDIRECT(1&":"&3))))}

Çözümlemesi şöyle

* Dizi1:IF(A2:A161=F2;IF(B2:B161=G2;C2:C161)) ile 2 nolu şubenin Paraçek işlein olduğu listeyi elde ediyoruz, yani C2:C10 arası döner.
* Dizi2:ROW-INDRIECT'li kısım:{1;2;3}
* SMALL(Dizi1;Dizi2):{263;290;481}
* Sonuç:1034

Bir de en düşük/yüksek 3 işlem hariç toplam ne kadar diye bakalım. (F7=2, G7=Para çek)

=SUMIFS(C:C;A:A;F7;B:B;G7)-SUM(SMALL(IF(A2:A161=F7;IF(B2:B161=G7;C2:C161));ROW(INDIRECT(1&":"&3))))-SUM(LARGE(IF(A2:A161=F7;IF(B2:B161=G7;C2:C161));ROW(INDIRECT(1&":"&3))))

Burda yapılan da SUMIFS yaparak full toplam almak ve ondan bir üstteki formülü ve bunun LARGE'lı versiyonunu çıkarmaktır.

Gördüğünüz gibi oldukça uzun bi formül oldu bu. Açıkçası yazması bile meşakkatli bu formülün çözümlemesi hiç girmek istemiyorum, bunu bu noktada artık sizin yapabileceğinizi düşünüyorum. Bu arada bunun bir de SUMPRODUCT'lı versiyonu var, ona ekli dosyadan bakarsınız.

Evet, uzunca bir konunun sonuna geldik. Umarım faydalı olmuştur. Her konuda olduğu gibi bunda da tam kavrayış için bol tekrar ile pekiştirilmesi gerekmektedir.

TEST SORULARI

Son Sorumuz şuymuş:Bir metindeki tüm noktaları yoketmek istiyorsunuz. Hangi fonksiyonu kullanırdınız?
Soru:

A şıkkı:

B şıkkı:

C şıkkı:

D şıkkı:

Doğru Cevap Etiketler

İlişkili konuyu seç

98290

Label
* Sorulara verilen yanlış cevaplardaki esprili yorumlarım için hoşgörünüze sığınıyorum.
* Test ve Ödevlerdeki bazı detaylar burada anlatılmamış olabilir. Bunları kendiniz araştırıp bulmalısınız.
* Birden çok konuya ait içeriği olan ödevler var. Algoritmik açıdan bakıldığında o an en uygun konuya adreslenmiştir.
Dikkat! Bir soruya cevap verdikten sonra geri dönemezsiniz.
0
0
0
0

SoruID:... Şu an için bu konu için soru bulunmamaktadır. İletişim menüsünden örnek sorularınızı bana iletebilirsiniz.




ÖDEVLER

0
0
ÖdevNo:... Şu an için bu konu için ödev bulunmamaktadır. İletişim menüsünden örnek ödev sorularını bana iletebilirsin.
Çözüme bakın(Başka türlü de çözülebilir tabi, bu benim çözümüm.)




=YORUMLAR ve SORULAR=


DEVİR UYARISI

Herkese merhaba. Hosting maliyetlerinin aşırı artması yüzünden sitemi yakın zamanda(en geç Mayıs 2023) kapatmaya karar vermiştim. Ancak, siteyi yakından takip eden bir arkadaş siteyi devralmak istemiştir. Siteyi, Mayıs ayında kendisine devir etmeye karar verdim. Üyelik bilgilerini bana güvenerek girdiğiniz için, hepsini silmiş bulunuyorum, yani mail adreslerinizi kimseyle paylaşmamış olacağım. Bilginizi rica ederim.