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

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

Δημοσ.

έχω ένα κομμάτι κώδικα και  η ερώτηση μου αφορά αποκλειστικά την 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

 

Δημοσ.
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

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

Καλησπέρα, είναι VBA αλλά δε μας ενδιαφέρει τόσο ο κώδικας και τα συντακτικά λάθη. Το θέμα είναι να κατανοήσω την if γιατί μπερδεύομαι με τη σειρά των εντολών που θα εκτελεστούν. Αυτό με ενδιαφέρει να μάθω.

Για την ιστορία, δεν ξέρω αν βοηθάει..

έχω μια στήλη του excel με διάφορα-διαφορετικά δεδομένα (2000, είναι το i).

σε κάποια κελιά υπάρχουν τα δεδομένα 0D, 1D, 3D, 4D. Μπορεί να υπάρχουν από 100 φορές το καθένα..

εγώ με την if ψάχνω τα κελιά και μόλις βρω κελί που το περιεχόμενο είναι ένα από αυτά τα 4, τότε θέλω να πάρει το περιεχόμενο 2 κελιών παρακάτω και να το τοποθετήσει κάπου αλλού

Μπορώ να το κάνω με 4 for-if, κάθε μια να ψάχνει και από 1 και έληξε το θέμα.

αλλά ο στόχος μου είναι να κατανοήσω αυτό με την If, όπως το έχω τώρα δε δουλεύει. προσπερνάει κάποια δεδομένα, άρα σε κάποιο σημείο ο κώδικας "πηδάει" ενώ δε θα έπρεπε

Θα μου πείτε ότι μπορώ να το κάνω με case, ok. απλά έφαγα κόλλημα που έχω κάνει λάθος με το if

λογικά όπως δουλεύει εδώ, δουλεύει σε όλες τις γλώσσες προγραμματισμού φαντάζομαι

Επεξ/σία από marinax1
Δημοσ.
22 λεπτά πριν, marinax1 είπε

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

Κατάλαβες τι σου έγραψε ο @tsofras;  Η ανάθεση κ=κ+1 (λογικά) εκτελείται όταν μπαίνει στην 4η if.  Ούτε εγώ γνωρίζω vba, αλλά μάλλον αυτό ισχύει.

Αυτό θες; Μήπως πρέπει να τη βάλεις αμέσως μετά την εντολή End If; Με λίγα λόγια μπορείς να διαβάζεις σωστά τη στήλη, αλλά να μην γράφεις σωστά τα δεδομένα με τις εντολές Cells(k, ....).Value = Cells(i + 2, 1). Καλύτερα τσέκαρε πρώτα (με κάποιου τύπου print, με debugger, δεν ξέρω τι χρησιμοποιείς) αν τα διαβάζεις σωστά και κατόπιν περνάς στις αναθέσεις.

  • Like 2
Δημοσ. (επεξεργασμένο)
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

Επεξ/σία από tsofras
  • Like 2
Δημοσ.
6 λεπτά πριν, tsofras είπε

Αν έχεις απορία πες μας να το εξηγήσουμε διαφορετικά

ευχαριστώ για τις απαντήσεις. καλά θα βγάλουμε άκρη δε φοβάμαι.

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

έκανα την αλλαγή που είπατε, εμφανίστηκαν τα στοιχεία που ήθελα αλλά....

εγω θέλω να ψάχνω όλη τη στήλη

μόλις βρω ένα απο τα 4 δεδομένα (μπορεί να βρεθεί στη γραμμή 25) τότε θέλω να πάρω το περιεχόμενο του κελιού 2 γραμμών κάτω (Α27) και να το τοποθετήσω στη δίπλα στήλη στο κελι Β1. ξεκινάω από την αρχή να γεμίζω τη στήλη προς τα κάτω

εν συνεχεία αν βρεθεί πάλι στη γραμμή πχ 250 (A250), τότε το περιεχόμενο 2 γραμμών κάτω (A252) να μπει στο Β2.

με το δικό σας τρόπο δε το κάνει αυτό. αλλά. Βρίσκει πχ το κελί Α25 και το περιεχόμενο Α27 το βάζει στο Β27 (δηλαδή δίπλα)

βρίσκει το Α500 (άρα πρέπει να πάρει το Α502) και το βάζει στο Β502.

και σε όλα αυτά έχω το εξής, αν βρει το 0D θα το βάλει στη στήλη Β, το 1D στη C.....

 

θα ανεβάσω λίγο αργότερα... ακριβώς τι εννοώ με εικόνα

