ms-office.gr > Forum > Microsoft Excel > Excel - Ερωτήσεις / Απαντήσεις > [VBA] Αντιγραφή & Επικόληση

Excel - Ερωτήσεις / Απαντήσεις Ότι έχει σχέση με συναρτήσεις, μορφοποίηση, εκτυπώσεις γραφήματα κτλ.

Απάντηση στο θέμα

 

Εργαλεία Θεμάτων Τρόποι εμφάνισης
  #1  
Παλιά 23-11-10, 20:22
Όνομα: Γιώργος
Έκδοση λογισμικού Office: Ms-Office 2003, Ms-Office 2007
Γλώσσα λογισμικού Office: Ελληνική, Αγγλική
 
Εγγραφή: 18-09-2010
Περιοχή: Θεσσαλονίκη
Μηνύματα: 75
Προεπιλογή Αντιγραφή & Επικόληση

Παρακαλώ την βοήθειά σας

Συμπληρώνω καθημερινά έναν πίνακα 12 στηλών & 18 γραμμών.(Συνολική Λίστα)
Επειδή κάποιες γραμμές επαναλαμβάνονται εκτός από τα δεδομένα στο τελευταίο κελί στη τελευταία στήλη (Μ)
Το ζητούμενο είναι ένας κώδικας VBA που να αντιγράφει την τελευταία γραμμή που έχει δεδομένα και να την επικολλά στην πρώτη κενή του πίνακα προτρέποντάς μας να αλάξουμε μόνο τα δεδομένα στο τελευταίο κελί στην τελευταία στήλη (Μ).

Σας ευχαριστώ εκ των προτέρων.

Γιώργος
Συνημμένα Αρχεία
Τύπος Αρχείου: xls Total_List.xls (16,0 KB, 32 εμφανίσεις)

Τελευταία επεξεργασία από το χρήστη Flashgordon61 : 28-11-10 στις 00:45.
Απάντηση με παράθεση
  #2  
Παλιά 24-11-10, 00:21
Το avatar του χρήστη gr8styl
Super Moderator
Όνομα: Θανάσης Στυλιανίδης
Έκδοση λογισμικού Office: Ms-Office 2003, Ms-Office 2010
Γλώσσα λογισμικού Office: Ελληνική, Αγγλική
 
Εγγραφή: 18-10-2009
Περιοχή: Βρυξέλλες, Βέλγιο
Μηνύματα: 823
Προεπιλογή

Φίλε Γιώργο,
δεν είμαι σίγουρος σίγουρος για το ζητούμενο
Ο παρακάτω κώδικας εντοπίζει με βάσει την στήλη Β (B1:B18) την τελευταία γραμμή (LastRow) στον πίνακα B:L και την αντιγράφει στην επόμενη γραμμή που είναι κενή.
Δηλαδή για το παράδειγμα που μας έδωσες αντιγράφει το B3:L3 στο B4:L4 και τελειώνει με ενεργό το κελί M4.
Κώδικας:
Sub CopyLastRow()
Dim LastRow As Double
    LastRow = WorksheetFunction.CountA(Range("B1:B18"))
    Range("B" & LastRow & ":L" & LastRow).Copy Destination:= _
    Range("B" & LastRow + 1 & ":L" & LastRow + 1)
    Range("M" & LastRow + 1).Select
End Sub
Διευκρίνισε μας παραπέρα αν δεν ήταν αυτό το ζητούμενο.
Θανάσης
Απάντηση με παράθεση
  #3  
Παλιά 24-11-10, 09:47
Όνομα: Γιώργος
Έκδοση λογισμικού Office: Ms-Office 2003, Ms-Office 2007
Γλώσσα λογισμικού Office: Ελληνική, Αγγλική
 
Εγγραφή: 18-09-2010
Περιοχή: Θεσσαλονίκη
Μηνύματα: 75
Προεπιλογή Αντιγραφή & Επικόληση

