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

Ερώτηση για if


marinax1

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

Βασικά δεν κατάλαβα το πρόβλημα. Αυτό που ήθελα να επισημάνω είναι ότι σε τετοιες περιπτώσεις φεύγουμε από τη λογική των if και  cases και πάμε σε λίστα

 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Μόλις τώρα, 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 να βαλω ομως ειναι πιο γρήγορο κανε το παραδειγμα πανω στον δικο σου κώδικα.

ΚΑΛΗ ΧΡΟΝΙΑ ΕΠΙΣΗΣ.




 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)
Αναφορά σε κείμενο

Βασικά δεν κατάλαβα το πρόβλημα. Αυτό που ήθελα να επισημάνω είναι ότι σε τετοιες περιπτώσεις φεύγουμε από τη λογική των if και  cases και πάμε σε λίστα

Σε γενικές γραμμές ναι, όπως άλλωστε και στους τύπους του Excel, όταν αυξάνονται οι IF περνάμε σε INDEX και MATCH ή VLOOKUP.

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

1 ώρα πριν, papmel είπε

Χρονια πολλα.
Εδω το ζητουμενο ηταν το τιπ που εδωσα και για του λογου το αληθες αν αλλαηεις τον κωδικα σου σε

Βασικά απευθυνόμουν στον k33theod. :)

Ο κώδικας όμως που έφτιαξες για τις δοκιμές, εντάσσεται στην κατηγορία "υπό άλλες συνθήκες", και συγκεκριμένα, πρόκειται για χρήση μιας μεταβλητής στη θέση μιας υπολογιζόμενης τιμής σε πολλά σημεία μέσα στον κώδικα, πρακτική με την οποία συμφωνώ. Δεν βλέπω όμως και το εκατοντάδες φορές γρηγορότερο αποτέλεσμα της χρήσης της μεταβλητής στις διαδικασίες του θέματος. Αντιθέτως, ομολογείς πως είναι ελάχιστα πιο γρήγορη η InStr("...", Cells(i, 1)).

Επίσης, πέρα από το κόστος σε εκτέλεση, η διαδικασίες έχουν και κόστος στην αρχικοποίηση. Κάποιες διαδικασίες καλούνται χιλιάδες φορές και εκεί το κόστος αρχικοποίησης λαμβάνεται σοβαρά υπόψη.

Ας μην κουράζουμε άλλο όμως με αυτές τις λεπτομέρειες και τις τελειομανίες...

Καλή χρονιά papmel!

Επεξ/σία από MastroGiannis
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Μόλις τώρα, MastroGiannis είπε

Σε γενικές γραμμές ναι, όπως άλλωστε και στους τύπους του Excel, όταν αυξάνονται οι IF περνάμε σε INDEX και MATCH ή VLOOKUP.

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

Βασικά απευθυνόμουν στον k33theod. :)

Ο κώδικας όμως που έφτιαξες για τις δοκιμές, εντάσσεται στην κατηγορία "υπό άλλες συνθήκες", και συγκεκριμένα, πρόκειται για χρήση μιας μεταβλητής στη θέση μιας υπολογιζόμενης τιμής σε πολλά σημεία μέσα στον κώδικα, πρακτική με την οποία συμφωνώ. Δεν βλέπω όμως και το εκατοντάδες φορές γρηγορότερο αποτέλεσμα της χρήσης της μεταβλητής στις διαδικασίες του θέματος. Αντιθέτως, ομολογείς πως είναι ελάχιστα πιο γρήγορη η InStr("...", Cells(i, 1)).

Επίσης, πέρα από το κόστος σε εκτέλεση, η διαδικασίες έχουν και κόστος στην αρχικοποίηση. Κάποιες διαδικασίες καλούνται χιλιάδες φορές και εκεί το κόστος αρχικοποίησης λαμβάνεται σοβαρά υπόψη.

Ας μην κουράζουμε άλλο όμως με αυτές τις λεπτομέρειες και τις τελειομανίες...

Καλή χρονιά papmel!

ναι μα γιαυτο το ειπα.
δεν εχει διαφορες!!! ειναι ελαχιστοτατες.

