Εισαγωγή
Αυτό το άρθρο περιγράφει τον τρόπο χρήσης μεταβλητών σε δευτερεύουσες διαδικασίες του Microsoft Excel στο Microsoft Visual Basic for Applications.
Περισσότερες πληροφορίες
Μεταβλητές σε μια δευτερεύουσα διαδικασία
Ένα ισχυρό χαρακτηριστικό των γλωσσών προγραμματισμού είναι η δυνατότητα αποθήκευσης κάποιου στοιχείου σε μια μεταβλητή, έτσι ώστε τα περιεχόμενα της μεταβλητής να μπορούν να χρησιμοποιηθούν ή να αλλάξουν αργότερα στη διαδικασία. Αυτό το έγγραφο ασχολείται με την ακόλουθη χρήση μεταβλητών στη Visual Basic:
- Πώς δηλώνονται οι μεταβλητές.
- Οι διαδικασίες και τα έργα που μπορούν να χρησιμοποιήσουν τη μεταβλητή.
- Η διάρκεια ζωής μιας μεταβλητής.
Δήλωση μεταβλητής σε μια μακροεντολή
Ο απλούστερος τρόπος για να δηλώσετε μια μεταβλητή σε μια μακροεντολή είναι να χρησιμοποιήσετε τη δήλωση Dim. Η παρακάτω γραμμή δηλώνει δύο μεταβλητές, ως ακέραιους αριθμούς:
Dim x As Integer, y As Integer
Με τα x και y καθορισμένα ως ακέραιους, ορίζετε στη Visual Basic να δεσμεύσει επαρκή μνήμη για μια ακέραια μεταβλητή (2 byte το καθένα για τα x και y) και ότι οι πληροφορίες που είναι αποθηκευμένες είτε στο x είτε στο y είναι ένας ακέραιος αριθμός μεταξύ -32768 και 32767.
ΣΗΜΕΙΩΣΗ: Εάν δηλώσετε περισσότερες από μία μεταβλητές χρησιμοποιώντας μία μόνο δήλωση Dim, πρέπει να καθορίσετε τον τύπο δεδομένων για κάθε μεταβλητή.
Εάν δεν καθορίσετε τον τύπο δεδομένων για κάθε μεταβλητή, όπως στον παρακάτω κώδικα της Visual Basic, μόνο η μεταβλητή y ορίζεται ως ακέραια μεταβλητή. Η μεταβλητή x θα είναι ένας τύπος μεταβλητής:
Dim x, y As Integer
Για περισσότερες πληροφορίες, ανατρέξτε στο θέμα Τύπος δεδομένων μεταβλητής παρακάτω.
Για να εκτελέσετε έναν έλεγχο μεταβλητής, ακολουθήστε τα εξής βήματα:
Αποθηκεύστε και κλείστε τα ανοιχτά βιβλία εργασίας και, στη συνέχεια, ανοίξτε ένα νέο βιβλίο εργασίας.
Ξεκινήστε την Επεξεργασία Visual Basic (πιέστε το συνδυασμό πλήκτρων ALT+F11).
Στο μενού "Εισαγωγή", κάντε κλικ στην επιλογή "Λειτουργική μονάδα".
Πληκτρολογήστε τον ακόλουθο κώδικα:
Sub Variable_Test()
Dim x ως ακέραιος, y ως ακέραιος
x = 10
y = 100
MsgBox "η τιμή του x είναι " & x & _
Chr(13) & "η τιμή του y είναι " & y
End SubΕκτελέστε τη μακροεντολή Variable_Test . Εμφανίζεται το ακόλουθο μήνυμα:
the value of x is 10
the value of y is 100Κάντε κλικ στο κουμπί OK.
Στη μακροεντολή Variable_Test , αλλάξτε την ακόλουθη γραμμή:
x = 10έως:
x = "error"Εκτελέστε τη μακροεντολή Variable_Test .
Θα λάβετε ένα σφάλμα χρόνου εκτέλεσης, επειδή το "σφάλμα" δεν είναι ακέραιος και προσπαθείτε να αντιστοιχίσετε αυτήν την τιμή συμβολοσειράς στην ακέραια μεταβλητή x.
Σύνοψη τύπου δεδομένων
Αυτοί είναι οι κοινοί τύποι δεδομένων μεταβλητών:
τύπος δεδομένων Variant
Εάν δεν καθορίσετε έναν τύπο δεδομένων όταν δηλώνετε μια μεταβλητή ή δεν δηλώνετε καθόλου μια μεταβλητή, η Visual Basic καθορίζει αυτόματα τον τύπο δεδομένων μεταβλητής για αυτήν τη μεταβλητή. Ακολουθούν τα πλεονεκτήματα των μεταβλητών που δηλώνονται ως αυτός ο τύπος δεδομένων:
- Οι μεταβλητές μπορούν να περιέχουν τιμές συμβολοσειράς, ημερομηνίας, ώρας, δυαδικής τιμής ή αριθμητικές τιμές.
- Οι μεταβλητές μπορούν να μετατρέπουν αυτόματα τις τιμές που περιέχουν.
Το μειονέκτημα είναι ότι οι μεταβλητές παραλλαγής απαιτούν τουλάχιστον 16 byte μνήμης. 16 byte μνήμης μπορεί να είναι σημαντικά σε μεγάλες διαδικασίες ή σε πολύπλοκες μονάδες.
Για να δείτε πώς λειτουργεί αυτό στη μακροεντολή Variable_Test, ακολουθήστε τα εξής βήματα:
Αλλάξτε τον κώδικα στη μακροεντολή Variable_Test σε:
Sub Variable_Test()
Dim x, y
x = "string"
y = 1.23
MsgBox "the value of x is " & x & _
Chr(13) & "the value of y is " & y
End Sub
Εκτελέστε τη μακροεντολή Variable_Test .
Δεν θα λάβετε σφάλμα, επειδή μπορείτε να αντιστοιχίσετε οτιδήποτε στις μεταβλητές παραλλαγής x και y.
ΣΗΜΕΙΩΣΗ: Μπορείτε επίσης να παραλείψετε την ακόλουθη γραμμή και η μακροεντολή θα εξακολουθεί να λειτουργεί, καθώς οι μεταβλητές x και y αντιμετωπίζονται ως τύποι δεδομένων μεταβλητής:
Dim x, y
Εμβέλεια μιας μεταβλητής
Όταν δηλώνετε μια μεταβλητή, ενδέχεται να είναι ορατή ή όχι σε άλλες μακροεντολές της ίδιας λειτουργικής μονάδας, σε άλλες λειτουργικές μονάδες ή σε άλλα έργα. Αυτή η διαθεσιμότητα μιας μεταβλητής στις λειτουργικές μονάδες αναφέρεται ως πεδίο εφαρμογής. Οι τρεις τύποι πεδίου εφαρμογής είναι επίπεδο διαδικασίας, ιδιωτικό επίπεδο ενότητας και επίπεδο δημόσιας ενότητας. Το πεδίο εφαρμογής εξαρτάται από το πώς και πού δηλώνετε τη μεταβλητή ή τις μεταβλητές σας.
Πεδίο εφαρμογής σε επίπεδο διαδικασίας
Μια μεταβλητή με εμβέλεια σε επίπεδο διαδικασίας δεν εμφανίζεται εκτός της διαδικασίας όπου δηλώνεται. Εάν ορίσετε την τιμή μιας μεταβλητής που έχει εμβέλεια σε επίπεδο διαδικασίας, τα περιεχόμενα αυτής της μεταβλητής δεν θα είναι ορατά στις άλλες μακροεντολές.
Για να επαληθεύσετε ότι μια μεταβλητή με εμβέλεια επιπέδου διαδικασίας δεν εμφανίζεται εκτός της διαδικασίας όπου έχει δηλωθεί, ακολουθήστε τα εξής βήματα:
Εισαγάγετε μια νέα λειτουργική μονάδα στο έργο σας.
Πληκτρολογήστε και τις δύο παρακάτω μακροεντολές σε αυτήν τη λειτουργική μονάδα:
Sub Macro1() Dim x As Integer x = 10 MsgBox "x, όπως φαίνεται από Macro1 είναι " & x 'η επόμενη γραμμή τρέχει Macro2 Macro2 End Sub Sub Macro2() MsgBox "x, όπως φαίνεται από Macro2 είναι " & x End SubΕκτελέστε τη Macro1 και θα λάβετε το ακόλουθο μήνυμα:
x, as seen by Macro1 is 10Κάντε κλικ στο κουμπί OK και θα λάβετε το ακόλουθο μήνυμα:
x, as seen by Macro2 isΚάντε κλικ στο κουμπί OK.
Η συνάρτηση Macro2 δεν εμφανίζει τιμή για τη μεταβλητή x, επειδή η μεταβλητή x είναι τοπική της Μακροεντολής1.
Ιδιωτικό και δημόσιο πεδίο εφαρμογής σε επίπεδο λειτουργικής μονάδας
Μπορείτε να ορίσετε μεταβλητές στην ενότητα δηλώσεων μιας λειτουργικής μονάδας (στο επάνω μέρος μιας λειτουργικής μονάδας, πάνω από όλες τις δευτερεύουσες διαδικασίες) και να ορίσετε το εύρος της μεταβλητής σας χρησιμοποιώντας τη δημόσια πρόταση, την πρόταση Dim ή την ιδιωτική δήλωση. Εάν τοποθετήσετε τη δημόσια πρόταση μπροστά από τη μεταβλητή σας, η μεταβλητή σας θα είναι διαθέσιμη σε όλες τις μακροεντολές όλων των λειτουργικών μονάδων του έργου. Εάν τοποθετήσετε την πρόταση Dim ή την πρόταση Private μπροστά από τη μεταβλητή, η μεταβλητή είναι διαθέσιμη μόνο για τις μακροεντολές στη λειτουργική μονάδα όπου δηλώνεται.
Για να δείτε τη διαφορά ανάμεσα στη δημόσια και την αρνητική πρόταση, ακολουθήστε τα εξής βήματα:
Αποθηκεύστε και κλείστε τα ανοιχτά βιβλία εργασίας και, στη συνέχεια, ανοίξτε ένα νέο βιβλίο εργασίας.
Ξεκινήστε την Επεξεργασία Visual Basic.
Εισαγάγετε μια λειτουργική μονάδα στο έργο σας.
-
Type the following code into this module: Public x As Integer Sub Macro_1a() x = 10 MsgBox x Macro_1b End Sub Sub Macro_1b() x = x * 2 MsgBox x Macro2 End Sub Εισαγάγετε κάποια άλλη λειτουργική μονάδα στο έργο σας.
Πληκτρολογήστε τον ακόλουθο κώδικα σε αυτήν τη λειτουργική μονάδα:
Sub Macro2()
x = x * 3
MsgBox x
End SubΕκτελέστε Macro_1a μακροεντολή στην πρώτη λειτουργική μονάδα.
Με τη μεταβλητή x να δηλώνεται ως "Public x As Integer", και οι τρεις μακροεντολές του έργου έχουν πρόσβαση στην τιμή x. Το πλαίσιο πρώτου μηνύματος εμφανίζει την τιμή 10. Το δεύτερο πλαίσιο μηνύματος εμφανίζει την τιμή 20 (επειδή το x πολλαπλασιάζεται επί 2 σε Macro_1b). Το τρίτο πλαίσιο μηνύματος εμφανίζει την τιμή 60 (επειδή η τιμή του x άλλαξε σε 20 στο Macro_1b και στη συνέχεια πολλαπλασιάστηκε επί 3 στη μακροεντολή2).
Αλλάξτε τη γραμμή δήλωσης στην πρώτη λειτουργική μονάδα από:
Public x As Integerέως:
Dim x As IntegerΕκτελέστε τη μακροεντολή Macro_1a .
Με τη δήλωση της μεταβλητής x ως "Dim x As Integer", μόνο οι μακροεντολές στην πρώτη λειτουργική μονάδα έχουν πρόσβαση στην τιμή του x. Επομένως, το πρώτο πλαίσιο μηνύματος εμφανίζει την τιμή 10, το δεύτερο πλαίσιο μηνύματος εμφανίζει την τιμή 20 (επειδή το x πολλαπλασιάζεται επί 2 στο Macro_1b) και το τρίτο πλαίσιο μηνύματος εμφανίζει την τιμή 0 (επειδή η μακροεντολή2 δεν βλέπει την τιμή x και η μη αρχικοποιημένη τιμή του μηδενός χρησιμοποιείται από τη μακροεντολή 2).
Αλλάξτε τη γραμμή δήλωσης στην πρώτη λειτουργική μονάδα από:
Dim x As Integerέως:
Private x As IntegerΕκτελέστε τη μακροεντολή Macro_1a .
Τα ίδια πλαίσια μηνυμάτων εμφανίζονται χρησιμοποιώντας την εμβέλεια της ιδιωτικής πρότασης, όπως αν εμφανίζονταν και με την πρόταση Dim. Η μεταβλητή x έχει το ίδιο πεδίο εφαρμογής, ιδιωτική στη λειτουργική μονάδα όπου δηλώνεται.
ΣΗΜΕΙΩΣΗ: Εάν θέλετε το εύρος της μεταβλητής σας να περιορίζεται στην ενότητα όπου έχει δηλωθεί, χρησιμοποιήστε την πρόταση Privatenote αντί για την πρόταση Dim. Και οι δύο επιτυγχάνουν το ίδιο αποτέλεσμα, αλλά το πεδίο εφαρμογής είναι σαφέστερο όταν διαβάζετε τον κώδικα εάν χρησιμοποιείτε τη δήλωση "Ιδιωτικό".
Διάρκεια ζωής μιας μεταβλητής
Ο χρόνος κατά τον οποίο μια μεταβλητή διατηρεί την αξία της είναι γνωστός ως διάρκεια ζωής της. Η τιμή μιας μεταβλητής μπορεί να αλλάξει κατά τη διάρκεια ζωής της, αλλά θα διατηρήσει κάποια τιμή. Επίσης, όταν μια μεταβλητή χάνει το πεδίο εφαρμογής, δεν έχει πλέον τιμή.
Προετοιμασία της τιμής μιας μεταβλητής
Όταν εκτελείτε μια μακροεντολή, όλες οι μεταβλητές προετοιμάζονται σε μια τιμή. Μια αριθμητική μεταβλητή αρχικοποιείται σε μηδέν, μια συμβολοσειρά μεταβλητού μήκους αρχικοποιείται σε συμβολοσειρά μηδενικού μήκους ("") και μια συμβολοσειρά σταθερού μήκους συμπληρώνεται με τον κωδικό 0 ASCII. Οι μεταβλητές παραλλαγών αρχικοποιούνται σε Empty. Μια κενή μεταβλητή αντιπροσωπεύεται από το μηδέν σε ένα αριθμητικό περιβάλλον και μια συμβολοσειρά μηδενικού μήκους ("") σε ένα περιβάλλον συμβολοσειράς.
Μεταβλητές επιπέδου διαδικασίας
Εάν έχετε μια μεταβλητή που δηλώνεται σε μια μακροεντολή χρησιμοποιώντας την πρόταση Dim, η μεταβλητή διατηρεί την τιμή της για όσο διάστημα εκτελείται η μακροεντολή. Εάν αυτή η μακροεντολή καλέσει άλλες μακροεντολές, η τιμή της μεταβλητής διατηρείται (δεν είναι διαθέσιμη στις άλλες μακροεντολές όμως) όσο εκτελούνται και αυτές οι άλλες μακροεντολές.
Για να δείξετε πώς λειτουργούν οι μεταβλητές σε επίπεδο διαδικασίας, ακολουθήστε τα εξής βήματα:
Εισαγάγετε μια νέα λειτουργική μονάδα στο έργο σας.
Πληκτρολογήστε και τις δύο παρακάτω μακροεντολές σε αυτήν τη λειτουργική μονάδα:
Sub Macro1()
'Ορισμός του X ως μεταβλητής επιπέδου διαδικασίας
Dim x ως ακέραιος
MsgBox "η αρχικοποιημένη τιμή του x είναι " & x
x = 10
MsgBox "x είναι" & x
'η επόμενη γραμμή τρέχει Macro2
Μακροεντολή2
MsgBox "x is still " & x
End Sub
Sub Macro2()
MsgBox "x, όπως φαίνεται από Macro2 είναι " & x
End SubΕκτέλεση μακροεντολής1.
Εμφανίζεται το ακόλουθο μήνυμα:
the initialized value of x is 0Κάντε κλικ στο κουμπί OK και θα λάβετε το μήνυμα:
x is 10Κάντε κλικ στο κουμπί OK και θα λάβετε το ακόλουθο μήνυμα:
x, as seen by Macro2 isΚάντε κλικ στο κουμπί OK.
Η συνάρτηση Macro2 δεν εμφανίζει τιμή για τη μεταβλητή x, επειδή η μεταβλητή x είναι τοπική της Μακροεντολής1. Εμφανίζεται το ακόλουθο μήνυμα:
x is still 10Κάντε κλικ στο κουμπί OK.
Εκτέλεση μακροεντολής1.
Λαμβάνετε τα ίδια μηνύματα που περιγράφονται στα βήματα 3 έως 6, επειδή μόλις η εκτέλεση της μακροεντολής1 διακόπηκε στο βήμα 6, η τιμή της μεταβλητής x χάθηκε. Επομένως, όταν εκτελείτε ξανά τη μακροεντολή1 στο βήμα 7, το πρώτο μήνυμα εμφανίζει την τιμή του x ως μηδέν (την αρχικοποιημένη τιμή).
Στατική λέξη-κλειδί
Εάν δηλωθεί μια μεταβλητή σε επίπεδο διαδικασίας χρησιμοποιώντας τη στατική λέξη-κλειδί, η μεταβλητή διατηρεί την τιμή της μέχρι να γίνει επαναφορά του έργου σας. Επομένως, εάν έχετε μια στατική μεταβλητή, την επόμενη φορά που θα καλέσετε τη διαδικασία, η στατική μεταβλητή προετοιμάζεται μέχρι την τελευταία τιμή.
Για να δείτε πώς λειτουργεί η στατική λέξη-κλειδί, ακολουθήστε τα εξής βήματα:
1.
Change the code in Macro1 to:
Sub Macro1()
'set x as a procedure level variable
Static x As Integer
MsgBox "the initialized value of x is " & x
x = x + 10
MsgBox "x is " & x
End Sub
Εκτέλεση μακροεντολής1.
Θα λάβετε το μήνυμα:
the initialized value of x is 0Κάντε κλικ στο κουμπί OK και θα λάβετε το μήνυμα:
x is 10Κάντε κλικ στο κουμπί OK.
Εκτελέστε τη Macro1 και λάβετε το ακόλουθο μήνυμα:
the initialized value of x is 10Κάντε κλικ στο κουμπί OK και θα λάβετε το ακόλουθο μήνυμα:
x is 20Κάντε κλικ στο κουμπί OK.
Οι τιμές που εμφανίζονται στα μηνύματα είναι διαφορετικές τη δεύτερη φορά, επειδή η μεταβλητή x δηλώνεται ως στατική μεταβλητή και η μεταβλητή διατηρεί την τιμή της μετά την εκτέλεση της μακροεντολής1 την πρώτη φορά.
ΣΗΜΕΙΩΣΗ: Εάν έχετε μια μεταβλητή σε επίπεδο μονάδας εργασίας, η διάρκεια ζωής της είναι ίδια σαν να ήταν μια στατική μεταβλητή επιπέδου διαδικασίας.
Για να επαληθεύσετε τη διάρκεια ζωής μιας μεταβλητής σε επίπεδο λειτουργικής μονάδας, ακολουθήστε τα εξής βήματα:
1.
Change the code in the module that contains Macro1 to the following:
Dim x As Integer 'create a module-level variable
Sub Macro1()
MsgBox "the initialized value of x is " & x
x = x + 10
MsgBox "x is " & x
End Sub
Εκτελέστε τη Macro1 και θα λάβετε το ακόλουθο μήνυμα:
the initialized value of x is 0Κάντε κλικ στο κουμπί OK και θα εμφανιστεί το ακόλουθο μήνυμα:
x is 10Κάντε κλικ στο κουμπί OK,
Εκτελέστε την εντολή Macro1 και θα λάβετε αυτό το μήνυμα:
the initialized value of x is 10Κάντε κλικ στο κουμπί OK.
Εμφανίζεται το ακόλουθο μήνυμα:
x is 20Κάντε κλικ στο κουμπί OK.
Οι τιμές που εμφανίζονται στα μηνύματα είναι διαφορετικές τη δεύτερη φορά, επειδή η μεταβλητή x δηλώνεται ως στατική μεταβλητή και διατηρεί την τιμή της μετά την εκτέλεση της μακροεντολής1 την πρώτη φορά.
Επαναφορά έργου για επαναφορά μεταβλητών
Εάν θέλετε να επαναφέρετε την τιμή για μια στατική μεταβλητή ή για μια μεταβλητή επιπέδου λειτουργικής μονάδας, κάντε κλικ στο κουμπί Επαναφορά στο
Standard γραμμή εργαλείων ή κάντε κλικ στην εντολή Επαναφορά (Reset) του μενού Εκτέλεση (Run).
Εάν το κάνετε αυτό για το έργο Macro1 και, στη συνέχεια, εκτελέσετε ξανά τη Μακροεντολή1, η τιμή της μεταβλητής x αρχικοποιείται ξανά στο μηδέν και λαμβάνετε το πρώτο μήνυμα:
the initialized value of x is 0