Raporlama, Tarihleri Eşleşenlerin Değerleri

1Al2Ver

Altın Üye
Katılım
5 Kasım 2007
Mesajlar
4,720
Excel Vers. ve Dili
64 Bit TR - Microsoft Office 365 - Win11 Home
Altın Üyelik Bitiş Tarihi
04-01-2026
Merhaba,

Başlığı kısa tuttum, tüm örnekleme ve açıklamaları ek'li dosyada yapmaya çalıştım,

Dosyamda ;

"VERiLER_GENEL" isimli sayfada, yemeklere ait veriler var,

"ÖĞLE_YEMEĞİ" isimli sayfada, aylık yemek listesi var,

"AYRINTI_ÖĞLE" isimli sayfada ise, yemek listesine ait ayın tarihleri ("B" sütunu) ve alınacak değerlerin başlıkları ("D3:Q3") var,

"VERİLER_GENEL" sayfası tıklandığında ulaşmak istediğim sonuç ;

"AYRINTILI_ÖĞLE" sayfasına, diğer 2 sayfadan, ilgili güne ve yemeklere ait toplam veriler almak,

NOT ; Bu işlemleri, anılan sayfada, yardımcı sütunlarla ve topla.çarpım formülleri ile alabilmekteyim,

Ancak, 14 sütun ve 31 satırlık bir çizelgede, veri düzenlemelerinde bir hayli dikkat ve zaman harcamamı gerektiriyor,

Şayet zamanınızı almaz ise, kodların yanlarına açıklamalarını da ekleyebilirseniz ;

Karşılaştırma, deneme-yanılma ile, bu tip çözümler gerektiren dosyalarda, kodlama konusunda, kendimi bir nebze de olsa geliştirmek istiyorum.

Teşekkür ederim.
 

Ekli dosyalar

1Al2Ver

Altın Üye
Katılım
5 Kasım 2007
Mesajlar
4,720
Excel Vers. ve Dili
64 Bit TR - Microsoft Office 365 - Win11 Home
Altın Üyelik Bitiş Tarihi
04-01-2026
Merhaba,

Çözüm arayışım devam etmektedir,

Teşekkür ederim.
 

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
43,007
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Deneyiniz.

Listelenen değerlerin doğruluğunu kontrol edersiniz.

C++:
Option Explicit

