Σάββατο, 9 Φεβρουαρίου 2019

Διαχωρισμός των μακροεντολών

Είναι χρήσιμο να αποθηκεύετε τον κώδικα κάθε μακροεντολής σε ξεχωριστές λειτουργικές μονάδες (modules) για καλύτερη διαχείριση των μακροεντολών. Έτσι, θα μπορείτε π.χ. να μεταφέρετε μεταξύ υπολογιστών μόνο το module με τη μακροεντολή που θέλετε. Επειδή όμως το Word έχει την κακή συνήθεια να αποθηκεύει τον κώδικα όλων των μακροεντολών στο ίδιο module, θα δείτε εδώ τι πρέπει να προσέξετε αν θελήσετε να τακτοποιήσετε αυτή την κατάσταση, και πώς θα χρησιμοποιήσετε με απλά βήματα τον VB Editor γι' αυτή τη δουλειά.

Αν έχετε χρησιμοποιήσει στο παρελθόν τον VB Editor, πιθανόν να γνωρίζετε ορισμένα βασικά, τουλάχιστον για το περιβάλλον εργασίας ή ίσως και για τον τρόπο που λειτουργεί. Ακόμα όμως κι αν είναι η πρώτη φορά που ασχολείστε μαζί του, η επόμενη διαδικασία δεν χρειάζεται ιδιαίτερες γνώσεις προγραμματισμού. Σαν πρώτο στάδιο όμως, καλό είναι να ξεκινήσετε με τις μακροεντολές που έχουν δημιουργηθεί με το εργαλείο Καταγραφή μαρκοεντολής του Word. Αυτές οι μακροεντολές μετατρέπονται σε κώδικα από το Word με ξεκάθαρη δόμηση, όπου κάθε μακροεντολή αντιστοιχεί σε ένα ολοκληρωμένο μπλοκ κώδικα με αρχή και τέλος. Άλλες μακροεντολές, που έχετε από άλλες πηγές μπορεί να έχουν πιο σύνθετο κώδικα και θα ήταν προτιμότερο να ασχοληθείτε μαζί τους σε επόμενο στάδιο.

Για να ολοκληρώσω το θεωρητικό μέρος, αν είναι η πρώτη φορά που θα ασχοληθείτε με τον VB Editor, καλό είναι να αποκτήσετε μια σχετική οικειότητα με τα βασικά στοιχεία του περιβάλλοντος εργασίας και μερικές γενικές έννοιες, όπως τι είναι project, module, ρουτίνα κ.λπ. Δείτε το θέμα Γνωριμία με τον Visual Basic Editor.

Τα πρώτα βήματα

Επί της διαδικασίας τώρα, ανοίξτε το Word και εμφανίστε τον VB Editor με ένα από τα επόμενα:

  • Πατήστε τη συντόμευση ALT+F11.
  • Στην καρτέλα Προγραμματιστής κάνετε κλικ στο κουμπί Visual Basic.

    Η καρτέλα Προγραμματιστής δεν εμφανίζεται στην κορδέλα

    Η καρτέλα Προγραμματιστής δεν εμφανίζεται στην κορδέλα λόγω των προκαθορισμένων ρυθμίσεων του Word. Για να ενεργοποιήσετε τη εμφάνισή της:

    1. Από την καρτέλα παρασκηνίου Αρχείο επιλέξτε την κατηγορία Επιλογές και στη συνέχεια εμφανίστε τη σελίδα Προσαρμογή κορδέλας.
    2. Στη λίστα με τις κύριες καρτέλες κάνετε κλικ στο πλαίσιο ελέγχου Προγραμματιστής για να το ενεργοποιήσετε.
    3. Κάνετε κλικ στο ΟΚ για να ολοκληρώσετε τη διαδικασία.


Εικ. 1: Περιβάλλον VB Editor

Εκ προεπιλογής, όταν ανοίγετε τον VB Editor (εικ. 1), εμφανίζονται τα πλαίσια Project Explorer και Properties, καθώς και το παράθυρο με τον κώδικα των μακροεντολών που καταχωρίζει το Word στο module NewMacros. Αν κάποιο από αυτά δεν εμφανίζεται:

  • Χρησιμοποιήστε τη συντόμευση πληκτρολογίου CTRL+R για να εμφανίσετε το πλαίσιο του Project Explorer, ή/και τη συντόμευση F4 για να εμφανίσετε το πλαίσιο Properties.
  • Στον Project Explorer κάνετε διπλό κλικ στο module NewMacros του Normal για να εμφανίσετε το παράθυρο με τον κώδικα.
Modules με όνομα NewMacros, μπορεί να υπάρχουν σε πρότυπα ή/και σε έγγραφα. Το Word δημιουργεί ένα module NewMacros ανάλογα με την θέση αποθήκευσης που επιλέγετε κάθε φορά, κατά την καταγραφή μιας μακροεντολής.


Εικ. 2: Κώδικας μακροεντολών

Η εικόνα δείχνει το παράθυρο με τον κώδικα των μακροεντολών allCaps και convertCase, που είναι καταχωρισμένος στο module NewMacros. Οι μακροεντολές που έχουν δημιουργηθεί με το εργαλείο Καταγραφή μακροεντολής, καταχωρίζονται αυτόματα από το Word σε αυτόνομα μπλοκ κώδικα, γνωστά ως ρουτίνες (routines). Η μακροεντολή αρχίζει με την έκφραση Sub και ολοκληρώνεται με την έκφραση End Sub. Οι γραμμές που αρχίζουν με απόστροφο είναι σχόλια και δεν λαμβάνονται υπ' όψιν κατά την εκτέλεση της μακροεντολής. Συνήθως αφορούν μια εξήγηση για τον τρόπο λειτουργίας του κώδικα που ακολουθεί.

Μεταξύ των μακροεντολών (εικ. 2) ο VB Editor προσθέτει αυτόματα μια διαχωριστική γραμμή. Αυτό σας επιτρέπει με μια γρήγορη ματιά να δείτε πού τελειώνει η μια μακροεντολή και πού αρχίζει η επόμενη και θα σας διευκολύνει στη συνέχεια, για να χωρίσετε τον κώδικα κάθε μακροεντολής σε διαφορετικό module:

ΠΡΟΣΟΧΗ: Για άλλη μια φορά, η διαδικασία που περιγράφεται εδώ αφορά τις μακροεντολές που έχουν δημιουργηθεί με το εργαλείο Καταγραφή μακροεντολής και που το Word καταχωρίζει αυτόματα στο module NewMacros. Δεν καλύπτονται άλλα modules ή άλλος κώδικας που τυχόν έχετε προσθέσει στο NewMacros "με το χέρι".

  1. Στον Project Explorer κάνετε δεξιό κλικ στο Normal και στο μενού συντομίας επιλέξτε Insert > Module.

    ΣΗΜΕΙΩΣΗ: Η πιο συνηθισμένη επιλογή είναι το Normal (το βασικό πρότυπο του Word), ώστε οι μακροεντολές να είναι διαθέσιμες σε όλα τα έγγραφα. Ανάλογα με τη χρήση και τη διαθεσιμότητα που θέλετε να έχουν, μπορείτε να τις αποθηκεύσετε σε άλλο πρότυπο ή σε έγγραφο. Για περισσότερες λεπτομέρειες δείτε Πού καταχωρίζονται οι μακροεντολές.

  2. Με αποκοπή και επικόλληση μεταφέρετε τον κώδικα της πρώτης μακροεντολής από το module NewMacros στο module που μόλις δημιουργήσατε Module1. (Σύμφωνα με την εικόνα 2 ο κώδικας της πρώτης μακροεντολής είναι από το Sub allCaps() έως το End Sub πάνω από τη διαχωριστική γραμμή).
  3. Μια καλή τακτική είναι να αντικαθιστάτε το όνομα Module1 που χρησιμοποιεί αυτόματα ο VB Editor με κάτι πιο περιγραφικό, συνήθως με το όνομα της μακροεντολής. Έτσι:
    1. Στον Project Explorer επιλέξτε το Module1.
    2. Στο πλαίσιο Properties, στο πεδίο (Name) διορθώστε το όνομα σε allCaps.

      ΣΗΜΕΙΩΣΗ: Για το όνομα επιτρέπονται μόνο γράμματα και αριθμοί. Όχι κενά διαστήματα, όχι ειδικοί χαρακτήρες (*, ", ? κ.λπ.). Δείτε επίσης Ονοματολογία μακροεντολών.

  4. Επαναλάβετε τη διαδικασία και για τις υπόλοιπες μακροεντολές του module NewMacros.
  5. Αφού ολοκληρώσετε με την μεταφορά του κώδικα όλων των μακροεντολών μπορείτε να διαγράψετε το module NewMacros. Το Word θα δημιουργήσει καινούργιο, τη επόμενη φορά που θα κάνετε καταγραφή μιας νέας μακροεντολής:
    1. Στον Project Explorer κάνετε δεξιό κλικ στο module NewMacros και στη συνέχεια επιλέξτε Remove NewMacros.
    2. Στο προειδοποιητικό μήνυμα που εμφανίζεται κάνετε κλικ στο κουμπί No για να διαγράψετε το module άμεσα.
      Η δεύτερη επιλογή Yes σας επιτρέπει, πριν τη διαγραφή, να δημιουργήσετε ένα αντίγραφο ασφαλείας. Στη συγκεκριμένη περίπτωση δεν έχει νόημα, εφόσον το module είναι κενό.

Σε επόμενο στάδιο

Όπως ανέφερα ήδη από την αρχή, η διαδικασία τακτοποίησης που περιγράφεται εδώ αφορά τις μακροεντολές που έχουν δημιουργηθεί με το εργαλείο Καταγραφή μακροεντολής, που καταχωρίζονται αυτόματα από το Word στο module NewMacros. Θεώρησα όμως χρήσιμο να αναφέρω δυο τρία σημεία που πρέπει να προσέξετε, αν θέλετε να ασχοληθείτε λίγο περισσότερο με τον κώδικα των μακροεντολών.

Έχετε υπ' όψη σας ότι, ο VB Editor αναγνωρίζει ως τέλος μιας μακροεντολής τη δήλωση τέλους End Sub, ώστε να προσθέσει μια εικονική διαχωριστική γραμμή για να διακρίνετε πιο εύκολα που τελειώνει η μία μακροεντολή και πού αρχίζει η επόμενη. Αυτό όμως ισχύει απόλυτα, μόνο όταν οι μακροεντολές έχουν δημιουργηθεί με το εργαλείο Καταγραφή μακροεντολής. Αν έχετε τον κώδικα μακροεντολής από κάποια άλλη πηγή (κάποιον που γνωρίζει VBA, από ένα email, από ένα site κ.λπ.) το End Sub μπορεί να μη δηλώνει το τέλος της μακροεντολής αλλά το τέλος μιας "ενδιάμεσης" διαδικασίας. Στο επόμενο παράδειγμα, η ρουτίνα AutoExec "καλεί" μια άλλη ρουτίνα (AddPasteSpecial) και επομένως οι δυο ρουτίνες αποτελούν ένα αναπόσπαστο σύνολο, ενώ ο VB Editor θα τις χωρίσει με την διαχωριστική γραμμή:

Sub AutoExec()
    Call AddPasteSpecial
End Sub
- - - - - - - - - - - - - - - - - - -
Sub AddPasteSpecial()
    Dim cb As CommandBar
    Dim c As CommandBarButton
    ...
End Sub

Στο ανωτέρω παράδειγμα χρησιμοποίησα το κόκκινο για να επισημάνω την επικοινωνία ανάμεσα στις δύο ρουτίνες. Ωστόσο και ο VB Editor χρησιμοποιεί κόκκινη επισήμανση για να δηλώσει ένα σφάλμα του κώδικα. Αν πρόκειται για σφάλμα σύνταξης, λίγες πιθανότητες έχετε να το διορθώσετε χωρίς βοήθεια αν δεν γνωρίζετε VBA. Ορισμένες φορές όμως το σφάλμα οφείλεται στο μέσο μεταφοράς της μακροεντολής και όχι στον συντάκτη. Π.χ. η αποστολή μιας μακροεντολής με email μπορεί να δημιουργήσει ανεπιθύμητες αναδιπλώσεις στις γραμμές του κώδικα, τις οποίες δεν αποδέχεται η VBA και επισημαίνει ως σφάλμα ο VB Editor, όπως στο παράδειγμα:

Do While myRange.Find.Execute
    FieldText = (myRange.Text)
    ActiveDocument.Fields.Add Range:=myRange,
    Type:=wdFieldIncludeText, Text:=FieldText
    myRange.MoveEndUntil cset:=""""""
    myRange.Collapse wdCollapseEnd
    myRange.Select
Loop
...

Έχετε δύο τρόπους για να διορθώσετε το σφάλμα της αναδίπλωσης:

  • "Ενώστε" τις δύο γραμμές σε μία, αφήνοντας ένα κενό διάστημα μετά το κόμμα.
  • Μετά τον τελευταίο χαρακτήρα της πρώτης γραμμής (εδώ το κόμμα) αφήστε ένα κενό διάστημα και πληκτρολογήστε τον χαρακτήρα υπογράμμισης ( _ ), που δηλώνει στη VBA ότι ο κώδικας της μιας γραμμής συνεχίζεται στην επόμενη.

Τέλος να υπενθυμίσω ότι, αφού ολοκληρώσετε τις εργασίες σας με τον VB Editor μπορείτε να τον κλείσετε. Οι αλλαγές που κάνατε έχουν μεταφερθεί αυτόματα στο αντίστοιχο πρότυπο ή έγγραφο που επηρεάστηκε και θα αποθηκευτούν μαζί με αυτό, ή θα σας ζητηθεί η αποθήκευσή τους όταν κλείσετε το Word.

Σύνοψη
Θέμα
Διαχωρισμός των μακροεντολών
Κείμενο
Γιώργος ο Αδαής
Συμβολή

Ταυτότητα
2.02.002/0006
Έκδοση
8/2/10
Αναθεώρηση
9/2/19

Δεν υπάρχουν σχόλια:

Δημοσίευση σχολίου