Φίλε Θανάση σ΄ευχαριστώ πολύ.
Ακριβώς αυτό ήθελα.

Γιώργος
Απάντηση με παράθεση
  #4  
Παλιά 24-11-10, 19:53
Όνομα: Γιώργος
Έκδοση λογισμικού Office: Ms-Office 2003, Ms-Office 2007
Γλώσσα λογισμικού Office: Ελληνική, Αγγλική
 
Εγγραφή: 18-09-2010
Περιοχή: Θεσσαλονίκη
Μηνύματα: 75
Προεπιλογή

Φίλε Θανάση βιάστηκα να πώ ότι είναι ακριβώς αυτό που ζητούσα.

Επανέρχομαι ζητώντας την βοήθειά σου διότι νόμιζα πως θα μπορούσα εύκολα να προσαρμόσω τον κώδικα στο πραγματικό αρχείο(Φόρμα). Όμως οι ελιπείς έως ανύπαρκτες γνώσεις μου στην VBA δεν μου επέτρεψαν να τα καταφέρω.
Στο πραγματικό αρχείο (Φόρμα) τα δεδομένα καταχωρούνται στην περιοχή {(Β11:M28) κίτρινη σκίαση} , τα υπόλοιπα κελιά είναι κλειδωμένα.
Το ζητούμενο είναι ο κώδικας VBA να αντιγράφει την τελευταία γραμμή του πίνακα (Περιοχή B11:M28) που έχει δεδομένα και να την επικολλά στην πρώτη κενή του πίνακα προτρέποντάς μας να αλάξουμε μόνο τα δεδομένα στην τελευταία στήλη (Μ)

Σ΄ευχαριστώ πολύ για την ανοχή σου

Γιώργος
Συνημμένα Αρχεία
Τύπος Αρχείου: xls Total_List1.xls (17,5 KB, 30 εμφανίσεις)
Απάντηση με παράθεση
  #5  
Παλιά 27-11-10, 15:47
Το avatar του χρήστη nisgia
Super Moderator
Όνομα: Γιάννης
Έκδοση λογισμικού Office: Ms-Office 2007
Γλώσσα λογισμικού Office: Ελληνική, Αγγλική
 
Εγγραφή: 12-10-2009
Περιοχή: Ηγουμενίτσα
Μηνύματα: 186
Προεπιλογή

Γιώργο καλησπέρα!

Σου επιστρέφω το Total_List1.xls με τη λειτουργικότητα που αναζητάς η οποία βασίζεται στη διαδικασία (μακροεντολή) "OffsetLastLine"
της λειτουργικής μονάδας "Module1" που θα δεις αν πατήσεις Alt+F11έχοντας ανοιχτό το Total_List1.xls.
(θα πρέπει να ενεργοποιήσεις τις μακροεντολές κατά το άνοιγμά του)

Αυτή τη στιγμή μπορείς να την καλέσεις είτε από το παράθυρο διαλόγου "Μακροεντολές" ("Macros")
είτε πατώντας Ctrl+Shift+L (με πληκτρολόγιο στα Αγγλικά) αλλά μπορείς και να την αντιστοιχίσεις
σε κάποιο κουμπί ή σε κάποια εντολή αναδυόμενου μενού (δεξί κλικ).

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

Για ό,τι άλλο χρειαστείς, εδώ είμαστε.
Φιλικά, Γιάννης.
Συνημμένα Αρχεία
Τύπος Αρχείου: zip Total_List2.zip (16,8 KB, 24 εμφανίσεις)
__________________
Αν δεν το ρωτούσες, δεν θα το μαθαίναμε ποτέ...!
-----------------------------------------------
Τελικά η γνώση, αντίθετα με ό,τι μέχρι σήμερα πίστευα, είναι η φυλακή της σκέψης.
Όταν η αφετηρία είναι η ελεύθερη σκέψη, δεν χρειάζεται πλέον να φτάσεις πουθενά!
Απάντηση με παράθεση
  #6  