Private Sub Worksheet_Activate()
    Dim S1 As Worksheet, S2 As Worksheet, S3 As Worksheet, Tarih As Object, Yemek_Listesi As Object
    Dim Yemek As Variant, Son As Long, Veri As Variant, X As Long, Say As Long, Y As Byte, Z As Byte
   
    Application.ScreenUpdating = False
   
    Set S1 = Sheets("VERİLER_GENEL")
    Set S2 = Sheets("ÖĞLE_YEMEĞİ")
    Set S3 = Sheets("AYRINTI_ÖĞLE")
    Set Tarih = CreateObject("Scripting.Dictionary")
    Set Yemek_Listesi = CreateObject("Scripting.Dictionary")
   
    S3.Range("D4:Q34").ClearContents
   
    Rem ÖĞLE_YEMEĞİ sayfasındaki tarihlere ait yemek isimleri hafızaya alınıyor.
    Son = S2.Cells(S2.Rows.Count, 2).End(3).Row
    If Son = 3 Then Son = 4
   
    Veri = S2.Range("B3:K" & Son).Value
   
    ReDim Yemek_Adi(1 To UBound(Veri, 1), 1 To 10)
   
    For X = LBound(Veri, 1) To UBound(Veri, 1)
        If Veri(X, 1) <> "" Then
            If Not Tarih.Exists(Veri(X, 1)) Then
                Say = Say + 1
                Tarih.Add Veri(X, 1), Say
                For Y = 2 To UBound(Veri, 2) - 1
                    Yemek_Adi(Say, 1) = IIf(Yemek_Adi(Say, 1) = "", Veri(X, Y), Yemek_Adi(Say, 1) & "|" & Veri(X, Y))
                Next
            Else
                For Y = 2 To UBound(Veri, 2) - 1
                    Yemek_Adi(Tarih.Item(Veri(X, 1)), 1) = IIf(Yemek_Adi(Tarih.Item(Veri(X, 1)), 1) = "", Veri(X, Y), Yemek_Adi(Tarih.Item(Veri(X, 1)), 1) & "|" & Veri(X, Y))
                Next
            End If
        End If
    Next
   
   
    Rem VERİLER_GENEL sayfasındaki yemek verileri hafızaya alınıyor.
    Son = S1.Cells(S1.Rows.Count, 2).End(3).Row
    If Son = 2 Then Son = 3
   
    Veri = S1.Range("B2:P" & Son).Value
   
    ReDim Yemek_Verileri(1 To UBound(Veri, 1), 1 To 14)
    Say = 0
   
    For X = LBound(Veri, 1) To UBound(Veri, 1)
        If Veri(X, 1) <> "" Then
            If Not Yemek_Listesi.Exists(Veri(X, 1)) Then
                Say = Say + 1
                Yemek_Listesi.Add Veri(X, 1), Say
                For Y = 2 To UBound(Veri, 2)
                    Yemek_Verileri(Say, Y - 1) = Veri(X, Y)
                Next
            Else
                For Y = 2 To UBound(Veri, 2)
                    Yemek_Verileri(Yemek_Listesi.Item(Veri(X, 1)), Y - 1) = Yemek_Verileri(Yemek_Listesi.Item(Veri(X, 1)), Y - 1) + Veri(X, Y)
                Next
            End If
        End If
    Next


    Rem AYRINTI_ÖĞLE sayfasındaki tarihlere göre ve yemek isimlerine göre veriler sorgulanıyor. Uyan veriler hafızaya alınıyor.
    Son = S3.Cells(S3.Rows.Count, 2).End(3).Row
    If Son = 4 Then Son = 5
   
    Veri = S3.Range("B4:B" & Son).Value
   
    ReDim Liste(1 To UBound(Veri, 1), 1 To 14)
    Say = 0
   
    For X = LBound(Veri, 1) To UBound(Veri, 1)
        If Veri(X, 1) <> "" Then
            If Tarih.Exists(Veri(X, 1)) Then
                Say = Say + 1
                Yemek = Split(Yemek_Adi(Tarih.Item(Veri(X, 1)), 1), "|")
                For Y = LBound(Yemek) To UBound(Yemek)
                    If Yemek_Listesi.Exists(Yemek(Y)) Then
                        For Z = 1 To UBound(Yemek_Verileri, 2)
                            Liste(Say, Z) = Liste(Say, Z) + Yemek_Verileri(Yemek_Listesi.Item(Yemek(Y)), Z)
                        Next
                    End If
                Next
            Else
                Say = Say + 1
                For Z = 1 To UBound(Veri, 2)
                    Liste(Say, Z) = ""
                Next
            End If
        End If
    Next
   
    Rem Koşullara uyan verilerin toplamı AYRINTI_ÖĞLE sayfasındaki ilgili hücrelere aktarılıyor.
    S3.Range("D4").Resize(Say, UBound(Liste, 2)) = Liste

    Set S1 = Nothing
    Set S2 = Nothing
    Set S3 = Nothing
    Set Tarih = Nothing
    Set Yemek_Listesi = Nothing

    Application.ScreenUpdating = True
End Sub
 

1Al2Ver

Altın Üye
Katılım
5 Kasım 2007
Mesajlar
4,720
Excel Vers. ve Dili
64 Bit TR - Microsoft Office 365 - Win11 Home
Altın Üyelik Bitiş Tarihi
04-01-2026
Sayın Korhan Ayhan, merhaba,

Öncelikle, ilginiz, emeğiniz ve çözüm için, çok teşekkür ederim,

Ek'li dosyada "AYRINTI_ÖĞLE" sayfasına, benim hesaplamalarım sonucu alınan verileri, fotoğraf olarak ekledim,

Dosyamı birkaç kez kontrol ettim, gözümden kaçanlar yoksa eğer, hesaplamalarda bir hata var,

Örneğin ; Kod, "D4:Q4" aralığında, sadece "E4:Q4" aralığını doğru hesapladı,

