Προς το περιεχόμενο

ΚΑΙ ΠΑΛΙ ΑΠΟΡΙΑ Excel!! Help


papazaf

Προτεινόμενες αναρτήσεις

Δημοσ.

ρε παιδια,

στο excel οταν εχω εναν πινακα που στην πρωτη στηλη του εχει μια σειρα απο καταχωρησεις , αλλα η ιδια καταχωρηση υπαρχει πανω απο μια φορα καπως εστι:

ΠΙΝΑΚΑΣ Α

138377

138378

138378

138378

138378

138378

138379

138379

138379

138380

138380

138381

138381

138381

138381

138381

138382

138382

138423

138423

138423

 

 

 

πως θα μπορουσα να βαζω σε μια νεα στηλη τις καταχωρησεις που θελω

πχ

ΠΙΝΑΚΑΣ Β

138381

138377

138423

 

και να πηγαινει στον πινακα Α, να διαγελει ολες τις γραμες που αρχιζουν απο τις καταχωρησειςτου πινακα Β και να τις κανει copy σε ενα νεο sheet??????

το vlookup δεν το κανει το δοκιμασα....

Δημοσ.

Αν κατάλαβα καλά θες από τον πίνακα Β να παίρνεις κάποια τιμή και να πηγαίνεις στον πίνακα Α να βρίσκεις όλες τις σειρές που έχουν ως πρώτη τιμή αυτή από τον πίνακα Β και να τις κάνεις copy σε νέο sheet, σωστά?

αν ναι πες και θα πάρεις απάντηση

Δημοσ.

Ωραία, πρώτα κάνεις ένα sort τον πίνακα Α (όχι μόνο τη στήλη 1 αλλά ολόκληρο τον πίνακα) ως προς την 1η στήλη (αυτή με τις τιμές του πίνακα Β),π.χ. --> Selection.Sort Key1:=Range("A2"), Order1:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom

 

Στη συνέχεια απλώς βρίσκεις το row στο οποίο βρίσκεται η τιμή που θέλεις από τον πίνακα Β. π.χ. για την τιμή 213-->

Columns("A:A").Select

Selection.Find(What:="213", After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False).Activate

οπότε έχεις active το πρώτο κελί που έχει την τιμή που θες και με την εντολή σταρτρος=Activecell.row βρισκεις τη σειρά στην οποία βρίσκεται

 

έπειτα ψάχνοντας προς τα κάτω βρίσκεις το κελί στο οποίο έχεις διαφορετική τιμή από αυτή που θες(μιας και θέλεις όλες τις σειρές με την ίδια τιμή) π.χ.-->

i = 0

Do

i = i + 1

If ActiveCell.Offset(i, 0).Value <> 213 Then

lastrow = ActiveCell.Offset(i - 1, 0).Row

Exit Do

End If

 

Loop

 

οπότε έχεις: startrow την αρχική σειρά, lastrow την τελική σειρά και πες ότι ο πίνακας έχει 5 στήλες-->

Range(Cells(startrow, 1), Cells(lastrow, 6)).Copy (Sheets(2).Range("a2"))

και το αντιγράφεις π.χ. στο δεύτερο sheet στη θέση A2 και κάτω ή καλύτερα-->

x = Sheets(2).Range("A2").End(xlDown).Offset(1, 0).Row ... (η πρώτη γραμμή κάτω κάτω που είναι κενή στο δεύτερο sheet)

Range(Cells(startrow, 1), Cells(lastrow, 6)).Copy (Sheets(2).Cells(x, 1))

 

αυτά...αν έχεις απορία ή κάτι άλλο pls ask!!

BYE

m

Δημοσ.

άνετα, αλλά καλύτερα να βάλεις κάτι σαν...

Selection.Find(What:=Sheets(3).Cells(2, 1).Value, After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False).Activate

όπου σαν τιμή (δηλ το 213 του προηγ.) παραδείγματος παίρνει το Α2 του sheet3 ή καλύτερα να το έχεις σαν παράμετρο π.χ. what:=val , όπου val μπορεί να αλλάζει τιμή σε ένα loop, μιας και δε θα θέλεις να το κάνεις μόνο για μια τιμή αλλά για τιμές ενός πίνακα όπως είπες....

Δημοσ.

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

 

1. Η Εύκολη (αλλά μπακάλικη) λύση

Εστω s_data το φύλλο των κυρίως δεδομένων μας και s_inp το φύλλο που στην πρώτη του στήλη καταχωρούμε τον Πίνακα Β, π.χ στις γραμμές από 1 έως 9.

(α) Αντιγράφουμε το s_data σε ένα Νέο Φύλλο, έστω το s_res.

(β) Στην Πρώτη Ελεύθερη Στήλη του s_res (έστω την Κ) εισάγουμε στην πρώτη γραμμή δεδομένων (λογικά στο Κ2, αν η γραμμή 1 έχει Επικεφαλίδες) τη Σχέση: =MATCH(A2;s_inp!$A$1:$A$9;0)

(γ) Αντιγράφουμε τη σχέση αυτή στη στήλη Κ, για όλες της μή κενές γραμμές του s_res

Τα κελλιά που ανήκουν σε εγγραφές με "Κωδικό" που υπάρχει στον Πίνακα Β θα έχουν τιμή ίση με τη θέση που βρίσκεται ο "Κωδικός" στον Πίνακα Β (από το 1 ως το 9) ενώ για τις γραμμές που αντιστοιχούν σε Κωδικό ανύπαρκτο για τον Πίνακα Β θα έχουν Τιμή #N/A.

