Υπολογίστε τον αριθμό των ημερών εργασίας μεταξύ δύο ημερομηνιών χρησιμοποιώντας VBA στο Microsoft Excel

Anonim

Σε αυτό το άρθρο, θα δημιουργήσουμε μια συνάρτηση καθορισμένη από το χρήστη (UDF) για να υπολογίσουμε τον αριθμό των εργάσιμων ημερών μεταξύ των καθορισμένων ημερομηνιών, συμπεριλαμβανομένων ή εξαιρουμένων των Σαββάτων και των Κυριακών ως αργίες εβδομάδας.

Τα ανεπεξέργαστα δεδομένα για αυτό το παράδειγμα αποτελούνται από ημερομηνία έναρξης και ημερομηνία λήξης. Θέλουμε να μετρήσουμε τον αριθμό των εργάσιμων ημερών μεταξύ αυτών των ημερομηνιών.

Έχουμε καθορίσει τις ημερομηνίες των διακοπών στη στήλη Α στο φύλλο "Διακοπές".

Το Excel διαθέτει ενσωματωμένη λειτουργία, NETWORKDAYS για να μετρήσει τον αριθμό των εργάσιμων ημερών μεταξύ του διαστήματος.

Σύνταξη της λειτουργίας NETWORKDAYS

NETWORKDAYS (StartDate, EndDate, [Holidays])

Αυτή η λειτουργία θα εξαιρέσει την ημερομηνία που καθορίζεται στη λίστα Διακοπές, μετρώντας παράλληλα τον αριθμό των εργάσιμων ημερών.

Αυτή η συνάρτηση θεωρεί τα Σάββατα και τις Κυριακές ως απενεργοποιημένες εβδομάδες από προεπιλογή, οπότε δεν μπορούμε να υπολογίσουμε τον αριθμό των εργάσιμων ημερών, σε περίπτωση που έχουμε μόνο μία εβδομάδα ρεπό.

Δημιουργήσαμε την προσαρμοσμένη συνάρτηση "CountWorkingDays" για να μετρήσουμε τον αριθμό των εργάσιμων ημερών μεταξύ του διαστήματος. Αυτή η προσαρμοσμένη συνάρτηση αντιμετωπίζει το πρόβλημα της συνάρτησης NETWORKDAYS. Σε αυτήν τη συνάρτηση, μπορούμε να μετρήσουμε τον αριθμό των εργάσιμων ημερών ακόμη και αν υπάρχει μόνο μία εβδομάδα άδεια, είτε το Σάββατο είτε την Κυριακή.

Σύνταξη προσαρμοσμένης λειτουργίας

CountWorkingDays (StartDate, EndDate, InclSat Saturdays, InclSundays)

Τα InclSat Saturdays και InclSundays είναι προαιρετικές παράμετροι. Από προεπιλογή, και οι δύο έχουν TRUE τιμές. Για να αλλάξετε τα Σάββατα και τις Κυριακές σε εργάσιμες ημέρες, αλλάξτε την τιμή της αντίστοιχης παραμέτρου σε FALSE.

Η Microsoft εισήγαγε τη λειτουργία NETWORKDAYS.INTL με το Excel 2010. Αυτή η λειτουργία αντιμετωπίζει το πρόβλημα της συνάρτησης NETWORKDAYS. Σε αυτήν τη συνάρτηση, μπορούμε να καθορίσουμε τις ημέρες εκτός εβδομάδας. Μπορούμε είτε να ορίσουμε μία ή δύο ημέρες ως Εβδομάδα αργία.

Σύνταξη της συνάρτησης NETWORKDAYS.INTL

NETWORKDAYS.INTL (StartDate, EndDate, [Weekend], [Holidays])

Στην παράμετρο του Σαββατοκύριακου, μπορούμε να καθορίσουμε ημέρες εκτός εβδομάδας.

Σε αυτό το παράδειγμα, θα χρησιμοποιήσουμε και τις τρεις παραπάνω συναρτήσεις για να μετρήσουμε τον αριθμό των εργάσιμων ημερών.

Λογική εξήγηση

Στη συνάρτηση "CountWorkingDays", πρώτα ελέγχουμε αν υπάρχει συγκεκριμένη ημερομηνία στην παράμετρο στην καθορισμένη λίστα διακοπών. Εάν η ημερομηνία υπάρχει στη λίστα των διακοπών, τότε η ημέρα αυτή δεν υπολογίζεται στον αριθμό των εργάσιμων ημερών. Εάν η ημερομηνία δεν υπάρχει στη λίστα των διακοπών, ελέγξτε αν η συγκεκριμένη ημερομηνία είναι Σάββατο ή Κυριακή. Με βάση την παρεχόμενη παράμετρο εισαγωγής, ελέγξτε αν θα συμπεριληφθούν ή θα εξαιρεθούν τα Σάββατα ή οι Κυριακές ως αργία.

Επεξήγηση κώδικα

Ορισμός RngFind = Φύλλα εργασίας ("Διακοπές"). Στήλες (1). Εύρεση (i)

Ο παραπάνω κωδικός χρησιμοποιείται για να βρείτε την τοποθεσία όπου υπάρχει η καθορισμένη ημερομηνία στη λίστα διακοπών.

Αν όχι RngFind δεν είναι τίποτα τότε

GoTo ForLast

Τέλος εαν

Ο παραπάνω κωδικός χρησιμοποιείται για να ελέγξει εάν υπάρχει καθορισμένη ημερομηνία στη λίστα διακοπών. Εάν η κατάσταση επιστρέψει TRUE, τότε αυτή η ημέρα δεν υπολογίζεται στον αριθμό των εργάσιμων ημερών.

Ακολουθήστε παρακάτω για τον κωδικό

 Option Explicit Function CountWorkingDays (StartDate As Long, EndDate As Long, Optional InclSat Saturdays Boolean = True, _ Optional InclSundays As Boolean = True) 'Δήλωση μεταβλητών Dim RngFind As Range Dim i As Long For i = StartDate To EndDate On Error Resume Next' Εύρεση της τοποθεσίας όπου υπάρχει η καθορισμένη ημερομηνία στο φύλλο Διακοπές Ρύθμιση RngFind = Φύλλα εργασίας ("Διακοπές"). Στήλες (1). Βρείτε (i) On Error GoTo 0 'Έλεγχος αν είναι αργία τη δεδομένη ημερομηνία Εάν όχι RngFind δεν είναι τίποτα Στη συνέχεια GoTo ForLast End If 'Έλεγχος αν είναι Σάββατο σε δεδομένη ημερομηνία If InclSat Saturdays If If Weekday (i, 2) = 6 Then GoTo ForLast End If End If' Έλεγχος αν είναι Κυριακή τη δεδομένη ημερομηνία If InclSundays Then If Weekday (i, 2) = 7 Στη συνέχεια GoTo ForLast End If End If CountWorkingDays = CountWorkingDays + 1 ForLast: Next End function 

Αν σας άρεσε αυτό το blog, μοιραστείτε το με τους φίλους σας στο Facebook. Επίσης, μπορείτε να μας ακολουθήσετε στο Twitter και το Facebook.

Θα θέλαμε πολύ να σας ακούσουμε, ενημερώστε μας πώς μπορούμε να βελτιώσουμε το έργο μας και να το κάνουμε καλύτερο για εσάς. Γράψτε μας στον ιστότοπο email