Arada boş hücrelerin olduğu satırlarda, aynı isimli firma için günlük ortalama hesaplama..

Katılım
21 Ocak 2008
Mesajlar
323
Excel Vers. ve Dili
Excel 2013 / Türkçe
Ekli, basitleştirilmiş örnek dosyada göreceğiniz gibi, C sütununda firma isimleri var. Hemen sağındaki D sütununda, o firma için kaç adet üretim yapılacağı yazılı.

İmalat, firmanın tabloya girdiği gün içerisinde bitirilemez, bir sonraki güne sarkarsa, bir alt satıra aynı firma ismi tekraren yeniden yazılmakta. Üretim adedi ise sadece firmanın tabloya işlendiği ilk günkü satırda, D sütununda sabit kalmakta, yinelenmemekte. Üretim bitirilememişse, firma ismi araya hafta tatili girse bile, yeni haftada aynı mantıkla, üretim bitirilene kadar devam etmekte.

Örnek üzerinden anlatacak olursam; 09.10.24 Çar günü [C7] hücresinde yazılı "Erler" firması için ilk imalat günü olmuş. Bir sağdaki [D7] hücresine Erler firmesı için yapılacak imalatın toplam adedi girilmiş. İmalatın tümü 09.10.24 tarihinde bitirilemediğinden, bir alt satırda [C8] yani 10.10.24 Per satırında "Erler" firma ismi yinelenmiş. Sonrasında araya hafta tatili girmiş ve üretim 14.10.24 Pzt günü ancak bitirilebilmiş.

Benim E sütununda hesaplatmaya çalıştığım şey ise; yazılacak formül D sütununda bir rakam tespit ettiğinde, bu rakamın hemen solundaki hücrede yazılı firma isminin, C sütununda kaç kez tekrarlandığını hesaplamalı ve toplam üretim adedini bu hesaplamış olduğu sayıya bölerek, Erler firması için yapılan 2200 adetlik imalatın, günlük kaç adetlik ortalama ile bitirilmiş olduğunu hesap etmeli.

Bu formülü yazmaya çalışırken, "Erler" firmasının tabloya ilk ve son kez yazıldığı (C7:C12) tanım aralığını formüle yansıtmayı beceremedim.

Kısacası, örnek üzerinden sorumu net olarak soracak olursam;

[E7] hücresine nasıl bir formül yazmalıyımki, [D7] hücresinde bir sayıya rastladığında, o sayının hemen solundaki [C7] hücresinde yazılı "Erler" firmasının adının, alta doğru kaç kez tekrarlandığını bulsun ve 2200 adetlik imalatı bu bulmuş olduğu sayıya bölerek, hergün için bir ortalama hesaplayıp, yazsın.

Yalnız, araya başka bir firmanın üretimi girdikten sonra, belki 2 gün sonra, belki 10 gün sonra aynı "Erler" firması için, farklı adette yeni bir imalat daha yapabiliriz ve bu imalatlar birbirine karıştırılmamalı. Her imalatın günlük üretim ortalamaları, sadece o dönem içinde hesaplanmalı.


 
Katılım
6 Mart 2024
Mesajlar
249
Excel Vers. ve Dili
Excel 2010 TR & Excel 2016 TR
Merhaba,
ilk başta Formülle yapamaya çalıştım fakat

Yalnız, araya başka bir firmanın üretimi girdikten sonra, belki 2 gün sonra, belki 10 gün sonra aynı "Erler" firması için, farklı adette yeni bir imalat daha yapabiliriz ve bu imalatlar birbirine karıştırılmamalı.
bu tür veri girişi olmasından dolayı malesef Makro+Formül le bir parça çözdüm sanırım
Bazen hata yapıyor gibi o bakımdan Formül kısmı geliştirilirse daha iyi olur gibi

Sayfa ismi sağ tıklanıp, Kod görüntüle bölümüne kodlar yazılacak
C5 ve D5 den itibaren C ve D sütunların da bir değişiklik olunca kodlar çalışacak

