Μια εύκολη τεχνική σύνταξης σύνθετων συναρτήσεων με πολλές φωλιασμένες IF

matryoshkaΑπό τις πιο χρήσιμες συναρτήσεις φύλλου η συνάρτηση IF, δημιουργεί προβλήματα κατά την σύνταξή της, όταν οι συνθήκες που θα ελεγχθούν είναι πολλές. Μέχρι 64 συναρτήσεις IF μπορούν να ενσωματωθούν η μία στην άλλη, για τη δημιουργία πιο σύνθετων ελέγχων και καθώς γράφονται τα αλλεπάλληλα φωλιασμένα IF, λάθη είναι σχεδόν σίγουρο ότι θα γίνουν, συνήθως σε παρενθέσεις. Για να αποφευχθούν αυτά τα λάθη, το χάσιμο χρόνου, ο εκνευρισμός που συνεπάγονται και για σιγουριά ότι κάθε φωλιασμένη IF, αλλά και όλη μαζί η συνάρτηση θα δουλέψουν σωστά, σας προτείνω την παρακάτω τεχνική σύνταξης. Για την περιγραφή της θα χρειαστούμε ένα παράδειγμα. Ας πούμε ότι θέλετε για έναν αριθμό στο κελί Α1, η IF να τον ελέγχει και να επιστρέφει κατά περίπτωση: “Μηδέν”, “Μονοψήφιος”, “Διψήφιος”, “Μεγάλος αριθμός”, “Αρνητικός αριθμός”.
Γράψτε κάθε περίπτωση IF χωριστά σε διαφορετικά κελιά και κάντε δοκιμές για κάθε μία, για να είστε σίγουροι ότι η κάθε περίπτωση δουλεύει σωστά. Για κάθε συνάρτηση IF
=IF(logical_test;value_if_true;value_if_false)
γράψτε το logical_test και την τιμή που θα επιστραφεί όταν αυτό επαληθεύεται (δηλαδή τη value_if_true) και σε όλες τις περιπτώσεις σαν όρισμα value_if_false θα γράψετε τη λογική τιμή FALSE, δηλαδή:

=IF(A1=0;"Μηδέν";FALSE)
=IF(AND(A1>0;A1<10);"Μονοψήφιος";FALSE)
=IF(AND(A1>=10;A1<100);"Διψήφιος";FALSE)
=IF(A1>=100;"Μεγάλος αριθμός";FALSE)

Στην παρακάτω εικόνα, οι συναρτήσεις αυτές έχουν γραφτεί στα κελιά D1:D4 του φύλλου.

nestingIF_00

Αφού κάνετε δοκιμές και δείτε ότι η κάθε μια IF δουλεύει σωστά, θα προχωρήσετε στην ενσωμάτωσή τους σε μία IF που θα κάνει όλη τη δουλειά.
1. Επιλέξτε το κελί στο οποίο έχετε γράψει τη δεύτερη IF, (κελί D2) και από την γραμμή των τύπων επιλέξτε τη συνάρτηση χωρίς το αρχικό ίσον, όπως στη εικόνα:

nestingIF_01

2. Όπως είναι επιλεγμένη η συνάρτηση πατήστε Ctrl+C για να την αντιγράψετε. (Αντί για Ctrl+C, μπορείτε να πατήσετε το κουμπί της αντιγραφής). Στη συνέχεια πατήστε μια φορά στο πληκτρολόγιο το πλήκτρο Esc.
3.Επίλεξε το κελί με την πρώτη IF, (κελί D1) και στην γραμμή των τύπων επίλεξε τη λογική τιμή FALSE, όπως στη επόμενη εικόνα:

nestingIF_02

4.Πατήστε Ctrl+V (ή το κουμπί της επικόλλησης) ώστε η τιμή FALSE να αντικατασταθεί από την συνάρτηση που αντιγράψατε στο 2ο βήμα. Μετά από αυτό στη γραμμή των τύπων η συνάρτηση θα δείχνει έτσι:

nestingIF_03

