Ενημέρωση βάσης από φόρμα

Ένας φίλος του ιστολογίου, έστειλε την παρακάτω ερώτηση: Σε ένα φύλλο, έχω τυποποιήσει μία φόρμα, πάνω στην οποία συλλέγω διάφορα στοιχεία. Προσπαθώ να γράψω μια μακροεντολή ώστε όταν ολοκληρώνω την δουλεία μου με την φόρμα, όλα τα δεδομένα να υποθηκεύονται σε μία βάση και η φόρμα να καθαρίζει και να είναι έτοιμη να υποδεχτεί νέα δεδομένα.
Για τη λύση του προβλήματος αυτού θα χρειαστούμε το φύλλο με τη φόρμα (πρώτη εικόνα), το φύλλο που θα υποδέχεται τα δεδομένα της φόρμας (βάση, δεύτερη εικόνα) και λίγο κώδικα ο οποίος έχει γραφτεί σε πολύ απλή μορφή, εύκολα προσαρμόσιμος στις δικές σας ανάγκες.
Στην πρώτη εικόνα είναι ένα απλό παράδειγμα φόρμας.

Το φύλλο “Φόρμα”

Κάποια από τα κελιά (B2,B4, B6,…) ενημερώνονται χειριστικά και κάποια (B12, B14, B16, D19) από συναρτήσεις. Όταν ο χρήστης ολοκληρώσει τη δουλειά που έχει να κάνει με την φόρμα, πατά το πλήκτρο: “Μεταφορά στη βάση & καθάρισμα της φόρμας” και τα δεδομένα της, δημιουργούν μια νέα εγγραφή (σειρά) στη βάση. (εικόνα 2).

Το φύλλο “Βάση” / Κλίκ για μεγέθυνση

Η ίδια η φόρμα καθαρίζει και είναι έτοιμη να υποδεχτεί νέα δεδομένα. (εικόνα 3).

εικόνα 3

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

Sub UpdateBaseAndCleanForm()
Dim t1, t2, t3, t4, t5 As Range
Dim t6, t7, t8, t9, t10 As Range

Dim arrayData As Variant
Dim cleanData As Range
Dim keli As Range
Dim baseSheet As Object
Dim formaSheet As Object
Dim meter As Long

Set baseSheet = Sheets("Βάση")
Set formaSheet = Sheets("Φόρμα")

Set t1 = formaSheet.Range("B2")
Set t2 = formaSheet.Range("B4")
Set t3 = formaSheet.Range("B6")
Set t4 = formaSheet.Range("B8")
Set t5 = formaSheet.Range("B10")
Set t6 = formaSheet.Range("B12")
Set t7 = formaSheet.Range("B14")
Set t8 = formaSheet.Range("B16")
Set t9 = formaSheet.Range("D19")
Set t10 = formaSheet.Range("D20")

meter = Application.WorksheetFunction.CountA(baseSheet.Range("A:A"))
arrayData = VBA.Array(meter, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10)
Set cleanData = Union(t1, t2, t3, t4, t5, t10)

With cleanData.Cells
 Set keli = .Find(What:="*", LookIn:=xlValues)
 If keli Is Nothing Then GoTo telos
 End With

baseSheet.Cells(meter + 1, 1).Resize(, 11) = arrayData
cleanData.ClearContents

telos:
End Sub

Στο παράδειγμα μεταφέρονται  από τη φόρμα στη βάση 10 τιμές από 10 κελιά. Αν οι τιμές που θα εσείς θα μεταφέρνετε από τη φόρμα σας προς τη βάση σας, είναι περισσότερες, προσθέστε μεταβλητές t.  Παράδειγμα για 17 τιμές προσθέστε μια ακόμα γραμμή κώδικα:

 Dim t11, t12, t13, t14, t15, t16, t17 As Range

Παρόμοια, αν οι τιμές σας είναι λιγότερες, διαγράψτε μεταβλητές t.
Το φύλλο που φιλοξενεί τη φόρμα λέγετε “Φόρμα” και το φύλλο της βάσης λέγετε “Βάση”. Αν τα δικά σας φύλλα λέγονται διαφορετικά αλλάξτε τα ονόματα αυτά, στις σειρές 12 & 13. Αλλάξτε, αν χρειάζεται, μόνο τα ονόματα μέσα στα εισαγωγικά.
Στις σειρές 15-24, οι μεταβλητές t αντιστοιχίζονται στα κελία της φόρμας, κελία όπου εισάγονται εγγραφές, οι οποίες θα μεταφέρονται στη βάση. Αλλάξτε τις διευθύνσεις των κελιών μέσα στα εισαγωγικά ώστε να ταιριάζουν με τις διευθύνσεις των κελιών της δικιά σας φόρμας. Ενδεχομένως θα προσθέσετε ή θα αφαιρέσετε αντιστοιχίες. Οι αντιστοιχίες θα είναι τόσες, όσες και οι μεταβλητές t.
Στη σειρά 27 γράψτε όλες τις μεταβλητές t στην παρένθεση του πίνακα Array.
Στην επόμενη σειρά 28, μέσα στην παρένθεση: Union( ), πρέπει να γραφούν, μόνο οι μεταβλητές t που αντιστοιχούν σε κελιά τα οποία ενημερώνονται χειριστικά ή από επικυρώσεις. Δεν θα γραφούν εδώ οι μεταβλητές t που αντιστοιχούν σε κελιά τα οποία ενημερώνονται από τύπους, όπως είναι τα κελία B12, B14, B16, D19 του παραδείγματος. Εδώ θα γραφούν μόνο τα κελία τα οποία θέλουμε να «καθαρίζονται» μετά την ενημέρωση της βάσης.
Τέλος στη σειρά 35 στην παρένθεση Resize(, 11) αλλάξτε τον αριθμό 11. Πρέπει να είναι κατά ένα μεγαλύτερος από τον πλήθος των μεταβλητών t.
Αν θέλετε κατεβάστε το excel βιβλίο: UpdateBaseAndCleanForm για να δείτε το παραπάνω παράδειγμα στην πράξη.
Posted in excel, Μακροεντολές, VBA | Tagged , , , , | Γράψτε ένα σχόλιο