Teşekkür ederim.
 

Ekli dosyalar

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
43,007
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Merhaba,

Dosya içinde paylaştığınız resimde D4 hücresi için olan değer ile VERİLER_GENEL sayfasındaki değer aynı değil?

Ek olarak VERİLER_GENEL sayfasında aşağıdaki veri mükerrer görünüyor.

YOĞURT (KASE)
 

1Al2Ver

Altın Üye
Katılım
5 Kasım 2007
Mesajlar
4,720
Excel Vers. ve Dili
64 Bit TR - Microsoft Office 365 - Win11 Home
Altın Üyelik Bitiş Tarihi
04-01-2026
Sayın Korhan Ayhan, tekrar merhaba,

Bu kadar büyük bir dikkatsizlik için çok özür dilerim, sanırım kopyala-yapıştır esnasında oluşan bir hata,

Dosyayı yeniden kontrol edip, gerekli düzenlemeler sonucunda elde ettiğim sonucu paylaşacağım,

Dikkatiniz ve nezaketiniz için de ayrıca teşekkür ederim,

Saygılarımla.
 

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
43,007
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Şimdi detaylı bakınca ÖĞLE_YEMEĞİ sayfasında aşağıdaki ürün VERİLER_GENEL sayfasında yok.

TURŞU (KARIŞIK)
 

1Al2Ver

Altın Üye
Katılım
5 Kasım 2007
Mesajlar
4,720
Excel Vers. ve Dili
64 Bit TR - Microsoft Office 365 - Win11 Home
Altın Üyelik Bitiş Tarihi
04-01-2026
Sayın Korhan Ayhan, merhaba,

Her şey için çok teşekkür ederim,

Gerekli düzetmeler sonucu yapılan denemelerde, kod doğru sonuçlar üretiyor.

Hem sorunuma çözüm ürettiniz, hem de hatalarımı bulup, ilerde olabilecek hatalı hesaplamaların önüne geçtiniz, sağ olun.

Sanırım, bu tür konularda biraz daha dikkat etmem gerekecek, bu da bana ders oldu.

Tekrar teşekkürlerimle saygılar sunarım.
 

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
43,007
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Ben işim gereği sürekli raporlama ve data inceleme yaptığım için olabilecek durumları öngörebiliyorum.

Veri girişlerinde mükerrerlik kontrolü için excelin yerleşik özelliği olan koşullu biçimlendirme özelliğinden faydalanıyorum. Daha detaylı kontroller gerekiyorsa formülleri kullanıyorum. Formüllerde yetersiz kalırsa makrolara başvuruyorum.
 

1Al2Ver

Altın Üye
Katılım
5 Kasım 2007
Mesajlar
4,720
Excel Vers. ve Dili
64 Bit TR - Microsoft Office 365 - Win11 Home
Altın Üyelik Bitiş Tarihi
04-01-2026
Sayın Korhan Ayhan, merhaba,

Bilgilendirme için teşekkür ederim, benim için yönlendirici oldu,

Saygılarımla.
 

1Al2Ver

Altın Üye
Katılım
5 Kasım 2007
Mesajlar
4,720
Excel Vers. ve Dili
64 Bit TR - Microsoft Office 365 - Win11 Home
Altın Üyelik Bitiş Tarihi
04-01-2026
Merhaba,

"VERiLER_GENEL" isimli sayfayı tüm ilgili sayfaların tamamında ortak kullanıyorum,,

"ÖĞLE_YEMEĞİ" isimli sayfada olduğu gibi "ÖĞLE_AKŞAM" isimli de, aylık yemek listesi var,

"AYRINTI_ÖĞLE" gibi "AYRINTI_AKŞAM" sayfam da var,

Kodu, Siteye eklediğim dosyaya uyguladığım zaman bir hata almamakla beraber, tamamen aynı olan şahsi dosyamda, kırmızı ile işaretli kod satırında

hata vermektedir, olası sebebi ne olabilir ?

Teşekkür ederim.

Option Explicit

.....
......
......