Αμέσως μετά πατήστε αριστερά στη γραμμή τύπων, το κουμπί της “εισαγωγής” (είναι το κουμπί με το σύμβολο του τσεκαρίσματος ✔) ή πατήστε Enter στο πληκτρολόγιο.
Με αυτά τα τέσσερα βήματα ολοκληρώθηκε το φώλιασμα της δεύτερης IF στην πρώτη. Με τον ίδιο τρόπο θα συνεχίσετε με το φώλιασμα της τρίτης IF στην πρώτη. Επιλέξτε το κελί D3, αντιγράψτε (Ctrl+C) την συνάρτηση (χωρίς το αρχικό ίσον) από την γραμμή των τύπων, πατήστε Esc, επιλέξτε το κελί D1, στη γραμμή των τύπων επιλέξτε την τιμή FALSE, κάντε επικόλληση (Ctrl+V) ώστε η τιμή FALSE να αντικατασταθεί με ότι μόλις αντιγράψατε, πατήστε “εισαγωγή” (✔). Τώρα η συνάρτηση στο κελί D1 πρέπει να δείχνει έτσι:

=IF(A1=0;"Μηδέν";IF(AND(A1>0;A1<10);"Μονοψήφιος";IF(AND(A1>=10;A1<100);"Διψήφιος";FALSE)))

Συνεχίστε με τον ίδιο τρόπο με τις υπόλοιπες IF συναρτήσεις έως την τελευταία. Στο παράδειγμά μας μένει μία ακόμα, η IF στο κελί D4. Μετά την ενσωμάτωση και αυτής στην πρώτη, η συνάρτηση θα είναι:

=IF(A1=0;"Μηδέν";IF(AND(A1>0;A1<10);"Μονοψήφιος";IF(AND(A1>=10;A1<100);"Διψήφιος";IF(A1>=100;"Μεγάλος αριθμός";FALSE))))

Απομένει μια λογική τιμή FALSE στο τέλος της συνάρτησης. Αυτή η τιμή αντιπροσωπεύει το τι θα επιστρέψει η συνάρτηση όταν κανένα από τα logical_test δεν έχει επαληθευτεί. Στη θέση του, γράψτε τι θέλετε να σας επιστρέφει η IF, όταν καμία από τις συνθήκες των επί μέρους IF δεν έχει ικανοποιηθεί. Στο παράδειγμα θα πρόκειται για αρνητικό αριθμό, για αυτό στη θέση του τελικού FALSE γράψτε “Αρνητικός αριθμός” και η τελική συνάρτηση θα είναι:

=IF(A1=0;"Μηδέν";IF(AND(A1>0;A1<10);"Μονοψήφιος";IF(AND(A1>=10;A1<100);"Διψήφιος";IF(A1>=100;"Μεγάλος αριθμός";"Αρνητικός αριθμός"))))

Διαγράψτε τώρα τις επιμέρους IF στα κελιά D2, D3 και D4, σας είναι άχρηστες. Η τεχνική αυτή ίσως να δείχνει υπερβολικά αναλυτική και χρονοβόρα. Αντίθετα, σας διαβεβαιώνω, ότι σας εξοικονομεί χρόνο και σας προστατεύει από λάθη.

Ένα ακόμα παράδειγμα.

calendar
Δείτε ένα ακόμα παράδειγμα, πιο ρεαλιστικό αυτή τη φορά, από την πραγματική ζωή του excel.
Στη στήλη Α ενός φύλλου υπάρχουν ημερομηνίες και στη στήλη Β μια συνάρτηση θα διαβάζει τις ημερομηνίες και θα επιστρέφει έναν από τους χαρακτηρισμούς, “Τρέχουσα εβδομάδα”, “Προηγούμενη εβδομάδα”, “Επόμενη εβδομάδα” ή “Σήμερα”, ανάλογα σε ποια εβδομάδα ανήκει η ημερομηνία. Για τις ημερομηνίες εκτός αυτών των εβδομάδων η συνάρτηση δεν θα επιστρέφει τίποτα, θα αφήνει το κελί “κενό”.
Για την σημερινή ημερομηνία η επιμέρους IF είναι απλή:

=IF(A1=TODAY();"Σήμερα";FALSE)

Η συνάρτηση =TODAY() επιστρέφει κάθε φορά την τρέχουσα ημερομηνία. Για την ακρίβεια επιστρέφει την ημερομηνία του υπολογιστή σας. Αν είναι σωστή, σωστή ημερομηνία επιστρέφει και η συνάρτηση. Η συνάρτηση:

=TODAY()-WEEKDAY(TODAY();3)