Χρωματική επισήμανση ενεργού κελιού, στήλης και γραμμής

Στην πρώτη εικόνα βλέπετε ένα φύλλο όπου, καθώς ο χρήστης επιλέγει ένα κελί στο εσωτερικό του πίνακα A3: R30 , η γραμμή και η στήλη του κελίου, στο εσωτερικό του πίνακα, επισημαίνονται με έντονο κίτρινο χρώμα.
Χρωματισμός της γραμμής και της στήλης του ενεργού κελιού , στην περιοχή A3: R30

Χρωματισμός της γραμμής και της στήλης του ενεργού κελιού , στην περιοχή A3: R30

Αυτό μπορεί να γίνει για μία περιοχή του φύλλου ή για ολόκληρο το φύλλο. Μπορεί να επισημαίνεται μόνο η γραμμή ή μόνο η στήλη ή και οι δύο, μόνο το ενεργό κελί (εικόνα 2) ή γραμμές και στήλες δεξιά ή αριστερά, πάνω ή κάτω του επιλεγμένου κελιού (εικόνα 3).
Στον πίνακα B3:F17, χρωματίζεται το κάθε φορά επιλεγμένο (ενεργό) κελί

Στον πίνακα B3:F17, χρωματίζεται το κάθε φορά επιλεγμένο (ενεργό) κελί

Σε όλο το φύλλο, επισημαίνεται η γραμμή πάνω και η στήλη αριστερά του ενεργού κελιού

Σε όλο το φύλλο, επισημαίνεται η γραμμή πάνω και η στήλη αριστερά του ενεργού κελιού

