Forum

Forum (https://www.ms-office.gr/forum/)
-   Excel - Ερωτήσεις / Απαντήσεις (https://www.ms-office.gr/forum/excel-erotiseis-apantiseis/)
-   -   [VBA] Πώς εμποδίζουμε την αποθήκευση αρχείου Excel (https://www.ms-office.gr/forum/excel-erotiseis-apantiseis/6030-pos-empodizoyme-tin-apothikeysi-arxeioy-excel.html)

caudillo 18-01-22 12:03

Πώς εμποδίζουμε την αποθήκευση αρχείου Excel
 
Την καλησπέρα μου σε όλους.
Χτες μου ζήτησε κάτι ο Διευθυντής μου, το οποίο ξεφεύγει λίγο από τις ικανότητες και τις γνώσεις μου.
Έχουμε 48 διαφορετικά αρχεία Excel με 8-10 φύλλα εργασίας το καθένα, όπου περνάμε τις βαθμολογίες των μαθητών μας.
Μου ζήτησε λοιπόν, αν ο μέσος όρος ενός μαθήματος είναι πάνω από 18,5 να βγαίνει ένα προειδοποιητικό μήνυμα (π.χ. "Υψηλή βαθμολογία") και - αν είναι δυνατόν - να μην αφήνει τον χρήστη να αποθηκεύσει το αρχείο αν δεν πέσει ο μέσος όρος κάτω από 18,5.
Ήδη στα αρχεία υπάρχουν διάφορες μακροεντολές με βάση τις οποίες αυτοματοποιούνται πολλές διεργασίες - να είναι καλά τα παιδιά του forum - αλλά αυτό είναι κάτι που δεν πάει το μυαλό μου πως μπορεί να γίνει (ούτως ή άλλως από VBA...)
Αν βρεθεί τρόπος να γίνει κάτι τέτοιο θα ήθελα και μια πρόταση σχετικά με το πως μπορεί να περαστεί αυτή η διαδικασία, όσο πιο εύκολα γίνεται, σε 450 -480 διαφορετικά φύλλα εργασίας.
Ευχαριστώ για τον χρόνο σας.
Ελπίζω στην καθοδήγησή σας.

caudillo 19-01-22 08:14

Καλημέρα σε όλο το forum.
Ψάχνοντας στο διαδίκτυο να βρω ιδέες για να λύσω το θέμα μου κατέληξα στον παρακάτω κώδικα:

"Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim WS_Count As Integer
Dim I As Integer
WS_Count = ActiveWorkbook.Worksheets.Count
For I = 1 To WS_Count
If Application.Sheets(I).Range("S22").Value > 18.5 Then
Cancel = True
MsgBox "Η αποθήκευση ακυρώθηκε." & Chr(13) & "Ο μέσος όρος βαθμολογίας στο μάθημα" & Chr(13) & "είναι πολύ υψηλός." & Chr(13) & "Παρακαλώ επανεξετάστε τους βαθμούς σας." & Chr(13) & "Εκ της Διευθύνσεως."
End If
Next I
End Sub"

Σε κάποιες δοκιμές που έχω κάνει φαίνεται να δουλεύει όπως πρέπει.
Η μόνη περίπτωση που παρατήρησα να έχει πρόβλημα είναι όταν δεν υπάρχουν βαθμοί στο φύλλο εργασίας - άρα δεν υπάρχει και μέσος όρος - οπότε δεν αφήνει το βιβλίο εργασίας να αποθηκευτεί. Ενώ λογικά θα έπρεπε, αφού η τιμή του κελιού που ελέγχει ο κώδικας είναι κάτω από 18,5 (στην πραγματικότητα δεν υπάρχει τιμή στο κελί αυτό).
Μήπως κάποιος μπορεί να βοηθήσει να ξεπεράσουμε αυτό το τελευταίο θέμα;
Ευχαριστώ πολύ.

kapetang 19-01-22 18:51

Καλησπέρα

Δοκίμασε τον κώδικα:

Κώδικας:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

    Dim WS_Count As Integer
    Dim I As Integer, mo As Variant
   
    WS_Count = ActiveWorkbook.Worksheets.Count
    For I = 1 To WS_Count
        mo = Application.Sheets(I).Range("S22").Value
        If (mo > 18.5) * (mo <> 0) * (mo <> "") Then
            Cancel = True
            MsgBox "Η αποθήκευση ακυρώθηκε." & Chr(13) & _
                  "Ο μέσος όρος βαθμολογίας στο μάθημα" & Chr(13) & _
                  "είναι πολύ υψηλός." & Chr(13) & _
                  "Παρακαλώ επανεξετάστε τους βαθμούς σας." & Chr(13) & _
                  "Εκ της Διευθύνσεως."
        End If
    Next I
End Sub


caudillo 20-01-22 07:44

Καλημέρα Γιώργο και σ' ευχαριστώ για την απάντησή σου.
Η αποθήκευση του αρχείου προχωράει τώρα κανονικά σε κάθε περίπτωση.
Να είσαι καλά και καλή συνέχεια.

comsup 19-02-22 16:41

Εφαρμογη λυσης
 
Καλησπερα, επειδη με ενδιαφερει η λυση που προτεινατε θα μπορουσα να το χρησιμοποιησω στο αρχειο μου. Αν καταλαβα καλα, δεν επιτρεπει την αποθηκευση αρχειου αν δεν πληροι καποιες προυποθεσεις τιμων σε κελια

kapetang 19-02-22 20:57

Καλησπέρα

Ο κώδικας δεν επιτρέπει την αποθήκευση, όταν η τιμή στο κελί S22, σε όλα τα φύλλα, δεν ικανοποιεί κάποια συνθήκη.

Με κατάλληλη προσαρμογή θα μπορούσες να τον χρησιμοποιήσεις.


Η ώρα είναι 18:51.

Ms-Office.gr - ©2000 - 2026, Jelsoft Enterprises Ltd.


Search Engine Optimization by vBSEO 3.3.2