επιστρέφει πάντα την ημερομηνία της πρώτης ημέρας της εβδομάδας (δηλαδή της Δευτέρας) της τρέχουσας ημερομηνίας. Δηλαδή, όποια ημέρα και να είναι η σημερινή, ο τύπος επιστρέφει την ημερομηνία της αμέσως προηγούμενης Δευτέρας. Φυσικά αν σήμερα είναι Δευτέρα θα επιστρέψει την σημερινή ημερομηνία. (Δέστε στο σημείωμα του ιστολογίου “Και άλλες συναρτήσεις ημερομηνίας και χρόνου”, την παράγραφος Θ).
Τώρα, όλες οι ημερομηνίες της προηγούμενης εβδομάδας αν συγκριθούν με την Δευτέρα αυτή, θα είναι παλιότερες (δηλαδή μικρότερες) κατά 1 έως 8 ημέρες. Με άλλα λόγια, αν για μία ημερομηνία που είναι γραμμένη στο κελί Α1 ισχύουν:

Α1>Δευτέρα-8 
και ταυτόχρονα
Α1 < Δευτέρα

τότε αυτή θα είναι ημερομηνία της προηγούμενης εβδομάδας. Με όρους του excel αυτό θα γραφτεί σε μία συνάρτηση IF έτσι:

=IF(AND(A1>Δευτέρα-8;A1<Δευτέρα);"Προηγούμενη";FALSE)

όπου φυσικά στη θέση της Δευτέρας θα βάλετε το τύπο:

=TODAY()-WEEKDAY(TODAY();3)

και ο τελικός τύπος που θα επιστρέφει τη λέξη «Προηγούμενη» αν η ημερομηνία του κελιού Α1, είναι της προηγούμενης εβδομάδας, είναι:

=IF(AND(A1> TODAY()-WEEKDAY(TODAY();3)-8;A1< TODAY()-WEEKDAY(TODAY();3));"Προηγούμενη";FALSE)

Παρόμοια, για να είναι η ημερομηνία του κελιού Α1 της τρέχουσας εβδομάδας, πρέπει να ισχύουν:

Α1>=Δευτέρα 
και ταυτόχρονα
Α1 < Δευτέρα+7

Ή για το excel:

=IF(AND(A1>= TODAY()-WEEKDAY(TODAY();3);A1< TODAY()-WEEKDAY(TODAY();3)+7);"Τρέχουσα";FALSE)

Για να είναι η ημερομηνία του κελιού Α1 της επόμενης εβδομάδας, πρέπει να ισχύουν ταυτόχρονα:

Α1>Δευτέρα +6
και 
Α1 < Δευτέρα+14

Άρα:

=IF(AND(A1> TODAY()-WEEKDAY(TODAY();3)+6;A1< TODAY()-WEEKDAY(TODAY();3)+14);"Επόμενη";FALSE)

Ενσωματώστε τώρα, με την τεχνική που είδατε πιο πάνω τους τύπους 2,3 και 4 στον τύπο 1. (Σημείωση: Αν ο τύπος είναι μεγάλος και η γραμμή των τύπων δεν επαρκεί για να κάνετε τις αντιγραφές και επικολλήσεις, τότε πατήστε F2 και επεξεργαστείτε τον τύπο μέσα στο κελί του).
Τελικά θα έχετε τον τύπο:

=IF(A1=TODAY();"Σήμερα";IF(AND(A1> TODAY()-WEEKDAY(TODAY();3)-8;A1< TODAY()-WEEKDAY(TODAY();3));"Προηγούμενη";IF(AND(A1>= TODAY()-WEEKDAY(TODAY();3);A1< TODAY()-WEEKDAY(TODAY();3)+7);"Τρέχουσα";IF(AND(A1> TODAY()-WEEKDAY(TODAY();3)+6;A1< TODAY()-WEEKDAY(TODAY();3)+14);"Επόμενη";""))))

Θα συμφωνήσετε ότι είναι ένας πολύ μεγάλος τύπος και δύσκολα γράφεται απ’ ευθείας.
Στο τύπο αυτό, η τελική τιμή FALSE αντικαταστάθηκε από δύο διπλά εισαγωγικά χωρίς κενό ανάμεσά τους, ώστε όταν όλες οι επί μέρους συνθήκες δεν ικανοποιούνται (δεν αληθεύει κανένα logical_test), η συνάρτηση να επιστρέφει ένα (φαινομενικά) κενό κελί. Δεν είναι πραγματικά κενό, αφού περιέχει την συνάρτηση. Στο φύλλο1 του βιβλίου NestingIF.xls μπορείτε να δείτε όλα τα παραπάνω στην πράξη.

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

=TODAY()-WEEKDAY(TODAY();3)

Η συνάρτηση αυτή μπορεί να εισαχθεί σαν όνομα στο βιβλίο και να γίνεται χρήση του ονόματος στις συναρτήσεις. Εισάγετε λοιπόν το όνομα:

Δευτ=TODAY()-WEEKDAY(TODAY();3)

