Renklere göre hücre toplama nasıl yapılır?

Merhaba,

Evde Libreofiste aylık giderlerimi tutuyorum. Faturalar, mutfak masrafları vs. gibi.

Tablomda rastgele hücrelerde ödemem gereken ücretler var. Ben bu ücretleri ödediğim zaman hücreyi sarıya boyuyorum.

Bu sayede hangileri ödendi, hangileri ödenmedi ayırabiliyorum.

Gelelim sıkıntıya. Ben ödediğim tüm ücretlerin toplamını görmek istiyorum.

Ödediğim ücretlerin hücrelerini sarıya boyadığıma göre bu renge göre toplama yapmam lazım.

Bu ücretler tabloda değişik yerlerde duruyorlar. Alt alta yada yan yana değiller. Bu yüzden filitre filan kullanamıyorum.

Kısacası bana “hücre rengi sarı ise, hücre değerini al ve topla” gibi bir şey formül lazım.

Araştırmalarım sonucu bazı makrolar filan buldum ama sonuca varamadım. Sağolsunlar libreoffis forumlarına üye olmak da cehennem azabı gibi.

1 Beğeni

Microsoft excelde bile böyle bir özellik yok maalesef. Ama hücre yanına ek bir hücreye tik işareti koyarak yapabilirsin sanırım.

1 Beğeni

Microsoft Exel de makro ile yapılabiliyor.
Aşağıya linkini ekliyorum. 50.saniyeden itibaren izleyebilirsiniz.
Libreofiste de yapılabileceğine eminim. Sadece makro yazmaya hakim birinin el atması lazım diye düşünüyorum.

Libre Office Calc how COLOR function work - English - Ask LibreOffice internet sayfasında makrolu bir anlatım var ama sorununuzu çözer mi bilmiyorum.

1 Beğeni

Bir bakayım ama bu muhtemelen rengi tespit ediyor. Devamında o rengi nasıl işleyeceğimi de bilmiyorum ben.

Kod:

REM --- macro çalıştırılmadan önce G1 hücresinden itibaren aşağıya doğru 
REM --- toplanacak renkleri sırayla hücre arkaplan rengi olarak alt alta belirleyin
REM --- örnekte kırmızı sarı ve turuncu olarak verildi.

Sub Topla
oSheet = ThisComponent.CurrentController.ActiveSheet
For sutun = 0 to 2 REM 0=A 1=B 2=C sutunları
  For satir = 0 to 4 REM 0=birinci satır, 1=ikinci satır 2=üçüncü satır ....
    hucre = oSheet.getCellByPosition(sutun, satir) REM örnek (0,0)=A1 hücresi, (2,3)=C4 hücresi ...
    if (hucre.cellBackColor>-1) Then REM hücre rengi olan hücrelerde işlem yapılacak
      For bulunan_satir = 0 to 2 REM 3 tane renk için satır sayısı belirtildi. Fazla renk varsa sayıyı artırın.
        bulunan = oSheet.getCellByPosition(6, bulunan_satir) REM toplamları G sutununa yazmak için 6 yazıldı. Çünkü G sutunu 6. sutundur.
        if bulunan.cellBackColor = hucre.cellBackColor Then
          bulunan.setValue(bulunan.getValue()+hucre.getValue())
        End if
      Next bulunan_satir
    End If
  Next satir
Next sutun

End Sub
6 Beğeni

Merhaba Kaan.
Zahmetin için teşekkür ederim. Biraz daha yardıma ihtiyacım var. Daha önce hiç makro kullanmadığımdan doğru kullanım şeklini beceremiyorum sanırım.
İki konuda yardıma ihtiyacım var.
1- Makroyu belge içinde nasıl çağıracağım?
2- İstediğim hücrede nasıl göstereceğim? Mesela sonuç M22 hücresinde gösterilsin istiyorum. Bunu nasıl yaparım?

  1. Belgeyi açtıktan sonra; Araçlar - Makrolar - Makroları Düzenle seçeneğini seçin.
    Açılan pencerenin sol tarafında bulunan Ağaç yapısından Belgenizin adını seçin ve altına açılan dal’dan Standart seçeneğini seçin ve Makroyu sağ tarafdaki editöre yapıştırın.
    Çalıştırmak için Makro penceresindeki yapıştırdığınız bölümün hemen üstündeki PLAY tuşuna basabilirsiniz ya da Form denetiminden sayfaya bir buton koyarak makroya atayabilirsiniz.

  2. 12=M sutunu demek, 21 ise 22.satır demek. Satır ve sutunlar 0’dan başlıyor çünkü.
    0=A sutunu, 1=B sutunu, 2=C sutunu … 12=M sutunudur.
    Sonuç olarak toplamlar M22 sutunundan aşağıya doğru yazılacak demektir.

For bulunan_satir = 0 to 2
   bulunan = oSheet.getCellByPosition(6, bulunan_satir)

satırını aşağıdaki gibi değiştirin:

For bulunan_satir = 21 to 24
   bulunan = oSheet.getCellByPosition(12, bulunan_satir) 

21 to 24 demek M22,M23,M24 hücrelerine yaz anlamına geliyor. Örnekte ben 3 renk kullandığım için 21 to 24 arası olarak belirledim. Mesela 5 renk varsa 21 to 26 yazabilirsiniz.

4 Beğeni

Ek olarak M22 hücresinden başlayarak aşağıya doğru (M22, M23, M24, M25…) belirlediğiniz renkleri hücrelerin arkaplan rengi olarak belirlemeyi unutmayın.

2 Beğeni

@kaan Makro meselesine şu ana kadar hiç girmedim ama gördüğüm kadarıyla makrolar çok kolaylık sağlıyor. Makro öğrenmek istesem, bununla ilgili anlatım videoları var mı tavsiye edebileceğiniz? İnternette bazı videolar gördüm izledim ama pek anlayamadım onlardan.

1 Beğeni

Chapter 13 Getting Started with Macros linkinden başlayabilirsiniz ama yapmak istenilen işlem ile ilgili aratmalar yaparak birçok dokumana ve videoya ulaşabilirsiniz.

2 Beğeni

Bu gün biraz daha inceleme fırsatım oldu. Sonuç olarak bu makronun fonksiyon olması gerektiğine kanaat getirdim. Çünkü gelirlerimi ayrı yerde giderlerimi ayrı yerde toplamam gerekiyor. Ve bunların yeri alt alta değil. O yüzden bu makroyu fonksiyon şeklinde yazıp, istediğimiz yerde satır ve sütun bilgilerini kendimiz girecek şekilde özgürleştirmeliyiz.
Kısacası ben canımın istediği hücreye girip: (Fonksiyon ismini “renkTopla” yaptığımızı var sayıyorum.
“=renkTopla(B3:K20)” yazdığımda, bana B3 ile K20 arasında kalan bütün “sarı” hücreleri toplayabilmeli.

Daha sonra başka bir hücreye gidip, başka bir aralıktaki sarı hücreleri de ayrıca toplayabilmeliyim. Biraz PHP dilinde fonksiyon yazma tecrübem var ama Libreofisin kullandığı dili bilmediğim için hiç bir şey yapamıyorum.

Bu kod çok temel, basit ve amaca yönelik sade bir başlangıçtır. İsteğe göre geliştirilebilir ve detaylandırılabilir.

Daha önce bir işim için MS Office Excel’de bir makro yazmıştım, problemimi çözmüştü. Lakin visual basic kullanılması bana çok itici geldi. Keşke python falan kullanılabilse diye düşünmüştüm. Libre Office 2021 yılında yapılan bir konferans’ta ScriptForge ile python kullanılarak makro yazılabileceği anlatılıyor.

Ayrıca aşağıdaki kaynakta yine Python ile basit bir makro örneği var.

Maalesef Türkçe kaynak pek yok bu konuda (Python ile makro yazma hususunda).

2 Beğeni

Aynı fikirdeyiz.

İşlevin bildirimi düşünce olarak şu şekilde olabilir.

=rengeGoreTopla(B3:K20; L3)

B3 ile K20 arasında toplamak istediğimiz veriler olsun. L3 hücresinin rengi de sarı olsun.

Ancak teknik bir güçlük var.

Libre Ofis makrolarında bildiğimiz kadarı ile bir aralık gönderemiyorsunuz. Bunun yerine verilerin kendi gidiyor.

Örneğin Ahmet. Mehmet, yirmi, otuz neyse.

Verilerin olduğu aralığa bir isim verebiliyorsunuz.

O zaman belki işlev tasarımı şu şekilde olabilir.

=rengeGoreTopla("L3")

Dikkat ederseniz renk bulunan hücreyi tırnaklar içinde dizge olarak gönderiyoruz.

Sinan bey burada Türkçesi var.

1 Beğeni

Mesela ilk etapta makroyu fonksiyon içine almaya çalıştım. Verileri de dışarıdan almak istedim. “Değişken seçimlik değil” diye bir hata verdi.

1 Beğeni

Ozaman ben biraz makroyu fonksiyona çevirmeye çalışayım. Takıldığım yerde desteklerseniz hem ben öğrenmiş olurum hemde ortaya kullanışlı bir fonksiyon çıkartmış oluruz. Başkalarıda faydalanır.

Emeğine sağlık kardeşim, çok teşekkürler.

1 Beğeni

Allah’ın izni ile oldu.

Aşağıdaki kütüğü

/home/erdem/.config/libreoffice/4/user/Scripts/python

dizinine renkli.py ismi ile kaydediniz.

Burada erdem yerine kendi kullanıcı adınızı seçiniz.

import uno

def rengeGoreTopla(renk):
    belge = XSCRIPTCONTEXT.getDocument()
    sayfa = belge.Sheets[0]
    renkliHücre = sayfa[renk]
    istediğimizRenk = renkliHücre.CellBackColor
    toplam = 0
    for satır in range(0, 19):
        for sütun in range(0, 11):
            hücre = sayfa.getCellByPosition(sütun, satır)
            if hücre.CellBackColor == istediğimizRenk:
                okunan = hücre.getValue()
                toplam += okunan
    renkliHücre.setString(str(toplam))
    return

def  renkliTopla(birşeyler):
    renkliHücreler = { "M1", "M2", "M3", "M4", "M5" }
    for hücre in renkliHücreler:
        rengeGoreTopla(hücre)

Makroyu çalıştırdığınızda M1:M5 aralığındaki hücrelerin renklerine göre A1:K19 arasında bulunan sayıları topluyor.

Veriler değiştiğinde makronun çalışması için altaki Sayfa1 e sağ tıklayınız.

Sayfa Olayları -> İçerik değişti ata Makro yolunu takip ederek renkli içinden renkliTopla yı seçiniz.

Makroların çalışabilmesi için Araçlar -> Seçenekler -> Güvenlik -> Makro Güvenliği yolunu takip ederek Düşük ya da Orta olarak seçmek gerekiyor.

Orta düzey güvenlik seçerseniz makro içeren her belgede sizden onay istiyor.

2 Beğeni

Bu tarz şeyleri fonksiyona çevirip libreoffice’e ekletmek mümkün mü? Olursa çok güzel olur.