Yıllık İzin Hakediş Hesaplama

ragnorak

Altın Üye
Katılım
4 Haziran 2016
Mesajlar
204
Excel Vers. ve Dili
Excel 2021
Altın Üyelik Bitiş Tarihi
03-09-2026
230241

Resimdeki gibi bir form düzenim var. Bir personelin yıllık olarak hak ettiği izni, sağdaki kriterlere göre işe giriş tarihinden bu zamana kadar yıl olarak listview'e eklemek istiyorum. Kriterlere göre nasıl bir sorgulama yapacağımı çözemedim. Birde şu var 50 yaş üzeri 15 yıl çalışan birinin izni iki kritere de uyduğundan en yüksek olanı (26 gün) olarak eklenmesi gerekiyor. Aynı şekilde 5 yıldan az çalışmış 50 yaş üstü bir personelinde izni 14 gün değil 20 gün oluyor. Yani birden çok kritere uyuyorsa en yüksek izin süresi olan alınıyor.
 

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,

Aşağıdaki kodu kendinize uyarlarsınız.

C++:
Sub izin_hesapla()

Dim girtrh As Date, hestrh As Date
Dim yas, ayfark, gunfark As Byte
Dim izingun As Integer

'girtrh, hestrh, yas değişkenlerini istediğin yerden atama yaparsınız
girtrh = "12.08.2020"
hestrh = "11.08.2026"
yas = "53"

On Error Resume Next

izingun = 0

ayfark = DateDiff("m", girtrh, hestrh)
gunfark = Day(hestrh) - Day(girtrh) + 1


If ayfark > 192 Then
    izingun = 26
ElseIf ayfark >= 72 And ayfark <= 192 Then
    If ayfark = 72 Then
        If gunfark > 0 Then
            izingun = 20
        Else
            izingun = IIf(yas >= 50 Or yas <= 18, 20, 14)
        End If
    ElseIf ayfark = 192 Then
        izingun = IIf(gunfark > 0, 26, 20)
    Else
        izingun = 20
    End If
ElseIf ayfark >= 12 And ayfark < 72 Then
    If ayfark = 12 Then
        If gunfark > 0 Then
            izingun = IIf(yas >= 50 Or yas <= 18, 20, 14)
        Else
            izingun = 0
        End If
    Else
        izingun = IIf(yas >= 50 Or yas <= 18, 20, 14)
    End If
Else
    izingun = 0
End If

MsgBox izingun


End Sub
 

ÖmerFaruk

Destek Ekibi
Destek Ekibi
Katılım
22 Ekim 2017
Mesajlar
4,779
Excel Vers. ve Dili
Microsoft 365 Tr-64
Formunuzu ufak bir revizyon yaptım.
Yaş yerine Doğum Tarihi girdim.
Liste koyduğunuz için işe giriş tarihinden itibaren hakedilen izinleri listeledim. Soruyu böyle anladım.
Dosyanız ekte.
 

Ekli dosyalar

Katılım
6 Mart 2011
Mesajlar
153
Excel Vers. ve Dili
Microsoft Office 2010
Formunuzu ufak bir revizyon yaptım.
Yaş yerine Doğum Tarihi girdim.
Liste koyduğunuz için işe giriş tarihinden itibaren hakedilen izinleri listeledim. Soruyu böyle anladım.
Dosyanız ekte.
Merhaba Dosyayı farklı upload sitesine yükleme imkanınız var mı?
 

ragnorak

Altın Üye
Katılım
4 Haziran 2016
Mesajlar
204
Excel Vers. ve Dili
Excel 2021
Altın Üyelik Bitiş Tarihi
03-09-2026
Elinize sağlık test ettim çok güzel çalışıyor. Çok teşekkür ederim.
 

ragnorak

Altın Üye
Katılım
4 Haziran 2016
Mesajlar
204
Excel Vers. ve Dili
Excel 2021
Altın Üyelik Bitiş Tarihi
03-09-2026
sn dost size teşekkür ederim. İlginiz için.
 

ragnorak

Altın Üye
Katılım
4 Haziran 2016
Mesajlar
204
Excel Vers. ve Dili
Excel 2021
Altın Üyelik Bitiş Tarihi
03-09-2026
230263

Farklı bir konu ama benzer olduğu için buraya yazdım. Burada da izin alan personelin tarih ve saat aralığında, mesai başlama ve bitiş saatlerine göre, mola süresi ve tatil günleri düşülerek izin süresini saat olarak hesaplamak istiyorum. VBA da zaman değişkenleriyle çok uğraşmadığımdan büyük / küçük kavramlarından emin olamıyorum.
 

Ekli dosyalar

ÖmerFaruk

Destek Ekibi
Destek Ekibi
Katılım
22 Ekim 2017
Mesajlar
4,779
Excel Vers. ve Dili
Microsoft 365 Tr-64
Formunzda bir kaç değişiklik yaptım. İnceleyin.
Başlangıç ve bitiş tarihlerini Combobaxa çevirip, 90 günlük tarih listeledim.
Çalışma ve mola saatlerini beliryen comboboxlarda kodları biraz değiştirdim.
 

Ekli dosyalar

ragnorak

Altın Üye
Katılım
4 Haziran 2016
Mesajlar
204
Excel Vers. ve Dili
Excel 2021
Altın Üyelik Bitiş Tarihi
03-09-2026
230304
Öncelikle Elinize Sağlık. Dosyayı biraz revize ettim. Sizin kodda 2. tatil günü yoktu onu ekledim. Molayı 1'den 3'e çıkardım. Ama nerde yanlışlık yaptıysam değerleri resimdeki gibi girdiğimde kod sonsuz hesaplamaya giriyor.
 

Ekli dosyalar

ÖmerFaruk

Destek Ekibi
Destek Ekibi
Katılım
22 Ekim 2017
Mesajlar
4,779
Excel Vers. ve Dili
Microsoft 365 Tr-64
Son dosyanızda Mola 2 ve 3 için oluşturduğunuz combolara herhangi bir liste ataması yapılmamış.
C++:
MOBIT_1.List = BAS_SAAT.List
MOBAS_1.List = BAS_SAAT.List
'Bunlar gibi 2 ve 3 için de atama yapmalısınız'
Ayrıca hatalı seçim ve dolayısıyla hatalı işlem olmaması için de CommmandButton içinde yapılan aşadıkanı bvenzer IF kontrollerini gözden geçirmeli, Mesait saatleri ve Molalar arasında agerekli kurguyu yapmalısınız
C++:
If MOBAS_1.ListIndex >= MOBIT_1.ListIndex Then
    MsgBox "Mesai başlangıcı mesai başlangıcından küçük olmalı"
    MOBAS_1.SetFocus
    Exit Sub
End If
,
 

ragnorak

Altın Üye
Katılım
4 Haziran 2016
Mesajlar
204
Excel Vers. ve Dili
Excel 2021
Altın Üyelik Bitiş Tarihi
03-09-2026

ragnorak

Altın Üye
Katılım
4 Haziran 2016
Mesajlar
204
Excel Vers. ve Dili
Excel 2021
Altın Üyelik Bitiş Tarihi
03-09-2026
Sorunu İzin "Baş.Saati", Mesai Başlangıç Saatine Eşit olunca veriyor.
 

ÖmerFaruk

Destek Ekibi
Destek Ekibi
Katılım
22 Ekim 2017
Mesajlar
4,779
Excel Vers. ve Dili
Microsoft 365 Tr-64
Ben de 08:00 - 18:00 yaptım izin saatlerini, denedim sıkıntı göremedim.
Hatta gün Cumartesiye döndü diye bilgisayarımın tarihini 24.09.2021 yaparak sizin verdiğiniz tarih ve saatlere göre yeniden test ettim. Yine bir sıkıntı göremedim

230327
 

ragnorak

Altın Üye
Katılım
4 Haziran 2016
Mesajlar
204
Excel Vers. ve Dili
Excel 2021
Altın Üyelik Bitiş Tarihi
03-09-2026
Sizden ricam Başlangıç ve Bitiş Tarihi aynı iken, Bitiş Saatini farklı değerlere alarak hesapla butonuna basabilir misiniz. Ben ne yaptımsa çalıştıramadım. Birkaç kez hesaplama yaptıktan sonra döngü durmadan devam ediyor.
 

ÖmerFaruk

Destek Ekibi
Destek Ekibi
Katılım
22 Ekim 2017
Mesajlar
4,779
Excel Vers. ve Dili
Microsoft 365 Tr-64
Ben de açtığımda hata verdi ama direkt nedeninini anlayana kadar hata kendiliğinden gitti.
Değişken tanımlamalarını değiştirdim. Zira döngünün sonlanmamasına sebep olabilecek konu Do-Loop döngüsünün kontrol satırıydı.
Yaptığım değişiklik sonrası tekrar aynı durumla karşılaşmadım.
Bir kez daha inceleyin lütfen.
 

Ekli dosyalar

ragnorak

Altın Üye
Katılım
4 Haziran 2016
Mesajlar
204
Excel Vers. ve Dili
Excel 2021
Altın Üyelik Bitiş Tarihi
03-09-2026
Şuan çalışıyor. Hiçbir sorunu yok. Sizi çok uğraştırdım. Hakkınızı helal edin. Teşekkür ederim. Elinize sağlık.
 

ragnorak

Altın Üye
Katılım
4 Haziran 2016
Mesajlar
204
Excel Vers. ve Dili
Excel 2021
Altın Üyelik Bitiş Tarihi
03-09-2026
sn. @ÖmerFaruk formda hesaplama kısmında bazı durumlarda hata ile karşılaştım. Kısa zaman aralığında belli olmasa da süre uzayınca aralık iyice açılıyor. Nedenini anlayamadım.
 

Ekli dosyalar

ÖmerFaruk

Destek Ekibi
Destek Ekibi
Katılım
22 Ekim 2017
Mesajlar
4,779
Excel Vers. ve Dili
Microsoft 365 Tr-64
Butona ait kodları aşağıdakiyl değiştirip denermisiniz. Hatayı gördüm algoritmada ufak bir değişiklik yaptım ve ayrıca çalışmasını biraz daha hızlandırdım.
C++:
Private Sub CommandButton1_Click()
Dim Zaman1 As Date, Zaman2 As Date, izin1 As Date, izin2 As Date, tKontrol As Date
Dim t1 As Date, t2 As Date, t3 As Date, t4 As Date, t5 As Date, t6 As Date, t7 As Date, t8 As Date
Dim i As Long, Dakika As Long
    TextBox1 = ""
    i = 0
    izin1 = CDate(BAS_TAR.Value) + CDate(BAS_SAAT.Value)
    izin2 = CDate(BIT_TAR.Value) + CDate(BIT_SAAT.Value)
    If izin2 <= izin1 Then
        MsgBox "İzin bitişi başlangıç tarih-saatinden büyük olmalı"
        BAS_TAR.SetFocus
        Exit Sub
    End If
    
    If MEBAS.ListIndex < MOBAS_1.ListIndex And MOBAS_1.ListIndex < MOBIT_1.ListIndex And _
        MOBIT_1.ListIndex < MOBAS_2.ListIndex And MOBAS_2.ListIndex < MOBIT_2.ListIndex And _
        MOBIT_2.ListIndex < MOBAS_3.ListIndex And MOBAS_3.ListIndex < MOBIT_3.ListIndex And _
        MOBIT_3.ListIndex < MEBIT.ListIndex Then
        GoTo Devam
    Else
        MsgBox "Mesai ve Mola Saatlerinde hata var"
        MOBAS_1.SetFocus
        Exit Sub
    End If
Devam:
    Zaman1 = izin1
    Do
    Zaman2 = DateSerial(Year(Zaman1), Month(Zaman1), Day(Zaman1))
    If Weekday(Zaman2, vbMonday) <> WEEKEND1.ListIndex + 1 And Weekday(Zaman2, vbMonday) <> WEEKEND2.ListIndex + 1 Then
        t1 = CDate(Zaman2) + CDate(MEBAS.Value)
        t2 = CDate(Zaman2) + CDate(MOBAS_1.Value)
        t3 = CDate(Zaman2) + CDate(MOBIT_1.Value)
        t4 = CDate(Zaman2) + CDate(MOBAS_2.Value)
        t5 = CDate(Zaman2) + CDate(MOBIT_2.Value)
        t6 = CDate(Zaman2) + CDate(MOBAS_3.Value)
        t7 = CDate(Zaman2) + CDate(MOBIT_3.Value)
        t8 = CDate(Zaman2) + CDate(MEBIT.Value)
        If Zaman1 >= t1 And Zaman1 < t2 Then Dakika = Dakika + 10
        If Zaman1 >= t3 And Zaman1 < t4 Then Dakika = Dakika + 10
        If Zaman1 >= t5 And Zaman1 < t6 Then Dakika = Dakika + 10
        If Zaman1 >= t7 And Zaman1 < t8 Then Dakika = Dakika + 10
        If t8 <= Zaman1 Then
            Zaman1 = CDate(DateAdd("d", 1, Zaman2)) + CDate(MEBAS.Value)
        Else
            Zaman1 = DateAdd("n", 10, Zaman1)
        End If
    Else
        Zaman1 = CDate(DateAdd("d", 1, Zaman2)) + CDate(MEBAS.Value)
    End If
    Loop Until Zaman1 >= izin2
    TextBox1 = Format(Dakika / 60, "#,##0.00")
    TextBox1 = Int(Dakika / 60) & " Saat  -  " & Dakika - 60 * Int(Dakika / 60) & " Dakika"
End Sub
 
Üst