LibreOfis de Hücre Rengine Göre Toplama

Gokrtl

Gökhan Kartal (TeknoDay)
Staff member
Katılım
27 Şubat 2019
Mesajlar
11,324
Resimdeki gibi rastgele rakamlarım var ve ben sadece sarı renkteki hücreleri toplamak istiyorum. Bunu nasıl yaparım?

libre.png
 
önce uno ve python kurulu olduguna emin olun
Python:
import uno
from com.sun.star.awt import FontWeight
localContext = uno.getComponentContext()
resolver = localContext.ServiceManager.createInstanceWithContext("com.sun.star.bridge.UnoUrlResolver", localContext)
context = resolver.resolve("uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext")
desktop = context.ServiceManager.createInstanceWithContext("com.sun.star.frame.Desktop", context)
model = desktop.getCurrentComponent()
sheet = model.CurrentController.ActiveSheet
toplam = 0
for row in range(sheet.Rows.getCount()):
    for col in range(sheet.Columns.getCount()):
        cell = sheet.getCellByPosition(col, row)
        cellColor = cell.getPropertyValue("CellBackColor")
        # Sarı rengin RGB kodu
        if cellColor == 16776960:
            cellValue = cell.getValue()
            if isinstance(cellValue, (int, float)):
                toplam += cellValue
print("Sarı renkteki hücrelerin toplamı:", toplam)

Yukarıdaki Python kodunu çalıştırmadan önce, LibreOffice belgesini açık tutmalısınız
Kodda geçen localhost ifadesi, LibreOffice uygulamasının yerel bilgisayarınızda çalıştığını ve 2002 port numarasının kullanıldığını varsayar
 
Kolay olmayacak sanırım. Yarın bakayım. Yattım artık.
 
Burada anlatılmış .
Tek sorun sütün sütün toplam alabiliyor ,en sonunda da onları toplatırsın,eğer sadece rakamlar varsa tek sütun haline getirisin)

 
Son düzenleme:
Amaç bunu toplayıp bir hücreye yazdırmak is VB ile kod yazarak yapabilirsiniz

Şurada yazı rengini tespit etmek için anlatımı var. Yazı rengi yerine hücre rengi için küçük bir fark gerekecektir. (kodda CharColor yerine başka birşey yazacaksınız. Ezbere bilmiyorum, araştırırsınız. BackColor olabilir mesela)

Sonra bu değerleri tablonun sağında, tabloya paralel ikinci bir tablo yapıp yerleştirin. Böylece ilk tablonun renklerinden oluşan bir tablonuz olacak.

Sonra:
=SUMIF( xx:xx, y, zz:zz)
formülü ile toplamı hesaplayabilirsiniz. Formülde;
- xx:xx yerine ikinci tablonun başlangıç ve bitiş hücreleri gelecek ($H$1:$M$25 gibi)
- y yerine süzmek istediğiniz rengin hesaplanan kodu gelecek
- zz:zz yerine ilk tablonun başlangıç ve bitiş hücreleri gelecek ($A$1:$F$25 gibi)
 
"CellBackColor" mış.

Kod:
Function RGBprobe(x , y, optional z)
Dim RGBarray(1 to 3)
oDoc = ThisComponent
oSheet = oDoc.Sheets(0)
'Decreasing coordinate values by 1 because BASIC starts numbering with 0.
If NOT IsMissing(z) Then oSheet = oDoc.Sheets(z-1)
oCell = oSheet.getCellByPosition(x-1,y-1)
CBkC = oCell.CellBackColor
RGBarray(1) = Red(CBkC) : RGBarray(2) = Green(CBkC) : RGBarray(3) = Blue(CBkC)
RGBprobe =RGBarray
End Function

Hatta RGB değerleriyle ayrı ayrı uğraşmamak için şöyle sadeleştirin:

Kod:
Function RGBprobe(x , y, optional z)
  oDoc = ThisComponent
  oSheet = oDoc.Sheets(0)
  'Decreasing coordinate values by 1 because BASIC starts numbering with 0.
  If NOT IsMissing(z) Then oSheet = oDoc.Sheets(z-1)
  oCell = oSheet.getCellByPosition(x-1,y-1)
  CBkC = oCell.CellBackColor
  RGBprobe =CBkC
End Function
 
Teşekkürler, Gün içinde ekleyeceğim kodu.
 
"CellBackColor" mış.