Παλιά 28-11-10, 00:10
Όνομα: Γιώργος
Έκδοση λογισμικού Office: Ms-Office 2003, Ms-Office 2007
Γλώσσα λογισμικού Office: Ελληνική, Αγγλική
 
Εγγραφή: 18-09-2010
Περιοχή: Θεσσαλονίκη
Μηνύματα: 75
Προεπιλογή Αντιγραφή & Επικόληση

Φίλε Γιάννη σ΄ευχαριστώ πολύ για την λύση που μου έδωσες.
Πάνω απ΄όλα σ΄ευχαριστώ για την αναλυτικότητα με την οποία έγραψες τον κώδικα (Βοηθάει να κατανοήσω την διαδικασία, αρχάριος γαρ στην VBA).
Εγώ μπακαλίστικα σκεφτόμενος επειδή ήμουν και τυχερός (Στο πραγματικό αρχείο, Περιοχή Β1:Β9 , Πορτοκαλί σκίαση, δεν υπήρχαν δεδομένα),
ξεκλείδωσα την συγκεκριμένη περιοχή και τροποποίησα τον κώδικα που μου έδωσε ο φίλος ο Θανάσης (gr8styl) και έδωσα λύση στο πρόβλημά μου.
Η λύση σου όμως είναι η απόλυτη λύση.
Στο επισυναπτόμενο αρχείο έχω βάλει 2 Button και τα έχω αντιστοιχίσει με τις 2 λύσεις.
(Δέστο και πες μου πόσο μπακάλης μπορεί να είμαι)

Σας ευχαριστώ όλους
Ο φίλος σας
Γιώργος
Συνημμένα Αρχεία
Τύπος Αρχείου: xls Total_List3.xls (33,5 KB, 31 εμφανίσεις)

Τελευταία επεξεργασία από το χρήστη Flashgordon61 : 28-11-10 στις 00:48.
Απάντηση με παράθεση
  #7  
Παλιά 28-11-10, 02:43
Το avatar του χρήστη Tasos
Διαχειριστής
Όνομα: Τάσος Φιλοξενιδης
Έκδοση λογισμικού Office: Ms-Office 365
Γλώσσα λογισμικού Office: Ελληνική, Αγγλική, Γερμανική
 
Εγγραφή: 21-10-2009
Μηνύματα: 2.249
Προεπιλογή

Καλημέρα σε όλους!
Γιώργο. δες ακόμα έναν τρόπο αντιγραφής της τελευταίας γραμμής με δεδομένα στην πρώτη κενή γραμμή της περιοχής "Table" του αρχείου σου:

Καλή συνέχεια!

Φιλικά / Τάσος

Sub CopyLastRow()
Dim FirstFreeLine As Range, LastLine As Range
With Range("Table")
If Trim(.Cells(1)) <> vbNullString Then
Set FirstFreeLine = .Cells(1).Offset(-1).End(xlDown).Offset(1).Resize(1, .Columns.Count)
Else
Set FirstFreeLine = .Cells(1).Resize(1, .Columns.Count)
End If
Set LastLine = .Offset(.Rows.Count + 1).End(xlUp).Resize(1, .Columns.Count)
If FirstFreeLine.Row < LastLine.Row Then FirstFreeLine.Value = LastLine.Value
'LastLine.ClearContents ' Διαγραφει την τελευταία γραμμή
FirstFreeLine.Resize(1, 1).Offset(, .Columns.Count - 1).Select
'SendKeys "{F2}" ' φέρνει το κελί σε κατάσταση επεξεργασίας
End With
End Sub
__________________
Ms-Office Development Team
Ανάπτυξη επαγγελματικών εφαρμογών
Απάντηση με παράθεση
  #8  
