![]() |
Αποθήκευση αρχείου Καλό σας μεσημέρι, Στο βιβλίο μου θέλω να χρησιμοποιήσω εντολές για την αποθήκευση του βιβλίου σε φάκελο στην επιφάνεια εργασίας. Κώδικας: ActiveWorkbook.SaveCopyAs (“C:\Users\Immortal\Desktop\Αρχείο\Το βιβλίο μου 2024 (Για αρχείο).xlsm”)Κώδικας: ActiveWorkbook.SaveAs (“C:\Users\Immortal\Desktop\Το βιβλίο μου 2025.xlsm”)Μπορεί αντί για την αποθήκευση απλά στο αρχείο, να αποθηκεύεται και να μεταφέρεται εκεί; Μπορεί μετά από όλα αυτά να ανοίγει το νέο βιβλίο 2025; Επίσης, εάν το βιβλίο χρησιμοποιηθεί σε άλλον υπολογιστή και χρειαστεί να γίνει αυτή η διαδικασία, θα πρέπει να αλλαχθούν τα paths εξ αρχής από εμενα ή υπάρχει κάτι γενικό που καθορίζει την επιφάνεια εργασίας για τους υπολογιστές; Αρκετές οι ερωτήσεις μου κ σας ευχαριστώ προκαταβολικά! |
Καλησπέρα σε όλους! Νικο, ας υποθέσουμε ότι το τρέχον βιβλίο εργασίας (ActiveWorkbook) έχει το όνομα "Βιβλίο_1" και το καινούργιο όνομα είναι "Βιβλίο_2". Η συνάρτηση "ActiveWorkbook.SaveAs" αποθηκεύει το Βιβλίο_1 ως βιβλίο_2 λαμβάνοντας υπ όψη τις αλλαγές που έχουν γίνει στο Βιβλίο_1. Έτσι, το βιβλίο_2 είναι ήδη ανοιχτό ενώ το βιβλίο Βιβλίο_1 άποδεσμεύεται (εικονικά κλείνει) από την εφαρμογή χωρίς να αποθηκευτούν οι όποιες αλλαγές έχουν γίνει. Η συνάρτηση "ActiveWorkbook.SaveCopyAs" απλά αντιγράφει το "Βιβλίο_1" με τις αλλαγές που τυχόν υπάρχουν αλλά δεν έχουν αποθηκευτεί με το όνομα "Βιβλίο_2" ενώ το "Βιβλίο_1" παραμένει ανοιχτό. Ελπίζω να βοήθησα. Καλή συνέχεια. Τάσος |
Καλησπέρα σας και καλή εβδομάδα, Νίκο, σε συνέχεια του μηνύματος του Τάσου, παραθέτω και ένα παράδειγμα κώδικα: Κώδικας: Sub APO8HKEYSH() |
Καλησπέρα σας και καλή εβδομάδα! Τάσο σε ευχαριστώ πολύ για τος αναλυτικές και κατανοητές πληροφορίες! Χρήστο σε ευχαριστώ κι εσένα για την πρόταση που δίνεις, θα την δοκιμάσω και θα επανέλθω! Μια λεπτομέρεια μόνο γιατί δεν το έχω δοκιμάσει ακόμη, στο παράδειγμα που δίνεις, κατά την λειτουργία του SaveCopyAs θα πρέπει ο φάκελος Αρχείο να υπάρχει ήδη στην επιφάνεια σωστά; |
Ναι, πρέπει να υπάρχει αλλιώς εμφανίζεται σφάλμα. |
Καλημέρα σε όλους! Ναι, όπως ανέφερε ο Χρήστος η διαδρομή πρέπει να είναι έγκυρη αλλιώς εμφανίζεται σφάλμα. Νομίζω στα πλαίσια αυτού του θέματος μπορούμε να δώσουμε παραδειγματικούς κώδικες που επιτρέπουν την δημιουργία φακέλου αν αυτός δεν υπάρχει. Παράδειγμα με VBA.MkDir() Η έκφραση MkDir "C:\Temp\TestFolder" θα δημιουργήσει τον φάκελο TestFolder μόνο αν υπάρχει ο φάκελος "C:\Temp\". Διαφορετικά θα προκληθεί σφάλμα εκτέλεσης. Αν δεν είναι σίγουρο ότι το "C:\Temp\" υπάρχει στο σύστημα, τότε θα πρέπει να τροποποιηθεί ο κώδικας έτσι που να ελέγξει την ύπαρξη κάθε φακέλου που αναφέρεται στη διαδρομή C:\Temp\TestFolder και αν δεν υπάρχει να τον δημιουργήσει. Κώδικας: Sub test()Παράδειγμα με Scripting.FileSystemObject (Προσθήκη αναφοράς: Tools>References > Microsoft Scripting Runtime) Όπως και η προηγούμενη, η έκφραση FSO.CreateFolder "C:\Temp\TestFolder" θα δημιουργήσει τον φάκελο TestFolder μόνο αν υπάρχει ο φάκελος "C:\Temp\". Κώδικας: Sub test()Σε διαδρομές με περισσότερα επίπεδα μπορεί να γίνει με τη χρήση της συνάρτησης MakeSureDirectoryPathExists () η οποία όμως δεν λειτουργεί αν η διαδρομή περιέχει χαρακτήρες Unicode όπως τα ελληνικά. Επιστρέφει True αν επιτύχει και False αν προκληθεί κάποιο σφάλμα κατά την εκτέλεση της. Κώδικας: #If VBA7 ThenΠαράδειγμα με Windows API: SHCreateDirectoryEx() Η συνάρτηση αυτή δημιουργεί όλους τους φακέλους σε διαδρομές με περισσότερα επίπεδα, λειτουργεί με χαρακτήρες Unicode και προσφέρει αρκετές πληροφορίες σε περιπτώσεις που προκληθεί σφάλμα.. Κώδικας: Option ExplicitΚαλή συνέχεια! Τάσος |
Καλή σας ημέρα! Τάσο με σιγουριά μπορώ να σου πω πως χάθηκα με τόσα παραδείγματα και τόσες γραμμές :w00t: Δοκίμασα το τελευταίο παράδειγμα (βασιζόμενος στο ότι εάν δεν υπάρχει ο φάκελος, να δημιουργηθεί), σε module (εκεί πρέπει να μπει; Ή μέσα στο φύλλο;) και κοκκινίζει αυτό Κώδικας: Private Declare Function SHCreateDirectoryEx Lib "shell32" Alias "SHCreateDirectoryExA" _Όπως και να έχει σας ευχαριστώ για τις προτάσεις και τον χρόνο σας! |
Καλημέρα Νίκο. Οι οδηγίες #If και #End If είναι προεπεξεργαστικές οδηγίες (preprocessor directives) στη VBA. Χρησιμοποιούνται για να ελέγξουν ποια τμήματα του κώδικα θα συμπεριληφθούν κατά τη μεταγλώττιση σε κώδικα μηχανής, ανάλογα με τις καθορισμένες συνθήκες. Αυτές οι οδηγίες δεν εκτελούνται κατά τη διάρκεια της εκτέλεσης του κώδικα, αλλά κατά τη φάση της μεταγλώττισης. Χρήση των #If και #End If Η οδηγία #If ελέγχει μια συνθήκη κατά τη φάση της μεταγλώττισης και, αν η συνθήκη είναι αληθής, συμπεριλαμβάνει το μπλοκ του κώδικα που ακολουθεί. Η οδηγία #Else χρησιμοποιείται για να καθορίσει εναλλακτικό μπλοκ κώδικα, αν η συνθήκη του #If είναι ψευδής. Η οδηγία #End If χρησιμοποιείται για να δηλώσει το τέλος του μπλοκ κώδικα που ελέγχεται από το #If. Παράδειγμα Ας δούμε ένα παράδειγμα για να κατανοήσουμε καλύτερα τη χρήση αυτών των οδηγιών: Κώδικας: #If VBA7 Then Η μια από τις δύο συναρτήσεις ανάλογα την έκδοση Microsoft Office Θεωρείται από τον VBE άκυρη και γι αυτό την "κοκκινίζει". Αυτό δε σημαίνει ότι είναι σφάλμα αφού θα αγνοηθεί κατά τη φάση της μεταγλώττισης. Προτείνω να βάλεις όλο τον κώδικα εκτός το Sub Test() σε μια λειτουργική μονάδα (Module) και το Sub Test() όπου χρειαστεί. Καλή συνέχεια! Τάσος |
Καλησπέρα! Τάσο έχω τοποθετήσει τον κώδικα σύμφωνα με τις οδηγίες σου! Όταν τον τρέχω δημιουργεί τον φάκελο Αρχείο, αλλά δεν αποθηκεύει το αρχείο κάπου, ούτε με το παλιό όνομα ούτε με το νέο :022: |
Παράθεση:
|
Καλησπέρα Νίκο, Δοκίμασε τον παρακάτω κώδικα: Κώδικας: Option Explicit- Στο LastYear θα υπάρχει η τιμή Αρχείο\Το βιβλίο μου 2024 (Για αρχείο).xlsm - Στο NextYear Το βιβλίο μου 2025.xlsm - Και στην επιφάνεια ο φάκελος Αρχείο. |
Χρήστο καλησπέρα Νομίζω πως όλα δουλεύουν άριστα :thumbup1: Σας ευχαριστώ πολύ για την βοήθεια Χρήστο και Τάσο να είστε καλά! Καλό βράδυ :happy: |
Παράθεση:
Ολοκληρώνοντας κάτι έρχονται ιδέες και για αλλά πράγματα κι έτσι σκέφτηκα πως με τον ίδιο ακριβώς τρόπο, θα μπορούσα να αποθηκεύω και τις ενεργές περιοχές κάποιων φύλλων σε μορφή pdf, αυτό που πρόκειται να εκτυπωθεί δηλαδή. Οπότε, ακολούθησα τις οδηγίες σου για άλλη μια φορά, γίνεται η διαδικασία κ αποθηκεύονται τα pdf στην διαδρομή που έχω ορίσει. Το πρόβλημα που συναντώ είναι πως ενώ το pdf αρχείο υπάρχει, δεν μου το ανοίγει. Μήπως με τη συγκεκριμένη διαδικασία δεν αποθηκεύονται οι ενεργές περιοχές ως έγγραφα αλλά τα φύλλα του βιβλίου γενικότερα; |
Καλησπέρα Νίκο, Ελπίζω ο ο παρακάτω κώδικας να σε καλύψει προσαρμόζοντάς τον στο δικό σου: Κώδικας: [B10:D50].ExportAsFixedFormat _Το όρισμα OpenAfterPublish με True ανοίγει το αρχείο μετά την αποθήκευση ενώ με False παραμένει κλειστό. |
Καλημέρα Χρήστο. Θα το δοκιμάσω και θα σε ενημερώσω. Όσον αφορά το [B10:D50], υπάρχει άλλος τρόπος να δέχεται η εντολή την ενεργή περιοχή του φύλλου; |
Καλημέρα Νίκο, Λέγοντας "ενεργή περιοχή του φύλλου", θεωρώ πως εννοείς το επιλεγμένο εύρος. Δοκίμασε αντί εύρος να βάλεις τη λέξη Selection. |
Χρήστο δεν ξέρω αν εννοούμε το ίδιο :005: Πιθανόν όχι, γιατί το Selection αποθηκεύει το κελί που έχω επιλεγμένο εκείνη την στιγμή. (Αυτά συμβαίνουν όταν μπλέκομαι με τα πίτουρα :a068:) Εννοώ αυτό που ορίζω ως περιοχή εκτύπωσης. |
Νομίζω τώρα είναι πιο ξεκάθαρο! :003: Οπότε αντί για Selection, δοκίμασε αυτό το εύρος να κάνεις σε pdf: Range(ActiveSheet.PageSetup.PrintArea) |
Να είσαι καλά βρε Χρήστο σε ευχαριστώ! Τώρα ξετυλίχθηκε το κουβάρι κ βρέθηκε η άκρη :thumbup: |
| Η ώρα είναι 15:30. |
Ms-Office.gr - ©2000 - 2026, Jelsoft Enterprises Ltd.