Τις γραμμές αυτές τις απομονώνουμε (με διαγραφή ή απόκρυψη -ό,τι βολεύει) με Φίλτρο ή Ταξινόμηση.

 

2. Λίγο καλύτερα (με Vlookup)

(Κρατάμε τις παραδοχές της λύσης 1, δηλ. ονομάζουμε s_data το φύλλο των κυρίως δεδομένων μας και s_inp το φύλλο που στην πρώτη του στήλη καταχωρούμε τον Πίνακα Β, πάλι για παράδειγμα στις γραμμές από 1 έως 9).

(α) Εισάγουμε μια κενή στήλη την "Α" στο s_data, μετατοπίζοντας τα δεδομένα μας προς τα δεξιά.

(β) Στο κελλί Α2 (πάλι θεωρώντας ότι η γραμμή 1 έχει Επικεφαλίδες) εισάγουμε τη Σχέση =IF(ISERROR(MATCH(B2;s_inp!$A$1:$A$9;0));0;MAX(A1:A$2)+1) και την αντιγράφουμε μέχρι την τελευταία γραμμή δεδομένων.

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

(γ) Προσδιορίζοντας εύκολα τη μέγιστη τιμή της στήλης Α του s_data (με φίλτρο, συνάρτηση max ή όπως αλλιώς βολεύει), δημιουργούμε το s_res, ώστε να έχει στην στήλη Α τις τιμές 1,2,3... ως τη μέγιστη τιμή και συμπληρώνουμε τα "κανονικά" πεδία με vlookup ως προς το νέο βοηθητικό πεδίο που δημιουργήσαμε).

Εναλλακτικά, μπορούμε να μη μεταφέρουμε τις τιμές στο s_res, αλλά να το ξεκινήσουμε από το A2, με τη σχέση:

VLOOKUP(CELL("row";A2)-1;s_data!$A$2:$F$570;CELL("col";A2)+1;FALSE) και να την αντιγράψουμε προς τα κάτω και προς τα δεξιά.

(προς τα δεξιά θα μας περιορίσουν οι επικεφαλίδες, προς τα κάτω η εμφάνιση τιμών #N/A).

Στην περίπτωση αυτή, εννοείται ότι θεωρούμε αυθαίρετα το F570 σαν όριο του range που περιέχει δεδομένα στο αρχικό Φύλλο.

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

 

3. Ξεφεύγοντας από το Excel (όχι και πολύ: Μέχρι την Access)

Μην Κρυβόμαστε: Το Excel (και κάθε λογιστικό φύλλο, εκτός από το αξέχαστο Improv) δεν είναι σχεδιασμένο για τέτοιες δουλειές. Αν χρησιμοποιούσαμε Open Office, η λογική επιλογή θα ήταν να πάμε στα db tools, χωρίς να εγκαταλείψουμε το Calc, αλλά το "ισχυρό σημείο" του δημιουργήματος του κ. Bill, η ..."ύπαρξη Database" μας αναγκάζει ν' αλλάξουμε για λίγο περιβάλλον:

(α) Σώνουμε το Αρχείο με τα Φύλλα s_data και s_inp, κλείνουμε το Excel και ανοίγουμε μια Κενή Βάση στην Access.

(β) Εκτελούμε δύο φορές διαδοχικά την Εντολή File-> Get External Data (Αρχείο-> Λήψη Εξωτερικών Δεδομένων άν θυμάμαι καλά) και από τον Wizard (που είναι σκέτος τυφλοσούρτης, να τα λέμε όλα) Δημιουργούμε δύο Πίνακες s_data και s_inp, εισάγοντας κάθε φορά το σχετικό φύλλο του Excel.

(γ) Πάμε στα Ερωτήματα(Queries). Τον Wizard των Ερωτημάτων δεν τον συμπάθησα ποτέ, και θα σας μπερδέψω, επιτρέψτε μου να γράψω το Ερώτημα σε SQL.

Για το παράδειγμα, έστω ότι οργανώνουμε την Ταινιοθήκη μας με τα πεδία (στο s_inp) Κωδ.(Σκηνοθέτη), Σκηνοθέτης, Πρωτότυπος Τίτλος, Ελληνικός Τίτλος, Ετος (Παραγωγής).

Καταχωρούμε κάποιους Κωδ. Σκηνοθετών στο s_inp, βαφτίζουμε το Πεδίο N_Code και γράφουμε το ερώτημα ως εξής:

SELECT s_data.Κωδ,

s_data.Σκηνοθέτης,

s_data.[Πρωτότυπος Τίτλος],

s_data.[Ελληνικός Τίτλος],

s_data.Ετος

FROM s_data INNER JOIN s_inp

ON s_data.Κωδ = s_inp.N_Code;

Εκτελούμε το Ερώτημα και Voila! Αποθηκεύουμε τον Πίνακα που θα προκύψει, σαν s_res, πάμε File-> Export, διαλέγουμε Τύπο Αρχείου Excel και δεν έχουμε παρά να εισάγουμε το Φύλλο αυτού του Αρχείου δίπλα στα δυό αρχικά.

 

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

Δημοσ.

παιδια ολεσ οι λυσεις που προτεινατε ειναι θα ελεγα αριστες, σας ευχαριστω πολυ, θα τις δουλεψω και θα σας πω εντυπωσεις

Αρχειοθετημένο

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

  • Δημιουργία νέου...