Kod:
Function RGBprobe(x , y, optional z)
Dim RGBarray(1 to 3)
oDoc = ThisComponent
oSheet = oDoc.Sheets(0)
'Decreasing coordinate values by 1 because BASIC starts numbering with 0.
If NOT IsMissing(z) Then oSheet = oDoc.Sheets(z-1)
oCell = oSheet.getCellByPosition(x-1,y-1)
CBkC = oCell.CellBackColor
RGBarray(1) = Red(CBkC) : RGBarray(2) = Green(CBkC) : RGBarray(3) = Blue(CBkC)
RGBprobe =RGBarray
End Function

Hatta RGB değerleriyle ayrı ayrı uğraşmamak için şöyle sadeleştirin:

Kod:
Function RGBprobe(x , y, optional z)
  oDoc = ThisComponent
  oSheet = oDoc.Sheets(0)
  'Decreasing coordinate values by 1 because BASIC starts numbering with 0.
  If NOT IsMissing(z) Then oSheet = oDoc.Sheets(z-1)
  oCell = oSheet.getCellByPosition(x-1,y-1)
  CBkC = oCell.CellBackColor
  RGBprobe =CBkC
End Function
Biraz daha net bilgi vereyim.
Kendim için aylık gelir giderlerimi tuttuğum bir sayfam var. Buradaki "Giderler" bölümündeki Sarı hücreler ödemesini yaptıklarım. Renksiz olan hücreler ise henüz ödemediklerim. Ben elime geçen paranın ne kadarını kullanıp ödeme yapmışım, tespit edebilmek için sarı hücreleri toplamak istiyorum.
Resimde göreceğiniz üzere biraz dağınık. Belki bunları aşağıda görünmeyen bir yerde tablo yapıp, yukarıya toplamını çağırabilirim.
Sizin kodu ekledim ama doğru kombinasyonu bulup bir türlü çalıştıramadım. Yani sarı hücreleri bir yerde toplayamadım.
Örnek linteki arkadaş =RGBPROBE(COLUMN()-1;ROW()) böyle bir kod vermiş ama bir türlü doğru veriyi giremedim.

goko.png


vb.png
 
Gökhan bu şekilde tasarlanınca çok karmaşık olur bence .
Sen libre office kullanıyorsun ben excelde basit bir şablon hazırladım.Bu şablona 1-2 hücre daha eklenebilir.
ödeme yapıldı ise yanındadaki hücreye E yazılınca (Evet ödeme yapıldı anlamında )bir sağdaki hücreye ödenenler hücresini bu değere eşitliyor.
(Belirli şarta göre hücreyi renklendirme excelde de var ancak hatırlayamadım )10 yıldan fazla excel kullanmadım
Bunun formül kısmını üstte çerçeve içine aldım zaten libre office de yaklaşık aynı komutları ve syntaxları kullanıyor sanırım.Diğer kısımları toplama çıkarma zaten. Birkaç örnek harcama girdim toplamları alması için

excel taslak.png
 
Son düzenleme:
Gökhan bu şekilde tasarlanınca çok karmaşık olur bence .
Sen libre office kullanıyorsun ben excelde basit bir şablon hazırladım.Bu şablona 1-2 hücre daha eklenebilir.
ödeme yapıldı ise yanındadaki hücreye E yazılınca (Evet ödeme yapıldı anlamında )bir sağdaki hücreye ödenenler hücresini bu değere eşitliyor.
(Belirli şarta göre hücreyi renklendirme excelde de var ancak hatırlayamadım )10 yıldan fazla excel kullanmadım
Bunun formül kısmını üstte çerçeve içine aldım zaten libre office de yaklaşık aynı komutları ve syntaxları kullanıyor sanırım.Diğer kısımları toplama çıkarma zaten. Birkaç örnek harcama girdim toplamları alması için
Evet böyle kolayca yapılabilir ama sistemi tamamen değiştirip e-h koyacak sütun oluşturmak lazım. Bir daha düzenlemeye üşeniyorum. :D Mecbur kalırsam yaparım artık.

Aslında aradığım da böyle basit çözüm. VB ile makro eklemeyi pek sevmiyorum. Çünkü her seferinde başka pc de çalışacak mı? Pc formatından sonra makro etkinleştirmeyi hatırlayacak mıyım vs. gibi endişelerim oluyor. Ama bazen mecbur kalıyor işte insan.
 
Excel de sütün oluşturmak çok basit oluşturmak istediğin hücre aralığına gel sağ klik "Ekle " bu kadar .Resimdeki formülü (hücre adlarına göre güncelle) sağ alt kenarına çift klik yap aynı formülü dolu tüm alt kolana excel otomatik doldurur.
 