Παλιά 28-11-10, 10:17
Όνομα: Γιώργος
Έκδοση λογισμικού Office: Ms-Office 2003, Ms-Office 2007
Γλώσσα λογισμικού Office: Ελληνική, Αγγλική
 
Εγγραφή: 18-09-2010
Περιοχή: Θεσσαλονίκη
Μηνύματα: 75
Προεπιλογή Αντιγραφή & Επικόληση

Φίλε Τάσο σ΄ευχαριστώ κι εσένα για την τρίτη λύση στο πρόβλημα.
Πολύ καλή λύση με ένα μικρό λάθος.(μάλον λόγω της ώρας σύνταξης του κώδικα 03:43)

To If FirstFreeLine.Row < LastLine.Row Then FirstFreeLine.Value = LastLine.Value
πρέπει να γίνει If FirstFreeLine.Row > LastLine.Row Then FirstFreeLine.Value = LastLine.Value
Σ ευχαριστώ πολύ
Διατελώ μεθ΄υπολήψεως
Ο ελάχιστος
Γιώργος
Απάντηση με παράθεση
  #9  
Παλιά 28-11-10, 13:44
Το avatar του χρήστη Tasos
Διαχειριστής
Όνομα: Τάσος Φιλοξενιδης
Έκδοση λογισμικού Office: Ms-Office 365
Γλώσσα λογισμικού Office: Ελληνική, Αγγλική, Γερμανική
 
Εγγραφή: 21-10-2009
Μηνύματα: 2.249
Προεπιλογή

Γιώργο καλημέρα!
Γράφεις:
Παράθεση:
Το ζητούμενο είναι ένας κώδικας VBA που να αντιγράφει την τελευταία γραμμή που έχει δεδομένα και να την επικολλά στην πρώτη κενή του πίνακα προτρέποντάς μας να αλάξουμε μόνο τα δεδομένα στο τελευταίο κελί στην τελευταία στήλη (Μ).
Έτσι έχουμε:
τελευταία γραμμή που έχει δεδομένα = LastLine
πρώτη κενή του πίνακα = FirstFreeLine

Στον κώδικα έχουμε:

If FirstFreeLine.Row < LastLine.Row Then FirstFreeLine.Value = LastLine.Value

που σημαίνει ότι ΜΟΝΟ αν η πρώτη ελεύθερη γραμμή της περιοχής (FirstFreeLine.Row) είναι πάνω από την τελευταία γραμμή (LastLine) θα αντιγραφούν τα δεδομένα.

Αν πχ. η FirstFreeLine βρίσκεται στην γραμμή 12 και η LastLine επίσης στη γραμμή 12, ο κώδικας δεν θα κάνει την αντιγραφή γιατί θα διαγράψει τα ήδη υπάρχοντα δεδομένα της FirstFreeLine.

Με τον τρόπο που μου το περιγράφεις, δεν θα γίνει ποτέ αντιγραφή αφού ηFirstFreeLine
δεν θα μπορεί να είναι μεγαλύτερη της
LastLine!

Ελπίζω να έγινα κατανοητός

Φιλικά

Τάσος
__________________
Ms-Office Development Team
Ανάπτυξη επαγγελματικών εφαρμογών
Απάντηση με παράθεση
  #10  
Παλιά 28-11-10, 22:02
Όνομα: Γιώργος
Έκδοση λογισμικού Office: Ms-Office 2003, Ms-Office 2007
Γλώσσα λογισμικού Office: Ελληνική, Αγγλική
 
Εγγραφή: 18-09-2010
Περιοχή: Θεσσαλονίκη
Μηνύματα: 75
Προεπιλογή

