Forum

Forum (https://www.ms-office.gr/forum/)
-   Excel - Ερωτήσεις / Απαντήσεις (https://www.ms-office.gr/forum/excel-erotiseis-apantiseis/)
-   -   [Συναρτήσεις] Διάσπαση περιεχομένου κελιού σε άλλα. (https://www.ms-office.gr/forum/excel-erotiseis-apantiseis/1226-diaspasi-periexomenoy-kelioi-se-alla.html)

ΤΖΙΜΗΣ 26-06-11 18:41

Διάσπαση περιεχομένου κελιού σε άλλα.
 
1 Συνημμένο(α)
Καλησπέρα σε όλους τους φίλους.Ανεβάζω ένα θέμα που αφορά τη διάσπαση του περιεχομένου ενός κελιού σε άλλα κελιά.Χρησιμοποίησα τη συνάρτηση TRIM για απαλοιφή τυχόν κενών, τη συνάρτηση FIND για να δούμε που βρίσκεται το κενό, τη συνάρτηση LEN για μέτρημα των γραμμάτων και του κενού και στο τέλος τις συναρτήσεις LEFT & RIGHT.
Το ερώτημα μου είναι, ενώ μου κάνει την πρώτη διάσπαση δε μπορώ να βρώ πως θα κάνουμε και τις επόμενες διασπάσεις.
Θα ήθελα μια βοήθεια με τις συγκεκριμένες συναρτήσεις και όχι με τον κλασικό τρόπο από ΔΕΔΟΜΕΝΑ-ΚΕΙΜΕΝΟ ΣΕ ΣΤΗΛΕΣ μιας και είναι μια χρονοβάρα διαδικασία και έχω μια λίστα 500 ατόμων σε διαφορετικά φύλλα.
Ευχαριστώ

manolis 26-06-11 19:46

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

Τζίμη σε μια παρόμοια ερώτηση μου παλιότερα , ο Τάσος μου πρότεινε την λύση που είναι στο συνημμένο .

Βέβαια δεν την κατάλαβα πως δουλευει :sntoup: αλλα δουλευει :dft009:

Φιλικά

Tasos 27-06-11 10:05

Καλημέρα σε όλους!
Η λύση με χρήση τύπων είναι αυτή που πρότεινε ο Μανώλης.:thumbup1:

Επειδή όμως πρόκειται για αναδιπλωμένο κείμενο που περιέχει τον χαρακτήρα 10 (= line feed, στην Excel= Char(10) , στην VB = vbLF ή Chr(10) ) ,
θα είχαμε πιο ακριβή αποτελέσματα αν στο κελί B1 τροποποιούσαμε τον τύπο ως εξής:

=TRIM(SUBSTITUTE(SUBSTITUTE(A1;CHAR(10);" ");" ";" "))

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

Αυτό θα μπορούσε να γίνει και με VBA πχ:

Κώδικας:

Sub Text2Columns_1()
    Range("B1:B100").TextToColumns _
            Destination:=Range("C1"), _
            DataType:=xlDelimited, _
            TextQualifier:=xlDoubleQuote, _
            ConsecutiveDelimiter:=True, _
            Tab:=False, _
            Semicolon:=False, _
            Comma:=False, _
            Space:=True, _
            Other:=False
End Sub

Εγώ προσωπικά θα χρησιμοποιούσα τον παρακάτω κώδικα που παίρνει δεδομένα κατευθείαν από τη στήλη A χωρίς τη διαδικασία με τύπους.
Κώδικας:

Sub Text2Columns_2()
    Dim x As Variant, c As Range
    For Each c In Range("A1:A100")
        If Not IsEmpty(c) Then
            With c
            x = Replace(Replace(.Value, vbLf, " "), "  ", " ")
                x = Split(x)
                .Offset(, 1).Resize(, UBound(x) + 1).Value = x
            End With
        End If
    Next
End Sub

Φιλικά

Τάσος

kapetang 27-06-11 11:28

Καλημέρα στην παρέα

Τάσο μου, επειδή ξέρω ότι δεν αφήνεις τίποτα στην τύχη σίγουρα θα έχεις κάποιο λόγο που χρησιμοποιείς τη συνάρτηση «SUBSTITUTE» δύο φορές.
Προσπάθησα να τον βρω, αλλά κόλλησα.
Δεν μπόρεσα να εξηγήσω τη χρησιμότητα της εξωτερικής «SUBSTITUTE» αφού το μόνο που κάνει είναι η αντικατάσταση των (δύο;) διαστημάτων, στο αποτέλεσμα που επιστρέφει η εσωτερική «SUBSTITUTE», με ένα διάστημα.
Αυτό όμως το κάνει η συνάρτηση TRIM που αφαιρεί τα αρχικά και τελικά διαστήματα και όλα τα επιπλέον ενδιάμεσα.
Θα μπορούσε δηλαδή, κατά τη γνώμη μου, να χρησιμοποιηθεί ο τύπος =TRIM(SUBSTITUTE(A1;CHAR(10);" "))

Φιλικά/Γιώργος

ΤΖΙΜΗΣ 27-06-11 11:48

Μανώλη Γιώργο ευχαριστώ πολύ για τις απαντήσεις σας..
Όσο για σένα Τάσο τι να πούμε .Κάθε σχολιασμός είναι περιττός.Απαντήσεις που απαιτούν μεγάλη οξυδέρκεια και γνώση.Παίρνουμε καθημερινά μαθήματα.
Ένα μεγάλο ευχαριστώ.

Tasos 27-06-11 13:44

Καλησπέρα σε όλους!

Γιώργο μου, παίρνουμε για παράδειγμα το περιεχόμενο του κελιού A1 στο συνημμένο του Τζίμη:

Πέτρος Γεωργίου του ΧρήστουChar(10)
Char(32)με ΑΦΜ 7777777777


Ο τύπος είναι: =TRIM(SUBSTITUTE(SUBSTITUTE(A1;CHAR(10);" ");" ";" "))

Ξεκινάμε με την συνάρτησηπου εκτελείται πρώτη (τη μεσαία)SUBSTITUTE(A1;CHAR(10);" ")
Aντικαθιστά τυχόν συμβολο της αναδιπλωσης CHAR(10)του κελιού A1 με κενό CHAR(32).

Το αποτέλεσμα θα είναι: Πέτρος Γεωργίου του ΧρήστουChar(32)Char(32)με ΑΦΜ 7777777777
δηλαδή έχουμε δημιουργήσει 2 κενά που θα προκαλέσουν πρόβλημα στη διάσπαση του περιεχομένου του κελιού (αφήνει κενά κελιά).

Αυτό με ώθησε να περικλείσω την πρώτη SUBSTITUTE() στην εξωτερική SUBSTITUTE()
Η εξωτερική SUBSTITUTE() αντικαθιστά τα δυο διαστήματα της πρώτης με ένα διάστημα.

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

Επειδή τέτοιου είδους δεδομένα έρχονται συνήθως από εξωτερικές πηγές δεδομένων
ή με αντιγραφή επικόλληση από το χρήστη,
καλό είναι το αποτέλεσμα της SUBSTITUTE(SUBSTITUTE(...)) να το ελέγξουμε με την TRIM() για τυχόν διαστήματα στην αρχή ή στο τέλος.

Τα λέμε!

Τάσος

kapetang 27-06-11 15:56

Καλησπέρα στην παρέα

Τάσο μου, σ’ ευχαριστώ για την άμεση και αναλυτική ενημέρωση.
Με την ευκαιρία θα ήθελα να ξεκαθαρίσω μια σημαντική διαφορά ανάμεσα στη συνάρτηση TRIM της VBA και στην TRIM του excel:
1. H TRIM της VBA αφαιρεί από το κείμενο τα αρχικά και τελικά διαστήματα (Chr(32)), αλλά δεν επηρεάζει τα διαστήματα που υπάρχουν ανάμεσα στις λέξεις του κειμένου.
2. H TRIM του excel είναι πιο ισχυρή. Αφαιρεί από το κείμενο τα αρχικά και τελικά διαστήματα (Chr(32)), αλλά και όλα τα πάνω από ένα διαστήματα που υπάρχουν ανάμεσα στις λέξεις του κειμένου (αφήνει μόνο ένα).
Έτσι, αν το ζητούμενο είναι η αφαίρεση των ακραίων διαστημάτων και των επιπλέον ενδιάμεσων από ένα κείμενο, η χρήση της TRIM του excel (Application.WorksheetFunction.Trim στον κώδικα) είναι η καλύτερη λύση.

Φιλικά/Γιώργος


Η ώρα είναι 00:43.

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


Search Engine Optimization by vBSEO 3.3.2