Bazı denemeler yaptım. Yukarıdaki örnek kodları denedim, iki gündür internette araştırma yapıyorum ama nafile. Libreofis de renklere göre hücre toplama yok. Daha önce benden başka kimseye lazım olmamış sanırım. Aslında makro yazılarak kolayca halledilebileceğini düşünüyorum ama ben bilmiyorum makro yazmayı.

Exelde bunun bir hazır makrosu var ve kolayca yapılıyor gibi görünüyor. Sırf bu yüzden exel'e geçsem mi diye düşünüyorum ama bilgisayara da virüs bulaştırmak istemiyorum.

Ayrıca libreofis forumlarına da üye olunamıyor. Daha önceden üyeliği olan varsa yada üye olup konu açmayı başarabilen varsa benim adıma bir konu açsın ne olur.

 
Pardus forumlarında LibreOfis bölümüne bir konu açıp bir miktar ilerleme kaydettim.
Elime hücre rengine göre toplama yapan bir makro geçti. Ancak bu makro fonksiyon biçiminde olmadığı için kullanışlı değil.
Makronun çalışması için ya her seferinde makroyu çalıştırmak gerekti yada makroyu tetiklemek için tablo içine bir buton koymam gerekti.
ayrıca istediğim hücrede istediğim aralığı toplayabilmek için her seferinde makro koduna müdahale etmem gerekti.
Bu makroyu dışarıdan veri alacak şekilde fonksiyona çevirebilmek için bir miktar çaba sarf ettim ama kodlara hakim olmadığım için ve bu konuda destek devam etmediği için başaramadım. Konunun detayı aşağıdaki linkte.


Bunun dışında exele makro yazan yapay zeka keşfettim. GPTEXEL diye bir uygulama. Ne istediğini söylüyorsun makrosunu, fonksiyonunu yazıp veriyor.

Ekran görüntüsü 2024-05-18 130252.png
 
Şimdi chatgpt ye sordum, mantıklı bir prosedür verdi. Ama ben librecalc'tan hiç anlamam o yüzden deneme şansım yok

1716028832988.png
 
Bu da toplamın otomatik olarak güncellenmesi

1716028903004.png
 
Bu da toplamın otomatik olarak güncellenmesi

33764 eklentisine bak
Ona bende sordum abi. Sürekli VB için kod üretiyor. Libreofise uymuyor.
LibreOfisin verdiği hatayı yazınca da "özür dilerim bu tanımlama libreofis de çalışmaz, onun yerine şu kodu kullanmalısın" deyip başka bir hatalı ood üretiyor.
 
Aslında elde ettiğimiz kodlar mantıklı. Sadece libreofise göre nasıl değiştireceğimizi bilemiyoruz.
 
Evet aynen. Şimdi benim Linbreoffıce 7.6.4 e makroyu yükledim, hata veriyor. Chatgpt libreoffice'den zerre kadar anlamıyor gerçekten. Dokümantasyonu okuyup olması gerektiği gibi halletmek lazım.

Rengi kontrol edip ona göre toplama yapan makro yazılacak. Sonra da hücrelerden herhangi birisinde bir değişiklik olduğunda makro otomatik çağrılacak şekilde bir "event listener" yapılacak.
 
Bence bilene basit bir iş ama libreofisden anlayan kişi sayısı çok az sanırım. Bir kaç gündür exel'e mi geçsem diye düşünüp duruyorum.
 

Çevrimiçi üyeler

Çevrimiçi üye yok.

Forum istatistikleri

Konular
6,520
Mesajlar
110,855
Üyeler
2,679
Son üye
eg3wie

Son kaynaklar

Son profil mesajları

hakan8470 wrote on Dede's profile.
1717172721760.png
Dedecim bu gul mu karanfil mi? Gerci ne farkeder onu da anlamam. Gerci bunun anlamini da bilmem :gulus2:
Lyewor_ wrote on hakan8470's profile.
Takip edilmeye başlanmışım :D ❤️
Merhaba elektronik tutsakları...
Lyewor_ wrote on taydin's profile.
Merhabalar. Elektrik laboratuvarınız varsa bunun hakkında bir konunuz var mı acaba? Sizin laboratuvarınızı merak ettim de :)
Lyewor_ wrote on taydin's profile.
Merhabalar forumda yeniyim! Bir sorum olacaktı lcr meterler hakkında. Hem bobini ölçen hemde bobin direnci ölçen bir lcr meter var mı acaba?
Back
Top