Φίλε Τάσο καλησπέρα
Η εντολή LastLine.ClearContents & η εντολή SendKeys "{F2}" όπως τις έγραψες δεν είναι ενεργοποιημένες
Παράθεση:
'LastLine.ClearContents ' Διαγραφει την τελευταία γραμμή
FirstFreeLine.Resize(1, 1).Offset(, .Columns.Count - 1).Select
'SendKeys "{F2}" ' φέρνει το κελί σε κατάσταση επεξεργασίας
Στο επισυναπτόμενο αρχείο, τον κώδικα που έδωσες (όπως ακριβως τον έγραψες) τον αντέγραψα σε ένα νέο module (motule3)
και τον αντιστοίχισα με το Button {Η λύση του (Τάσου) όπως τροποποιήθηκε} κάνοντας την αλλαγή που ανέφερα σε προγενέστερο μύνημα.
Παράθεση:
(To If FirstFreeLine.Row < LastLine.Row Then FirstFreeLine.Value = LastLine.Value
πρέπει να γίνει If FirstFreeLine.Row > LastLine.Row Then FirstFreeLine.Value = LastLine.Value)
Αν οι εγραφές στον πίνακα (Table) είναι συνεχείς (δεν υπάρχει κενή γραμμή και μετά γραμμή με δεδομένα) ο τροποποιημένος κώδικας
δουλεύει απόλυτα. εκτός από το γεγονός ότι επικολά και το τελευταίο κελί στην στήλη (Μ).
Άν υπάρχει κενή γραμμή και μετά γραμμή με δεδομένα, έχεις δίκιο ο κώδικας δουλεύει όπως ακριβώς τον έγραψες
(If FirstFreeLine.Row < LastLine.Row Then FirstFreeLine.Value = LastLine.Value).
Ίσως στο ζητούμενο έπρεπε να γράψω ότι οι εγραφές είναι συνεχείς.
Τέλος η πρόθεσή μου δεν ήταν να σε διορθώσω (πως θα μπορούσα άλωστε, έχω δηλώσει και σε προηγούμενα μυνήματα αρχάριος στη VBA),
απλώς κρίνοντας από το αποτέλεσμα με τον τροποποιημένο κώδικα έγραψα το παραπάνω μύνημα.

Φιλικά Γιώργος
Συνημμένα Αρχεία
Τύπος Αρχείου: xls Total_List4.xls (45,5 KB, 45 εμφανίσεις)
Απάντηση με παράθεση
Απάντηση στο θέμα


Δικαιώματα - Επιλογές
Δε μπορείτε να δημοσιεύσετε νέα μηνύματα
Δε μπορείτε να δημοσιεύσετε απαντήσεις
Δεν μπορείτε να επισυνάψετε αρχεία
Δεν μπορείτε να επεξεργαστείτε τα μηνύματα σας

Ο κώδικας ΒΒ είναι σε λειτουργία
Τα Smilies είναι σε λειτουργία
Ο κώδικας [IMG] είναι σε λειτουργία
Ο κώδικας HTML είναι εκτός λειτουργίας
Trackbacks are εκτός λειτουργίας
Pingbacks are εκτός λειτουργίας
Refbacks are εκτός λειτουργίας


Παρόμοια Θέματα

Θέμα Δημιουργός Forum Απαντήσεις Τελευταίο Μήνυμα
[Γενικά] Ειδική Επικόληση xristos Excel - Ερωτήσεις / Απαντήσεις 8 26-05-15 15:06
[Γενικά] Αυτόματη επικόληση δεδομένων από λίστα σε άλλο φύλλο xristos Excel - Ερωτήσεις / Απαντήσεις 0 08-07-14 17:22
[Συναρτήσεις] Στατιστικά από επικόληση σύνδεσης xristos Excel - Ερωτήσεις / Απαντήσεις 10 18-12-13 09:40
[Συναρτήσεις] Στατιστικά από επικόληση σύνδεσης xristos Excel - Ερωτήσεις / Απαντήσεις 11 30-09-13 20:17
[Συναρτήσεις] Επικόληση σύνδεσης xristos Excel - Ερωτήσεις / Απαντήσεις 4 11-12-12 11:27


Η ώρα είναι 22:15.