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/1455-antigrafi-stilis.html)

jose 26-10-11 15:19

Αντιγραφή στήλης
 
Έχουμε ενα φύλλο πού οι εγγραφές ξεκινάνε απο την 5 σειρά

η 1,2,3,4 είναι κενές
η 5η εχει ονομασίες στήλης και έχουμε ποσά από την 6η

πχ

____A________B________C______D
5_Onoma_____etos__.___poso__Onoma
6_Nikos__.__._1985_____100__._
7_Maria__.___.1987_____180_.__
8_Eleni.__.___.1989_____220_.__


΄Μπορώ με copy στην vba να αντιγράψω την στηλη Α ,
από το Α6 και όσα κελιά προς τα κάτω έχουν τιμές , στο D6 ?

Tasos 26-10-11 16:24

Καλησπέρα Νίκο.

Δοκίμασε:

Κώδικας:

Sub CopyRange()
    With Worksheets("Sheet1" 'όπου "Sheet1" = το όνομα του φύλλου στο οποίο γίνεται η ενέργεια αυτή.
        .Range("A6", "A" & Rows.Count).Copy .Range("D6")
    End With
End Sub

Τάσος

jose 27-10-11 06:23

:w00t:

Πολύτιμη η απάντηση

ευχαριστίες

Πριν το έκανα 'μπακαλίστικα' ,
με μια ''καταγραφή'' μακροεντολής με copy και past τις στήλες
και κατόπιν αντέγραφα τις κινήσεις στην module που εχω

:icon_yes:

Tasos 27-10-11 10:39

Καλημέρα Νίκο!
Αν θέλεις απλά η στήλη D να παίρνει τις τιμές της στήλης A τότε
με VBA δεν χρειάζεται να κάνεις αντιγραφή - επικόλληση.

Σύμφωνα με τα παραπάνω, μπορείς να χρησιμοποιήσεις τον παρακάτω κώδικα που είναι και γρηγορότερος στην εκτέλεση:

Κώδικας:

Sub CopyRange()
    With Worksheets("Sheet1")  'όπου "Sheet1" = το όνομα του φύλλου στο οποίο γίνεται η ενέργεια αυτή.
        .Range("D6", "D" & Rows.Count).Value = .Range("A6", "A" & Rows.Count).Value
    End With
End Sub

Τάσος

jose 28-10-11 09:07

Καλημέρα και Χρόνια Πολλά !

ενα σημείο με δυσκολεύει,

''αντιγράφει'' μέχρι το τέλος ,μεχρι και την 1048576 σειρα !!

και ''ξεχυλώνει'' το φύλλο

Το ίδιο αντιμετωπιζω και με το split κελιου px "A-S"

με την ( που βρηκα στο net )

Dim arr As Variant, i As Long
With Sheets("DATA")
arr = .Range("BB6:BB6" & .UsedRange.Rows.Count)
For i = 1 To UBound(arr)
.Range("EC6" & i & ":ED6" & i).Value = Split(arr(i, 1), "-")
Next i
End With

To split ειδικα σε ενα δοκιμαστικό φύλλο δούλευε μια χαρά
και ξαφνικα μου πηγαινει και αυτο μεχρι την τελευταια σειρα
Αδυνατον να το κατανοησω,

Είναι και οι τελευταιες απορίες που εχω σε αυτό που εργάζομαι.
Οτι άλλες απορίες ειχα, διαβάζοντας εδω τα περασμένα θεματα
βρηκα λυσεις , και από έρευνα στο δαδυκτιο βεβαια

Tasos 28-10-11 11:23

Καλημέρα φίλε μου!
Παράθεση:

΄Μπορώ με copy στην vba να αντιγράψω την στηλη Α ,
από το Α6 και όσα κελιά προς τα κάτω έχουν τιμές , στο D6 ?
Νομίζω ότι πήρες ακριβώς ότι ζήτησες δηλαδή αντιγραφή όσων κελιών προς τα κάτω έχουν τιμές.

Τα κενά κάτω από τη χρησιμοποιημένη περιοχή δεν έχουν σημασία.

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

Τώρα στον κώδικα που αναφέρεσαι βλέπω 2 σημαντικά λάθη:

1) χρησιμοποιείται Array όταν όλο το φύλλο είναι και επεξεργάζεται σαν Array από την ίδια την Excel .

2) Με τη χρήση του UsedRange.Rows.Count δεν είναι σίγουρο ότι θα επιστραφεί το νούμερο της τελευταίας γραμμής
αφού το UsedRange (χρησιμοποιημένη περιοχή του φύλλου) μπορεί να ξεκινά από την 3η γραμμή για παράδειγμα και συνεπώς να επιστρέψει ένα νούμερο - 3 !!!

Γενικότερα σε ενέργειες πάνω στο υπολογιστικό φύλλο, το γρηγορότερο αντικείμενο είναι το Range και αυτό πρέπει να χρησιμοποιείται.

Παρόλα αυτά αν θέλεις να αντιγράφεις μόνο όσα κελιά περιέχουν τιμές και όχι μέχρι την τελευταία σειρά ( 1048576 ) μπορείς να χρησιμοποιήσεις αυτό:

Κώδικας:

Sub CopyRange()
    With Worksheets("Sheet1")  'όπου "Sheet1" = το όνομα του φύλλου στο οποίο γίνεται η ενέργεια αυτή.
        Dim LRow As Long
        LRow = .Range("A" & Rows.Count).End(xlUp).Row
        .Range("D6", "D" & Rows.Count).ClearContents
        .Range("D6", "D" & LRow).Value = .Range("A6", "A" & LRow).Value
    End With
End Sub

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

Τάσος


Η ώρα είναι 09:52.

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


Search Engine Optimization by vBSEO 3.3.2