Forum

Forum (https://www.ms-office.gr/forum/)
-   Excel - Ερωτήσεις / Απαντήσεις (https://www.ms-office.gr/forum/excel-erotiseis-apantiseis/)
-   -   [Συναρτήσεις] Formula function με ημερομηνία (https://www.ms-office.gr/forum/excel-erotiseis-apantiseis/5872-formula-function-me-imerominia.html)

minas84 22-04-21 13:15

Formula function με ημερομηνία
 
1 Συνημμένο(α)
Καλησπέρα θα ήθελα αν κάποιος έχει λιγο χρόνο να με βοηθήσει με κάτι που είναι δύσκολο για το δικό μου επίπεδο.
Έχω φτιάξει 2 modules.
To πρώτο διαβάζει "πράσινο" και "κόκκινο" χρώμα κελιού

Function CheckColor(range)
If range.Interior.Color = RGB(256, 0, 0) Then
CheckColor = "Red"
ElseIf range.Interior.Color = RGB(0, 176, 80) Then
CheckColor = "Green"
Else
CheckColor = "Neither"
End If
End Function


To δεύτερο ανάλογα με το χρώμα του κελιού κάνει άλλη πράξη με τον αριθμό του
Στο "κόκκινο" αφαιρεί 6
Στο "πράσινο" προσθέτει (cell value-1)*0.97


Function Daily(MyRange)
Daily = 0
For Each Cell In MyRange
If Cell.Interior.Color = RGB(255, 0, 0) Then
Daily = Daily - 6
ElseIf Cell.Interior.Color = RGB(0, 176, 80) Then
Daily = Daily + (Cell.Value - 1) * 0.97
Else: Daily = Daily
End If
Next Cell
End Function



Μέχρι εδώ τα καταφέρνω.
Αυτό που θέλω ειναι να "διαβάζω" την ημερομηνία και να "τραβάω" μόνο εκείνο το range.
Δηλαδή, στο παράδειγμα που κάνω Upload, θελω να "διαβάζω" στην στήλη Α που εχέι "24 Feb"
και να κάνει τον κώδικα του daily για αυτες τις τιμες. Στο παράδειγμα μου κάνουν μόνο οι τιμές ( 3,58 κόκκινο, 1,58 κόκκινο, 2,77 πράσινο, που έχουν ημερομηνία 24 Feb)
Οπότε αναμένω να κάνει -6-6+(2,77-1)*0,97

Δοκίμασα =IF(A1:A100 = "*"&A21&"*"; daily(F1:F100)) αλλά κάτι γράφω λάθος.
Ευχαριστώ πάρα πολύ!

ChrisGT7 22-04-21 15:14

1 Συνημμένο(α)
Καλησπέρα Μηνά,

Ελπίζω να σε καλύπτει η μορφή της Daily().

Την τροποποίησα έτσι ώστε να δέχεται ως ορίσματα τρία εύρη: το πρώτο εύρος αφορά τα κελιά με τα χρώματα, το δεύτερο τις ημερομηνίες και το τρίτο το κελί με την ημερομηνία που ψάχνεις.

Θεωρώ πως οι ημερομηνίες είναι σε μορφή κειμένου.

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

Όπως θα διαπιστώσεις, σημαντικό είναι το $ όταν ορίζεις τα εύρη στη συνάρτηση, ώστε να παραμένουν σταθερά όταν τραβάς τον τύπο και στα υπόλοιπα κελιά.

minas84 23-04-21 00:43

Εύχαριστω πάρα πάρα πολυ για τον χρόνο σου. Ωραία πληροφορία αυτή με το $.

Δεν μου υπολογίζει καλά τα νούμερα όμως.
Παράδειγμα στις 24 Feb έχουμε ( 3,58 κόκκινο, 1,58 κόκκινο, 2,77 πράσινο)
Άρα θα ήθελα να κάνει -6-6+(2,77-1)*0,97=-12+1,7169=-10,2831
Στις 25 Feb έχει μονο 1 κόκκινο
Άρα ήθελα να κάνει -6
Δεν μπορώ να δω που είναι το λάθος όμως.



p.s. πολυ ωραίο avatar έχεις

ChrisGT7 23-04-21 08:37

Καλημέρα Μηνά,

Χρησιμοποίησα λάθος λογική, όπως φαίνεται... Αντικατέστησε τον κώδικα της daily με τον παρακάτω και έλεγξε αν όλα είναι εντάξει:

Κώδικας:

Function Daily(MyColors As range, MyDates As range, Str As range) As Double
    Dim R  As Long: R = MyColors(1, 1).Row - MyDates(1, 1).Row
    Dim C  As Long: C = MyColors(1, 1).Column
    Dim Dt As range
   
    For Each Dt In MyDates
        If InStr(Dt.Value, Str.Value) Then
            If Cells(Dt.Row + R, C).Interior.Color = RGB(255, 0, 0) Then
                Daily = Daily - 6
            ElseIf Cells(Dt.Row + R, C).Interior.Color = RGB(0, 176, 80) Then
                Daily = Daily + (Cells(Dt.Row + R, C).Value - 1) * 0.97
            Else
                Daily = Daily
            End If
        End If
    Next
End Function

Υ.Γ. Σ' ευχαριστώ πολύ! :)

kapetang 23-04-21 14:39

1 Συνημμένο(α)
Καλησπέρα

Και μια πρόταση με συνάρτηση πίνακα.

minas84 23-04-21 20:58

Παράθεση:

Αρχική Δημοσίευση από ChrisGT7 (Μήνυμα 32593)
Καλημέρα Μηνά,

Χρησιμοποίησα λάθος λογική, όπως φαίνεται... Αντικατέστησε τον κώδικα της daily με τον παρακάτω και έλεγξε αν όλα είναι εντάξει:

Κώδικας:

Function Daily(MyColors As range, MyDates As range, Str As range) As Double
    Dim R  As Long: R = MyColors(1, 1).Row - MyDates(1, 1).Row
    Dim C  As Long: C = MyColors(1, 1).Column
    Dim Dt As range
   
    For Each Dt In MyDates
        If InStr(Dt.Value, Str.Value) Then
            If Cells(Dt.Row + R, C).Interior.Color = RGB(255, 0, 0) Then
                Daily = Daily - 6
            ElseIf Cells(Dt.Row + R, C).Interior.Color = RGB(0, 176, 80) Then
                Daily = Daily + (Cells(Dt.Row + R, C).Value - 1) * 0.97
            Else
                Daily = Daily
            End If
        End If
    Next
End Function

Υ.Γ. Σ' ευχαριστώ πολύ! :)

Υπέρ υπέρ ευχαριστώ, το προσπαθώ πολλές μέρες, με έσωσες!

minas84 23-04-21 20:59

Παράθεση:

Αρχική Δημοσίευση από kapetang (Μήνυμα 32594)
Καλησπέρα

Και μια πρόταση με συνάρτηση πίνακα.

Θα μου άρεσε πάρα πολύ, ακολουθώ τις οδηγίες αλλά δεν τα κατάφερα :002::002:

kapetang 23-04-21 21:28

Μηνά είναι εύκολο.

Κάνε μια δοκιμή στο βιβλίο που ανέβασα:

1. Κάνε κλικ σε ένα κελί και σύρε το ποντίκι δεξιά και κάτω ώστε να επιλέξεις μια περιοχή 2 στηλών με αριθμό γραμμών ίσο με τον αριθμό των ημερομηνιών (πχ K2:L14)

2. Στο πλαίσιο των τύπων (δεξιά από το fx) πληκτρολογούμε τη συνάρτηση: =Daily(A2:A14;F2:F14)

3. Με πατημένα τα κουμπιά Ctrl και Shift, πατούμε και το Enter.

minas84 24-04-21 00:14

Θα το δοκιμάσω, αλλά μόλις μου έβγαλε ένα σφάλμα ακόμα (όχι στον πίνακας, στο daily). Στην ουσία εγώ έχω 6-7 sheet με τους ίδιους κώδικες, στο ίδιο αρχείο excel. Το καθένα από αυτά εχεί διαφορετικα input αν ημερομηνία και έτσι βγάζει διαφορετικά συνολικά αποτελέσματα για την κάθε μέρα.
Του βάζω καινούρια αποτελέσματα στο sheet1 και κάνω alt+shift+ctrl+f9 για να κανει refresh και να μου πέρασει τα αποτελέσματα το daily. αύτο χαλάει όλα τα υπόλοιπα sheet στο daily όμως. Γιατί συμβαίνει αύτό; Μπορώ να το αποφυγω;

kapetang 24-04-21 10:50

Καλημέρα

Επειδή δε γνωρίζω τη δομή του βιβλίου εργασίας σου, όσα αναφέρω παρακάτω βασίζονται στο παραδειγματικό βιβλίο που ανέβασα (ταυτίζεται με το συνημμένο σου):

1) Η συνάρτηση Daily έχει 2 ορίσματα (τη στήλη με τις ημερομηνίες A2:A14 και την έγχρωμη F2:F14).

Τα ορίσματα χωρίζονται με ; (ερωτηματικό) για ελληνικό Excel και με , (κόμμα) για αγγλικό.

2) Αν κάνεις αλλαγές μέσα στα κελιά των ορισμάτων (αλλάξεις κάποια ημερομηνία ή τιμή στην έγχρωμη στήλη) η συνάρτηση Daily θα επαναϋπολογιστεί αυτόματα.

3) Αν προσθέσουμε ημερομηνίες (επεκτείνουμε τις 2 στήλες ) θα πρέπει να, όπως περιγράφω, να επανατοποθετήσουμε στο φύλλο τη συνάρτηση Daily, ώστε να ανταποκρίνεται στα νέα δεδομένα (νέα περιοχή επιλογής και ορίσματα).

4) Αν κάνουμε αλλαγή στο χρώμα κάποιου κελιού δεν προκαλείται αυτόματος υπολογισμός.
Στην περίπτωση αυτή κάνουμε χειροκίνητο υπολογισμό (καρτέλα Formulas -> Calculation Sheet).

Το κουμπί Calculation Now επαναϋπολογίζει όλο το βιβλίο (όχι μόνο το τρέχον Sheet).


Η ώρα είναι 20:36.

Ms-Office.gr - ©2000 - 2026, Jelsoft Enterprises Ltd.


Search Engine Optimization by vBSEO 3.3.2