• DİKKAT

    DOSYA İndirmek/Yüklemek için ÜCRETLİ ALTIN ÜYELİK Gereklidir!
    Altın Üyelik Hakkında Bilgi

Yıllık İzin Hakediş Hesaplama

ragnorak

Altın Üye
Katılım
4 Haziran 2016
Mesajlar
208
Excel Vers. ve Dili
Excel 2021
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

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
 
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

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ı?
 
Elinize sağlık test ettim çok güzel çalışıyor. Çok teşekkür ederim.
 
sn dost size teşekkür ederim. İlginiz için.
 
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

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

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

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
,
 
Sorunu İzin "Baş.Saati", Mesai Başlangıç Saatine Eşit olunca veriyor.
 
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
 
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.
 
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

Ş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.
 
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

  • 001.JPG
    001.JPG
    33.4 KB · Görüntüleme: 8
  • 002.JPG
    002.JPG
    32.6 KB · Görüntüleme: 8
  • 003.JPG
    003.JPG
    32.4 KB · Görüntüleme: 7
  • 004.JPG
    004.JPG
    31.9 KB · Görüntüleme: 6
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
 
Geri
Üst