Δημοσ.
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

  • Like 2
Δημοσ. (επεξεργασμένο)
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
Επεξ/σία από marios28
  • Like 1
Δημοσ. (επεξεργασμένο)

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


 

Επεξ/σία από papmel
Δημοσ.
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

 

Δημοσ. (επεξεργασμένο)
Μόλις τώρα, 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
 

Επεξ/σία από papmel
Δημοσ.
19 ώρες πριν, papmel είπε

κοιτα σε ενα Grid σε delphi ας πουμε ειναι 100 φορες πιο γρηγορο να βαζεις το κελλι σε μεταβλητη.
Η ερωτηση που εκανε ηταν για τα If then elseif else και γιαυτο και κανει 4 Ελεγχους αρα ισχειυ αυτο που του ειπα.

Πιθανότατα, υπό άλλες συνθήκες να είναι πιο αποδοτικό, αλλά, στην προκειμένη, που σε κάθε επανάληψη αλλάζει η αναφορά του κελιού και χρησιμοποιείται μια απλή και γρήγορη ιδιότητά του (.Value), η δημιουργία μιας ακόμα μεταβλητής και μιας ακόμα ανάθεσης τιμής, μέσα στο βρόχο, μάλλον επιβαρύνει την όλη διαδικασία παρά τη βελτιώνει. Η διαφωνία μου όμως είχε να κάνει με την αναζήτηση τις τιμής κάθε φορά σε 2000 κελιά, και, τώρα εσύ μιλάς μόνο για τέσσερις ελέγχους. :huh:

Επίσης, αν και συμφωνώ με τη θεωρία των Integer, στην πρότασή σου, αναγκάζεσαι να χρησιμοποιήσεις μια διαδικασία για να παράξεις την ακέραια τιμή με αποτέλεσμα να χάνεις κατά πολύ το πλεονέκτημά τους.

Βάλε και τις δυο διαδικασίες σε δοκιμασία να τις δεις στην πράξη και, αν θέλεις, ανακοίνωσέ μας τα αποτελέσματα.

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

Υ.Γ.

Πολύ ωραίο το avatar σου! :cool:

Δημοσ. (επεξεργασμένο)
Μόλις τώρα, MastroGiannis είπε

Πιθανότατα, υπό άλλες συνθήκες να είναι πιο αποδοτικό, αλλά, στην προκειμένη, που σε κάθε επανάληψη αλλάζει η αναφορά του κελιού και χρησιμοποιείται μια απλή και γρήγορη ιδιότητά του (.Value), η δημιουργία μιας ακόμα μεταβλητής και μιας ακόμα ανάθεσης τιμής, μέσα στο βρόχο, μάλλον επιβαρύνει την όλη διαδικασία παρά τη βελτιώνει. Η διαφωνία μου όμως είχε να κάνει με την αναζήτηση τις τιμής κάθε φορά σε 2000 κελιά, και, τώρα εσύ μιλάς μόνο για τέσσερις ελέγχους. :huh:

Επίσης, αν και συμφωνώ με τη θεωρία των Integer, στην πρότασή σου, αναγκάζεσαι να χρησιμοποιήσεις μια διαδικασία για να παράξεις την ακέραια τιμή με αποτέλεσμα να χάνεις κατά πολύ το πλεονέκτημά τους.

Βάλε και τις δυο διαδικασίες σε δοκιμασία να τις δεις στην πράξη και, αν θέλεις, ανακοίνωσέ μας τα αποτελέσματα.

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

Υ.Γ.

Πολύ ωραίο το avatar σου! :cool:

 οπως ειπα το 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  


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

Για να απαντήσουμε ξεκάθαρα στην @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) χρόνο.

Καλή Χρονιά

Επεξ/σία από k33theod
Δημοσ. (επεξεργασμένο)
25 λεπτά πριν, k33theod είπε

Δεν έχεις καθόλου if ή cases έχεις μια λίστα που σου γυρνάει τιμή σε Ο(1) χρόνο.

Χρειάζεσαι τουλάχιστον μια IF για να ελέγξεις αν η lista(a) δεν επιστρέφει κάτι ανεπιθύμητο, ενώ, μόνο με την k, οι στήλες θα έχουν κενά. Πρέπει να μετράς τις "επιτυχίες" κάθε στήλης ξεχωριστά. Διαφορετικά, έφτανε η i.

Καλή χρονιά επίσης!

Επεξ/σία από MastroGiannis

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

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

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

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

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

Σύνδεση

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

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