marinax1 Δημοσ. 30 Δεκεμβρίου 2020 Δημοσ. 30 Δεκεμβρίου 2020 έχω ένα κομμάτι κώδικα και η ερώτηση μου αφορά αποκλειστικά την if. Αν η πρώτη if είναι αληθής, εκτελείται ο κώδικας Cells(k, 2).Value = Cells(i + 2, 1) στη συνέχεια το πρόγραμμα που πηγαίνει; βγαίνει έξω από την if. Κάνω δοκιμές κι έχω μπερδευτεί Sub Test() Dim i, j, k As Long k = 1 For i = 1 To 2000 If Cells(i, 1).Value = "0D" Then Cells(k, 2).Value = Cells(i + 2, 1) ElseIf Cells(i, 1).Value = "1D" Then Cells(k, 3).Value = Cells(i + 2, 1) ElseIf Cells(i, 1).Value = "3D" Then Cells(k, 4).Value = Cells(i + 2, 1) ElseIf Cells(i, 1).Value = "4D" Then Cells(k, 5).Value = Cells(i + 2, 1) k = k + 1 End If Next i End Sub
tsofras Δημοσ. 30 Δεκεμβρίου 2020 Δημοσ. 30 Δεκεμβρίου 2020 1 ώρα πριν, marinax1 είπε έχω ένα κομμάτι κώδικα και η ερώτηση μου αφορά αποκλειστικά την if. Αν η πρώτη if είναι αληθής, εκτελείται ο κώδικας Cells(k, 2).Value = Cells(i + 2, 1) στη συνέχεια το πρόγραμμα που πηγαίνει; βγαίνει έξω από την if. Κάνω δοκιμές κι έχω μπερδευτεί Sub Test() Dim i, j, k As Long k = 1 For i = 1 To 2000 If Cells(i, 1).Value = "0D" Then Cells(k, 2).Value = Cells(i + 2, 1) ElseIf Cells(i, 1).Value = "1D" Then Cells(k, 3).Value = Cells(i + 2, 1) ElseIf Cells(i, 1).Value = "3D" Then Cells(k, 4).Value = Cells(i + 2, 1) ElseIf Cells(i, 1).Value = "4D" Then Cells(k, 5).Value = Cells(i + 2, 1) k = k + 1 End If Next i End Sub Αν και δεν αναγνωρίζω την γλώσσα για να σου πώ αν έχεις κάποιο συντακτικό (vb είναι? ) Όπως το διαβάζω θα έλεγα ότι μετά την if τρέχει Cells(k, 2).Value = Cells(i + 2, 1) και τέλος πάει στο Next i Επειδή όμως δεν γνωρίζω την σύνταξη και δεν έχει brackets ή tabs μπερδεύομαι λίγο στην περίπτωσή σου στο σημείο που έχεις την End If Θεωρώ ότι το k = k+1 θα τρέξει μόνο όταν μπεί στην ElseIf Cells(i, 1).Value = "4D" Then
marinax1 Δημοσ. 30 Δεκεμβρίου 2020 Μέλος Δημοσ. 30 Δεκεμβρίου 2020 (επεξεργασμένο) Καλησπέρα, είναι VBA αλλά δε μας ενδιαφέρει τόσο ο κώδικας και τα συντακτικά λάθη. Το θέμα είναι να κατανοήσω την if γιατί μπερδεύομαι με τη σειρά των εντολών που θα εκτελεστούν. Αυτό με ενδιαφέρει να μάθω. Για την ιστορία, δεν ξέρω αν βοηθάει.. έχω μια στήλη του excel με διάφορα-διαφορετικά δεδομένα (2000, είναι το i). σε κάποια κελιά υπάρχουν τα δεδομένα 0D, 1D, 3D, 4D. Μπορεί να υπάρχουν από 100 φορές το καθένα.. εγώ με την if ψάχνω τα κελιά και μόλις βρω κελί που το περιεχόμενο είναι ένα από αυτά τα 4, τότε θέλω να πάρει το περιεχόμενο 2 κελιών παρακάτω και να το τοποθετήσει κάπου αλλού Μπορώ να το κάνω με 4 for-if, κάθε μια να ψάχνει και από 1 και έληξε το θέμα. αλλά ο στόχος μου είναι να κατανοήσω αυτό με την If, όπως το έχω τώρα δε δουλεύει. προσπερνάει κάποια δεδομένα, άρα σε κάποιο σημείο ο κώδικας "πηδάει" ενώ δε θα έπρεπε Θα μου πείτε ότι μπορώ να το κάνω με case, ok. απλά έφαγα κόλλημα που έχω κάνει λάθος με το if λογικά όπως δουλεύει εδώ, δουλεύει σε όλες τις γλώσσες προγραμματισμού φαντάζομαι Επεξ/σία 30 Δεκεμβρίου 2020 από marinax1
marios28 Δημοσ. 30 Δεκεμβρίου 2020 Δημοσ. 30 Δεκεμβρίου 2020 22 λεπτά πριν, marinax1 είπε Το θέμα είναι να κατανοήσω την if γιατί μπερδεύομαι με τη σειρά των εντολών που θα εκτελεστούν. Αυτό με ενδιαφέρει να μάθω. Κατάλαβες τι σου έγραψε ο @tsofras; Η ανάθεση κ=κ+1 (λογικά) εκτελείται όταν μπαίνει στην 4η if. Ούτε εγώ γνωρίζω vba, αλλά μάλλον αυτό ισχύει. Αυτό θες; Μήπως πρέπει να τη βάλεις αμέσως μετά την εντολή End If; Με λίγα λόγια μπορείς να διαβάζεις σωστά τη στήλη, αλλά να μην γράφεις σωστά τα δεδομένα με τις εντολές Cells(k, ....).Value = Cells(i + 2, 1). Καλύτερα τσέκαρε πρώτα (με κάποιου τύπου print, με debugger, δεν ξέρω τι χρησιμοποιείς) αν τα διαβάζεις σωστά και κατόπιν περνάς στις αναθέσεις. 2
tsofras Δημοσ. 30 Δεκεμβρίου 2020 Δημοσ. 30 Δεκεμβρίου 2020 (επεξεργασμένο) 43 λεπτά πριν, marinax1 είπε Καλησπέρα, είναι VBA αλλά δε μας ενδιαφέρει τόσο ο κώδικας και τα συντακτικά λάθη. Το θέμα είναι να κατανοήσω την if γιατί μπερδεύομαι με τη σειρά των εντολών που θα εκτελεστούν. Αυτό με ενδιαφέρει να μάθω. Για την ιστορία, δεν ξέρω αν βοηθάει.. έχω μια στήλη του excel με διάφορα-διαφορετικά δεδομένα (2000, είναι το i). σε κάποια κελιά υπάρχουν τα δεδομένα 0D, 1D, 3D, 4D. Μπορεί να υπάρχουν από 100 φορές το καθένα.. εγώ με την if ψάχνω τα κελιά και μόλις βρω κελί που το περιεχόμενο είναι ένα από αυτά τα 4, τότε θέλω να πάρει το περιεχόμενο 2 κελιών παρακάτω και να το τοποθετήσει κάπου αλλού Μπορώ να το κάνω με 4 for-if, κάθε μια να ψάχνει και από 1 και έληξε το θέμα. αλλά ο στόχος μου είναι να κατανοήσω αυτό με την If, όπως το έχω τώρα δε δουλεύει. προσπερνάει κάποια δεδομένα, άρα σε κάποιο σημείο ο κώδικας "πηδάει" ενώ δε θα έπρεπε Θα μου πείτε ότι μπορώ να το κάνω με case, ok. απλά έφαγα κόλλημα που έχω κάνει λάθος με το if λογικά όπως δουλεύει εδώ, δουλεύει σε όλες τις γλώσσες προγραμματισμού φαντάζομαι Αυτό που λέμε με τον @marios28 αν και οι 2 δεν ξέρουμε VBA είναι ότι θεωρητικά πρέπει να βγάλεις το κ=κ+1 πριν απο το EndIf και να το βάλεις απο κάτω. Έτσι όπως το έχεις γράψει εσύ τώρα δλδ σε ψευδοκώδικα (όχι σχολής θα στο πώ απλά ) είναι : Για κάθε i απο το ένα μέχρι το 2000 Αν η τιμή στο κελί i, 1) είναι = "0D" Τότε Cells(k, 2).Value = Cells(i + 2, 1) Αλλιώς αν η τιμή στο κελί Cells(i, 1) είναι "1D" Τότε Cells(k, 3).Value = Cells(i + 2, 1) Αλλιώς αν η τιμή στο κελί Cells(i, 1) είναι "3D" Τότε Cells(k, 4).Value = Cells(i + 2, 1) Αλλιώς αν η τιμή στο κελί Cells(i, 1) είναι "4D" Τότε Cells(k, 5).Value = Cells(i + 2, 1) Δώσε τιμή στο k την τιμή που είχε το k +1 Τέλος της συνθήκης Ανέβασε το i κατά 1 Οπότε σύμφωνα με το παραπάνω η τιμή του k αλλάζει μόνο όταν μπεί στην συνθήκη που η τιμή είναι 4D. Στις άλλες περιπτώσεις δεν αλλάζει γιατί δεν έχει μπεί μέσα σε αυτό το μπλοκ κώδικα Για να παίξει σωστά θεωρητικά πρέπει να γίνει έτσι : Sub Test() Dim i, j, k As Long k = 1 For i = 1 To 2000 If Cells(i, 1).Value = "0D" Then Cells(k, 2).Value = Cells(i + 2, 1) ElseIf Cells(i, 1).Value = "1D" Then Cells(k, 3).Value = Cells(i + 2, 1) ElseIf Cells(i, 1).Value = "3D" Then Cells(k, 4).Value = Cells(i + 2, 1) ElseIf Cells(i, 1).Value = "4D" Then Cells(k, 5).Value = Cells(i + 2, 1) End If k = k + 1 Next i End Sub Αυτός είναι και ο λόγος που "πηδάει" 'όπως λες γραμμές Αν έχεις απορία πες μας να το εξηγήσουμε διαφορετικά Α και κάνε παράθεση αν απαντάς γιατί δεν μου ήρθε ειδοποίηση στην 2η ερώτηση σου , απλά το είδε επειδή με έκανε tag ο marios28 Επεξ/σία 30 Δεκεμβρίου 2020 από tsofras 2
marinax1 Δημοσ. 30 Δεκεμβρίου 2020 Μέλος Δημοσ. 30 Δεκεμβρίου 2020 6 λεπτά πριν, tsofras είπε Αν έχεις απορία πες μας να το εξηγήσουμε διαφορετικά ευχαριστώ για τις απαντήσεις. καλά θα βγάλουμε άκρη δε φοβάμαι. ίσως δεν έχετε καταλάβει κι εσείς τι θέλω να πετύχω, δε το έχω εξηγήσει καλά, έπρεπε να ανεβάσω μια εικόνα έκανα την αλλαγή που είπατε, εμφανίστηκαν τα στοιχεία που ήθελα αλλά.... εγω θέλω να ψάχνω όλη τη στήλη μόλις βρω ένα απο τα 4 δεδομένα (μπορεί να βρεθεί στη γραμμή 25) τότε θέλω να πάρω το περιεχόμενο του κελιού 2 γραμμών κάτω (Α27) και να το τοποθετήσω στη δίπλα στήλη στο κελι Β1. ξεκινάω από την αρχή να γεμίζω τη στήλη προς τα κάτω εν συνεχεία αν βρεθεί πάλι στη γραμμή πχ 250 (A250), τότε το περιεχόμενο 2 γραμμών κάτω (A252) να μπει στο Β2. με το δικό σας τρόπο δε το κάνει αυτό. αλλά. Βρίσκει πχ το κελί Α25 και το περιεχόμενο Α27 το βάζει στο Β27 (δηλαδή δίπλα) βρίσκει το Α500 (άρα πρέπει να πάρει το Α502) και το βάζει στο Β502. και σε όλα αυτά έχω το εξής, αν βρει το 0D θα το βάλει στη στήλη Β, το 1D στη C..... θα ανεβάσω λίγο αργότερα... ακριβώς τι εννοώ με εικόνα
xristos97 Δημοσ. 30 Δεκεμβρίου 2020 Δημοσ. 30 Δεκεμβρίου 2020 2 ώρες πριν, tsofras είπε Αν και δεν αναγνωρίζω την γλώσσα για να σου πώ αν έχεις κάποιο συντακτικό (vb είναι? ) Όπως το διαβάζω θα έλεγα ότι μετά την if τρέχει Cells(k, 2).Value = Cells(i + 2, 1) και τέλος πάει στο Next i Επειδή όμως δεν γνωρίζω την σύνταξη και δεν έχει brackets ή tabs μπερδεύομαι λίγο στην περίπτωσή σου στο σημείο που έχεις την End If Θεωρώ ότι το k = k+1 θα τρέξει μόνο όταν μπεί στην ElseIf Cells(i, 1).Value = "4D" Then Οπως το λες ειναι: https://onlinegdb.com/Hkv5TL9pD 2
marios28 Δημοσ. 30 Δεκεμβρίου 2020 Δημοσ. 30 Δεκεμβρίου 2020 (επεξεργασμένο) 1 ώρα πριν, marinax1 είπε με το δικό σας τρόπο δε το κάνει αυτό. αλλά. Βρίσκει πχ το κελί Α25 και το περιεχόμενο Α27 το βάζει στο Β27 (δηλαδή δίπλα) Δεν είναι δικός μας τρόπος. Δεν ξέραμε τι θέλεις και σου γράψαμε ότι ίσως είναι λάθος αυτό που έχεις κάνει. Λογικά θες να κάνεις το εξής (αν καταλαβαίνω σωστά): Εάν Cells(i, 1).Value = "0D" Ή (δεν ξέρω ποιος είναι ο λογικός τελεστής στη vba) Ή Cells(i, 1).Value = "1D" Ή ... κ.τ.λ (και τις 4 περιπτώσεις) κάνεις την ανάθεση: Cells(k, 2).Value = Cells(i + 2, 1) και αυξάνεις το κ με την εντολή κ=κ+1 μέσα στην if η ανάθεση και η αύξηση του k. edit... τώρα ξαναδιάβασα και είδα ότι θες να τα βάζεις όχι μόνο σε μία στήλη, αλλά σε τέσσερις. Οπότε άκυρο το or. Χρειάζεσαι άλλες 3 μεταβλητές για να αυξάνεις τον μετρητή της κάθε στήλης χωριστά. Όπως δηλαδή ο αρχικός σου κώδικας, αλλά σε κάθε if θα αυξάνεις τον αντίστοιχο μετρητή της στήλης. Φυσικά η ανάθεση σε κάθε if θα γίνεται βάσει της αντίστοιχης μεταβλητής/μετρητή. Δοκίμασε το παρακάτω αν βγάζει σωστό αποτέλεσμα. For i = 1 To 2000 If Cells(i, 1).Value = "0D" Then Cells(k, 2).Value = Cells(i + 2, 1) k = k + 1 ElseIf Cells(i, 1).Value = "1D" Then Cells(l, 3).Value = Cells(i + 2, 1) l = l + 1 ElseIf Cells(i, 1).Value = "3D" Then Cells(m, 4).Value = Cells(i + 2, 1) m = m + 1 ElseIf Cells(i, 1).Value = "4D" Then Cells(n, 5).Value = Cells(i + 2, 1) n = n + 1 End If Next i Επεξ/σία 30 Δεκεμβρίου 2020 από marios28 1
papmel Δημοσ. 31 Δεκεμβρίου 2020 Δημοσ. 31 Δεκεμβρίου 2020 (επεξεργασμένο) https://www.tutorialspoint.com/vbscript/vbscript_if_elseif_else_statement.htm Αυτο που ζητας να μην το βαζει διπλα δηλαδη το πετυχαινεις με εναν counter. στην αρχη ο counter δειχνει στο 1 κελλι. πχ dim counter counter=0 καθε φορα που θα βρισκεις κατι που θέλεις πριν το γραψεις στο κελι Β θα αυξανεις τον μετρητη ( counter) πχ counter=counter+1 και μετα θα γραφεις στο Row του counter αυτο που βρηκες. και ενα TIP οταν συγκρινεις περιεχομενα των Cells ειναι πιο χρονοβόρο απο το να βαζειςμεσα στον βρογχο το κελι σε μια μεταβλητη. πχ mycell=cell(a,b) και μετα if mycell= klp ετσι θα συγκρινεις την μεταβλητη και δεν χρειαζετε ο κωδικας να ψαχνει να βρει τα περιεχομενα του κελιου καθε φορα απο το 1 εως το 2000 Επεξ/σία 31 Δεκεμβρίου 2020 από papmel
MastroGiannis Δημοσ. 31 Δεκεμβρίου 2020 Δημοσ. 31 Δεκεμβρίου 2020 1 ώρα πριν, papmel είπε και ενα TIP οταν συγκρινεις περιεχομενα των Cells ειναι πιο χρονοβόρο απο το να βαζειςμεσα στον βρογχο το κελι σε μια μεταβλητη. πχ mycell=cell(a,b) και μετα if mycell= klp ετσι θα συγκρινεις την μεταβλητη και δεν χρειαζετε ο κωδικας να ψαχνει να βρει τα περιεχομενα του κελιου καθε φορα απο το 1 εως το 2000 Συγνώμη αλλά αυτό που λες δεν ισχύει εφόσον το κελί που συμμετέχει κάθε φορά στη σύγκριση είναι συγκεκριμένο και διαφορετικό. Η σύγκριση δεν ψάχνει για την τιμή σε περιοχή 2000 κελιών. Σωστός ο @marios28 για τις τέσσερις μεταβλητές αλλά νομίζω πως με την Select Case ο κώδικας γίνεται απλούστερος και πιο ευανάγνωστος, ειδικά μέσα σε μια δομή With-End With: Sub test() Dim i As Long Dim j As Long Dim k As Long Dim l As Long Dim m As Long 'Υποθέτω πως δεν χρειάζεται να ελέγχεις τα επόμενα δύο κελιά 'οπότε ο μετρητής έχει βήμα ανά τρία κελιά. 'Αν είμαι λάθος αφαίρεσε το Step 3 παρακάτω. For i = 1 To 2000 Step 3 With Cells(i, 1) Select Case LCase(.Value) 'H Select Case είναι "case-sensitive". Case "0d" j = j + 1 Cells(j, 2) = .Offset(2) Case "1d" k = k + 1 Cells(k, 3) = .Offset(2) Case "3d" l = l + 1 Cells(l, 4) = .Offset(2) Case "4d" m = m + 1 Cells(m, 5) = .Offset(2) End Select End With Next i End Sub Ενημερωτικά, με το Dim i, j, k As Long έχεις δύο μεταβλητές τύπου Variant (I,j) και μια Long. Ακόμη και σε δηλώσεις μιας γραμμής, στη VBA, θα πρέπει να δηλώνεται ο τύπος για όλες τις μεταβλητές. Dim i As Long, j As Long, k As Long
papmel Δημοσ. 31 Δεκεμβρίου 2020 Δημοσ. 31 Δεκεμβρίου 2020 (επεξεργασμένο) Μόλις τώρα, MastroGiannis είπε Συγνώμη αλλά αυτό που λες δεν ισχύει εφόσον το κελί που συμμετέχει κάθε φορά στη σύγκριση είναι συγκεκριμένο και διαφορετικό. Η σύγκριση δεν ψάχνει για την τιμή σε περιοχή 2000 κελιών. κοιτα σε ενα Grid σε delphi ας πουμε ειναι 100 φορες πιο γρηγορο να βαζεις το κελλι σε μεταβλητη. Η ερωτηση που εκανε ηταν για τα If then elseif else και γιαυτο και κανει 4 Ελεγχους αρα ισχειυ αυτο που του ειπα. Και το Select Case 4 compare θα κανει το Cell με το value αρα και εκει χρειαζετε να μπει σε μεταβλητη απλα ειναι πιο ξεκαθαρος ο κωδικας. γενικα ποτε δεν βαζουμε Gui μεσα σε κωδικα αν πρωτα δεν το εχουμε καταχωρησει σε μια μεταβλητη.Τουλαχιστον ετσι το κανω εγω τοσα χρονια. και οι μετρησεις δειχνουν οτι ειναι 100 φορες πιο γρηγορος ο Ελεγχος. και μιας και μιλαμε για Optimize παλι ( ολως τυχαιως ) ο τροπος που θα το εκανε εγω ειναι ο εξης. Sub test() Dim i As Long Dim j As Long Dim k As Long Dim l As Long Dim m As Long dim myintval as integer For i = 1 To 2000 Step 3 myintval=Instr("0d1d3d4d",Cells(i, 1)) 'edo exo pleon me enan elexo to apotelesma 1 3 5 7 With Cells(i, 1) Select Case myintval ' einai poles fores pio grhgoros o elexos epeidi einai integer kai oxi string Case 1 j = j + 1 Cells(j, 2) = .Offset(2) Case 3 k = k + 1 Cells(k, 3) = .Offset(2) Case 4 l = l + 1 Cells(l, 4) = .Offset(2) Case 7 m = m + 1 Cells(m, 5) = .Offset(2) End Select End With Next i End Sub Ετσι βρισκεις αμέσως τι απο τα 4 ειναι και εχεις μια μεταβλητη με τιμες 1,3,5,7 και πρατεις αναλογα αλλα γλυτλωνεις τους 4 ελεγχους σε αλφαρηθμιτικα και ελεγχεις Integer. Ασε που μπορεις να το προχωρησεις και αλλο και να μην κανεις καν το Select αλλα να εχεις σε ενα Array τις τοποθεσιες που θες να βαλεις τα κειμενα. Υγ. στο Select case το Case 4 να αλλαξει σε Case 5 Επεξ/σία 31 Δεκεμβρίου 2020 από papmel
MastroGiannis Δημοσ. 1 Ιανουαρίου 2021 Δημοσ. 1 Ιανουαρίου 2021 19 ώρες πριν, papmel είπε κοιτα σε ενα Grid σε delphi ας πουμε ειναι 100 φορες πιο γρηγορο να βαζεις το κελλι σε μεταβλητη. Η ερωτηση που εκανε ηταν για τα If then elseif else και γιαυτο και κανει 4 Ελεγχους αρα ισχειυ αυτο που του ειπα. Πιθανότατα, υπό άλλες συνθήκες να είναι πιο αποδοτικό, αλλά, στην προκειμένη, που σε κάθε επανάληψη αλλάζει η αναφορά του κελιού και χρησιμοποιείται μια απλή και γρήγορη ιδιότητά του (.Value), η δημιουργία μιας ακόμα μεταβλητής και μιας ακόμα ανάθεσης τιμής, μέσα στο βρόχο, μάλλον επιβαρύνει την όλη διαδικασία παρά τη βελτιώνει. Η διαφωνία μου όμως είχε να κάνει με την αναζήτηση τις τιμής κάθε φορά σε 2000 κελιά, και, τώρα εσύ μιλάς μόνο για τέσσερις ελέγχους. Επίσης, αν και συμφωνώ με τη θεωρία των Integer, στην πρότασή σου, αναγκάζεσαι να χρησιμοποιήσεις μια διαδικασία για να παράξεις την ακέραια τιμή με αποτέλεσμα να χάνεις κατά πολύ το πλεονέκτημά τους. Βάλε και τις δυο διαδικασίες σε δοκιμασία να τις δεις στην πράξη και, αν θέλεις, ανακοίνωσέ μας τα αποτελέσματα. Καλή συνέχεια! Υ.Γ. Πολύ ωραίο το avatar σου!
papmel Δημοσ. 1 Ιανουαρίου 2021 Δημοσ. 1 Ιανουαρίου 2021 (επεξεργασμένο) Μόλις τώρα, MastroGiannis είπε Πιθανότατα, υπό άλλες συνθήκες να είναι πιο αποδοτικό, αλλά, στην προκειμένη, που σε κάθε επανάληψη αλλάζει η αναφορά του κελιού και χρησιμοποιείται μια απλή και γρήγορη ιδιότητά του (.Value), η δημιουργία μιας ακόμα μεταβλητής και μιας ακόμα ανάθεσης τιμής, μέσα στο βρόχο, μάλλον επιβαρύνει την όλη διαδικασία παρά τη βελτιώνει. Η διαφωνία μου όμως είχε να κάνει με την αναζήτηση τις τιμής κάθε φορά σε 2000 κελιά, και, τώρα εσύ μιλάς μόνο για τέσσερις ελέγχους. Επίσης, αν και συμφωνώ με τη θεωρία των Integer, στην πρότασή σου, αναγκάζεσαι να χρησιμοποιήσεις μια διαδικασία για να παράξεις την ακέραια τιμή με αποτέλεσμα να χάνεις κατά πολύ το πλεονέκτημά τους. Βάλε και τις δυο διαδικασίες σε δοκιμασία να τις δεις στην πράξη και, αν θέλεις, ανακοίνωσέ μας τα αποτελέσματα. Καλή συνέχεια! Υ.Γ. Πολύ ωραίο το avatar σου! οπως ειπα το Select Case μετα και τα If δεν χρειάζονται Οποτε ο κωδικας που εδωσα ειναι ενας ελεγχος μονο αοφυ μπορει τα Positions των row να τα εχει σε εναν Pinaka. Στειλτε μου εσεις Data και εγω ευαχριστως να ανεβασω τα αποτελεσματα των δυο TEST. αν και θεωρω απο τωρα οτι θα ειναι τουλαχιστον 100 φορες πιο γρηγορο αν τα Data ειναι πανο απο 100.000 records. και για την ιστορια σε 800.000 rows 1 τροπος Seconds to 2 decimal places: 10,50 2ος τροπος (δικος μου ) Seconds to 2 decimal places: 10,02 κωδικας για να το τεσταρεις και εσυ Dim fpos(7): fpos(1) = 0: fpos(3) = 0: fpos(5) = 0: fpos(5) = 0 Dim fposition(7): fposition(1) = 2: fposition(3) = 3: fposition(5) = 4: fposition(7) = 5 Dim fdata(7): fdata(1) = "0d": fdata(3) = "1d": fdata(5) = "2d": fdata(7) = "3d" Dim myintval Dim fs As String Dim i As Long For i = 1 To 800000 fs = Cells(i, 1) myintval = InStr("0d1d2d3d", fs) fpos(myintval) = fpos(myintval) + 1 Cells(fpos(myintval), fposition(myintval)) = fdata(myintval) Next i Να σημειώσουμε εδω οτι αν δεν βαλεις το fs=cells(i,1) και το χωσεις κατευθειαν μεσα στο isntr px myintval = InStr("0d1d2d3d", Cells(i, 1)) τοτε η διαφορα ειναι ασημαντη και ειναι 10.42 Seconds Επεξ/σία 1 Ιανουαρίου 2021 από papmel
k33theod Δημοσ. 1 Ιανουαρίου 2021 Δημοσ. 1 Ιανουαρίου 2021 (επεξεργασμένο) Για να απαντήσουμε ξεκάθαρα στην @marinax1 Σε ένα if με πολλά else if και else εκτελείται μόνο μία συνθήκη (εάν px το 1ο if είναι αληθές θα εκτελεστεί ο κώδικας του και τίποτα άλλο) και μετά ο έλεγχος μεταφέρεται μετά το else. Επίσης ο τρόπος που αντιμετοπίζονται προβλήματα όταν έχουμε πολλά if είναι με τη δημιουργία μια λίστας. Τα κλειδιά είναι αυτές οι τίμες που έχεις στις συνδθήκες if και οι τιμές είναι κάποιες αντιστοιχίσεις τους. Στη συγκεκριμένη περίπτωση η τιμές που αλλάζεις εκεί στο Cells(k, 2).Value Και ο κώδικας μοιάζει κάπως έτσι: lista = ["0D":2, "1D":3, "3D":4,"4D":5 ] For i = 1 To 2000 let a = cells(i,1).value; cells(k, lista(a)).value = cells(i+2,1) || default//όπου default to else k = k + 1 Next i Δεν έχεις καθόλου if ή cases έχεις μια λίστα που σου γυρνάει τιμή σε Ο(1) χρόνο. Καλή Χρονιά Επεξ/σία 1 Ιανουαρίου 2021 από k33theod
MastroGiannis Δημοσ. 1 Ιανουαρίου 2021 Δημοσ. 1 Ιανουαρίου 2021 (επεξεργασμένο) 25 λεπτά πριν, k33theod είπε Δεν έχεις καθόλου if ή cases έχεις μια λίστα που σου γυρνάει τιμή σε Ο(1) χρόνο. Χρειάζεσαι τουλάχιστον μια IF για να ελέγξεις αν η lista(a) δεν επιστρέφει κάτι ανεπιθύμητο, ενώ, μόνο με την k, οι στήλες θα έχουν κενά. Πρέπει να μετράς τις "επιτυχίες" κάθε στήλης ξεχωριστά. Διαφορετικά, έφτανε η i. Καλή χρονιά επίσης! Επεξ/σία 1 Ιανουαρίου 2021 από MastroGiannis
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα