prezakis Δημοσ. 27 Σεπτεμβρίου 2008 Δημοσ. 27 Σεπτεμβρίου 2008 Καλησπέρα σε όλους, Προσπάθησα να λύσω την απορία μου απο άλλα posts,αλλά επειδή δεν ξέρω από VBA δεν κατάφερα να βγάλω άκρη. Καταρχήν, να περιγράψω το πρόβλημα. Έχω ένα αρχείο σε excel,με 6 φύλλα. Το πρώτο από τα οποία αποτελεί ουσιαστικά το index για τα υπόλοιπα. Συγκεκριμένα, είναι μία λίστα από φαντάρους(και άλλα μέλη) ενός λόχου, όπου κάθε γραμμή αντιστοιχεί σε ένα φαντάρο. Οριζόντια υπάρχει η ημερομηνία κι έτσι κάθε στήλη αντιστοιχεί στην υπηρεσία κάθε φαντάρου την αντίστοιχη μέρα. Επισύναψα ένα screenshot για να καταλάβετε πώς έχει το story. Τα υπόλοιπα 5 φύλλα είναι κατηγοριοποιημένοι οι φαντάροι ανά υπηρεσίες. Δηλαδή,ανάλογα με τι κωδικό υπηρεσίας έχει πάρει ο κάθε φαντάρος την παρούσα ημέρα στο πρώτο φύλλο τοποθετείται(ως τώρα manual) σε κάποιο από τα υπόλοιπα 5 επόμενα φύλλα. Αυτό που θέλω είναι να γίνεται αυτόματα η τοποθέτηση του φαντάρου στο αντίστοιχο φύλλο που πρέπει ανάλογα με την υπηρεσία του την current-date. Σε γλώσσα προγραμματισμού είναι σχετικά έυκολο γιατί απλοποιούνται τα πράγματα με τη χρήση πινάκων σε κάποια βάση(στο pc του στρατού,όμως,υπάρχει μόνο office και αυτό είναι πολυτέλεια), αλλά στο excel δεν έχω δοκιμάσει ποτέ να γράψω macro ή VBA. Συνεπώς, υποθέτω ότι τα δύο πράγματα που θα χρειαστώ είναι : 1)Πώς γίνεται ,εκτελώντας μία εντολή σε ένα κελί, να διαβάσω την τιμή που βρίσκεται στην ίδια γραμμή αλλά σε διαφορετική στήλη? 2)Εφαρμόζοντας κάτι αντίστοιχο της εντολής case, ανάλογα με την τιμή που έχει το κελί στην στήλη της παρούσας ημερομηνίας να στέλνω μία τιμή(το όνοματ/μο του φαντάρου,με τον τρόπο που ζήτησα στο (1)) σε μία λίστα ενός διαφορετικού φύλλου. Ευχαριστώ εκ των προτέρων.
prezakis Δημοσ. 27 Σεπτεμβρίου 2008 Μέλος Δημοσ. 27 Σεπτεμβρίου 2008 Κανείς γνώστης? -----Προστέθηκε 28/9/2008 στις 01 : 58 : 00----- Παιδιά λίγη βοήθεια....?
bilco Δημοσ. 28 Σεπτεμβρίου 2008 Δημοσ. 28 Σεπτεμβρίου 2008 Απλά υποθέτω κάποια πράγματα, αφου δεν δίνεις αρκετά στοιχεία και μια μόνο εικόνα δεν φτάνει. Υποθέτω λοιπόν ότι στο φύλλο Κατ.Υπ.(1) έχεις στην πρώτη στήλη τις υπηρεσίες (με τα ονόματα που αυτές εμφανίζονται στα δεδομένα του πρώτου φύλλου) και φυσικά αναφερόμαστε στην ίδια χρονική περίοδο (όσες ημέρες έχεις στο πρώτο φύλλο, τόσες έχεις και στο δεύτερο). Στην παρακάτω μέθοδο strSourceData είναι η περιοχή των δεδομένων χωρίς τις επικεφαλίδες και χωρίς τις στήλες με τα ονόματα και τα λοιπά στοιχεία των φαντάρων. Μόνο τα δεδομένα τα δεδομένα κατά ημέρα. Στην συγκεκριμμένη περίπτωση υποθέτω "G11:EA60" ή όπου φτάνει αφού δεν φαίνεται από την εικόνα. strSourcePersons είναι η στήλη με τα ονόματα των φαντάρων, π.χ. "C11:C60". strSourceSheet το όνομα του φύλλου που είναι όλα τα δεδομένα ("Φύλλο1 (2)"). strTargetServices είναι η περιοχή του δεύτερου φύλλου που θα βάλουμε τα δεδομένα (τα ονόματα των στρ. δηλαδή) για τις υπηρεσίες. Αν υποθέσουμε δηλαδή ότι έχεις δέκα υπηρεσίες που έχεις γράψει στη στήλη C11:C20, τότε θα πρέπει να ορίσεις αυτήν την περιοχή "D11:EX20" δηλαδή όσες στήλες έχει η περιοχή εισόδου (αφού αναφερόμαστε στις ίδιες μέρες) και όσες γραμμές έχει η στήλη των υπηρεσιών. Απο πάνω βέβαια πρέπει να έχεις προσθέσει και τις επικεφαλίδες των ημερών με αντιγραφή από το πρώτο φύλλο. strTargetServices είναι η στήλη με τα ονόματα των υπηρεσιών ("C11:C20" στο παραπάνω παράδειγμα). strTargetSheet είναι το όνομα το φύλλου για τις υπηρεσίες "Κατ. Υπ.(1)" (πρόσεξε τα κενά στα ονόματα γιατί δεν μπορώ να τα διακρίνω καλά) > [color=#0000FF]Sub[/color] GenerateServices(strSourceData [color=#0000FF]As[/color] [color=#0000FF]String[/color], strSourcePersons [color=#0000FF]As[/color] [color=#0000FF]String[/color], _ strSourceSheet [color=#0000FF]As[/color] [color=#0000FF]String[/color], strTargetServices [color=#0000FF]As[/color] [color=#0000FF]String[/color], _ strTargetData [color=#0000FF]As[/color] [color=#0000FF]String[/color], strTargetSheet [color=#0000FF]As[/color] [color=#0000FF]String[/color]) [color=#0000FF]On[/color] [color=#0000FF]Error[/color] [color=#0000FF]GoTo[/color] err_input: [color=#0000FF]Dim[/color] sourceData [color=#0000FF]As[/color] [color=#0000FF]Variant[/color], sourcePersons [color=#0000FF]As[/color] [color=#0000FF]Variant[/color], _ targetServices [color=#0000FF]As[/color] [color=#0000FF]Variant[/color], targetData [color=#0000FF]As[/color] [color=#0000FF]Variant[/color] [color=#008800]' just to be sure that we wont mix old data with new data clear the targetData range[/color] Worksheets(strTargetSheet).Range(strTargetData).ClearContents [color=#008800]' get the 2-dim arrays from the ranges[/color] sourceData = Worksheets(strSourceSheet).Range(strSourceData).Value sourcePersons = Worksheets(strSourceSheet).Range(strSourcePersons).Value targetServices = Worksheets(strTargetSheet).Range(strTargetServices).Value targetData = Worksheets(strTargetSheet).Range(strTargetData).Value [color=#0000FF]Dim[/color] countDays [color=#0000FF]As[/color] [color=#0000FF]Long[/color], countPersons [color=#0000FF]As[/color] [color=#0000FF]Long[/color], countServices [color=#0000FF]As[/color] [color=#0000FF]Long[/color], _ n [color=#0000FF]As[/color] [color=#0000FF]Long[/color], cd [color=#0000FF]As[/color] [color=#0000FF]Long[/color], strS [color=#0000FF]As[/color] [color=#0000FF]String[/color] [color=#008800]' bounds of our data[/color] countDays = [color=#0000FF]UBound[/color](sourceData, 2) countPersons = [color=#0000FF]UBound[/color](sourcePersons, 1) countServices = [color=#0000FF]UBound[/color](targetServices, 1) [color=#008800]' dimensions must match[/color] [color=#0000FF]If[/color] ((countPersons <> [color=#0000FF]UBound[/color](sourceData, 1)) [color=#0000FF]Or[/color] (countDays <> [color=#0000FF]UBound[/color](targetData, 2)) _ [color=#0000FF]Or[/color] (countServices <> [color=#0000FF]UBound[/color](targetData, 1))) [color=#0000FF]Then[/color] MsgBox [color=#880000]"Dimensions of ranges do not match"[/color], vbCritical, [color=#880000]"Error"[/color] [color=#0000FF]Exit[/color] [color=#0000FF]Sub[/color] [color=#0000FF]End[/color] [color=#0000FF]If[/color] [color=#0000FF]On[/color] [color=#0000FF]Error[/color] [color=#0000FF]GoTo[/color] err_operation [color=#0000FF]Dim[/color] servicesDictionary [color=#0000FF]As[/color] [color=#0000FF]Object[/color] [color=#008800]' create and initialize services dictionary[/color] [color=#0000FF]Set[/color] servicesDictionary = CreateObject([color=#880000]"Scripting.Dictionary"[/color]) [color=#0000FF]For[/color] n = 1 [color=#0000FF]To[/color] countServices servicesDictionary.Add targetServices(n, 1), n [color=#0000FF]Next[/color] n [color=#008800]' for each day of our data[/color] [color=#0000FF]For[/color] cd = 1 [color=#0000FF]To[/color] countDays [color=#008800]' for each person for that day[/color] [color=#0000FF]For[/color] n = 1 [color=#0000FF]To[/color] countPersons strS = sourceData(n, cd) [color=#008800]' search for service[/color] [color=#0000FF]If[/color] (servicesDictionary.Exists(strS)) [color=#0000FF]Then[/color] [color=#008800]' add person to target data[/color] targetData(servicesDictionary.Item(strS), cd) = sourcePersons(n, 1) [color=#0000FF]End[/color] [color=#0000FF]If[/color] [color=#0000FF]Next[/color] n [color=#0000FF]Next[/color] cd [color=#008800]' finally write data to target range[/color] Worksheets(strTargetSheet).Range(strTargetData).Value = targetData [color=#0000FF]Exit[/color] [color=#0000FF]Sub[/color] err_input: MsgBox [color=#880000]"Failed to create input ranges. Check your input values."[/color], vbCritical, [color=#880000]"Error"[/color] [color=#0000FF]Exit[/color] [color=#0000FF]Sub[/color] err_operation: MsgBox [color=#880000]"Operation failed"[/color], vbCritical, [color=#880000]"Error"[/color] [color=#0000FF]Exit[/color] [color=#0000FF]Sub[/color] [color=#0000FF]End[/color] [color=#0000FF]Sub[/color]
prezakis Δημοσ. 28 Σεπτεμβρίου 2008 Μέλος Δημοσ. 28 Σεπτεμβρίου 2008 Thanks file mou.8a rikso mia matia k 8a epistrepso na sou po.
prezakis Δημοσ. 3 Οκτωβρίου 2008 Μέλος Δημοσ. 3 Οκτωβρίου 2008 Συγνώμη αν ακούγεται τόσο άσχετο,αλλά για να τρέξω αυτόν τον κώδικα πρέπει να τον εισάγω ως μακροεντολή στο Excel ή άλλη είναι η διαδικασία?
bilco Δημοσ. 3 Οκτωβρίου 2008 Δημοσ. 3 Οκτωβρίου 2008 Κοίτα το παράδειγμα που επισυνάπτω (excel 2007). Σε ένα κουμπί έχω συνδέσει τη μακροεντολή doit η οποία με τη σειρά της καλεί την GenerateServices με τα κατάλληλα ορίσματα. EXAMPLE.zip
prezakis Δημοσ. 8 Οκτωβρίου 2008 Μέλος Δημοσ. 8 Οκτωβρίου 2008 Φίλε bilco σε υπερευχαριστώ. Τώρα άνοιξα το excelακι που μου έστειλες και βλέπω ότι ασχολήθηκες αρκετά. Τι να πώ....χίλια ευχαριστώ!
bilco Δημοσ. 9 Οκτωβρίου 2008 Δημοσ. 9 Οκτωβρίου 2008 Φίλε bilco σε υπερευχαριστώ. Τώρα άνοιξα το excelακι που μου έστειλες και βλέπω ότι ασχολήθηκες αρκετά. Τι να πώ....χίλια ευχαριστώ! Να 'σαι καλά
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.