Αν σας είναι χρήσιμη αυτή η τεχνική για κάποιο φύλλο ή για κάποιο πίνακα, είναι εύκολο να την έχετε. Θα χρειαστείτε μία ή δύο μορφοποιήσεις υπό όρους, και τρεις σειρές VBA κώδικα.
Ο κώδικας θα γραφτεί στο ThisWorkbook του βιβλίου σας και όχι σε ένα module και είναι ο εξής:
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
Application.ScreenUpdating = True
End Sub
Οι μορφοποιήσεις υπό όρους είναι όλες μορφοποιήσεις με τύπους. Επιλέγετε πρώτα την περιοχή που θέλετε να έχετε τη χρωματική επισήμανση, τμήμα φύλλου ή ολόκληρο το φύλλο και εισάγετε την μορφοποίηση:
α) Για τον χρωματισμό της γραμμής του ενεργού κελιού:
=CELL("ROW")=ROW()
β) Για τον χρωματισμό της στήλης του ενεργού κελιού:
=CELL("COL")=COLUMN()
γ) Για να επισημάνετε ταυτόχρονα στήλη και γραμμή θα εισάγετε και τις δύο παραπάνω μορφοποιήσεις .
δ) Για την χρωματική επισήμανση του ενεργού κελιού:
=ADDRESS(ROW();COLUMN())=CELL("ADDRESS")
ε) Για τον χρωματισμό της γραμμής πάνω και της στήλης αριστερά του ενεργού κελιού θα εισάγετε τις παρακάτω δύο μορφοποιήσεις:
=CELL("COL")=COLUMN()+1
=CELL("ROW")=ROW()+1
Παίξτε, αλλάζοντας τον αριθμό 1 σε άλλο ακέραιο, θετικό ή αρνητικό και θα έχετε χρωματικές επισήμανσης γραμμών και στηλών σε όση απόσταση επιθυμείτε από το κάθε φορά ενεργό κελί.
στ) Με τον τύπο:
=ADDRESS(ROW()+a;COLUMN()+b)=CELL("ADDRESS")
όπου a και b αριθμοί ακέραιοι, θετικοί ή αρνητικοί ή μηδέν θα μπορείτε να χρωματίζετε οποιαδήποτε κελί σε σχέση με το ενεργό.
Για τους φίλους του ιστολογίου που δεν είναι αρκετά εξοικειωμένοι με τις μορφοποιήσεις με τύπους ή με την εισαγωγή κώδικα, ακολουθούν αναλυτικές οδηγίες.
Αναλυτικά τα βήματα για να εισάγετε τη μορφοποίηση:
Για Excel 2007
Επιλέξτε (με το ποντίκι) την περιοχή στην οποία θέλετε να εμφανίζονται ο χρωματικός δείκτης γραμμής και: Καρτέλα Κεντρική > Μορφοποίηση υπό όρους > Δημιουργία κανόνα…
Ανοίγει η καρτέλα: “Δημιουργία κανόνα μορφοποίησης” και επιλέγετε: “Χρήση τύπου για τον καθορισμό των κελίων που θα μορφοποιηθούν” και στο πλαίσιο: “Μορφοποίηση τιμών όπου ο τύπος είναι αληθής” γράφετε τον τύπο:
=CELL("ROW")=ROW()
Στη συνέχεια επιλέγετε το πλήκτρο “Μορφοποίηση” και από την καρτέλα “ Γέμισμα” επιλέγετε ένα χρώμα. Πατήστε ΟΚ και ξανά ΟΚ. Έχετε έτσι, ολοκληρώσει τη μορφοποίηση.
Αν θέλετε να έχετε και χρωματικό δείκτη στήλης , εισάγετε με τον ίδιο τρόπο και δεύτερη μορφοποίηση με τύπο αυτή τη φορά:
=CELL("COL")=COLUMN()
Για Excel 2003 και προηγούμενα:
Επιλέξτε (με το ποντίκι) την περιοχή στην οποία θέλετε να εμφανίζονται ο χρωματικός δείκτης γραμμής και: Μενού: Μορφή > Μορφοποίηση υπό όρους
Στο πτυσσόμενο πλαίσιο επιλέξτε “ Ο τύπος είναι” και δεξιά γράψτε τον τύπο :
=CELL("ROW")=ROW()
Στη συνέχεια επιλέγετε το πλήκτρο “Μορφοποίηση” και από την καρτέλα Μοτίβα επιλέγετε ένα χρώμα. Πατήστε ΟΚ και ξανά ΟΚ. Έχετε έτσι, ολοκληρώσει τη μορφοποίηση.
Αν θέλετε να έχετε και χρωματικό δείκτη στήλης , προσθέστε με τον ίδιο τρόπο και δεύτερη μορφοποίηση με τύπο αυτή τη φορά:
=CELL("COL")=COLUMN()
Αναλυτικά βήματα για να εισάγετε τον κώδικα :
Με ανοιχτό το excel βιβλίο στο οποίο θέλετε να εισάγετε τους χρωματικούς δείκτες , πατήστε τον συνδυασμό πλήκτρων ALT+F11 για να εμφανιστεί ο επεξεργαστής της Visual Basic.
Στο πάνω αριστερά παράθυρο Project, βρέστε το βιβλίο σας. Αν το βιβλίο λέγεται πχ Color_Mark.xls, εδώ θα το δείτε ως: VBAProject(Color_Mark.xls). Βεβαιωθείτε ότι το τετράγωνο μπροστά στο όνομα δείχνει πλην (-) και όχι συν (+). Διπλοπατήστε (διπλό αριστερό κλικ) στο ThisWorkbook που βλέπετε αμέσως από κάτω και δεξιά γράψτε ή αντιγράψτε τις λίγες σειρές κώδικα που έχουμε αναφέρει πιο πάνω. (Δέστε την εικόνα που ακλουθεί). Όταν ολοκληρώσετε πατήστε ALT+Q για να κλείσει ο επεξεργαστής της Visual Basic και να ξαναγυρίσετε στα φύλλα του βιβλίου. Αποθηκεύστε το βιβλίο και είστε έτοιμος. Αν δουλεύετε σε excel 2007 και άνω, πρέπει να το αποθηκεύσετε σαν βιβλίο με δυνατότητα μακροεντολών (xlsm).

Πατήστε πάνω στην εικόνα για μεγέθυνση
Τις παραπάνω τεχνικές μπορείτε να δείτε και στο excel βιβλίο: Color_Mark

Posted in excel, Μακροεντολές, Μορφοποίηση υπό όρους, VBA | Tagged , , , | Γράψτε ένα σχόλιο

συναρτήσεις – πίνακες ή Ctrl+Shift+Enter συναρτήσεις

Το σημερινό σημείωμα είναι για όσους από τους φίλους του ιστολογίου δεν είναι εξοικειωμένοι με τις “συναρτήσεις – πίνακες” ή “συναρτήσεις Ctrl+Shift+Enter” όπως αλλιώς είναι γνωστές. Θα επιχειρήσω με όσο το δυνατό λιγότερα λόγια να περιγράψω τις συναρτήσεις αυτές και τον τρόπο που εισάγονται στο φύλλο. Στα παραδείγματα θα χρησιμοποιήσω την συνάρτηση LARGE η οποία αποδίδει την ν-οστή μεγαλύτερη τιμή σε ένα σύνολο αριθμητικών δεδομένων.
Αν στην περιοχή A1:C40 υπάρχουν αριθμητικά δεδομένα τότε η συνάρτηση: =LARGE(A1:C40;1) θα επιστρέψει τον μεγαλύτερο αριθμό της περιοχής, η =LARGE(A1:C40;2) τον δεύτερο μεγαλύτερο, η =LARGE(A1:C40;3) τον τρίτο μεγαλύτερο κλπ.
Προσέξτε, τώρα, την παρακάτω συνάρτηση:
=LARGE(A1:C40;{1;2;3})
Φαίνεται σαν να ζητάμε από την συνάρτηση LARGE να επιστέψει και τους τρεις μεγαλύτερους αριθμούς της περιοχής A1:C40. Είναι λογικό αυτό; Είναι λογικό να ζητάμε από μία συνάρτηση να επιστρέψει τρεις διαφορετικούς αριθμούς; Ας δούμε. Γράψτε την συνάρτηση σε ένα κελί. Θα σας επιστέψει έναν αριθμό, όχι τρεις, θα επιστρέψει τον μεγαλύτερο της περιοχής A1:C40.
Τώρα, κάντε κλικ στο κελί με την συνάρτηση (επιλέξτε το), πατήστε F2 και μετά πατήστε F9 (μην πατάτε Enter). Θα δείτε κάτι παρόμοιο με την παρακάτω εικόνα:

Βλέπετε τι πραγματικά θέλει να επιστρέψει η συνάρτηση, θέλει να επιστρέψει τρεις αριθμούς, αρκεί να της δώσουμε χώρο (κελιά) και να την εισάγουμε κατάλληλα.
Πατήστε Esc για να φύγετε από την κατάσταση επεξεργασίας(F2) και υπολογισμού (F9).
Επιλέξτε το κελί στο οποίο έχετε γράψει τη συνάρτηση και τα δύο επόμενα δεξιά κελιά, όπως στην εικόνα:

Πατήστε F2 και μετά πατήστε Ctrl+Shift+Enter.
Πράγματι, η συνάρτηση επιστρέφει τους τρεις μεγαλύτερους αριθμούς της περιοχής A1:C40 σε 3 συνεχόμενα κελιά μιας γραμμής:

Αυτή που μόλις γράψατε σε 3 κελιά είναι μια “συνάρτηση πίνακας πολλών κελιών”
Το excel αυτόματα περιβάλλει την συνάρτηση σε άγκιστρα: {=LARGE(A1:C40;{1;2;3})}, όπως βλέπετε στην γραμμή των τύπων.
Τα εξωτερικά άγκιστρα δεν μπορείτε να τα βάλετε μόνοι σας. Μπαίνουν αυτόματα μόλις πατήσετε Ctrl+Shift+Enter.
Τα τρία κελιά που χρειάστηκε η συνάρτηση, αποτελούν μια παρέα, μια ενότητα και δεν μπορείτε να διαγράψετε ένα από αυτά. Όπως δεν μπορείτε να διαγράψετε τις στήλες των κελιών αυτών. Αν το επιχειρήσετε θα πάρετε το παρακάτω μήνυμα:

Αν θέλετε να κάνετε κάποια αλλαγή ή διόρθωση στη συνάρτηση, πρέπει πρώτα να “διασπάσετε” την ενότητα τους: Επιλέξτε τα τρία κελιά, πατήστε F2 και μετά πατήστε Ctrl+Enter. Τα άγκιστρα γύρω της θα φύγουν – συνάρτηση δεν επιστρέφει πια σωστά αποτελέσματα – κάντε τις αλλαγές σας και εισάγετε ξανά την συνάρτηση όπως είπαμε πιο πάνω.
Μπορείτε να έχετε τους τρεις αριθμούς σε τρία συνεχόμενα κελιά μιας στήλης (κάθετα), αλλά θα χρειαστεί να συντάξετε την συνάρτηση σας ως εξής: =LARGE(A1:C40;{1\2\3}). Επιλέξτε τρία συνεχόμενα κελιά μίας στήλης, γράψτε την συνάρτηση όπως την βλέπετε και πατήστε Ctrl+Shift+Enter.
Η παρακάτω συνάρτηση:
=LARGE(A1:C40;{1;2;3\4;5;6\7;8;9\10;11;12})
θα επιστέψει τους δώδεκα μεγαλύτερους αριθμούς της περιοχής A1:C40 διατεταγμένους σε 4 γραμμές και 3 στήλες. Γράψτε τη συνάρτηση αυτή, ας πούμε, στο κελί J1. Επιλέξτε την περιοχή J1:L4, πατήστε F2 και μετά πατήστε Ctrl+Shift+Enter. Θα πάρετε μια εικόνα παρόμοια με αυτή:

Ανακεφαλαίωση:
Για να εισάγουμε μία “συνάρτηση – πίνακα πολλών κελιών”
Επιλέγουμε τα κελιά.
Γράφουμε στο ενεργό (πρώτο) κελί την συνάρτηση.
Πατάμε Ctrl+Shift+Enter
ή
Γράφουμε ή αντιγράφουμε στο πρώτο κελί της περιοχής την συνάρτηση.
Επιλέγουμε την περιοχή.
Πατάμε F2 και μετά πατάμε Ctrl+Shift+Enter

Παρατήρηση: Οι παραπάνω σύνταξη των συναρτήσεων ισχύει για τις συνηθισμένες στην Ελλάδα ρυθμίσεις στα settings του υπολογιστή, όπου το διαχωριστικό των ορισμάτων των συναρτήσεων είναι το ελληνικό ερωτηματικό (;). Αν σαν διαχωριστικό των ορισμάτων έχετε το κόμμα (,) τότε οι παραπάνω συναρτήσεις πρέπει να γραφούν:
=LARGE(A1:C40,{1;2;3}) για επιστροφή των αριθμών σε γραμμή (οριζόντια).
=LARGE(A1:C40,{1,2,3}) για επιστροφή των αριθμών σε στήλη (κάθετα).
=LARGE(A1:C40,{1;2;3,4;5;6,7;8;9,10;11;12}) για επιστροφή των αριθμών σε ορθογώνια περιοχή.
Συναρτήσεις πίνακα πολλών κελιών, είναι και κάποιες από τις ενσωματωμένες συναρτήσεις του excel, πιο γνωστή η συνάρτηση TRANSPOSE για τον μετασχηματισμό μιας περιοχής, όπως και οι μαθηματικές συναρτήσεις MINVERSE και MMULT και άλλες.
Διασκεδαστική άσκηση:  Σε 24 συνεχόμενα κελιά μια στήλης (πχ Α1:Α24) κάντε εισαγωγή της Ctrl+Shift+Enter συνάρτησης:
=CHAR(ROW(INDIRECT("1:24"))+224+(ROW(INDIRECT("1:24"))>17))
Θα εκπλαγείτε από το αποτέλεσμα.
Σε ένα κελί γράψτε, τώρα, γράψτε τη συνάρτηση: =SUM(LARGE(A1:C40;{1\2\3}))
Η συνάρτηση αυτή αναζητά τις 3 μεγαλύτερες τιμές της περιοχής A1:C40, και των αριθμών αυτών επιστρέφει το άθροισμα. Αυτή είναι μία απλή συνάρτηση και όχι συνάρτηση – πίνακας. Η LARGE με τη βοήθεια του ορίσματος {1\2\3} επέστρεψε (εσωτερικά) τους τρεις μεγαλύτερους αριθμούς, η SUM τους πρόσθεσε και επέστρεψε το αποτέλεσμα στο κελί. Το ίδιο αποτέλεσμα θα παίρναμε και με την:
=SUM(LARGE(A1:C40;{1;2;3})). Και αν θέλαμε τη μέση τιμή των τριών αυτών αριθμών: =AVERAGE(LARGE(A1:C40;{1\2\3})) ή =AVERAGE(LARGE(A1:C40;{1;2;3})).
Υποθέστε, τώρα, ότι θέλετε να σχεδιάσετε μια συνάρτηση που θα δώσει το άθροισμα των 50 μεγαλύτερων αριθμών της περιοχής A1:C40. Δεν είναι καθόλου πρακτικό να γράψουμε ένα όρισμα σαν αυτό: {1\2\3\4\5\6\7\8\……..\47\48\49\50}. Ευτυχώς υπάρχουν συναρτήσεις που μπορούν να αντικαταστήσουν το τεράστιο αυτό όρισμα. Παράδειγμα η συνάρτηση: =ROW(INDIRECT(“1:50″)) επιστρέφει ένα πίνακα διαδοχικών αριθμών από το 1 έως το 50. (Γράψτε τη συνάρτηση σε ένα κελί, και πατήστε F2 και μετά F9 για να το δείτε).
Η συνάρτηση, λοιπόν, που θα δώσει το άθροισμα
των 50 μεγαλύτερων αριθμών είναι:
=SUM(LARGE(A1:C40;ROW(INDIRECT("1:50"))))
και για τη μέση τιμή:
=AVERAGE(LARGE(A1:C40;ROW(INDIRECT("1:50"))))
Αλλά, και οι δύο αυτές συναρτήσεις για να δουλέψουν και να δώσουν σωστά αποτελέσματα πρέπει να εισαχθούν με Ctrl+Shift+Enter. Είναι “συναρτήσεις – πίνακες ενός κελιού”
Για να εισάγουμε μία “συνάρτηση – πίνακα ενός κελιού”:
Γράφουμε ή αντιγράφουμε τη συνάρτηση στο κελί.
Πατάμε F2 και μετά πατάμε Ctrl+Shift+Enter.
Μόλις εισάγουμε την συνάρτηση με Ctrl+Shift+Enter, το excel περικλείει τη συνάρτηση σε άγκιστρα {……}
Αν και οι δύο τελευταίες συναρτήσεις εισάγονται σε ένα κελί και επιστρέφουν έναν αριθμό, πρέπει να εισαχθούν σαν συναρτήσεις-πίνακες, έτσι μόνο θα γίνει υπολογισμός του εσωτερικού πίνακα-ορίσματος ROW(INDIRECT(“1:50″)).
Οι τύποι πίνακα είναι ένα πολύ ισχυρό εργαλείο στο Excel. Σας δίνουν την δυνατότητα να κάνετε πράγματα που είναι αδύνατα με τις συνηθισμένες συναρτήσεις.
Αρκετές συναρτήσεις – πίνακες ενός κελιού θα βρείτε στο excel βιβλίο Average_functions που συνοδεύει το άρθρο του ιστολογίου: Ειδικές συναρτήσεις για τη μέση τιμή.
Posted in excel, Συναρτήσεις φύλλου | Tagged , , , , , , | Γράψτε ένα σχόλιο

Επικύρωση δεδομένων από λίστα

Και στο σημερινό σημείωμα θα ασχοληθούμε με τις επικυρώσεις δεδομένων. Ακολουθούν τρία παραδείγματα όπου οι επιτρεπόμενες καταχωρήσεις βρίσκονται σε λίστα:
Επικύρωση δεδομένων με επιτρεπόμενες τιμές από λίστα.
Γράψτε τις επιτρεπόμενες τιμές της επικύρωσης σε μία στήλη ενός οποιαδήποτε φύλλου του βιβλίου σας. Δώστε ένα καθολικό όνομα στα δεδομένα σας, ας πούμε ValidationData. Μάλιστα επειδή τα δεδομένα σας μπορεί να μεταβάλλονται και να προστίθενται όλο και νέες εγγραφές στη στήλη, ορίστε το όνομα δυναμικά, ώστε αυτόματα να προστίθενται οι νέες εγγραφές. Αν υποθέσουμε ότι γράψατε τις επιτρεπόμενες τιμές στη στήλη Α του φύλλου “βοηθητικό” γράψτε το όνομα έτσι:
ValidationData =OFFSET(βοηθητικό!$A$1;0;0;COUNTA(βοηθητικό!$A:$A);1)
Μετά καθορίστε την επικύρωση σε όποιο φύλλου του βιβλίου σας θέλετε, όπως βλέπετε στην παρακάτω εικόνα:


Παράδειγμα με αναλυτικές οδηγίες θα βρείτε στο excel βιβλίο: SpecialValidation_01

Επικύρωση με αυτόματη εισαγωγή νέων εγγραφών.
Η λίστα με τις επιτρεπόμενες τιμές της επικύρωσης παράγεται αυτόματα από τις μοναδικές τιμές που εισάγετε στη στήλη με την επικύρωση. Αν η τιμή που μόλις εισάγετε έχει εισαχθεί και στο παρελθόν, θα τη βρείτε στο πτυσσόμενο πλαίσιο της επικύρωσης. Αν η τιμή είναι νέα θα ερωτηθείτε αν πράγματι η τιμή είναι νέα και αν θέλετε η τιμή να εισαχθεί στις τιμές της λίστας τιμών επικύρωσης.
Στο παράδειγμα της εικόνας ο χρήστης εισάγει μία νέα τιμή (ΗΠΑ). Επειδή η τιμή πρώτη φορά εμφανίζεται, η επικύρωση τον ρωτά αν αυτή είναι μια νέα τιμή. Αν απαντήσει ναι (OK), θα επιτραπεί η είσοδος της τιμής και αυτόματα θα ενημερωθεί η λίστα των μοναδικών τιμών και στις επόμενες χρήσεις, η νέα τιμή θα εμφανίζετε στο πτυσσόμενο πλαίσιο.

Στο excel βιβλίο  SpecialValidation_02  θα βρείτε παράδειγμα με αναλυτικές οδηγίες βήμα-βήμα.
Στο τρίτο παράδειγμα η είσοδος δεδομένων γίνεται από μία πολυσυλλεκτική φόρμα.
Οι τιμές που θα επιλέξετε από την φόρμα θα προστεθούν στη στήλη εισαγωγής δεδομένων, ακριβώς κάτω από τις άλλες τιμές. Δείτε ένα παράδειγμα σε λειτουργία και τον λίγο VBA κώδικα που χρειάστηκε στο excel βιβλίο SpecialValidation_03
Posted in excel, Επικύρωση, Μακροεντολές, VBA | Tagged , , , , | Γράψτε ένα σχόλιο

Φιλτραρισμένη επικύρωση (δεδομένα σε ομάδες)

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

Οι τιμές που θα εμφανίζονται στο πτυσσόμενο πλαίσιο της επικύρωσης έχουν χωριστεί σε 4 ομάδες στο φύλλο “βοηθητικό”.
Στο κελί Α1 ενός άλλου φύλλου (φύλλο1) ο χρήστης επιλέγει την ομάδα και το πτυσσόμενο πλαίσιο της επικύρωσης (στήλη C ), εμφανίζει μόνο τις τιμές της ομάδας. Δέστε τις δύο επόμενες εικόνες:

Στην πράξη:
Στο βοηθητικό φύλλο χωρίζουμε τα δεδομένα σε ομάδες (στήλες), κάθε ομάδα έχει ένα τίτλο (1η γραμμή) και έναν αύξοντα αριθμό (2η γραμμή).
Στη συνέχεια για τα δεδομένα κάθε ομάδας δίνουμε ένα όνομα.
Πχ για την Α στήλη: Αstili =βοηθητικό!$A$3:$A$13
Επειδή τα δεδομένα μπορεί να μεταβάλλονται καλύτερα να ορίσετε δυναμικά ονόματα :
Astili =OFFSET(βοηθητικό!$A$3;0;0;COUNTA(βοηθητικό!$A:$A)-2;1)
Bstili =OFFSET(βοηθητικό!$B$3;0;0;COUNTA(βοηθητικό!$B:$B)-2;1)
Cstili =OFFSET(βοηθητικό!$C$3;0;0;COUNTA(βοηθητικό!$C:$C)-2;1)
Dstili =OFFSET(βοηθητικό!$D$3;0;0;COUNTA(βοηθητικό!$D:$D)-2;1)
Δίνουμε επίσης ένα όνομα για τους τίτλους των ομάδων:
OmadesTitloi =βοηθητικό!$A$1:$D$1
Στη συνέχεια εισάγουμε ένα ακόμα όνομα :
OmadesLookup=HLOOKUP(Φύλλο1!$A$1;βοηθητικό!$A$1:$D$2;2;FALSE)
Είναι μία συνάρτηση που με τη βοήθεια της οριζόντιας LOOKUP επιστρέφει τον αύξοντα αριθμό της ομάδας που έχει επιλεγεί από το χρήστη στο κελί Α1.
Τον αριθμό αυτό χρησιμοποιεί στο πρώτο όρισμά της η πιο κάτω συνάρτηση CHOOSE η οποία εισάγεται και αυτή σαν όνομα:
epikirosi=CHOOSE(OmadesLookup;Astili;Bstili;Cstili;Dstili)
Αφού έχουμε εισάγει τα 7 αυτά ονόματα, ορίζομε τις παρακάτω επικυρώσεις:
Στο κελί Α1 στο φύλλο1:
Επιτρεπόμενη καταχώριση: Λίστα,
Προέλευση: =OmadesTitloι
Στη στήλη C στο φύλλο1:
Επιτρεπόμενη καταχώριση: Λίστα,
Προέλευση: =epikirosi
Όταν ο χρήστης επιλέγει μία ομάδα στο κελί Α1, ας πούμε «Νησιά», η συνάρτηση HLOOKUP επιστρέφει 3 και αποδίδει την τιμή αυτή στο όνομα OmadesLookup.  Στη συνέχεια η συνάρτηση CHOOSE αφού το πρώτο όρισμά της είναι 3, επιστρέφει την τρίτη τιμή Cstili και αποδίδει αυτή την τιμή στο όνομα epikirisi.  Εμείς έχουμε χρησιμοποιήσει αυτό το όνομα σαν λίστα της επικύρωσης μας και έτσι όταν ανοίξουμε το πτυσσόμενο πλαίσιο βλέπουμε την Cstili, δηλαδή τα νησιά.

Δέστε το παραπάνω παράδειγμα στο excel βιβλίο: group_filtered_validation

Μπορείτε να έχετε έως 29 ομάδες για τα δεδομένα σας, οι οποίες μάλιστα δεν είναι υποχρεωτικό να είναι οργανωμένες όλες μαζί σε ένα φύλλο δίπλα-δίπλα, αλλά μπορεί να είναι διάσπαρτες στήλες ή γραμμές μέσα στα διάφορα φύλλα του βιβλίου. (Με κατάλληλη τροποποίηση στα ονόματα-συναρτήσεις)
Στην τελευταία εικόνα:

βλέπετε μια διαφορετική δόμηση του φύλλου1. Εδώ επιλέγουμε στην στήλη Α την ομάδα και τότε στην στήλη Β, το πλαίσιο της επικύρωσης εμφανίζει σε κάθε κελί την ομάδα που περιγράφει το κελί αριστερά του.

Δέστε το παράδειγμα αυτό στο excel βιβλίο: group_filtered_validation_2

Posted in excel, Επικύρωση, Συναρτήσεις φύλλου | Tagged , | 4 σχόλια

2012 Ευχές

Η Ευχή “Καλοτάξιδο», Ψηφιακή ζωγραφική, ΜαρSα 2009

Η Ευχή “Καλοτάξιδο», Ψηφιακή ζωγραφική, ΜαρSα 2009

Ευχές για το 2012.

Και ας είναι οι ευχές, μια δέηση στα κύτταρα του χρόνου.

————————————————————————————————————————————————————-
“….μια δέηση στα κύτταρα του χρόνου” , Ανδρέας  Εμπειρίκος,  “ Ενδοχώρα, Η τρυφερότης των μαστών” 1934
Posted in Γενικά | Γράψτε ένα σχόλιο

Εναλλακτικές μορφές της συνάρτησης IF (συνέχεια)

Σε προηγούμενο σημείωμα για την συνάρτηση IF είχα υποσχεθεί  άλλη μία μέθοδο εναλλακτικής μορφής της συνάρτησης IF. Να ένα απλό παράδειγμα:
Το κελί Α5 παίρνει διάφορες τιμές a,b,c,d,e,f,…. και η συνάρτησή σας, θέλετε να επιστρέφει aa,bb,cc,dd,ee,ff,….αντίστοιχα.
Διαλέξτε στο φύλλο μία κενή στήλη, ας πούμε την G
Στο κελί G1 γράψτε τον τύπο: =IF(A5="a";"aa";G2)
Στο κελί G2 γράψτε τον τύπο: =IF(A5="b";"bb";G3)
Στο κελί G3 γράψτε τον τύπο: =IF(A5="c";"cc";G4)
Στο κελί G4 γράψτε τον τύπο: =IF(A5="d";"dd";G5)
Στο κελί G5 γράψτε τον τύπο: =IF(A5="e";"ee";G6)
Στο κελί G6 γράψτε τον τύπο: =IF(A5="f";"ff";G7)
...............................................
Και μπορείτε να συνεχίσετε έτσι για όσο θέλετε. Στο κελί που θέλετε να πάρετε την επιστροφή της συνάρτησης (ας πούμε το Β5) γράψτε απλά τον τύπο =G1. Τίποτα άλλο. Καθώς το κελί Α5 παίρνει τιμές a, b, c,d,e,… το κελί Β5 (δηλαδή ο τύπος =G1) θα επιστρέψει aa,bb,cc,dd,ee,…αντίστοιχα. Τη στήλη G, στα κελία της οποίας γίνεται όλη η υπολογιστική δουλειά μπορείτε να την κρύψετε, μάλλον οι  επί μέρους υπολογισμοί σας είναι άχρηστοι.
Κάθε κελί της G συντάσσεται χωριστά, στη μορφή:

IF(logical_test;value_if_true; ένα_άλλο_κελί)

