k33theod Δημοσ. 1 Ιανουαρίου 2021 Δημοσ. 1 Ιανουαρίου 2021 Βασικά δεν κατάλαβα το πρόβλημα. Αυτό που ήθελα να επισημάνω είναι ότι σε τετοιες περιπτώσεις φεύγουμε από τη λογική των if και cases και πάμε σε λίστα
papmel Δημοσ. 1 Ιανουαρίου 2021 Δημοσ. 1 Ιανουαρίου 2021 Μόλις τώρα, MastroGiannis είπε Χρειάζεσαι τουλάχιστον μια IF για να ελέγξεις αν η lista(a) δεν επιστρέφει κάτι ανεπιθύμητο, ενώ, μόνο με την k, οι στήλες θα έχουν κενά. Πρέπει να μετράς τις "επιτυχίες" κάθε στήλης ξεχωριστά. Διαφορετικά, έφτανε η i. Καλή χρονιά επίσης! Χρονια πολλα. Εδω το ζητουμενο ηταν το τιπ που εδωσα και για του λογου το αληθες αν αλλαηεις τον κωδικα σου σε For i = 1 To 800000 fs = LCase(Cells(i, 1)) Select Case fs Case "0d" j = j + 1 Cells(j, 2) = Cells(i, 1).Offset(2) Case "1d" k = k + 1 Cells(k, 3) = Cells(i, 1).Offset(2) Case "2d" l = l + 1 Cells(l, 4) = Cells(i, 1).Offset(2) Case "3d" m = m + 1 Cells(m, 5) = Cells(i, 1).Offset(2) End Select κερδιζεις 1 δευτερολεπτο στα 11 ( 9% πιο fast δηλαδη ) και το range μεγαλώνει οσο μεγαλώνουν τα Data. κανενα if δεν χρειαζετε γιατι δεν ειπε οτι μπορει αν εχει κενο μεσα Αν παμε στην περιπτωση που εχει κενο τοτε δεν χρειαζετε ο Βρογχος γιατι με ενα Do While τα ψαχνεις και ειναι ανεξάρτητο του βροχου. Ακομα και if να βαλω ομως ειναι πιο γρήγορο κανε το παραδειγμα πανω στον δικο σου κώδικα. ΚΑΛΗ ΧΡΟΝΙΑ ΕΠΙΣΗΣ.
MastroGiannis Δημοσ. 1 Ιανουαρίου 2021 Δημοσ. 1 Ιανουαρίου 2021 (επεξεργασμένο) Αναφορά σε κείμενο Βασικά δεν κατάλαβα το πρόβλημα. Αυτό που ήθελα να επισημάνω είναι ότι σε τετοιες περιπτώσεις φεύγουμε από τη λογική των if και cases και πάμε σε λίστα Σε γενικές γραμμές ναι, όπως άλλωστε και στους τύπους του Excel, όταν αυξάνονται οι IF περνάμε σε INDEX και MATCH ή VLOOKUP. Σε μερικές περιπτώσεις όμως, η αντικατάστασή τους, ίσως να μειώνει γραμμές κώδικα αλλά να περιπλέκει τα πράγματα. 1 ώρα πριν, papmel είπε Χρονια πολλα. Εδω το ζητουμενο ηταν το τιπ που εδωσα και για του λογου το αληθες αν αλλαηεις τον κωδικα σου σε Βασικά απευθυνόμουν στον k33theod. Ο κώδικας όμως που έφτιαξες για τις δοκιμές, εντάσσεται στην κατηγορία "υπό άλλες συνθήκες", και συγκεκριμένα, πρόκειται για χρήση μιας μεταβλητής στη θέση μιας υπολογιζόμενης τιμής σε πολλά σημεία μέσα στον κώδικα, πρακτική με την οποία συμφωνώ. Δεν βλέπω όμως και το εκατοντάδες φορές γρηγορότερο αποτέλεσμα της χρήσης της μεταβλητής στις διαδικασίες του θέματος. Αντιθέτως, ομολογείς πως είναι ελάχιστα πιο γρήγορη η InStr("...", Cells(i, 1)). Επίσης, πέρα από το κόστος σε εκτέλεση, η διαδικασίες έχουν και κόστος στην αρχικοποίηση. Κάποιες διαδικασίες καλούνται χιλιάδες φορές και εκεί το κόστος αρχικοποίησης λαμβάνεται σοβαρά υπόψη. Ας μην κουράζουμε άλλο όμως με αυτές τις λεπτομέρειες και τις τελειομανίες... Καλή χρονιά papmel! Επεξ/σία 1 Ιανουαρίου 2021 από MastroGiannis
papmel Δημοσ. 1 Ιανουαρίου 2021 Δημοσ. 1 Ιανουαρίου 2021 Μόλις τώρα, MastroGiannis είπε Σε γενικές γραμμές ναι, όπως άλλωστε και στους τύπους του Excel, όταν αυξάνονται οι IF περνάμε σε INDEX και MATCH ή VLOOKUP. Σε μερικές περιπτώσεις όμως, η αντικατάστασή τους, ίσως να μειώνει γραμμές κώδικα αλλά να περιπλέκει τα πράγματα. Βασικά απευθυνόμουν στον k33theod. Ο κώδικας όμως που έφτιαξες για τις δοκιμές, εντάσσεται στην κατηγορία "υπό άλλες συνθήκες", και συγκεκριμένα, πρόκειται για χρήση μιας μεταβλητής στη θέση μιας υπολογιζόμενης τιμής σε πολλά σημεία μέσα στον κώδικα, πρακτική με την οποία συμφωνώ. Δεν βλέπω όμως και το εκατοντάδες φορές γρηγορότερο αποτέλεσμα της χρήσης της μεταβλητής στις διαδικασίες του θέματος. Αντιθέτως, ομολογείς πως είναι ελάχιστα πιο γρήγορη η InStr("...", Cells(i, 1)). Επίσης, πέρα από το κόστος σε εκτέλεση, η διαδικασίες έχουν και κόστος στην αρχικοποίηση. Κάποιες διαδικασίες καλούνται χιλιάδες φορές και εκεί το κόστος αρχικοποίησης λαμβάνεται σοβαρά υπόψη. Ας μην κουράζουμε άλλο όμως με αυτές τις λεπτομέρειες και τις τελειομανίες... Καλή χρονιά papmel! ναι μα γιαυτο το ειπα. δεν εχει διαφορες!!! ειναι ελαχιστοτατες. Στην delphi Ομως αν πας να το κανεις και εχεις εναν StringGrind απλα τον Ηπιες! χαχαχαχαχασ Γιαυτο υπεθεσα οτι θα ειναι 100 φορες πιο γρηγορο.Και ομολογω οτι οταν ειδα το αποτελεσμα κουφαθηκα λιγο.
marinax1 Δημοσ. 2 Ιανουαρίου 2021 Μέλος Δημοσ. 2 Ιανουαρίου 2021 (επεξεργασμένο) Χρόνια Πολλά, Καλή Χρονιά. Πολύ ενδιαφέρον βλέπω, ευχαριστώ πολύ Τα παίρνω απο την αρχή. Ήταν να έχω ένα excel με στοιχεία πελατών (όνομα, επώνυμο, email...). Δυστυχώς όμως το excel που είχα αντί να έχει τα στοιχεία σε στήλες τα είχε όλα στην στήλη Α το ένα κάτω από το άλλο firstname --- Νίκος lastname ----- Νικολάου ---- ---- email --- [email protected] firstname Έπρεπε λοιπόν να τα χωρίσω, Στη Β τα ονόματα, στην C το επώνυμο και στην D το email Οπότε αυτό που ήθελα να κάνω ήταν να ψάχνω στη στήλη Α και μόλις βρω κελί με περιεχόμενο "Όνομα" να πάρω το περιεχόμενο 2 κελιών παρακάτω και να το βάλω στη στήλη Β, παρομοίως αν βρω το "Επώνυμο" να το βάλω στη στήλη C και πάει λέγοντας. Μια for και case ή for και if Επέλεξα την If αλλά δε μου βγήκε οπότε επειδή βιαζόμουν για τη δουλειά το έκανα με πρόχειρο τρόπο όπως παρακάτω για να τελειώνω. Καταλαβαίνω ότι αυτό που έκανα ήταν ποντιακό αλλά όπως είπα έπρεπε να φτιάξω το αρχείο. Απλά έφαγα κόλλημα τι λάθος είχα στον αρχικό κώδικά. το αστείο ήταν ότι είχα κάνει κάτι παρόμοιο παλαιότερα και δούλεψε, copy paste έκανα και δε καταλαβαίνω τι πήγε στραβά Sub Test() Dim i, k As Long k = 1 For i = 1 To 2000 If Cells(i, 1).Value = "firstname" Then Cells(k, 2).Value = Cells(i + 2, 1) k = k + 1 End If Next i k = 1 For i = 1 To 2000 If Cells(i, 1).Value = "lastname" Then Cells(k, 3).Value = Cells(i + 2, 1) k = k + 1 End If Next i k = 1 For i = 1 To 2000 If Cells(i, 1).Value = "email" Then Cells(k, 4).Value = Cells(i + 2, 1) k = k + 1 End If Next i End Sub οπότε τώρα φαντάζομαι καταλάβατε τι ήθελα να κάνω. δυστυχώς δε μπορώ να ανεβάσω το αρχείο. Επεξ/σία 2 Ιανουαρίου 2021 από marinax1
MastroGiannis Δημοσ. 3 Ιανουαρίου 2021 Δημοσ. 3 Ιανουαρίου 2021 Πώς προκύπτει η δομή του αρχείου; Εισάγεις κάποιο .txt από κάποια άλλη εφαρμογή/συσκευή; Δεν έχουν οι τιμές πάντα την ίδια απόσταση σε γραμμές (Rows) από τις ιδιότητές τους; Κάνεις συχνά αυτή την εργασία ή ήταν μια κι έξω; Αν την κάνεις συχνά, έχει ένα νόημα να τη βελτιώσεις τη ρουτίνα. Αν όμως ήταν για μια φορά, μια χαρά την έκανες και μπακαλίστικα. Καλή συνέχεια!
papmel Δημοσ. 4 Ιανουαρίου 2021 Δημοσ. 4 Ιανουαρίου 2021 Στις 3/1/2021 στις 12:43 ΜΜ, MastroGiannis είπε Πώς προκύπτει η δομή του αρχείου; Εισάγεις κάποιο .txt από κάποια άλλη εφαρμογή/συσκευή; Δεν έχουν οι τιμές πάντα την ίδια απόσταση σε γραμμές (Rows) από τις ιδιότητές τους; Κάνεις συχνά αυτή την εργασία ή ήταν μια κι έξω; Αν την κάνεις συχνά, έχει ένα νόημα να τη βελτιώσεις τη ρουτίνα. Αν όμως ήταν για μια φορά, μια χαρά την έκανες και μπακαλίστικα. Καλή συνέχεια! Δεν μπορω να καταλαβω γιατι οσες φορες ζητανε κατι δεν βαζουν και ενα Sample Data για να μπορουμε να δημιουργησουμε εγω και ο mastrogiannis και καθομαστε και φανταζομαστε. Δεν χρειαζετε να ειναι πραγματικα Data απλα ενα excel του Style το εχω ετσι και ενα excel το Θέλω ετσι. Αντε γιατι με την καραντινα πολυ βαριομαστε τουλαχιστον να προσφερουμε και κατι :)))))))))))))))))
marinax1 Δημοσ. 10 Ιανουαρίου 2021 Μέλος Δημοσ. 10 Ιανουαρίου 2021 Στις 3/1/2021 στις 10:43 ΠΜ, MastroGiannis είπε Πώς προκύπτει η δομή του αρχείου; Εισάγεις κάποιο .txt από κάποια άλλη εφαρμογή/συσκευή; Δεν έχουν οι τιμές πάντα την ίδια απόσταση σε γραμμές (Rows) από τις ιδιότητές τους; Κάνεις συχνά αυτή την εργασία ή ήταν μια κι έξω; Αν την κάνεις συχνά, έχει ένα νόημα να τη βελτιώσεις τη ρουτίνα. Αν όμως ήταν για μια φορά, μια χαρά την έκανες και μπακαλίστικα. Καλή συνέχεια! μου το δώσανε το αρχείο. οι τιμές έχουν πάντα την ίδια απόσταση. πχ υπάρχει ο τίτλος (πχ firstname) ένα κενό κελί και μετά η τιμή (πχ Marina). αν για όλα τα άτομα τα στοιχεία ήταν ίδια στον αριθμό θα μπορούσα να το βρω με άλλον τρόπο αλλά μπορεί για ένα άτομο να έχει μόνο firstname και για το άλλο άλλα 3 στοιχεία. δε ξέρω αν χρειαστεί να το ξανακάνω αλλά κατα διαστήμα χρειάζεται να γράφω κάποιες εντολές vba για να κάνω διάφορες τέτοιες απλές εργασίες. (συνήθως συγκρίσεις μεταξύ κελιών) το πρόβλημα μου δεν ήταν πως να το κάνω, το πρόβλημα μου ήταν γιατί δε δούλεψε η if. γι αυτό άνοιξα το θέμα ευχαριστώ και πάλι όλους
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα