Εμφάνιση ενός μόνο μηνύματος
  #19  
Παλιά 10-12-10, 16:32
kapetang Ο χρήστης kapetang δεν είναι συνδεδεμένος
Όνομα: Γιώργος
Έκδοση λογισμικού Office: Ms-Office 2010
Γλώσσα λογισμικού Office: Ελληνική, Αγγλική
 
Εγγραφή: 18-06-2010
Μηνύματα: 3.674
Προεπιλογή

Καλησπέρα στην παρέα

Χρήστο, αν κατάλαβα καλά, θα ήθελες μία συνάρτηση που θα υπολογίζει τις μέρες των ημιαργιών, που δε θα μετρούν σα μέρες κανονικής άδειας.
Αν υποθέσουμε ότι ένας εργαζόμενος απουσιάζει, λόγω κανονικής άδειας, από την ημερομηνία D1 μέχρι τη D2, συμπεριλαμβανομένων, για τον υπολογισμό των ημερών που θα χρεωθούν ως κανονική άδεια θα έχουμε:
  • Μέρες απουσίας: Ms=D2-D1+1.
  • Μέρες αργιών (γιορτών Κυριακών, κλπ): Mk.
  • Μέρες ημιαργιών που θεωρούνται αργίες: Μa.
  • Μέρες που χρεώνονται ως κανονική άδεια: Ms-Mk-Ma
Για τον προσδιορισμό της Ma, στηριζόμενος στα στοιχεία που έδωσες, έγραψα μία συνάρτηση, που παραθέτω παρακάτω.
Κώδικας:
Public Function ArgiesApoHmiargies(D1 As Variant, _
        D2 As Variant) As Integer
        
    Dim dte(3) As Date
    Dim i As Integer, x As Integer

    'Αν υπάρχουν τιμές null
    If IsNull(D1) Or IsNull(D2) Then Exit Function
    
    'Αρχική τιμή συνάρτησης
    ArgiesApoHmiargies= 0

    'Ημερομηνίες ημιαργιών. Αν τα έτη έναρξης και λήξης της απουσίας
    'δεν είναι ίδια (πχ 2010, 2011) και στο διάστημα απουσίας που εμπίπτει
    'στο μεγαλύτερο έτος (2011) υπάρχουν ημιαργίες τα αποτελέσματα δεν είναι
    'σωστά. Την περίπτωση αυτή, για τις κανονικές αδειες, τη θεώρησα αδύνατη.
    dte(0) = DateSerial(Year(D1), 3, 24)
    dte(1) = DateSerial(Year(D1), 10, 27)
    dte(2) = DateSerial(Year(D1), 12, 24)
    dte(3) = DateSerial(Year(D1), 12, 31)
        
    '1. Η άδεια είναι μικρότερη από 3 μέρες
    If D2 - D1 + 1 < 3 Then Exit Function
    
    '2. Περιέχονται δύο ημιαργίες (περιλαμβάνονται και τα όρια του διαστήματος απουσίας)
    x = 0
    For i = 0 To 3
        If D1 <= dte(i) And dte(i) <= D2 Then x = x + 1
    Next
    If x > 1 Then
        ArgiesApoHmiargies= 1
        Exit Function
    End If
    
    '3. Η ημιαργία περιέχεται στα όρια του διαστήματος της απουσίας (χωρίς να περιλαμβάνονται)
    For i = 0 To 3
        If D1 < dte(i) And dte(i) < D2 Then
            ArgiesApoHmiargies= 1
            Exit For
        End If
    Next

End Function
Θα πρέπει να την αντιγράψεις και να δοκιμάσεις , όλες τις περιπτώσεις που έχεις, για να δεις αν σε καλύπτει, αλλά και για να δοκιμαστεί η ακρίβεια του κώδικα.
Φυσικά θα πρέπει να λάβεις υπόψη σου και τις εύστοχες επισημάνσεις του Ανδρέα.

Φιλικά/Γιώργος
ΥΓ Φίλε Ανδρέα καλωσόρισες στο φόρουμ .

Τελευταία επεξεργασία από το χρήστη kapetang : 10-12-10 στις 16:53. Αιτία: διόρθωση ονόματος συνάρτησης σε ArgiesApoHmiargies
Απάντηση με παράθεση