Arvento Araç takip sistemine göre aracın günlük çalışma hesabı

gezgin-49

Altın Üye
Katılım
17 Ekim 2006
Mesajlar
669
Excel Vers. ve Dili
Türkçe 2003
Altın Üyelik Bitiş Tarihi
22-09-2028
Sayın Üstatlarım, arvento araç takip sistemine göre bir şoförün aracı saat kaçta kullanmaya başladığı, gün sonunda saat kaçta stop ettiği ve gün içinde kaç saat aracın çalıştığını tespit etmem gerekiyor.

ekli tabloda D sütununda tarih ve saat kısmı var, H sütununda ise km/hız var,
Hesaplama şu şekilde olacak
K sütununda belirtilen tarihte bir haftalık tarihler yazılı
HESAPLAMALAR K sütunundaki tarih baz alınarak;
L sütununda şoförün K sütunundaki tarihte saat kaçta aracı çalıştırıp hareket ettirdiği,
M sütununda şoförün K sütunundaki tarihte gün içinde aracı en son kaçta stop ettirdiği,
N sütununda ise şoförün K sütunundaki tarihte günde kaç saat araç kullandığının hesap edilmesi gerekmektedir.

Not: Gün içinde aracın dur/kalk yapması yani km. 0 olması halinde 0 olan saat/dakika/saniye/salise ler günlük araç kullanma hesabından düşülmesi gerekmektedir.
yani aracın bir gün içindeki araç kullanma saati = aracın stop saati - aracın kullanmaya başladığı saat - gün içindeki dur/kalk
olması gerekiyor.
 

Ekli dosyalar

Katılım
15 Mart 2005
Mesajlar
380
Excel Vers. ve Dili
Microsoft 365 En 64 Bit
Altın Üyelik Bitiş Tarihi
20-03-2024
Merhaba,

L2 hücresine (aşağı doğru süreklersiniz)

C++:
=MIN(IF((INT(D$2:INDIRECT("D$"&ROW(OFFSET(D1;COUNTA(D:D)-1;0))))=$K2)*(E$2:INDIRECT("E$"&ROW(OFFSET(D1;COUNTA(D:D)-1;0)))>0);TIME(HOUR(D$2:INDIRECT("D$"&ROW(OFFSET(D1;COUNTA(D:D)-1;0))));MINUTE(D$2:INDIRECT("D$"&ROW(OFFSET(D1;COUNTA(D:D)-1;0))));SECOND(D$2:INDIRECT("D$"&ROW(OFFSET(D1;COUNTA(D:D)-1;0)))))))
En son dolu hücreyi de bularak, tarih bazında E kolonunda 0'dan büyük olanların Minimum saat-dakika sını bulur.

M2 hücresine (aşağı doğru süreklersiniz)

C++:
=MAX(IF((INT(E$2:INDIRECT("D$"&ROW(OFFSET(E1;COUNTA(E:E)-1;0))))=$K2)*(F$2:INDIRECT("E$"&ROW(OFFSET(E1;COUNTA(E:E)-1;0)))>0);TIME(HOUR(E$2:INDIRECT("D$"&ROW(OFFSET(E1;COUNTA(E:E)-1;0))));MINUTE(E$2:INDIRECT("D$"&ROW(OFFSET(E1;COUNTA(E:E)-1;0))));SECOND(E$2:INDIRECT("D$"&ROW(OFFSET(E1;COUNTA(E:E)-1;0)))))))
En son dolu hücreyi de bularak, tarih bazında E kolonunda 0'dan büyük olanların Maksimum saat-dakika sını bulur.


Günlük harekat saat toplamına müsait olunca bakarım.
 

gezgin-49

Altın Üye
Katılım
17 Ekim 2006
Mesajlar
669
Excel Vers. ve Dili
Türkçe 2003
Altın Üyelik Bitiş Tarihi
22-09-2028
sayın üstadım Dost formülü yazınca AD hatası veriyor acaba sizin yazdığınız formül ingilizce de ondan mı oluyor,
 

gezgin-49

Altın Üye
Katılım
17 Ekim 2006
Mesajlar
669
Excel Vers. ve Dili
Türkçe 2003
Altın Üyelik Bitiş Tarihi
22-09-2028
Sayın üstadım Dost, formülleri çevirdim, L2 hücresine formülü yapıştırdım, sonuç hepsinde 0 verdi, M2 hücresindeki formül de DEĞER hatası verdi,
ilk mesajda eklediğim dosyada siz bir deneseniz nerede hata veriyor ben anlayamadım.
 
Katılım
15 Mart 2005
Mesajlar
380
Excel Vers. ve Dili
Microsoft 365 En 64 Bit
Altın Üyelik Bitiş Tarihi
20-03-2024
Merhaba,