C++:
Private Sub Worksheet_Change(ByVal Target As Range)
    ' Eğer hedef hücre 5. satırdan küçükse veya C ya da D sütununda değilse çık
    If Target.Row < 5 Or Not (Target.Column = 3 Or Target.Column = 4) Then Exit Sub

    Dim lastRow As Long
    Dim i As Long
    Dim firma As String
    Dim count As Long
    Dim currentFirma As String

    ' C sütunundaki son satırı bul
    lastRow = Me.Cells(Me.Rows.count, "C").End(xlUp).Row
   
    Me.Range("E5:E" & lastRow).ClearContents

    ' Başlangıç durumu
    currentFirma = ""

    ' C sütunundaki her bir hücreyi kontrol et
    For i = 5 To lastRow
        firma = Me.Cells(i, "C").Value
       
        ' Eğer firma adı değiştiyse, yeni firmanın sayısını hesapla
        If firma <> currentFirma Then
            count = kactanevar(Me, firma, i, lastRow)
            currentFirma = firma
        End If

        ' E sütununa formülü yaz
        Me.Cells(i, "E").Formula = _
            "=IF(OR(WEEKDAY(B" & i & ",2)=6,WEEKDAY(B" & i & ",2)=7)," & _
            "IF(C" & i & "="""","""",IF(D" & i & "<>"""",D" & i & "," & _
            "IF(E" & (i - 1) & "=""""," & _
            "IF(WEEKDAY(B" & (i - 1) & ",2)=7,E" & (i - 3) & "," & _
            "IF(WEEKDAY(B" & (i - 1) & ",2)=6,E" & (i - 2) & ",""""))," & _
            "E" & (i - 1) & ")))," & _
            "IF(D" & i & "<>"""",D" & i & "," & _
            "IF(E" & (i - 1) & "=""""," & _
            "IF(WEEKDAY(B" & (i - 1) & ",2)=7,E" & (i - 3) & "," & _
            "IF(WEEKDAY(B" & (i - 1) & ",2)=6,E" & (i - 2) & ",""""))," & _
            "E" & (i - 1) & ")))/" & count
   
        ' Formül sonucunu kontrol et (numara olup olmadığını kontrol et)
        If IsNumeric(Me.Cells(i, "E").Value) Then
            ' ilk imalatı formülle count a böldük, geri kalanı 1 e böl
            count = 1
        Else
            Me.Cells(i, "E").Value = ""
        End If
    Next i
End Sub

Private Function kactanevar(ws As Worksheet, firma As String, startRow As Long, lastRow As Long) As Long
    Dim i As Long
    Dim count As Long
   
    ' Başlangıç sayacını sıfırla
    count = 0
   
    If firma = "" Then Exit Function
   
    ' Aynı firma isminde ardışık kaç tane olduğunu say
    For i = startRow To lastRow
        If ws.Cells(i, "C").Value = firma Then
            count = count + 1
        ElseIf ws.Cells(i, "C").Value = "" Then
            count = count
        Else
            Exit For ' Firma adı değişirse döngüden çık
        End If
    Next i
   
    ' Fonksiyona sonucu döndür
    kactanevar = count
End Function
 
Katılım
6 Mart 2024
Mesajlar
249
Excel Vers. ve Dili
Excel 2010 TR & Excel 2016 TR
Yeniden Merhaba,
Sadece VBA ile çözümü
C++:
Private Sub Worksheet_Change(ByVal Target As Range)

    ' Eğer hedef hücre 5. satırdan küçükse veya C ya da D sütununda değilse çık
    If Target.Row < 5 Or Not (Target.Column = 3 Or Target.Column = 4) Then Exit Sub

    Dim lastRow As Long
    Dim i As Long
    Dim firma As String
    Dim count As Long
    Dim currentFirma As String

    ' C sütunundaki son satırı bul
    lastRow = Me.Cells(Me.Rows.count, "C").End(xlUp).Row

    ' E sütununu temizle
    Me.Range("E5:E" & lastRow + 1).ClearContents

    ' Başlangıç durumu
    currentFirma = ""

    ' C sütunundaki her bir hücreyi kontrol et
    For i = 5 To lastRow
        firma = Me.Cells(i, "C").Value
        
        ' Eğer firma adı değiştiyse, yeni firmanın sayısını hesapla
        If LCase(firma) <> LCase(currentFirma) Then
            count = kactanevar(Me, firma, i, lastRow)
            currentFirma = firma
        End If

        ' E sütununa formülü yaz
        If Me.Cells(i, "D").Value <> "" And firma <> "" Then
            Me.Cells(i, "E").Value = Me.Cells(i, "D").Value / count
        ElseIf firma <> "" And Me.Cells(i, "D").Value = "" Then
            ' Cumartesi veya Pazar kontrolü
            Select Case Weekday(Me.Cells(i - 1, "B").Value, vbMonday)
                Case 7 ' Pazar
                    Me.Cells(i, "E").Value = Me.Cells(i - 3, "E").Value
                Case 6 ' Cumartesi
                    Me.Cells(i, "E").Value = Me.Cells(i - 2, "E").Value
                Case Else
                    Me.Cells(i, "E").Value = Me.Cells(i - 1, "E").Value
            End Select
        Else
            Me.Cells(i, "E").Value = ""
        End If
    Next i
End Sub

Private Function kactanevar(ws As Worksheet, firma As String, startRow As Long, lastRow As Long) As Long
    Dim i As Long
    Dim count As Long
    
    count = 0
    If firma = "" Then Exit Function
    
    ' Aynı firma isminde ardışık kaç tane olduğunu say
    For i = startRow To lastRow
        If LCase(ws.Cells(i, "C").Value) = LCase(firma) Then
            count = count + 1
        ElseIf ws.Cells(i, "C").Value = "" Then
            count = count
        Else
            Exit For
        End If
    Next i

    kactanevar = count
End Function
 
Katılım
21 Ocak 2008
Mesajlar
323
Excel Vers. ve Dili
Excel 2013 / Türkçe
Cevabınızı yeni gördüm, hemen deneyeceğim. İlginize çok teşekkürler ediyorum...
 
Üst