• DİKKAT !

    Forum içeriğine ve tüm hizmetlerimize erişim sağlamak için foruma kayıt olmalı ya da giriş yapmalısınız. Foruma üye olmak Dosya Yükleme tamamen ücretsizdir.

Soru Bodroda aylar itibarıyla yıllık matrah toplamı getirmede sorun

mars2

Gold Üye
Katılım
22 Nis 2022
Mesajlar
81
Aldığı beğeni
15
Excel V
Office 2016 TR
Gold Bitiş
25 Mayıs 2026
Konu Sahibi
Windows 10 Mozilla Firefox 150
İyi Akşamlar;
Daha önceden userx tarafından yıllık matrahları aylardaki sayfalara aktarılmkata ancak, bodro 40 - 50 kişilik olmasına rağmen yıllık matrahın buşlunduğu G sutunda bodro dışındaki bulunan 190 ncı satıra kadar 0 (sıfır) değeri atamaktadır. Sorunun kaynağı ile çözümü için desteğinizi.


HTML:
Kod:
İçeriği görebilmek için Giriş yap ya da Üye ol.

1777927035800.png
 
Windows 10 Opera 130
Sorunun sebebi şu satır: For Z = 10 To son + 5

Burada son, Yıllıkmatrah sayfasındaki son satıra göre alınıyor. Yıllıkmatrah’ta 185 kişi/satır varsa, aylık sayfalarda 10’dan 190’a kadar G sütununa formül sonucu yazılıyor. Bordroda kişi olmasa bile SUMIF sonucu bulunamadığı için 0 yazıyor.

Şu şekilde düzeltin: aylık sayfada B sütunundaki gerçek son bordro satırını bulun ve sadece o kadar satıra yazdırın.

HTML:
Kod:
İçeriği görebilmek için Giriş yap ya da Üye ol.

Deneyiniz
 
Konu Sahibi
Windows 10 Mozilla Firefox 150
Sayın arzuhalci;

İlginize teşekkürler. Ancak, her ay farklı kişi veya sayıda olabileceğinden bu sorunla karşılaşmamak için yıllık matrahın toplamını alma hakkında farklı düşünceniz veya yol var mıdır.
 
Windows 10 Opera 130
Daha sağlam yol: aylık sayfalara tekrar tekrar yazmak yerine, yıllık matrahı sadece Yıllıkmatrah sayfasında kişi bazında toplayıp, aylık sayfalarda gerekirse DÜŞEYARA/XLOOKUP veya SUMIF ile göstermek.

En sağlıklı mantık şu olur:
Her ayın bordrosundan sadece dolu personel satırlarını oku.
Personeli TC/Personel No gibi benzersiz bir alanla eşleştir.
Yıllıkmatrah sayfasında her personel için ay ay ve kümülatif toplam oluştur.
Aylık sayfaya G sütunu yazılacaksa sadece o ayda bordroda olan kişilere yaz.

Benim tercih edeceğim sade VBA yaklaşımı şu:
HTML:
Kod:
İçeriği görebilmek için Giriş yap ya da Üye ol.

Ama daha iyi tasarım şudur:
Aylık sayfalarda G sütununu VBA ile doldurmayın. G10’a şu mantıkta formül yazın ve aşağı doğru sadece bordro satırı kadar çoğaltın:
HTML:
Kod:
İçeriği görebilmek için Giriş yap ya da Üye ol.
Ocak için D : D, Şubat için E:E, Mart için F:F gibi devam eder.

En temiz çözüm ise aylık sayfaları standart tabloya çevirmek:
AyTC/Personel NoAd SoyadMatrah

Sonra yıllık toplamı PivotTable veya Power Query ile almak. Böylece kişi sayısı her ay değişse bile 40 kişi de olsa 200 kişi de olsa sorun çıkmaz.

Kısaca: Mevcut VBA düzeltilebilir; fakat uzun vadede en sağlam yöntem aylık verileri tek listeye toplayıp yıllık matrahı oradan üretmektir.
 
Konu Sahibi
Windows 10 Mozilla Firefox 150
İyi Akşamlar;
Konu hakkında önerileriniz ve yardımlarınız beklenmektedir.
 
Windows 10 Opera 130
HTML:
Kod:
İçeriği görebilmek için Giriş yap ya da Üye ol.

böyle denermisiniz
 
Windows 10 Opera 130
HTML:
Kod:
İçeriği görebilmek için Giriş yap ya da Üye ol.

Yani artık bütün G10:G190 alanına dizi halinde değer basmak yerine, sadece bordroda gerçekten personel olan satırın G hücresine değer yazılır. Hr iki kodu deneyin bakalım
 
Konu Sahibi
Windows 10 Mozilla Firefox 150
Sayın arzuhalci;

Yardımlarınız için teşekkürler. kodunuz denedim çalıştı. ancak, syf.Range("G10:G" & sonAy).ClearContents satırında hata verdi
 
Windows 10 Opera 130
Eğer sonAy değerinin doğru hesaplandığını görmek isterseniz, kodu şu şekilde değiştirebilirsiniz

HTML:
Kod:
İçeriği görebilmek için Giriş yap ya da Üye ol.

Bu kod, sonAy değerini bir mesaj kutusunda gösterecek ve değerin geçerli olup olmadığını kontrol etmenizi sağlayacaktır.

Özet:

