Forum

Forum (https://www.ms-office.gr/forum/)
-   Excel - Ερωτήσεις / Απαντήσεις (https://www.ms-office.gr/forum/excel-erotiseis-apantiseis/)
-   -   [VBA] Μεταφορά δεδομένων ανάμεσα σε φύλλα (https://www.ms-office.gr/forum/excel-erotiseis-apantiseis/1001-metafora-dedomenon-anamesa-se-filla.html)

anastasiosz 03-03-11 22:09

Μεταφορά δεδομένων ανάμεσα σε φύλλα
 
Καλησπερα παιδια, πρωτη φορα γραφω στο FORUM, το οποιο ειναι πολυ καλο, ωαρια δουλεια. Τεσπα θα ηθελα να κάνω μια ερώτηση. Εχω ενα excel και θέλω γράφωντας κατι στο Φυλλο1 στο κελί Α1 να περναει στο Φυλλο2 στην στηλη Α π.χ γραφω στο Φυλλο1 στο κελι Α1 123 θέλω να πηγαινει στο φυλλο2 στην στηλη Α και αν το κελι Α1 ειναι κενο να το γραφει εκει αλλιως να πηγαινει στο Α2 και ουτω καθ εξης..

Ευχαριστω

gr8styl 04-03-11 00:33

Φίλε Αναστάση,
για όλα υπάρχει μια αρχή, Καλώς όρισες λοιπόν στο φόρουμ μας.
Για το ερώτημά σου τώρα, αν έχω καταλάβει καλά αυτό που ζητάς είναι:
κάθε φορά που αλλάζουν τα περιεχόμενα του Φύλλο1!a1 να αντιγράφονται τα περιεχόμενα του στο πρώτο κενό κελί της στήλης Φύλλο2!a:a

Χωρίς να ξέρω ποιές είναι οι γνώσεις σου σε σχέση με την VBA και τις μακροεντολές σου λέω ότι:
Για να γίνεται αυτό αυτόματα θα πρέπει να χρησιμοποιήσεις το συμβάν Worksheet_Change. Από την άλλη, η αντιγραφή μπορεί να γίνει μόνο χρησιμοποιώντας κώδικα VBA

Ο παρακάτω κώδικας λοιπόν στο συμβάν Worksheet_change του Φύλλο1 θα σου κάνει το ζητούμενο

Πες μας αν τα κατάφερες.

Θανάσης

Κώδικας:

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$A$1" Then
    With Sheets("Φύλλο2")
        .Cells(.Range("A1").End(xlDown).Row + 1, 1) = Target.Value
    End With
    Target.Select
End If
End Sub


anastasiosz 05-03-11 10:09

Φιλε θαναση οσον αναφορα το πρωτο ερωτημα δεν εχω μεγαλη σχεση με το VBA παρ ολα αυτα ασχολουμαι με VB και μπορω να καταλααβω καποια πραγματα μενει να μαθω πως να κανω αναφορεσσε κελια που ειναι πρωτογνωρα για μενα.. καθε αρχη και δυσκολη.
Τεσπα εβαλα τον κωδικα που μου εδωσες αλλα μου χτυπαει error run time error 1004 application defined.... στο debug μου δινει το πρόβλημα στην γραμμη .Cells(.Range("A1").End(xlDown).Row + 1, 1) = Target.Value

αν κανω κατι λαθος ενημερωστε με...
ty:smiley:

anastasiosz 05-03-11 10:32

το δοκιμασα με αλλο τροπο και δουλεψε If Target.Address = "$A$1" Then
.Cells(.Range("A65536").End(xlUp).Row + 1, 1) = Target.Value

ελπιζω μην ειναι λαθός τροπος :)

Tasos 05-03-11 14:59

Αναστάση καλησπέρα και καλωσόρισες στο φόρουμ!

Ο κώδικας σου δεν έχει κάποιο συντακτικό λάθος.

Σου γράφω τα παρακάτω σε θεωρητικό επίπεδο όπως το βλέπει ο προγραμματιστής :

.....Cells(.Range("A65536") δεν θα λειτουργήσει σε 2007 αν τα κελιά έχουν ήδη φτάσει μέχρι τη γραμμή 65536.

Για να μην αντιμετωπίσεις πρόβλημα σε περίπτωση που το φύλλο "Φύλλο2" μετονομαστεί
ή το κελί A1 χρειαστεί να μετακινηθεί, δημιούργησε το όνομα "MyCell" με αναφορά το κελί
A1 (στο φύλλο "Φύλλο1") και στο συμβάν Worksheet_Change() δοκίμασε το παρακάτω:

Κώδικας:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim DestinationCell As Range
    If Not Intersect(Target, Range("MyCell")) Is Nothing Then
        With Sheet2  ' Sheet2=το εσωτερικό όνομα του φύλλου (CodeName)
            'Eίναι πιο ασφαλές να χρησιμοποιούμε το εσωτερικό όνομα του φύλλου (CodeName)
            'Επίσης καλό είναι να μήν υπάρχουν εσωτερικά ονόματα που περιέχουν ελληνικούς χαραχτήρες (πχ.Φύλλο1).

          'Σ αυτή την περίπτωση μπορούμε να αλλάξουμε τα εσωτερικά ονόματα των φύλλων σε άλλα με λατινικούς χατακτήρες
            If IsEmpty(.Range("A1")) Then .Range("A1").Value = Target.Value: Exit Sub 
          'Περνάει την τιμή στο A1 αν αυτό είναι κενό

            Set DestinationCell = .Range("A" & Rows.Count).End(xlUp).Offset(1)
            If IsEmpty(DestinationCell) Then
                DestinationCell.Value = Target.Value
            Else  'αν το τελευταίο κελί της στήλης περιέχει ήδη τιμή
                MsgBox "Destination Sheet is Full", vbInformation
            End If
        End With
        Target.Select
    End If
End Sub

Έτσι, χωρίς να χρειαστείς αλλαγές στον κώδικα μπορείς:
  • Αν χρειαστεί να μετακινήσεις το κελί "MyCell" σε οποιοδήποτε σημείο του φύλλου.
  • Να μετονομάσεις το φύλλο προορισμού σε οτιδήποτε άλλο.
  • Λιγότερο χρήσιμο. Να μην περιορίζεσαι στις 65536 εγγραφές αν βρίσκεσαι σε περιβάλλον Excel 2007 (*.xlsx)

Φιλικά

Τάσος

gr8styl 05-03-11 19:00

Καλησπέρα σας,
όπως το κατάλαβα εγώ το προβλήμα θεώρησα ότι το ζητούμενο είναι να γράψουμε στο πρώτο κενό κελί της στήλης Α του Φύλλο2 γι'αυτό και χρησιμοποίησα xldown και όχι xlup
(Με το xlup αν το κελί Α10 είναι κενό, τότε δεν θα συμπληρωθεί ποτέ αν το Α11 δεν είναι κενό)
Το λάθος μου είναι ότι θεώρησα πως τα Α1 και Α2 ΔΕΝ είναι κενά. :hammer-smilies-0001
Αν λοιπόν έχω καταλάβει σωστά το ζητούμενο, θα πρέπει να προστεθεί ένας έλεγχος για τα Α1 και Α2 και να χρησιμοποιηθεί xlup
Δηλαδή μέσα στην With θα έχω:
Κώδικας:

...
        If IsEmpty(.Range("A1")) Then
            .Range("A1").Value = Target.Value
        ElseIf IsEmpty(.Range("A2")) Then
            .Range("A2").Value = Target.Value
        Else
            .Cells(.Range("A1").End(xlDown).Row + 1, 1) = Target.Value
        End If
...

Από την άλλη θα ήθελα να πω ότι εγκρίνω και επαυξάνω την πρόταση χρήσης ονόματος MyCell που πρότεινε ο Τάσος. Κάνει τον κώδικα περισσότερο ανεξάρτητο, αν και υπάρχει υπάρχει εξάρτηση από το φύλλο.
Θα συμφωνήσω επίσης για το κωδικό όνομα των φύλλων σε ελληνικά, με τα οποία η VBA όχι μόνο δεν συνεργάζεται πλήρως, αλλά δημιουργεί και προβλήματα
(ένα xls φτιαγμένο σε ελληνικό Excel αν περιέχει κώδικα VBA και κατόπιν το επεξεργαστούμε με Αγγλικό Excel δεν μπορούμε να το ξαναχρησιμοποιήσουμε σε περιβάλλον με ελληνικό Excel τουλάχιστον μέχρι την έκδοση 2003)
Αυτά τα λίγα
Θανάσης.

anastasiosz 05-03-11 22:35

Post 1:
παιδια ευχαριστω με βοηθησατε πολυ με τις απαντησεις σας.. τωρα επεξεργαζομαι ολα αυτα που ειπατε και προσθετω και αλλα... αν χρειαστω τπτ θα επανερθω! ty! :)

Post 2:
.... και επανερχομαι λοιπον αρχισα λιγο το vba μου και εκανα μια φορμα που θα περναει απο εκει τα δεδομενα (μου φενεται καλυτερο).. τωρα το προβλημα μου ειναι οτι εχω 3 textboxes οπου θα γράφω μέσα τιμές πως γινεται. Στο ΦΥΛΛΟ 1 στην στηλη Α θα εχω καποια ονοματα π.χ Α1: Παπαδοπουλος Α2: Γεωργιου παταώ πανω σε ενα ονομα και μου εμφανιζεται η φορμα που εχω δημιουργησει γραφω στα κελια τα δεδομενα μου. Ταυτοχρονα στο Φυλλο 2 στην γραμμη 1 εχω Α1: Παπαδοπουλος D1 : Γεωργιου (οπου το καθενα απο αυτα τα κελια ειναι συγχωνευση τριων κελιων) θελω τωρα π.χ οταν πατησω πανω στον παπαδοπουλο και γραψω τα δεδομενα στην φορμα να ελεγχει (μαλλον με HLOOKUP) που εχει υπαρχει αυτο το ονομα στο φυλλο 2 και οταν το βρει να συμπληρωνει (για τον παπαδοπουλο) στα κελια Α2: textbox1.text B2:textbox2.text C2:textbox3.text στην ουσια θελω με το που βρει σε ποιο ονομα βρισκεται το ονομα να συμπληρωνει στην δευτερη γραμμη για 3 κελια τα δεδομενα.. Ελπιζω να καταλαβεται τι εννοω αλλιως να δωσω αλλο παραδειγμα

Ευχαριστω!

anastasiosz 06-03-11 18:29

1 Συνημμένο(α)
λοιπον βαζω και το excel για να το δειτε καλυτερα το παραδειγμα ελπιζω να σας βοιηθησει περισσοτερο να καταλαβεται τι θελω να κανω.

Tasos 06-03-11 22:25

Αγαπητέ Αναστάση,

δεν είναι η Excel η εφαρμογή που ταιριάζει στην περίπτωση σου ειδικά όταν χρησιμοποιείς UserForm!

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

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

Ή αλήθεια είναι ότι δεν κατανόησα τον τρόπο που θέλεις να στήσεις τα δεδομένα σου αφού στο αρχείο σου βρήκα 4 - 5 κελιά
με κάποιες τιμές που δεν υποδηλώνουν το ζητούμενο σου (για μένα τουλάχιστον).
Βάλε μερικές τιμές στα κελιά σου καθώς και το αποτέλεσμα που επιθυμείς για να μπορέσουμε να σε βοηθήσουμε.
Επίσης με τη φόρμα δεν θα μπορείς να έχεις τον πλήρη έλεγχο των δεδομένων σου.
Λάβε υπόψη σου ότι τα πλαίσια κειμένου επιστρέφουν κείμενο που σημαίνει ότι θα πρέπει να μετατρέπονται οι τυχόν αριθμητικές τιμές τους σε αριθμό
για να μπορούν να αποθηκευτούν με σωστά στα κελιά και να μπορούν να επεξεργαστούν αν χρειαστεί.
Εκ των προτέρων σου προτείνω να χρησιμοποιήσεις τα στοιχεία της Excel (όχι τα ActiveX) κατευθείαν πάνω στο φύλλο.

Περιμένουμε νέα σου.

Φιλικά

Τάσος

anastasiosz 07-03-11 00:44

1 Συνημμένο(α)
φιλε και συνονοματε Τασο εχεις δικίο οτι θα ηταν καλυτερα και ποιο ευκολα να δουλεψω σε access αλλα το θέμα ειναι οτι δεν μπορω να εχω προσβαση στην access και εχω μονο σε excel. Ελπιζω να το κανω οπως θελω. Αυτο που θελω να πω είναι οτι σητν ουσια θελω την φορμα για ενα ευκολο τροπο εισαγωγης δεδομενων και δεν με νοιαζει τοσο αν μπορω να επεξεργαστω αριθμητικα τα δεδομενα μου (μονο καποια sum θα χρειαστω). Δινω το excel ξανα με καποιες σημειωσεις και στα φυλλα και πανω στην φορμα που δινουν ακριβως αυτο που θελω. Περιμενω συντομα νεα απο οποιον μπορει να βοηθησει και τον ευχαριστω εκ των προτερων..


Η ώρα είναι 11:37.

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


Search Engine Optimization by vBSEO 3.3.2