Τότε οι επί μέρους τύποι και ο τελικός θα είναι:

=IF(A1=TODAY();"Σήμερα";FALSE)

=IF(AND(A1> Δευτ-8;A1< Δευτ);"Προηγούμενη";FALSE)

=IF(AND(A1>= Δευτ;A1< Δευτ+7);"Τρέχουσα";FALSE)

=IF(AND(A1> Δευτ+6;A1< Δευτ+14);"Επόμενη";FALSE)

=IF(A1=TODAY();"Σήμερα";IF(AND(A1> Δευτ-8;A1< Δευτ);"Προηγούμενη";IF(AND(A1>= Δευτ;A1< Δευτ+7);"Τρέχουσα";IF(AND(A1> Δευτ+6;A1< Δευτ+14);"Επόμενη";""))))

Τους πέντε παραπάνω τύπους μπορείτε να δείτε σε λειτουργία στο φύλλο2 του βιβλίου NestingIF.xls Επίσης στο φύλλο3 θα βρείτε μια λύση του ίδιου προβλήματος, με μήνες αυτή τη φορά και όχι με εβδομάδες.

Πιο απλά δεν γίνεται;
Σε αρκετές περιπτώσεις, προβλήματα που οδηγούν σε πολύπλοκες IF συναρτήσεις, μπορούν να λυθούν με τις LOOKUP, VLOOKUP, HLOOKUP, CHOOSE, INDEX κλπ
Το παραπάνω πρόβλημα με τις εβδομάδες λύνεται από την LOOKUP με τον παρακάτω κομψό τύπο:

=IF(A1=TODAY();"Σήμερα";LOOKUP(A1; Δευτ +{-10000;-7;0;7;14};{"";"Προηγούμενη";"Τρέχουσα";"Επόμενη";""}))

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

This entry was posted in excel, Συναρτήσεις φύλλου and tagged , , , , , , , . Bookmark the permalink.