Αν το logical_test κάποιου κελιού της στήλης G επαληθευθεί (πάρει τιμή TRUE), τότε επιστρέφει το δικό του value_if_true και την ίδια τιμή value_if_true μεταβιβάζει για να επιστρέψουν και τα προηγούμενα κελία, άρα και το G1. Αν το logical_test δεν επαληθευθεί (πάρει τιμή FALSE), τότε η συνάρτηση μεταβιβάζει την έρευνα σε ένα άλλο κελί και εκείνο στο επόμενο και ούτω καθεξής, ώσπου να βρεθεί ένα logical_test που να επαληθευθεί.
Αν κανένα logical_test δεν επαληθευθεί, τότε θα επιστραφεί η τιμή του κελιού που παραπέμπει η τελευταία IF. Στο παραπάνω παράδειγμα, η τιμή του κελιού G7. (Αν  το κελί G7 είναι κενό θα επιστραφεί μηδέν)
Αν επαληθευθούν περισσότερα από ένα logical_test τότε η μέθοδος θα επιστέψει το value_if_true  του πρώτου logical_test που θα επαληθευθεί.
Η λογική αυτής της μεθόδου είναι ότι, αντί να έχω πολλά (φωλιασμένα ή όχι) IF σε ένα και μόνο τύπο, γράφω κάθε περίπτωση σε κάθε κελί χωριστά.
Τα πλεονεκτήματα της μεθόδου: 
Μπορεί να περιλαμβάνει χιλιάδες (κυριολεκτικά) περιπτώσεις IF.
Συντάσσεται και διορθώνεται πολύ εύκολα.
Είναι εύκολα κατανοητή.
Δεν έχει κανένα περιορισμό στις επιστρεφόμενες τιμές οι οποίες μπορεί να είναι: αριθμοί, ημερομηνίες,     συναρτήσεις, κείμενο, λογικές τιμές, σφάλματα. Το παρακάτω παράδειγμα δουλεύει χωρίς κανένα πρόβλημα ακόμα και στην περίπτωση του σφάλματος 5/0 (#ΔΙΑΙΡ/0!).
Κελί G1: =IF(A5="a";"aaa";G2)
Κελί G2: =IF(A5="b";222;G3)
Κελί G3: =IF(A5="c";TODAY();G4)
Κελί G4: =IF(A5="d";TRUE;G5)
Κελί G5: =IF(A5="e";5/0;G6)
Κελί G6: =IF(A5="f";SUM(S1:S7);G7)
Κελί G7: ΕΚΤΟΣ ΠΕΡΙΠΤΩΣΕΩΝ
Γράψτε τις επί μέρους  συναρτήσεις IF οπού σας βολεύει στο φύλλο, σε στήλη ή γραμμή. Μπορείτε να τις γράψετε και σε ένα διαφορετικό φύλλο το οποίο μπορεί να είναι κρυφό ή πολύ κρυφό. Δέστε το παράδειγμα 3 στο excel βιβλίο  dynamicIF
Η μέθοδος αυτή προσφέρετε για αρκετά πολύπλοκες συναρτήσεις, όταν οι περιπτώσεις IF είναι πολλές, όταν το logical_test είναι πολυσύνθετο (και δεν εξαρτάται μόνο από την τιμή ενός κελιού όπως στα παραδείγματα) ή σε συνδυασμό αυτών. Στις περιπτώσεις αυτές, η τμηματική γραφή της συνάρτησης θα βοηθήσει όσους έχουν πρόσβαση στο βιβλίο, να κατανοήσουν την λογική του τύπου και εύκολα να κάνουν αλλαγές αν χρειάζεται. Αντίθετα πάλι, αν δεν θέλετε να έχουν οι άλλοι χρήστες πρόσβαση στην συνάρτησή σας, μπορείτε να την συντάξετε σε μία στήλη ενός φύλλου που είναι κρυφό ή πολύ κρυφό. (Για τα κρυφά και πολύ κρυφά φύλλα είπαμε στο προηγούμενο σημείωμα).
 
Μια παραλλαγή της μεθόδου:
Αντί να γράψετε τα τμήματα της συνάρτησης σε (διαδοχικά) κελία, θα τα γράψετε σε  καθορισμένα ονόματα (names). Για το πρώτο από τα παραπάνω παραδείγματα καθορίστε τα παρακάτω ονόματα:
name1:  =IF(φύλλο1!$A$5="a";"aa";name2)
name2:  =IF(φύλλο1!$A$5="b";"bb";name3)
name3:  =IF(φύλλο1!$A$5="c";"cc";name4)
name4:  =IF(φύλλο1!$A$5="d";"dd";name5)
name5:  =IF(φύλλο1!$A$5="e";"ee";name6)
name6:  =IF(φύλλο1!$A$5="f";"ff";name7)
......................................
namex:  ="εκτός περιπτώσεων"
Η σύνταξη των ονομάτων είναι εντελώς παρόμοια με αυτή των κελιών. Δημιουργούμε μια  διαδοχή (αλυσίδα) ονομάτων. Κάθε επιμέρους συνάρτηση-όνομα ελέγχει το δικό της logical_test, αν το βρει TRUE, επιστρέφει το δικό της value_if_true και την ίδιο value_if_true επιστρέφουν και τα προηγούμενα ονόματα της αλυσίδας και τελικά και το name1. (Έτσι στο κελί που θέλουμε να έχουμε την τελική επιστροφή της συνάρτησης εισάγουμε =name1).  Αν το βρει FALSE μεταβιβάζει τον έλεγχο στο επόμενο όνομα έως το τέλος. Όλα τα παραπάνω παραδείγματα (και ένα πιο σύνθετο) μπορείτε να τα δείτε στο excel βιβλίο dynamicIF       
Posted in excel, Συναρτήσεις φύλλου | Tagged , , , , | Γράψτε ένα σχόλιο