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

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

Δημοσ.

Καλημέρα.

Χρειάζομαι να κάνω κάτι αλλαγές σε ένα excel με περίπου 1000 γραμμές και είναι αδύνατον να γίνει copy-paste.

Θέλω λοιπόν έναν αυτοματισμό να κάνω την διαδικασία που επισυνάπτω.

Γνωρίζει κάποιος αν υπάρχει τρόπος?

Ευχαριστώ.

TEST.xlsx

Καταγραφή.JPG

Δημοσ. (επεξεργασμένο)

Όχι, θέλει τα ζυγά κελιά να αντιγράφονται στα μονά. Μάλλον θέλει macro ή vba script.

π.χ. για το macro θα προγραμματίσεις μια εντολή που να προχωράει δύο κελιά κάτω, να αντιγράφει τα περιεχόμενα, μετά να επιστρέφει ένα κελί πάνω και να κάνει επικόλληση. Θα ξεκινήσεις το macro από το 1ο κελί και θα το επαναλαμβάνεις  μέχρι τέλος.

Επεξ/σία από micos000
Δημοσ.

Μια απλη λυση χωρις macro ειναι να προσθεσεις 2 στηλες (C, D). Στην C βαζεις εναλλαξ 1, 2 στα κελια ωστε να δηλωσεις μονα, ζυγα. Στην D βαζεις την φορμουλα =IF(C1=1;B2;B1) στο κελι D1 και μετα την τραβας προς τα κατω ωστε να κανει apply στα υπολοιπα κελια. Για να ολοκληρωσεις τωρα την δουλεια κανεις αντιγραφη την στηλη D στην στηλη B με Paste Special -> Values και αφου καθαρισεις τα C & D εισαι ετοιμος.

 

image.png.5b680eafcd0cca85d522b7bbdca00092.png

  • Like 1
Δημοσ. (επεξεργασμένο)

Μια απλή μακροεντολή είναι η παρακάτω...

'
' copy_paste macro
'
    Dim i As Integer
    For i = 2 To 8 Step 2
    Range("B" & i).Select
    Selection.Copy
    Range("B" & (i + 1)).Select
    ActiveSheet.Paste
    Next

Στην γραμμή "For i= 2 to 8"  βάζεις σε από ποια σειρά μέχρι ποια θέλεις να γίνει η αντιγραφή.
Το "step 2" δηλώνει ανά πόσα βήματα θα προχωράει.
Το "Β" είναι η στήλη.

 

Τώρα, θα πας Μακροεντολές και θα δημιουργήσεις μια νέα.
Θα δώσεις ένα όνομα και θα πατήσεις Επεξεργασία.
Θα κάνεις επικόλληση το΄παραπάνω ανάμεσα στο Sub και στο End Sub.
Θα κλείσεις τον vba editor και θα σώσεις το excell σε μορφή που υποστηρίζει μακροεντολές (.xlsm).
Τώρα πηγαίνοντας στις μακροεντολές θα την επιλέγεις και θα πατάς Εκτέλεση.

Υ.Γ. Εννοείται ότι σηκώνει αρκετή βελτίωση όπως να επιλέγει αυτόματα σαν αρχικό κελί αυτό που είναι επιλεγμένο και να αντιγράφει μέχρι το τελευταίο κελί, όποιο κι αν είναι αυτό, αλλά έχω πολλά χρόνια να ασχοληθώ με vba και δε θυμάμαι όλες τις εντολές. Όποιος γνωρίζει ας το διορθώσει κατά βούληση. ;)

Επεξ/σία από micos000
  • Thanks 1
Δημοσ.

Παιδιά, σας ευχαριστώ πολύ για τις απαντήσεις σας.

Έψαχνα ακριβώς αυτό που πολύ σωστά κατάλαβε ο Micos.

Το προσπαθώ τώρα και επανέρχομαι με τα αποτελέσματα.

Καλημέρα και καλή δύναμη σε όλους.

Δημοσ.

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

  • Like 1
Δημοσ. (επεξεργασμένο)

Τις είδα, αλλά δυστυχώς αν είσαι εντελώς άσχετος, αδυνατείς να καταλάβεις και τα -για πολλούς- αυτονόητα.

Να ρωτήσω παρακαλώ γιατί βάζεις

For i = 2 To 8 Step 2

και όχι

For i = 1 To 8 Step 2

Δηλαδή, εγώ που στο excel έχω και μια πρώτη γραμμή με τα ονόματα των στηλών, πρέπει να βάλει 2 ή 3? Ή κάτι άλλο?

Και επίσης, το excel αποτελείται από περίπου 20 στήλες και όπως έιπα κοντά στις 1000 γραμμές. Από τις 20 στήλες, εγώ θέλω να αντιγράψω τις 6-7 από τις 20. Δοκίμασα λοιπόν το παρακάτω, αλλά κάπου κάνω λάθος.

Και πάλι ευχαριστώ!

'
' copy_paste macro
'
    Dim i As Integer
    For i = 2 To 8 Step 2
    Range("B", "C", "D", "E", "F", "G" & i).Select
    Selection.Copy
    Range("B", "C", "D", "E", "F", "G" & (i + 1)).Select
    ActiveSheet.Paste
    Next

EQW.JPG

Επεξ/σία από Tzimmys
Δημοσ. (επεξεργασμένο)

Βάζω 2 έως 8 για να ξεκινάει και να καταλήγει με το κελί από το οποίο θα γίνει η αντιγραφή. Αν το έβαζα από 1 έως 7 (ένα μικρότερο από το τελευταίο κελί) θα έβαζα το 1ο range (i-1) και το 2ο απλά i, το ίδιο θα είναι.
Μετά, αφού έχεις πολλές στήλες θα πρέπει να προσαρμόσεις σωστά το range της επιλογής. Ακολουθεί διορθωμένο το script όπου προσάρμοσα την for για να συνεχίζει μέχρι να βρει το τελευταίο κελί. Αν δε σε βολεύει βάλε την for όπως το 1ο script ξεκινώντας από τη γραμμή 3.

'
' c_p Macro
'
    Dim i As Integer
    Dim j As Integer
        
    For i = 3 To Range("B" & Rows.Count).End(xlUp).Row Step 2
    j = i - 1
    Range("B" & i, "G" & i).Select
    Selection.Copy
    Range("B" & j, "G" & j).Select
    ActiveSheet.Paste
    Next

 

Α, έχω προσέξει όμως ότι αν είναι μονός ο αριθμός των γραμμών προς αντιγραφή (π.χ. 101) η 101η μένει όπως είναι γιατί δεν υπάρχει 102 γραμμή για να αντιγραφτεί στην 101. Πρόσεξε το αυτό.

EDIT:

Να σημειώσω ότι οι στήλες για επιλογή αναφέρονται στις δύο Range και δηλώνονται μέσα στην παρένθεση ως εξής:
("ΑΠΟ" & i, "ΕΩΣ" & i)  και αντίστοιχα για την επικόλληση το i γίνεται j. Οπότε αν θέλεις από την D έως την K θα βάλεις αντί Β το D και αντί G το K μέσα στα ομοιωματικά.

Επεξ/σία από micos000
  • Thanks 1
Δημοσ.

Για ακόμα μία φορά με βοήθησες και για ακόμα μία φορά η λύση σου δούλεψε άψογα.

Ήταν απόλαυση να βλέπω το excel να μεταφορτώνεται στην μορφή που το θέλω.

Ευχαριστώ όλα τα παιδιά και κυρίως τον mico για την βοήθειά σας.

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

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...