Set S1 = Sheets("VERİLER_GENEL")
Set S2 = Sheets("AKŞAM_YEMEĞİ")
Set S3 = Sheets("AYRINTI_AKŞAM")
Set Tarih = CreateObject("Scripting.Dictionary")
Set Yemek_Listesi = CreateObject("Scripting.Dictionary")

..................
.................
.................

Son = S3.Cells(S3.Rows.Count, 2).End(3).Row
If Son = 4 Then Son = 5

Veri = S3.Range("B4:B" & Son).Value

ReDim Liste(1 To UBound(Veri, 1), 1 To 14)
Say = 0

For X = LBound(Veri, 1) To UBound(Veri, 1)
If Veri(X, 1) <> "" Then
If Tarih.Exists(Veri(X, 1)) Then
Say = Say + 1
Yemek = Split(Yemek_Adi(Tarih.Item(Veri(X, 1)), 1), "|")
For Y = LBound(Yemek) To UBound(Yemek)
If Yemek_Listesi.Exists(Yemek(Y)) Then
For Z = 1 To UBound(Yemek_Verileri, 2)
Liste(Say, Z) = Liste(Say, Z) + Yemek_Verileri(Yemek_Listesi.Item(Yemek(Y)), Z)
Next
End If
Next
Else
Say = Say + 1
For Z = 1 To UBound(Veri, 2)
Liste(Say, Z) = ""
Next
End If
End If
Next

.............
...........
...........


End Sub
 

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
43,007
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Tarihlere ait satırlarda yemek adı olmayan satır var mı?
 

1Al2Ver

Altın Üye
Katılım
5 Kasım 2007
Mesajlar
4,720
Excel Vers. ve Dili
64 Bit TR - Microsoft Office 365 - Win11 Home
Altın Üyelik Bitiş Tarihi
04-01-2026
Merhaba,

Düzeltme , üst mesajdaki "ÖĞLE_AKŞAM" isimli de, aylık yemek listesi var, ifadesi "AKŞAM_YEMEĞİ" olacak idi,

Hata için özür diliyorum,

Teşekkür ederim.
 

1Al2Ver

Altın Üye
Katılım
5 Kasım 2007
Mesajlar
4,720
Excel Vers. ve Dili
64 Bit TR - Microsoft Office 365 - Win11 Home
Altın Üyelik Bitiş Tarihi
04-01-2026
Sayın Korhan Ayhan, merhaba,

Tarihlere ait satırlarda yemek adı olmayan satır var mı? sorunuzun cevabı ; Evet var.

Teşekkür ederim.
 

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
43,007
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Bir sorgu satırı ile sorun aşılabilir.

Deneyiniz.

C++:
Option Explicit

