Επιλογή αρχείων εντός του VBA - Συμβουλές για το Excel

Ο Ρενάτο από την Ιταλία ρωτά:

Πώς μπορώ να ανοίξω ένα βιβλίο εργασίας στο VBA επιλέγοντας από μια λίστα; Όταν εγγράφω μια μακροεντολή, κωδικοποιεί σκληρά το όνομα του επιλεγμένου αρχείου στη μακροεντολή.

Υπάρχει μια εντολή στο VBA που ονομάζεται GetOpenFileName. Εμφανίζει το πλαίσιο Άνοιγμα αρχείου. Μπορείτε να πλοηγηθείτε σε έναν κατάλογο, να επιλέξετε το αρχείο και μετά να κάνετε κλικ στο Άνοιγμα. Σε αυτό το σημείο, η εντολή δεν ανοίγει το αρχείο, αλλά απλώς μεταδίδει το όνομα πίσω στο πρόγραμμά σας. Ακολουθεί ένα παράδειγμα του κώδικα που χρησιμοποιείται:

Sub TestIt() NewFN = Application.GetOpenFilename(FileFilter:="Excel Files (*.xls), *.xls", Title:="Please select a file") If NewFN = False Then ' They pressed Cancel MsgBox "Stopping because you did not select a file" Exit Sub Else Workbooks.Open Filename:=NewFN End If End Sub

Ο Ρότζερ ρωτά:

Πώς μπορώ να τρέξω μια μακροεντολή πριν κλείσει ή αποθηκευτεί ένα αρχείο;

Η μακροεντολή πρέπει να εισαχθεί στο παράθυρο κώδικα που σχετίζεται με το "ThisWorkbook". Από το δεξί αναπτυσσόμενο μενού, επιλέξτε είτε BeforeClose είτε BeforeSave.

Ο Κέν γράφει:

Έχω έναν χειριστή συμβάντων φύλλου εργασίας που κάνει βρόχο, τουλάχιστον 16 φορές. Τι συμβαίνει?

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

Η λύση είναι να σταματήσετε προσωρινά την εκτέλεση συμβάντων ενώ αλλάζετε την τιμή σε κεφαλαία. Μπορείτε να το κάνετε αλλάζοντας την τιμή του Application.EnableEvents σε False. Εδώ είναι η διορθωμένη μακροεντολή:

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Excel.Range) If Not IsNumeric(Target.Value) Then Application.EnableEvents = False Target.Value = UCase(Target.Value) Application.EnableEvents = True End If End Sub

Ο Andy από το Ηνωμένο Βασίλειο θέτει την πιο ενδιαφέρουσα ερώτηση σήμερα.

Έχω μια ρουτίνα VBA σε ένα βιβλίο εργασίας που δημιουργεί πολλά άλλα βιβλία εργασίας. Θα ήθελα να μπορώ να προσθέσω δυναμικά έναν υπερσύνδεσμο σε κάθε νέο βιβλίο εργασίας που θα επιστρέψει στο βιβλίο εργασίας που δημιούργησε τα νέα βιβλία εργασίας.

Andy - αυτή είναι μια ωραία ιδέα. Χωρίς το όφελος να δω τον κωδικό σας, μπορώ να φανταστώ κάτι τέτοιο θα λειτουργούσε:

Sub Testit() Creator = ActiveWorkbook.FullName '… . Andy's code to create the new workbook… . ActiveSheet.Hyperlinks.Add Anchor:=Range("A1"), Address:= _ Creator, TextToDisplay:="Click Here to Return to " & Creator End Sub

ενδιαφέροντα άρθρα...