Ο απλούστερος τύπος βρόχου στον προγραμματισμό του Excel VBA είναι ένας βρόχος For-Next. Ο βρόχος ελέγχεται από μια μεταβλητή μετρητή, η οποία ξεκινά από μια τιμή και σταματά σε μια άλλη τιμή. Οι δηλώσεις μεταξύ της πρότασης For και της εντολής Next είναι οι δηλώσεις που επαναλαμβάνονται στον βρόχο.
Ένα παράδειγμα για το επόμενο
Το παρακάτω παράδειγμα χρησιμοποιεί έναν βρόχο For-Next για να αθροίσει τους πρώτους 1.000 θετικούς αριθμούς. Η μεταβλητή Σύνολο ξεκινά ως μηδέν. Έπειτα γίνεται το looping. Η μεταβλητή Cnt είναι ο μετρητής βρόχου. Ξεκινά ως 1 και αυξάνεται κατά 1 κάθε φορά μέσω του βρόχου. Ο βρόχος τελειώνει όταν το Cnt είναι 1.000.
Αυτό το παράδειγμα έχει μόνο μία δήλωση μέσα στον βρόχο. Αυτή η δήλωση προσθέτει την τιμή του Cnt στη μεταβλητή Total. Όταν τελειώσει ο βρόχος, ένα MsgBox εμφανίζει το άθροισμα των αριθμών.
Sub AddNumbers()
Dim Total As Double
Dim Cnt As Long
Σύνολο = 0
Για Cnt = 1 έως 1000
Σύνολο = Σύνολο + Cnt
Επόμενο Cnt
Σύνολο MsgBox
End Sub
Επειδή ο μετρητής βρόχου είναι μια κανονική μεταβλητή, μπορείτε να γράψετε κώδικα για να αλλάξετε την τιμή του μέσα στο μπλοκ κώδικα μεταξύ των εντολών For και Next. Αυτό, ωστόσο, είναι μια πολύ κακή πρακτική.
Για-Επόμενα παραδείγματα με Βήμα
Μπορείτε να χρησιμοποιήσετε μια τιμή Step για να παραλείψετε ορισμένες τιμές μετρητή σε έναν βρόχο For-Next. Ακολουθεί το προηγούμενο παράδειγμα, που γράφτηκε ξανά για να αθροιστούν μόνο οι περιττοί αριθμοί μεταξύ 1 και 1.000:
Sub AddOddNumbers()
Dim Total As Double
Dim Cnt As Long
Σύνολο = 0
Για Cnt = 1 έως 1000 Βήμα 2
Σύνολο = Σύνολο + Cnt
Επόμενο Cnt
Σύνολο MsgBox
End Sub
Αυτή τη φορά, το Cnt ξεκινά ως 1 και στη συνέχεια παίρνει τιμές 3, 5, 7 και ούτω καθεξής. Η τιμή Step καθορίζει τον τρόπο με τον οποίο αυξάνεται ο μετρητής. Παρατηρήστε ότι η τιμή του ανώτερου βρόχου (1000) δεν χρησιμοποιείται στην πραγματικότητα επειδή η υψηλότερη τιμή του Cnt θα είναι 999.
Ακολουθεί ένα άλλο παράδειγμα που χρησιμοποιεί τιμή Βήματος 3. Αυτή η διαδικασία λειτουργεί με το ενεργό φύλλο και εφαρμόζει σκίαση ανοιχτού γκρι σε κάθε τρίτη σειρά, από τη σειρά 1 έως τη σειρά 100.
Sub ShadeEveryThirdRow()
Dim i As Long
Για i = 1 έως 100 Βήμα 3
Σειρές(i).Εσωτερικό.Χρώμα = RGB(200, 200, 200)
Επόμενο i
End Sub
Δείτε το αποτέλεσμα της εκτέλεσης αυτής της μακροεντολής.
Χρήση βρόχου για εφαρμογή σκίασης φόντου σε σειρές.
Ένα παράδειγμα For-Next με δήλωση Exit For
Ένας βρόχος For-Next μπορεί επίσης να περιλαμβάνει μία ή περισσότερες δηλώσεις Exit For εντός του βρόχου. Όταν το VBA συναντήσει αυτήν τη δήλωση, ο βρόχος τερματίζεται αμέσως.
Το ακόλουθο παράδειγμα δείχνει την πρόταση Exit For. Αυτή η ρουτίνα είναι μια διαδικασία λειτουργίας, που προορίζεται να χρησιμοποιηθεί σε έναν τύπο φύλλου εργασίας. Η συνάρτηση δέχεται ένα όρισμα (μια μεταβλητή με το όνομα Str) και επιστρέφει τους χαρακτήρες στα αριστερά του πρώτου αριθμητικού ψηφίου. Για παράδειγμα, εάν το όρισμα είναι "KBR98Z", η συνάρτηση επιστρέφει "KBR".
Συνάρτηση TextPart(Str)
Dim i As Long
TextPart = ""
Για i = 1 To Len(Str)
Αν IsNumeric(Mid(Str, i, 1)) Τότε
Έξοδος για
Αλλού
TextPart = TextPart & Mid(Str, i, 1)
Τέλος εαν
Επόμενο i
Λειτουργία τερματισμού
Ο βρόχος For-Next ξεκινά με 1 και τελειώνει με τον αριθμό που αντιπροσωπεύει τον αριθμό των χαρακτήρων στη συμβολοσειρά. Ο κώδικας χρησιμοποιεί τη συνάρτηση Mid της VBA για να εξαγάγει έναν μόνο χαρακτήρα εντός του βρόχου. Εάν βρεθεί ένας αριθμητικός χαρακτήρας, εκτελείται η πρόταση Exit For και ο βρόχος τελειώνει πρόωρα.
Εάν ο χαρακτήρας δεν είναι αριθμητικός, προστίθεται στην τιμή που επιστρέφεται (η οποία είναι ίδια με το όνομα της συνάρτησης). Η μόνη φορά που ο βρόχος θα εξετάσει κάθε χαρακτήρα είναι εάν η συμβολοσειρά που πέρασε καθώς το όρισμα δεν περιέχει αριθμητικούς χαρακτήρες.
Ένα ένθετο παράδειγμα For-Next
Μπορείτε να έχετε οποιονδήποτε αριθμό δηλώσεων στον βρόχο και να τοποθετήσετε τους βρόχους For-Next μέσα σε άλλους βρόχους For-Next.
Το παρακάτω παράδειγμα χρησιμοποιεί έναν ένθετο βρόχο For-Next για την εισαγωγή τυχαίων αριθμών σε μια περιοχή κελιών 12 σειρών επί 5 στηλών. Παρατηρήστε ότι η ρουτίνα εκτελεί τον εσωτερικό βρόχο (τον βρόχο με τον μετρητή Row) μία φορά για κάθε επανάληψη του εξωτερικού βρόχου (τον βρόχο με τον μετρητή Col). Με άλλα λόγια, η ρουτίνα εκτελεί την πρόταση Cells(Row, Col) = Rnd 60 φορές.
Αυτά τα κελιά γεμίστηκαν χρησιμοποιώντας έναν ένθετο βρόχο For-Next.
Sub FillRange()
Dim Col As Long
Αδύναμη σειρά όσο διαρκεί
Για Col = 1 έως 5
Για σειρά = 1 έως 12
Κελιά(Σειρά, Στήλη) = Rnd
Επόμενη σειρά
Επόμενος Κολ
End Sub
Το επόμενο παράδειγμα χρησιμοποιεί ένθετους βρόχους For-Next για να προετοιμάσει έναν τρισδιάστατο πίνακα με την τιμή 100. Αυτή η ρουτίνα εκτελεί τη δήλωση στη μέση όλων των βρόχων (η δήλωση εκχώρησης) 1.000 φορές (10 * 10 * 10), κάθε φορά με διαφορετικό συνδυασμό τιμών για i, j και k:
Sub NestedLoops()
Dim MyArray(10, 10, 10)
Dim i As Long
Dim j As Long
Dim k As Long
Για i = 1 έως 10
Για j = 1 έως 10
Για k = 1 έως 10
MyArray(i, j, k) = 100
Επόμενο κ
Επόμενο j
Επόμενο i
Άλλες δηλώσεις πηγαίνουν εδώ
End Sub
Ακολουθεί ένα τελευταίο παράδειγμα που χρησιμοποιεί ένθετους βρόχους For-Next, με τιμή Step. Αυτή η διαδικασία δημιουργεί ένα σκακιέρα αλλάζοντας το χρώμα φόντου των εναλλασσόμενων κελιών.
Χρησιμοποιώντας βρόχους για να δημιουργήσετε ένα μοτίβο σκακιέρας.
Ο μετρητής σειρών κάνει βρόχους από το 1 έως το 8. Μια κατασκευή If-Then καθορίζει ποια ένθετη δομή For-Next θα χρησιμοποιηθεί. Για σειρές με περιττούς αριθμούς, ο μετρητής Col αρχίζει με 2. Για σειρές με ζυγούς αριθμούς, ο μετρητής Col ξεκινά με 1. Και οι δύο βρόχοι χρησιμοποιούν τιμή Βήματος 2, επομένως επηρεάζονται εναλλακτικά κελιά. Δύο πρόσθετες προτάσεις καθιστούν τα κελιά τετράγωνα (ακριβώς όπως ένα πραγματικό σκακιέρα).
Sub MakeCheckerboard()
Dim R όσο καιρό, C όσο καιρό
Για R = 1 έως 8
If WorksheetFunction.IsOdd(R) Τότε
Για C = 2 έως 8 Βήμα 2
Κυψέλες(R, C).Εσωτερικό.Χρώμα = 255
Επόμενο Γ
Αλλού
Για C = 1 έως 8 Βήμα 2
Κυψέλες(R, C).Εσωτερικό.Χρώμα = 255
Επόμενο Γ
Τέλος εαν
Επόμενος R
Σειρές ("1:8").Ύψος σειράς = 35
Στήλες("A:H").Πλάτος στήλης = 6,5
End Sub