sonAy değerini doğru şekilde hesaplayın ve geçerli olup olmadığını kontrol edin.
Geçerli değilse, kullanıcıya hata mesajı gösterin ve işlemi durdurun.
Kodunuzun çalışabilmesi için sonAy'ın geçerli bir satır numarası olması gerekmektedir.

HTML:
Kod:
İçeriği görebilmek için Giriş yap ya da Üye ol.

Bu kodda sonAy değerinin geçerli olup olmadığı kontrol edilmiştir. Eğer sonAy değeri 10'dan küçükse işlem yapılmaz
 
Konu Sahibi
Windows 10 Mozilla Firefox 150
İyi Akşamlar,

Konu hakkında bana ayırdığız zaman için teşekkürler. Ancak, yukarıda verdiğiniz en son kodu uygulamaya çaılıştımda yine syf.Range("G10:G" & sonAy).ClearContents satırında hatası vermektedir.

ayrıca, If syf.Name = ym.Cells(4, y + 2).Value Then satırına imleçi getirdiğimde ocak ayı gözükmektedir.

Makroları uygulamaya çalıştığımda, benden kaynaklı olabileceği düşündüğümden örmek dosya yükledim. Örnek dosyayı inceleyerek hatanın nereden kaynaklandığı ve sorunun çözümü için yardımlarınız esirgemeyeceğiniz umuduyla,
 

Ekli dosyalar

Windows 10 Opera 130
deneyiniz
 

Ekli dosyalar

Konu Sahibi
Windows 10 Mozilla Firefox 150
Sayıun arzuhalci;

Konu hakkında, bugüne kadar ki zaman ve emeğiniz nedeniyle teşekkürler. Sizi bunaltmamak, laf kalabalığı yaparak sıkmak veya rahatsızlık vermediğim inancıyla,

Aşağıdaki satırlardaki On Error GoTo Hata satırını pasif( 'On Error GoTo Hata) yapılca sorunsuz çalışmaktadır.
Örnek dosya ile uygulama dosyası aynı olmasına rağmen aşağıdaki hata vermektedir. Birleştirilmiş hücre bulunmamaktadır. Benim gözümden kaçan veya yanlış yapmış olacağım bir olay bulunmaktadır.

On Error Resume Next
Set syf = ThisWorkbook.Worksheets(ayAdi)
On Error GoTo Hata



1778531006411.png
 
Windows 10 Opera 130
Buradaki kritik nokta şu
On Error GoTo Hata satırı hata üretmiyor. O satırdan sonra oluşan gerçek hatayı yakalamaya başlıyor.

Sen o satırı pasif yapınca:

On Error Resume Next
Set syf = ThisWorkbook.Worksheets(ayAdi)
'On Error GoTo Hata

On Error Resume Next makronun geri kalanında aktif kalıyor. Yani hata aslında devam ediyor ama VBA hatayı göstermeden atlıyor. Bu yüzden “sorunsuz çalışıyor” gibi görünüyor; fakat bazı satırlar çalışmadan geçiliyor olabilir.

Bu hata büyük ihtimalle şu satırlardan birinde oluşuyor:

ym.Range("D5:O" & son).ClearContents
veya
syf.Range(syf.Cells(10, "G"), syf.Cells(sonAy, "G")).ClearContents
veya en yüksek ihtimalle:
ym.Range("B5:O" & son).Value = matrahVeri

Çünkü burada sadece D:O değil, komple B:O aralığına toplu veri yazıyorsun. Eğer B5:O... içinde tek bir gizli/unutulmuş birleştirilmiş hücre varsa 1004 hatası verebilir.

Aylık sayfalarda da G10:G... içinde ya da G hücresinin sağındaki/altındaki hücrelerle yapılmış bir merge varsa aynı hatayı verir.

Birleşmiş hücreyi bulmak için makro
Excel’de bazen birleşik hücre gözden kaçabiliyor; özellikle gizli satır/sütunlarda, eski formatlı alanlarda veya sayfa dışına taşan alanlarda.

Şunu ayrı bir modüle koyup çalıştır:
HTML:
Kod:
İçeriği görebilmek için Giriş yap ya da Üye ol.
 
Windows 10 Opera 130
Yapılan Değişiklikler:

Birleşik Hücrelerin Bulunması: Hata mesajlarında hangi işlem sırasında hata oluştuğunu görmek için islem değişkenini ekledim. Bu, hata mesajlarında hangi işlemin yapıldığını gösteriyor.

On Error Resume Next Kullanımı: Sayfa bulma kısmındaki hata yönetimini daha sağlıklı hale getirmek için Err.Clear kullandım. Bu, önceki hataların temizlenmesini sağlar ve yeni hatalar için düzgün bir hata yönetimi yapılır.

Daha İyi Hata Raporlama: On Error GoTo Hata satırını, hatanın hangi işlem sırasında oluştuğunu belirlemek için islem değişkeniyle birlikte kullandım. Hata oluştuğunda, hangi adımda hata verdiğini daha kolay görebileceksiniz.

ClearContents ve Veri Yazma İşlemleri: Her işlemi bir açıklama satırı ile etiketledim ve her adımdan önce islem değişkeni ile hangi işlem yapıldığını belirttim. Böylece hangi işlemde hata alındığını daha kolay takip edebilirsiniz.

Yukarıdaki kodda, hata aldığınız satırları daha iyi tespit edebilirsiniz.
 

Ekli dosyalar

Geri
Üst