10 Responses to Μια εύκολη τεχνική σύνταξης σύνθετων συναρτήσεων με πολλές φωλιασμένες IF

  1. Ο/Η Νικόλας λέει:

    Καλημέρα σας! Περιττό πιστεύω να σας πω το πόσο πολύ κόσμο βοηθάτε! Άρχισα μόλις χθες να διαβάζω το blog και ήδη έφτιαξα τον πρώτο μου πίνακα με απλές συναρτήσεις.!!
    Έχω όμως και εγώ κάποια προβλήματα – θέματα που θα ήθελα την βοήθειά σας.
    Τον πίνακα τον έβαλα με την μέθοδο της εισαγωγής του excel 2010. Με τα φίλτρα που έχει από μόνο του.
    Αφού έφτιαξα και κάποιες SUMIF συναρτήσεις, όλα καλά. Το θέμα όμως είναι πως όταν βάζω κάποιο φίλτρο (να βλέπω για παράδειγμα μόνο τα τιμολόγια που εκκρεμούν, τότε αυτόματα χάνονται τα αποτελέσματα που μου δείχνουν το συνολικό ποσό. Η συνάρτηση είναι η εξής: =SUMIF(Πίνακας1[Κατάσταση];»Εκκρεμεί»;Πίνακας1[Ποσό])
    όπου [Κατάσταση], είναι το πεδίο κριτηρίων. «Εκκρεμεί» είναι η λέξη κριτήριο, και [Ποσό] είναι ο το πεδίο από όπου αθροίζει.

    Όταν λοιπόν βάζω στο φίλτρο να μου δείχνει μόνο αυτά που λέει «Εκκρεμεί», τότε χάνεται αυτή η συνάρτηση… Κάτι έχω κάνει λάθος. Σωστά;

    Επίσης, άλλη μία απορία που έχω: Έβαλα μέσω του προγραμματιστή ένα checkbox. Αλλά όταν διαλέγω το κελί που το συνδέω, το μόνο που μου κάνει είναι να μου βγάζει «TRUE» Ή «FALSE». Ανάλογα αν το έχω τικαρισμένο ή όχι. Εγώ μπορώ να το κάνω να γράφει «Εκκρεμεί» ή «Εξωφλήθη» αντίστοιχα;
    Εδώ να σημειώσω πως δεν πείραξα τίποτα από visual basic (μιας και είμαι άσχετος). Είχε 2 επιλογές για checkbox. Η μία «στοιχεία ελέγχου φόρμας» και η άλλη «στοιχεία ελέγχου AvtiveX». Την 2η δεν μπορώ καν να την συνδέσω με κάποιο κελί αφού με πάει κατευθείαν σε visual. Την πρώτη την έκανα, αλλά δεν ξέρω αν μπορώ να αλλάξω την τιμή που δίνει.

    Ανέβασα και το αρχείο σε μορφή .xlsx (και αυτό δεν ξέρω αν το έκανα σωστά…)
    http://sharesend.com/sui8t5mp

    Κάθε ιδέα, ευπρόσδεκτη!

    Ευχαριστώ,
    Νικόλας

  2. Ο/Η vioannis λέει:

    Νικόλα:
    Όταν φιλτράρει το Excel, κρύβει τις γραμμές που δεν χρειάζεται και κρατά μόνο τις γραμμές του φίλτρου. Όταν λέμε “κρύβει τις γραμμές” τις κρύβει ολόκληρες πέρα –πέρα δεξιά, έως το τέλος του φύλλου. Παρακολούθησε την αρίθμηση των γραμμών μετά από το φίλτρο για να το δεις. Γι αυτό, ότι έχεις γράψει δεξιά του πίνακα κρύβεται και αυτό. Τα Sumif κλπ γράψτα σε γραμμές πάνω από τον πίνακα, ή κάτω και δεξιά από τον πίνακα ή σε άλλο φύλλο (μπορείς να αναφέρεσαι σε πίνακα από οπουδήποτε φύλλου του βιβλίου). Στην περίπτωσή σου μετάφερε τα Sumif όπου θέλεις με απλή αντιγραφή – επικόλληση. Πάντως να ξέρεις ότι οι τύποι που αναφέρονται σε έτοιμους από το Excel πίνακες και οι ίδιοι οι πίνακες έχουν μηδενική συμβατότητα με παλιότερες εκδόσεις του Excel. Αν αυτό δεν σε ενδιαφέρει καλώς τους χρησιμοποιείς είναι πολύ καλό εργαλείο.
    Για το άλλο θέμα, το checkbox είναι μάλλον υπερβολικό για αυτό που ζητάς, Πιο καλά κάνε επικύρωση δεδομένων:
    Επίλεξε τη στήλη ΚΑΤΑΣΤΑΣΗ στον πίνακα.
    Στο μενού δεδομένα επίλεξε επικύρωση δεδομένων.
    Από τις επιτρεπόμενες καταχωρίσεις διάλεξε Λίστα.
    Στο πλαίσιο κάτω από τη λέξη προέλευση γράψε: Εκκρεμεί ; Εξοφλήθη
    και ότι άλλο θες χωρισμένα με ελληνικό ερωτηματικό.
    Πάτα ΟΚ.
    Τώρα μπορείς να επιλέξεις από το κουμπί δεξιά στο κελί.
    Αν οι τιμές της επικύρωσης είναι πολλές ακολούθησε τα βήματα που περιγράφω στο πρώτο παράδειγμα εδώ: Επικύρωση δεδομένων από λίστα.

  3. Ο/Η pigassos λέει:

    Καλημέρα έχω καταφέρει να κάνω το πρώτο κομμάτι των φωλιασμένων if αλλά θέλω να κάνω το ίδιο και για επιπλεον αριθμους από πίνακα.
    Για την πρώτη στήλη η συνάρτηση είναι
    IF(AF4=AK3;AS3;IF(AF4=AL3;AS3;IF(AF4=AM3;AS3;IF(AF4=AN3;AS3;IF(AF4=AO3;AS3;IF(AF4=AP3;AS3;IF(AF4=AQ3;AS3;IF(AF4=AR3;AS3;»NA»))))))))
    και επιστρέφει αυτό που θέλω -2 αλλά οταν πάω να κάνω και για τα υπόλοιπα μου βγάζει πρόβλημα
    IF(AF4=AK3;AS3;IF(AF4=AL3;AS3;IF(AF4=AM3;AS3;IF(AF4=AN3;AS3;IF(AF4=AO3;AS3;IF(AF4=AP3;AS3;IF(AF4=AQ3;AS3;IF(AF4=AR3;AS3;IF(AF4=AK4;AS4;»NA»)))))))) δηλαδή δεν δέχεται την νέα συνάρτηση με στοιχεία από διαφορετικά κελιά.
    0 1 2 3 4 5 6 7 -2
    8 9 10 11 12 13 14 15 -1
    16 17 18 19 20 21 22 23 0
    24 25 26 27 28 29 30 31 1
    32 33 34 35 36 37 38 39 2
    Θα εκτιμούσα πολύ την βοήθεια σας.

    ευχαριστώ
    Γεράσιμος

  4. Ο/Η vioannis λέει:

    Γεράσιμε απαντώ σε αυτό το μήνυμά σου, είναι το ίδιο με αυτό της σελίδας about.
    α) Στον δεύτερο τύπο πρέπει στο τέλος να κλείνουν 8 παρενθέσεις . Αν δεν είναι αυτό το λάθος και απλά αυτό προέκυψε κατά την αντιγραφή του τύπου στο μήνυμα σου, τότε
    β) Δες μήπως δουλεύεις σε excel παλαιότερο του 2007. Στα παλιότερα excel μπορείς να ενθέσεις μόνο έως 7 συναρτήσεις if. Σε αυτή την περίπτωση δες μήπως σε εξυπηρετεί ένας από του τρόπους που προτείνω στο σημείωμα του ιστολογίου «Εναλλακτικές μορφές της συνάρτησης IF». Επειδή δε παρατηρώ ότι όλες οι επί μέρους if εξετάζουν την τιμή ενός κελιού και μόνο, του AF4, δες και την μέθοδο που προτείνω στη συνέχεια του προηγούμενου σημειώματος: “Εναλλακτικές μορφές της συνάρτησης IF (συνέχεια)”.
    γ)Μπορεί να δουλεύεις σε excel 2007 και άνω αλλά το ίδιο το αρχείο (βιβλίο) να είναι παλιότερης έκδοσης. Για να το δεις γρήγορα-γρήγορα αυτό, γράψε σε ένα κελί την συνάρτηση =COLUMNS(1:1) Αν σου επιστρέψει 256, τότε αυτό είναι το πρόβλημα. Στην περίπτωση αυτή αποθήκευσε το βιβλίο σου σαν βιβλίο .xlsx (ή σαν .xlsm αν περιέχει μακροεντολές), κλείστο και ξανα-άνοιξέ το και συνέχισε να δουλεύεις.
    Εγώ πάντως διορθώνοντας το (α) και δουλεύοντας σε 2007, φώλιασα χωρίς πρόβλημα την δεύτερη στην πρώτη.

  5. Ο/Η Γεράσιμος λέει:

    ευχαριστώ πολύ βοήθησε

  6. Ο/Η ΑΝΔΡΕΑΣ λέει:

    ΓΕΙΑ ΣΑΣ…!!!
    Εχω ένα πρόβλημα και δεν ξερω αν τελικά υπάρχει δυνατότητα να προγματοποιηθεί
    πάντως εγώ απο λίγο που το πάλεψα δεν το βλέπω να τα καταφέρνω…!!!
    Το πρόβλημα – θεμα έχει ώς εξής:
    Εχω ένα βιβλίο excel 2003 που περιέχει 15 φύλλα (φύλλο1, φύλλο2, φύλλο3, …) και θέλω όταν καταλήγει μετά απο τους υπόλοιπους υπολογισμούς που κανει τότε το περιεχόμενο (όνομα) ενός κελιού να αλλάζει (rename) την ονομασία του ανάλογα με το περιεχόμενο των κελιών ενός συγκεκριμμένου πίνακα που υπάρχει στο ίδιο πάντα βιβλίο.
    Δηλαδή έστω το περιεχόμενο ενός πίνακα:
    D1=Ανδρέας1
    D2=Ανδρέας2
    D3=Ανδρέας3
    …….
    Οπότε μετά θα πρέπει να καταλήξει το βιβλίο νά έχει τα φύλλα με τις παραπάνω ονομασίες
    Ανδρέας1, Ανδρέας2, Ανδρέας3,… κλπ
    Για μένα αυτό το πρόβλημα φαίνεται αρκετά δύσκολο οπότε άν κάποιος το έχει αντιμετωπίσει…
    πάσα παροχή βοήθειας δεκτή

    Σας ευχαριστώ πολύ
    Με εκτίμηση
    ΑΝΔΡΕΑΣ

  7. Ο/Η vioannis λέει:

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

    Sub makroTest()
    With ActiveWorkbook
        .Sheets("Φύλλο1").Name = .Sheets("Πίνακας").Range("d1").Text
        .Sheets("Φύλλο2").Name = .Sheets("Πίνακας").Range("d2").Text
        .Sheets("Φύλλο3").Name = .Sheets("Πίνακας").Range("d3").Text
        
        
        .Sheets("Φύλλο15").Name = .Sheets("Πίνακας").Range("d15").Text
    End With
    End Sub
    
  8. Ο/Η ΑΝΔΡΕΑΣ λέει:

    Καλημέρα κ. Γιάννη
    Η macro που στείλατε δουλεύει κανονικά…!!!
    Τώρα από ότι παρατηρώ ήμουν σχεδόν κοντά στην λύση αλλά έλειπε αυτό το κλίκ που εσείς έχετε «γράψει» με χιλιόμετρα…
    (Αν και δεν σας γνωρίζω προσωπικά αλλά είναι προφανέστατη η μέγιστη εμπειρία που διαθέτετε…!!!)

    Συγγνώμη από σχετική παράληψη στο προηγούμενο μήνυμα μου δεν σας ανέφερα ότι στο βιβλίο εκτός των άλλων φύλλων, το φύλλο που περιέχει όλα τα δεδομένα ονομάζεται “DATA” και θα πρέπει όμως να έχω την δυνατότητα:

    1. Ταυτόχρονα όλα τα υπόλοιπα φύλλα του παρόντος βιβλίου εκτός του “DATA” να διαγράφονται,
    και
    2. Αν αυτή η διαγραφή είναι δυνατόν να γίνεται παραμετρικά (κατ’ επιλογή)

    Επίσης απ΄ ότι τώρα σκέφτομαι μία άλλη λύση – και πιθανά πιο ευέλικτη – θα ήταν να δημιουργεί ένα καινούργιο βιβλίο το οποίο θα περιέχει μόνο αυτά τα νέα φύλλα και με όνομα βιβλίου που θα παίρνει από ένα κελί (έστω G120)
    Στην ουσία δηλαδή θα κάνει copy αυτά τα φύλλα που μας ενδιαφέρουν, αυτούσια με το περιεχόμενό τους και με την νέα ονομασία που τους έδωσε, σε ένα άλλο νέο βιβλίο που το όνομά του θα προέρχεται από το περιεχόμενο ενός συγκεκριμένου κελιού (έστω G120) του παραπάνω “DATA”.

    ΣΗΜΕΙΩΣΗ
    Είμαι ερευνητής βιολόγος και το πρωτογενές βιβλίο που σας ανέφερα είναι η αυτόματη έξοδος από ένα αμερικάνικο όργανο πολλαπλών μετρήσεων κατόπιν μιας χρονοβόρας – πολύπλοκης ανάλυσης και επεξεργασίας…
    Και μπορεί τώρα να έχει περίπου 15 φύλλα (ήδη με μια παράμετρο που άλλαξα έχω φτάσει στα 23) αλλά από ότι διαβλέπω στο εγγύς μέλλον, όσο προστίθενται παράμετροι τόσο αυτά αυξάνονται σε αρκετά μεγάλο αριθμό, γεωμετρικά θα έλεγα…
    Έτσι για την ιστορία, όπως αναφέρει το manual έχει δυνατότητα εξόδου μέχρι 2048 φύλλα!!!!
    Επειδή ήδη έχω αρχίσει να χάνομαι μέσα στην πληθώρα των φύλλων θέλω να πιστεύω ότι με την παραπάνω “μέθοδο” θα βελτιστοποιήσω τον χρόνο και θα ελαχιστοποιήσω την πιθανότητα λαθών αλαφραίνοντας λίγο τα πράγματα και κάθε φορά θα μπορώ να ξεχωρίσω σε ένα νέο βιβλίο μόνο αυτά που με ενδιαφέρουν για περαιτέρω σκοπούμενη ανάλυση και επεξεργασία…
    Προσπάθησα να το κάνω αυτό μέσα απο το μενού του οργάνου, δηαλδή να εξάγω μόνο αυτά που με ενδιαφέρουν κάθε φορά αλλά αυτό στάθηκε αδύνατον, και σε επικοινωνία με την εταιρία κατασκευής μου απήνησε ότι δεν υπάρχει τέτοια επιλογή από το ίδιο το όργανο, αυτό θα πρέπει
    να γίνει εξωτερικά με επεξεργασία του παραγόμενου excel αρχείου!!!
    Το παραγόμενο αρχείο excel όπως σας ανέφερα είναι έκδοσης 97-2003 από ότι αναφέρει το manual, και πρέπει να παραμένει έτσι γιατί μετά από αυτή την διαδικασία θέλουμε διάφορα (επιλεκτικά κάθε φορά) από τα φύλλα – δεδομένα να τα δώσουμε είσοδο (πάντα σε έκδοση 97-2003) σε άλλα όργανα που όπως αναφέρουν απαιτούν και αυτά είσοδο μόνο σε αυτή την έκδοση…
    Τα παραγόμενα δεδομένα είναι αρκετά κρίσιμα δεν ξέρω το μπορεί να συμβεί (απώλεια μέρους δεδομένων – σφαλμάτων κλπ) αν πάμε σε κατάσταση συμβατότητας σε άλλες νεότερες εκδόσεις…!!!
    Ελπίζω να μην σας κούρασα αλλά όπως καταλαβαίνετε δεν έχω αντικείμενο πληροφορικής οι γνώσεις μου είναι περιορισμένες στον τομέα αυτό και ό,τι έχω κάνει μάλλον πολλά είναι για τις δικές μου τις γνώσεις και γι’αυτό καταλήγω σε “εξωτερική” βοήθεια…

    Συγγνώμη και πάλι σας ευχαριστώ
    με εκτίμηση
    ΑΝΔΡΕΑΣ

  9. Ο/Η vioannis λέει:

    Αντρέα:
    α) η έκδοση 2003 είναι πολύ καλή και σταθερή. Μόνο αν ζητάς περισσότερες γραμμές ή στήλες θα αναβαθμιστείς σε νεώτερες εκδόσεις, αλλά δεν νομίζω ότι αυτό είναι το ζητούμενο, άρα μην έχεις κανένα πρόβλημα με την έκδοση.
    β) Ας λένε τα manual, στην πράξη δεν μπορείς να έχεις χιλιάδες φύλλα σε ένα βιβλίο, ούτε καν εκατοντάδες.
    γ) Παρακολούθησε τώρα το παρακάτω σενάριο:
    Μία μάκρο, σε μία ελεύθερη στήλη του φύλλου DATA ή σε ένα νέο φύλλο (INDEX) κατασκευάζει μια λίστα όλων των φύλλων του βιβλίου. Στην διπλανή στήλη από ένα πτυσσόμενο πλαίσιο επιλέγεις μία από τις δυνατότητες:
    Φανερό
    Κρυφό
    Διαγραφή
    Μετακίνηση
    Τρέχεις μία δεύτερη μάκρο και:
    1) Τα φύλλα που έχουν τον χαρακτηρισμό ΦΑΝΕΡΟ παραμένουν στο βιβλίο ως έχουν ή αν σε προηγούμενη χρήση της μάκρο είχαν αποκρυφτεί, θα γίνουν φανερά.
    2) Τα φύλλα που έχουν τον χαρακτηρισμό ΚΡΥΦΟ παραμένουν στο βιβλίο αλλά μετατρέπονται σε κρυφά, δηλαδή η ετικέτα τους δεν θα εμφανίζεται στη γραμμή με τα φύλλα. Αν ήδη είναι κρυφά, η κατάστασή τους δεν μεταβάλλεται.
    3) Τα φύλλα που έχουν τον χαρακτηρισμό ΔΙΑΓΡΑΦΗ διαγράφονται. Πρόσεχε ότι, η διαγραφή είναι οριστική, αμετάκλητη και απολύτως μη αναστρέψιμη.
    4) Τα φύλλα που έχουν τον χαρακτηρισμό ΜΕΤΑΚΙΝΗΣΗ θα μετακινούνται όλα μαζί σε ένα νέο βιβλίο, το οποίο θα δημιουργείται εκείνη τη στιγμή, και θα αποθηκεύεται στον ίδιο ακριβώς φάκελο στον οποίο βρίσκεται το βιβλίο που εργάζεσαι. Η μετακίνηση που είναι βέβαια μία τυποποιημένη εργασία του excel είναι απολύτως ασφαλής μέθοδος αν το φύλλο περιέχει δεδομένα σε αξίες ή συναρτήσεις που αναφέρονται σε δεδομένα του ίδιου του φύλλου. Αν το φύλλο περιέχει αναφορές και διασυνδέσεις σε άλλα φύλλα αυτές πρέπει να αντιμετωπιστούν.
    5) Τα φύλλα που δεν έχουν χαρακτηρισμό, καμία μεταβολή δεν υφίστανται.
    Θα μπορείς να τρέξεις τη μάκρο για όσα φύλλα θέλεις, από ένα έως όλα.
    Πριν τελειώσει η μάκρο θα καλεί αυτόματα την πρώτη μάκρο και θα ανανεώνει τη λίστα με τα φύλλα, στη νέα πια μορφή του βιβλίου.
    Αντιμετωπίζουν τα παραπάνω, τις σκέψεις σου και τις ανάγκες σου;

  10. Ο/Η vioannis λέει:

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

Τα σχόλια είναι απενεργοποιημένα.