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?
-
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. -
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.
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.
@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.
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.
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).
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.
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.
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.
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.
Bu tarz şeyleri fonksiyona çevirip libreoffice’e ekletmek mümkün mü? Olursa çok güzel olur.
Şö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
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.
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
Keşke GptCalc da olsa. O zaman Libre Office Calc makrolarını yazmak için uğraşmak gerekmezdi.
Bu konu son yanıttan 30 gün sonra otomatik olarak kapatıldı. Yeni yanıtlara artık izin verilmiyor.