Private Sub Worksheet_Activate()
    Dim S1 As Worksheet, S2 As Worksheet, S3 As Worksheet, Tarih As Object, Yemek_Listesi As Object
    Dim Yemek As Variant, Son As Long, Veri As Variant, X As Long, Say As Long, Y As Byte, Z As Byte
   
    Application.ScreenUpdating = False
   
    Set S1 = Sheets("VERİLER_GENEL")
    Set S2 = Sheets("ÖĞLE_YEMEĞİ")
    Set S3 = Sheets("AYRINTI_ÖĞLE")
    Set Tarih = CreateObject("Scripting.Dictionary")
    Set Yemek_Listesi = CreateObject("Scripting.Dictionary")
   
    S3.Range("D4:Q34").ClearContents
   
    Rem ÖĞLE_YEMEĞİ sayfasındaki tarihlere ait yemek isimleri hafızaya alınıyor.
    Son = S2.Cells(S2.Rows.Count, 2).End(3).Row
    If Son = 3 Then Son = 4
   
    Veri = S2.Range("B3:K" & Son).Value
   
    ReDim Yemek_Adi(1 To UBound(Veri, 1), 1 To 10)
   
    For X = LBound(Veri, 1) To UBound(Veri, 1)
        If Veri(X, 1) <> "" Then
            If Not Tarih.Exists(Veri(X, 1)) Then
                Say = Say + 1
                Tarih.Add Veri(X, 1), Say
                For Y = 2 To UBound(Veri, 2) - 1
                    Yemek_Adi(Say, 1) = IIf(Yemek_Adi(Say, 1) = "", Veri(X, Y), Yemek_Adi(Say, 1) & "|" & Veri(X, Y))
                Next
            Else
                For Y = 2 To UBound(Veri, 2) - 1
                    Yemek_Adi(Tarih.Item(Veri(X, 1)), 1) = IIf(Yemek_Adi(Tarih.Item(Veri(X, 1)), 1) = "", Veri(X, Y), Yemek_Adi(Tarih.Item(Veri(X, 1)), 1) & "|" & Veri(X, Y))
                Next
            End If
        End If
    Next
   
   
    Rem VERİLER_GENEL sayfasındaki yemek verileri hafızaya alınıyor.
    Son = S1.Cells(S1.Rows.Count, 2).End(3).Row
    If Son = 2 Then Son = 3
   
    Veri = S1.Range("B2:P" & Son).Value
   
    ReDim Yemek_Verileri(1 To UBound(Veri, 1), 1 To 14)
    Say = 0
   
    For X = LBound(Veri, 1) To UBound(Veri, 1)
        If Veri(X, 1) <> "" Then
            If Not Yemek_Listesi.Exists(Veri(X, 1)) Then
                Say = Say + 1
                Yemek_Listesi.Add Veri(X, 1), Say
                For Y = 2 To UBound(Veri, 2)
                    Yemek_Verileri(Say, Y - 1) = Veri(X, Y)
                Next
            Else
                For Y = 2 To UBound(Veri, 2)
                    Yemek_Verileri(Yemek_Listesi.Item(Veri(X, 1)), Y - 1) = Yemek_Verileri(Yemek_Listesi.Item(Veri(X, 1)), Y - 1) + Veri(X, Y)
                Next
            End If
        End If
    Next


    Rem AYRINTI_ÖĞLE sayfasındaki tarihlere göre ve yemek isimlerine göre veriler sorgulanıyor. Uyan veriler hafızaya alınıyor.
    Son = S3.Cells(S3.Rows.Count, 2).End(3).Row
    If Son = 4 Then Son = 5
   
    Veri = S3.Range("B4:B" & Son).Value
   
    ReDim Liste(1 To UBound(Veri, 1), 1 To 14)
    Say = 0
   
    For X = LBound(Veri, 1) To UBound(Veri, 1)
        If Veri(X, 1) <> "" Then
            If Tarih.Exists(Veri(X, 1)) Then
                Say = Say + 1
                If InStr(1, Yemek_Adi(Tarih.Item(Veri(X, 1)), 1), "|") > 0 Then
                    Yemek = Split(Yemek_Adi(Tarih.Item(Veri(X, 1)), 1), "|")
                    For Y = LBound(Yemek) To UBound(Yemek)
                        If Yemek_Listesi.Exists(Yemek(Y)) Then
                            For Z = 1 To UBound(Yemek_Verileri, 2)
                                Liste(Say, Z) = Liste(Say, Z) + Yemek_Verileri(Yemek_Listesi.Item(Yemek(Y)), Z)
                            Next
                        End If
                    Next
                End If
            Else
                Say = Say + 1
                For Z = 1 To UBound(Veri, 2)
                    Liste(Say, Z) = ""
                Next
            End If
        End If
    Next
   
    Rem Koşullara uyan verilerin toplamı AYRINTI_ÖĞLE sayfasındaki ilgili hücrelere aktarılıyor.
    S3.Range("D4").Resize(Say, UBound(Liste, 2)) = Liste

    Set S1 = Nothing
    Set S2 = Nothing
    Set S3 = Nothing
    Set Tarih = Nothing
    Set Yemek_Listesi = Nothing

    Application.ScreenUpdating = True
End Sub
 

1Al2Ver

Altın Üye
Katılım
5 Kasım 2007
Mesajlar
4,720
Excel Vers. ve Dili
64 Bit TR - Microsoft Office 365 - Win11 Home
Altın Üyelik Bitiş Tarihi
04-01-2026
Sayın Korhan Ayhan, tekrar merhaba,

Tek kelime ile ; Müteşekkirim.

İyi ki varsınız,

Saygılarımla.
 
Üst