O zaman formülle yormayalım exceli. VBA ile halledelim istediğini.

Günlük harekat saat toplamı sonuçlarını kontrol edersiniz.

C++:
Sub HareketSaatToplam()
    Dim conn As Object
    Dim RS As Object
    Dim strSQL As String
    Dim i, sonsat As Long
    Dim tarih As Date
    Dim toplamSaat As Double
    Dim fark, sat As Integer
    Dim s1 As Worksheet
  

    Application.ScreenUpdating = False
  
    Set s1 = Sheets("Sayfa1")
  
    if s1.Range("K1") <> "" Then s1.Range("K1").CurrentRegion.ClearContents
  
    Set conn = CreateObject("ADODB.Connection")
  

    conn.Open "Provider=Microsoft.Ace.Oledb.12.0;Extended Properties='Excel 12.0;HDR=YES;IMEX=0';Data Source=" & ThisWorkbook.FullName
      
    strSQL = "SELECT " & _
                "FORMAT(t1.[Tarih Saat], 'dd.mm.yyyy') AS myDate, " & _
                "FORMAT(MIN(t1.[Tarih Saat]), 'hh:mm') AS MinHour,  " & _
                "FORMAT(MAX(t1.[Tarih Saat]), 'hh:mm') AS MaxHour " & _
             "FROM [Sayfa1$] t1 " & _
             "WHERE t1.[Hız (km/sa)] > 0 " & _
             "GROUP BY FORMAT(t1.[Tarih Saat], 'dd.mm.yyyy') "

    Set RS = conn.Execute(strSQL)
  
    s1.Range("K2").CopyFromRecordset RS

    conn.Close
  
    s1.Range("K1").Resize(1, 4) = Array("Tarih", "Aracın ilk harekat saati", "Aracın Son Harekat Saati", "Günlük harekat saat toplamı")
  
    sonsat = s1.Cells(s1.Rows.Count, "D").End(xlUp).Row
    toplamSaat = 0
    tarih = s1.Cells(2, "D")
    sat = 2

    '**** Bu for dögüsündekini SQL ile yapamadım. Yaparsam tekrar paylaşırım kodu ****
    For i = 2 To sonsat
        If Int(s1.Cells(i, "D").Value) <> Int(tarih) Then
            If i = sonsat Then
                If s1.Cells(i, "E").Value > 0 Then
                    fark = s1.Cells(i, "D").Value - tarih
                    toplamSaat = toplamSaat + fark
                End If
            End If
            If toplamSaat > 0 Then
                s1.Cells(sat, "N").Value = Format(toplamSaat, "hh:mm")
                toplamSaat = 0
                sat = sat + 1
            End If
        Else
            If s1.Cells(i, "E").Value > 0 Then
                fark = s1.Cells(i, "D").Value - tarih
                toplamSaat = toplamSaat + fark
            End If
            If i = sonsat And toplamSaat > 0 Then s1.Cells(sat, "N").Value = Format(toplamSaat, "hh:mm")
        End If
        tarih = s1.Cells(i, "D").Value
    Next i
  
    Set s1 = Nothing:   Set conn = Nothing:   Set RS = Nothing
      
    Application.ScreenUpdating = True

End Sub
 
Son düzenleme:

gezgin-49

Altın Üye
Katılım
17 Ekim 2006
Mesajlar
669
Excel Vers. ve Dili
Türkçe 2003
Altın Üyelik Bitiş Tarihi
22-09-2028
Sayın Üstadım Dost, sen bir harikasın, tam istediğim gibi olmuş, Allah razı olsun, ellerine, emeğine sağlık, sadece günlük harekat saat toplam sonucunda hata var, daha doğrusu sadece orası sonucu doğru vermiyor. tarihlere göre ilk harekat saati ile son harekat saatinde bir sıkıntı yok,
 
Son düzenleme:
Katılım
15 Mart 2005
Mesajlar
380
Excel Vers. ve Dili
Microsoft 365 En 64 Bit
Altın Üyelik Bitiş Tarihi
20-03-2024
Merhaba,

Sonuçlar aşağıdaki gibi çıkmadı mı? (Satır sayısı: 33687)

Tarih

Aracın ilk harekat saati

Aracın Son Harekat Saati

Günlük harekat saat toplamı

04.01.2016

07:28

11:36

03:00

05.01.2016

07:40

18:45

07:02

06.01.2016

06:25

17:41

07:18

08.01.2016

14:24

18:23

03:55

 

gezgin-49

Altın Üye
Katılım
17 Ekim 2006
Mesajlar
669
Excel Vers. ve Dili
Türkçe 2003
Altın Üyelik Bitiş Tarihi
22-09-2028
galiba hata satır sayısından geliyor, ben örnek bir dosya göndermiştim.