Στην delphi Ομως αν πας να το κανεις και εχεις εναν StringGrind απλα τον Ηπιες! χαχαχαχαχασ

Γιαυτο υπεθεσα οτι θα ειναι 100 φορες πιο γρηγορο.Και ομολογω οτι οταν ειδα το αποτελεσμα κουφαθηκα λιγο. :)


 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

Χρόνια Πολλά, Καλή Χρονιά.

Πολύ ενδιαφέρον βλέπω, ευχαριστώ πολύ

Τα παίρνω απο την αρχή.
Ήταν να έχω ένα 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

 

οπότε τώρα φαντάζομαι καταλάβατε τι ήθελα να κάνω. δυστυχώς δε μπορώ να ανεβάσω το αρχείο.

Επεξ/σία από marinax1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Πώς προκύπτει η δομή του αρχείου; Εισάγεις κάποιο .txt από κάποια άλλη εφαρμογή/συσκευή; Δεν έχουν οι τιμές πάντα την ίδια απόσταση σε γραμμές (Rows) από τις ιδιότητές τους;

Κάνεις συχνά αυτή την εργασία ή ήταν μια κι έξω; Αν την κάνεις συχνά, έχει ένα νόημα να τη βελτιώσεις τη ρουτίνα. Αν όμως ήταν για μια φορά, μια χαρά την έκανες και μπακαλίστικα. :)

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

 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Στις 3/1/2021 στις 12:43 ΜΜ, MastroGiannis είπε

Πώς προκύπτει η δομή του αρχείου; Εισάγεις κάποιο .txt από κάποια άλλη εφαρμογή/συσκευή; Δεν έχουν οι τιμές πάντα την ίδια απόσταση σε γραμμές (Rows) από τις ιδιότητές τους;

Κάνεις συχνά αυτή την εργασία ή ήταν μια κι έξω; Αν την κάνεις συχνά, έχει ένα νόημα να τη βελτιώσεις τη ρουτίνα. Αν όμως ήταν για μια φορά, μια χαρά την έκανες και μπακαλίστικα. :)

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

 

Δεν μπορω να καταλαβω γιατι οσες φορες ζητανε κατι δεν βαζουν και ενα Sample Data για να μπορουμε να δημιουργησουμε εγω και ο mastrogiannis και καθομαστε και φανταζομαστε.
Δεν χρειαζετε να ειναι πραγματικα Data απλα ενα excel του Style το εχω ετσι και ενα excel το Θέλω ετσι.
Αντε γιατι με την καραντινα πολυ βαριομαστε τουλαχιστον να προσφερουμε και κατι :)))))))))))))))))

 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Στις 3/1/2021 στις 10:43 ΠΜ, MastroGiannis είπε

Πώς προκύπτει η δομή του αρχείου; Εισάγεις κάποιο .txt από κάποια άλλη εφαρμογή/συσκευή; Δεν έχουν οι τιμές πάντα την ίδια απόσταση σε γραμμές (Rows) από τις ιδιότητές τους;

Κάνεις συχνά αυτή την εργασία ή ήταν μια κι έξω; Αν την κάνεις συχνά, έχει ένα νόημα να τη βελτιώσεις τη ρουτίνα. Αν όμως ήταν για μια φορά, μια χαρά την έκανες και μπακαλίστικα. :)

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

 

μου το δώσανε το αρχείο.

οι τιμές έχουν πάντα την ίδια απόσταση. πχ υπάρχει ο τίτλος (πχ firstname) ένα κενό κελί και μετά η τιμή (πχ Marina).

αν για όλα τα άτομα τα στοιχεία ήταν ίδια στον αριθμό θα μπορούσα να το βρω με άλλον τρόπο αλλά μπορεί για ένα άτομο να έχει μόνο firstname και για το άλλο άλλα 3 στοιχεία.

 

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

το πρόβλημα μου δεν ήταν πως να το κάνω, το πρόβλημα μου ήταν γιατί δε δούλεψε η if. γι αυτό άνοιξα το θέμα

ευχαριστώ και πάλι όλους

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

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

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

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

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

Σύνδεση

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

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