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

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 Beğeni
  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.

5 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.

3 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.

2 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.

3 Beğeni

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

Yusuf Bey burada ofis eklentisi yazmak için bir örnek var.

Şöyle bir deneme yaptım. Şimdi de 508 hatası alıyorum.

Function renkTopla(sutun,satir,renk,pos)
oSheet = ThisComponent.CurrentController.ActiveSheet
For sutunn = sutun to 10 REM 0=A 1=B 2=C sutunları
  For satirr = satir to 19 REM 0=birinci satır, 1=ikinci satır 2=içinci satır ....
    hucre = oSheet.getCellByPosition(sutunn, satirr) REM örnek (0,0)=A1 sutunu, (2,3)=C4 sutunu ...
    if (hucre.cellBackColor>0) Then REM hucre rengi beyazdan farklı bir renk ise işlem yapılacak
      For bulunan_satir = renk to 31 REM 3 tane renk için satır sayısı belirtildi. Fazla renk varsa sayıyı artırın.
        bulunan = oSheet.getCellByPosition(pos, 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 satirr
Next sutunn

End Function
1 Beğeni

Biraz araştırınca 508 hatasının formül yazım hatası olduğunu anladım.
Doğru şekilde formülü yazınca bir toplam elde ettim ama toplama hesabı yanlıştı.
Hücre aralıklarını doğru girmediğimi düşünerek biraz daha kurcalayınca belgem açılmayacak ve kurtarılamayacak şekilde hata verdi.
Kısa bir panikten sonra “C:\Users\xxxx\AppData\Roaming\LibreOffice\4\user\basic\Standard” altındaki makro sayfasına girip oluşturduğum fonksiyonu silince belegemi kurtardım.
Bu günlük bu kadar atraksiyon yeter. :slight_smile:

1 Beğeni

Bu arada Gpt Excel isimli bir yapay zeka destekli hesaplama tablosu teknolojisi var. Onu da denemenizi öneririm. Türkçe olarak istediğinizi yazın, size gereken tabloyu oluşturuyor. Dilerseniz sizin için macro yazabiliyor.

Örnek Olarak Yaptığım Bir Uygulama

1 Beğeni

Keşke GptCalc da olsa. O zaman Libre Office Calc makrolarını yazmak için uğraşmak gerekmezdi.

1 Beğeni

Bu konu son yanıttan 30 gün sonra otomatik olarak kapatıldı. Yeni yanıtlara artık izin verilmiyor.