aracın ilk harekat saati ile son harekat saati tam olarak hesap ediliyor, tüm satırlar için ancak günlük hareket saati toplamı 33687 satırdan sonra hatalı hesap ediyor.
benim elimdeki dosyada 818936 satır var hata bundan veriyor olabilir mi?
 

veyselemre

Özel Üye
Katılım
9 Mart 2005
Mesajlar
3,647
Excel Vers. ve Dili
Pro Plus 2021
Kod:
Sub aracTakipSureHesaplama()
    Dim veri, yVeri, i, ii, gun, saat, hiz, y, say, say2, itms, kys
    With Sheets("Sayfa1")
        veri = .Range("D2:E" & .Cells(Rows.Count, 4).End(3).Row).Value
    End With

    'With Sheets("Sayfa2")
        '.Activate
        '.Range("2:" & Rows.Count).ClearContents
    'End With
    ReDim yVeri(1 To UBound(veri) * 2, 1 To 4)
    For i = 1 To UBound(veri)
        gun = CDate(Format(veri(i, 1), "dd.mm.yyyy"))
        saat = CDate(Format(veri(i, 1), "hh:nn:ss"))
        hiz = IIf(veri(i, 2) = 0, 0, 10)
        say = say + 1
        yVeri(say, 1) = gun
        yVeri(say, 2) = saat
        yVeri(say, 3) = hiz
    Next i

    'Range("A2").Resize(say, 3).Value = yVeri
    ReDim veri(1 To say, 1 To 4)
    For i = 1 To say - 1
        gun = yVeri(i, 1)
        hiz = yVeri(i, 3)
        say2 = say2 + 1
        veri(say2, 1) = gun
        veri(say2, 2) = yVeri(i, 2)
        veri(say2, 3) = yVeri(i, 3)

        For ii = i + 1 To say
            If gun = yVeri(ii, 1) And hiz = yVeri(ii, 3) Then
                veri(say2, 4) = yVeri(ii, 2)
            Else
                i = ii - 1
                Exit For
            End If
        Next ii
    Next i

    'Range("E2").Resize(say2, 4).Value = veri

    For i = 1 To say2 - 1
        If veri(i, 1) = veri(i + 1, 1) And veri(i, 3) <> veri(i + 1, 3) Then
            veri(i, 4) = veri(i + 1, 2)
        End If
    Next i

    'Range("J2").Resize(say2, 4).Value = veri

    With CreateObject("Scripting.Dictionary")
        For i = 1 To say
            gun = veri(i, 1)
            saat = veri(i, 2)
            hiz = veri(i, 3)
            If hiz > 0 Then
                If Not .exists(gun) Then
                    .Item(gun) = Array(gun, saat, veri(i, 4), 0, 0, 0)
                Else
                    y = .Item(gun)
                    y(2) = veri(i, 4)
                    .Item(gun) = y
                End If
            End If
        Next i

        ReDim yVeri(1 To say, 1 To 4)
        say2 = 0
        For i = 1 To say
            gun = veri(i, 1)
            saat = veri(i, 2)
            hiz = veri(i, 3)
            If hiz = 0 Then
                If .exists(gun) Then
                    y = .Item(gun)
                    If saat > y(1) And saat < y(2) Then
                        say2 = say2 + 1
                        For ii = 1 To 4
                            yVeri(say2, ii) = veri(i, ii)
                        Next ii
                        y = .Item(gun)
                        y(4) = y(4) + veri(i, 4) - veri(i, 2)
                        .Item(gun) = y
                    End If
                End If
            End If
        Next i

        'Range("O2").Resize(say2, 4).Value = yVeri

        kys = .keys
        itms = .items
            Cells(1, "K").Resize(, 5).Value = Array("Tarih", "Başlama", "Bitiş", "Brüt Süre", "Duruş Süre", "Net Çalışma")
        For i = 0 To UBound(kys)
            itms(i)(3) = itms(i)(2) - itms(i)(1)
            itms(i)(5) = itms(i)(3) - itms(i)(4)
            Cells(i + 2, "K").Resize(, 5).Value = itms(i)
            Cells(i + 2, "L").Resize(, 4).NumberFormat = "hh:mm:ss"
        Next i

    End With

End Sub
 

gezgin-49

Altın Üye
Katılım
17 Ekim 2006
Mesajlar
669
Excel Vers. ve Dili
Türkçe 2003
Altın Üyelik Bitiş Tarihi
22-09-2028
Sayın Üstadlarım Dost ve Veyselemre Allah sizlerden razı olsun, tam istediğim gibi olmuş, ellerinize emeğinize sağlık, iyi ki varsınız, Saygılarımı hürmetle sunuyorum.
 

veyselemre

Özel Üye
Katılım
9 Mart 2005
Mesajlar
3,647
Excel Vers. ve Dili
Pro Plus 2021
Gün geçişlerinde çalışan araçlar için düzenleme yapıldı. Gün sonu çalışmalar bölündü.
Kod:
Sub aracTakipSureHesaplama()
    Dim veri, yVeri, i, ii, gun, gunS, saat, hiz, y, say, say2, itms, kys
    With Sheets("Sayfa1")
        veri = .Range("D2:E" & .Cells(Rows.Count, 4).End(3).Row).Value
    End With

    'With Sheets("Sayfa2")
    '    .Activate
    '    .Range("2:" & Rows.Count).ClearContents
    'End With
    ReDim yVeri(1 To UBound(veri) * 2, 1 To 4)
    For i = 1 To UBound(veri)
        gun = CDate(Format(veri(i, 1), "dd.mm.yyyy"))
        saat = CDate(Format(veri(i, 1), "hh:nn:ss"))
        hiz = IIf(veri(i, 2) = 0, 0, 10)
        say = say + 1
        yVeri(say, 1) = gun
        yVeri(say, 2) = saat
        yVeri(say, 3) = hiz
        If i < UBound(veri) Then
            gunS = CDate(Format(veri(i + 1, 1), "dd.mm.yyyy"))
            If gun <> gunS Then
                say = say + 1
                saat = TimeSerial(23, 59, 59)
                yVeri(say, 1) = gun
                yVeri(say, 2) = saat
                yVeri(say, 3) = hiz
                say = say + 1
                saat = TimeSerial(0, 0, 0)
                yVeri(say, 1) = gunS
                yVeri(say, 2) = saat
                yVeri(say, 3) = hiz
            End If
        End If
    Next i

    'Sheets("Sayfa2").Range("A2").Resize(say, 3).Value = yVeri
    ReDim veri(1 To say, 1 To 4)
    For i = 1 To say - 1
        gun = yVeri(i, 1)
        hiz = yVeri(i, 3)
        say2 = say2 + 1
        veri(say2, 1) = gun
        veri(say2, 2) = yVeri(i, 2)
        veri(say2, 3) = yVeri(i, 3)

        For ii = i + 1 To say
            If gun = yVeri(ii, 1) And hiz = yVeri(ii, 3) Then
                veri(say2, 4) = yVeri(ii, 2)
            Else
                i = ii - 1
                Exit For
            End If
        Next ii
    Next i

    'Sheets("Sayfa2").Range("E2").Resize(say2, 4).Value = veri

    For i = 1 To say2 - 1
        If veri(i, 1) = veri(i + 1, 1) And veri(i, 3) <> veri(i + 1, 3) Then
            veri(i, 4) = veri(i + 1, 2)
        End If
    Next i

    'Sheets("Sayfa2").Range("J2").Resize(say2, 4).Value = veri

    With CreateObject("Scripting.Dictionary")
        For i = 1 To say
            gun = veri(i, 1)
            saat = veri(i, 2)
            hiz = veri(i, 3)
            If hiz > 0 Then
                If Not .exists(gun) Then
                    .Item(gun) = Array(gun, saat, veri(i, 4), 0, 0, 0)
                Else
                    y = .Item(gun)
                    y(2) = veri(i, 4)
                    .Item(gun) = y
                End If
            End If
        Next i

        ReDim yVeri(1 To say, 1 To 4)
        say2 = 0
        For i = 1 To say
            gun = veri(i, 1)
            saat = veri(i, 2)
            hiz = veri(i, 3)
            If hiz = 0 Then
                If .exists(gun) Then
                    y = .Item(gun)
                    If saat > y(1) And saat < y(2) Then
                        'say2 = say2 + 1
                        'For ii = 1 To 4
                        '    yVeri(say2, ii) = veri(i, ii)
                        'Next ii
                        y = .Item(gun)
                        y(4) = y(4) + veri(i, 4) - veri(i, 2)
                        .Item(gun) = y
                    End If
                End If
            End If
        Next i

        'Sheets("Sayfa2").Range("O2").Resize(say2, 4).Value = yVeri

        kys = .keys
        itms = .items
        Cells(1, "K").Resize(, 6).Value = Array("Tarih", "Başlama", "Bitiş", "Brüt Süre", "Duruş Süre", "Net Çalışma")
        For i = 0 To UBound(kys)
            itms(i)(3) = itms(i)(2) - itms(i)(1)
            itms(i)(5) = itms(i)(3) - itms(i)(4)
            Cells(i + 2, "K").Resize(, 6).Value = itms(i)
            Cells(i + 2, "L").Resize(, 6).NumberFormat = "hh:mm:ss"
        Next i

    End With


End Sub
 
Üst