› Excel e gli applicativi Microsoft Office › Protezione Macro
-
AutoreArticoli
-
Buongiorno, sono nuovo nel Forum,Ho sviluppato un programma in excel97 con delle macro (in gran parte fatte creare e poi riviste dal Generatore di Macro).Ora la cartella e i fogli di lavoro possono essere protetti, ma vedo che questo non protegge le macro da modifiche anche non volute dall'utente. Come posso fare?Forse il problema dovrebbe essere risolto da una sorta di "compilazione" delle macro, che traducendole in binario, oltretutto, le renderebbe anche più veloci in esecuzione?Sono assolutamente inesperto dell'argomento e sarei grato se qualcuno mi inquadrasse un'attimo la faccenda (a parte seguire il tutorial VBA che ho già visto disponibile).Grazie!!!Ciao Abramo,prima cosa che mi viene in mente,se vuoi proteggere le macro da scritture devi proteggere il VBA.Quindi:- Alt+F11 --> Strumenti --> Proprietà di VBAProject- clicca su "Protezione"- spulcia "proteggi progetto dalla visualizzazione" e inserisci una psw confermandola- salva il fileAlla prossima apertura vedrai che premendo Alt+F8 sarà attivo solo "ESEGUI" mentre tutti gli altri pulsanti sono disabilitati ... naturalmente se entri nel VBA (Alt + F11) ed inserendo la psw iniziale, potrai modificare le tue macro.Spero che sia quello che stavi cercandociaoCianoGrazie Ciano! problema risolto, secondo le tue indicazioni.Per quanto riguarda le macro, mi domandavo se esiste una sorta di "compilazione" per renderle più veloci in esecuzione ... o no?Grazie, Abramo.Buongiorno,Abramo,l'unica cosa che io sappia per velocizzare le macro è quello di bloccare lo sfarfallio dello schermo, mentre è in esecuzione, altro non saprei ....metti questi comandi ad inizio "Sub" ed alla fine "Sub":
`Sub nome_tua_sub() Application.ScreenUpdating = False ... .. tuo codice Sub ... Application.ScreenUpdating = True End Sub
ciao
Ciano
Non mi è chiaro dove va messa l'istruzione:prima di ogni sub?Cioè prima di ogni:Sub nome_tua_sub()???che confusione!!! (ho fatto un copia incolla e guarda che ca...) riprovo:Non mi è chiaro dove va messa l’istruzione:
prima di ogni sub?
Cioè prima di ogni:
Sub nome_tua_sub()
???
niente da fare, acc!non mi è chiaro dove va messa l'istruzioneprima di ogni sub?Abramo,il.. non centra nulla ... probabilmente non ho dato lo spazio giusto nello scrivere le righe d'istruzione ... devi guardare solo quello che è compreso tra "Sub" e "End Sub" che sono l'inizio e la fine obbligatorie che racchiudono la tua istruzione.
Quindi il comando che devi inserire sarebbeApplication.ScreenUpdating = False 'da inserire sotto l'inizio "Sub"eApplication.ScreenUpdating = True ' da inserire prima della fine "End Sub"spero che sia chiarociaoCianoSalve a tuttiPer velocizzare (e un po', ma solo un po') l'esecuzione come dice Ciano (ciao) devi mettere quel codice all'inizio della macro e prima della fine.Evito tutta la sfilza che appare e che non è possibile leggere.Tu hai una macro che, ipotizziamo, si chiama Prova()Ovviamente la macro inizierà conSub Prova()ecco subito dopo questa riga metti Application.ScreenUpdating = Falsepoi ci sarà il tuo codice ed alla fine ci saràEnd SubProprio prima di detta riga devi mettere Application.ScreenUpdating = TrueSpero sia chiaro. Ciao,MarioGrazie Ciano e Marco,Applicato: tempi dimezzati!!!Ma che succede se una volta applicato lo "screenupdating False" la sub esce (correttamente con un "exit sub" per una particolare condizione) senza aver eseguito la "sceenupdating true"?Rimane impostato il False per tutte le sub che possono essere eseguite in seguito? Finché non viene eseguito uno "screenupdating True"?CiaoPoco male, un lapsus è concesso (eheheh!)Sì, esattamente.Devi trovare il modo di intercettare l'errore e, eventualmente, rimandare ad una riga di codice che ripristini a TrueCiao,Mariooppure siccome non mi interessa "mai" lo sfarfallio dello schermo durante l'esecuzione delle macro, potrei anche lasciarlo il "False" ... o no?Potrebbe dare problemi in altre circostanze al di fuori dell'esecuzione delle macro?Ciaose non ti interessa lo sfarfallio allora non mettere nè la prima istruzione nè la seconda.Se lo lasci in False, come dici, non avrai più l'aggiornamento dello schermo.Ciao,Mariomi intrometto un attimo,il così detto sfarfallio dello schermo non è altro che l'aggiornamento dei dati sullo schermo.quindi la messa in "False" fa in modo che lo schermo non si aggiorni fino a quando non sono stati fatte tutte le stringhe della "Sub" ... risparmiando anche qualcosa in tempo di esecuzione ... al ripristino del "True" non succede nient'altro che venga aggiornato lo schermo con tutti i dati corretti.Come ha detto Marius (che saluto), se non introduci la posizione "true" praticamente non otterrai sullo schermo l'aggiornamento desiderato dei tuoi dati.ciaoCianoMa una "prima volta" lo devo mettere da qualche parte, o lo posso impostare a livello di progetto? Come?ahhh! Capito! Ciano.Vuoi dire che alla fine un "True" ci vuole se vuoi vedere il risultato finale del lavoro (lo sfarfallio intermedio non mi interessa, ma il risultato finale sì, ovviamente).E' così?ok, Abramotu puoi mettere in "false" ed eseguire più macro .. importante che alla fine dell'ultima macro prima di "End Sub" e quindi prima che esegua l'uscita dell'ultima macro .. tu metta il "true"CianoTutto chiaro! Comunque, i tempi si sono dimezzati e le macro cono protette.Grazie per i vostri consigli, ora devo seguire un po' il tutorial VBA del forum, perché la gran parte delle macro le ho ottenute dal generatore di macro di excel e quindi penso non siano proprio perfettamente ottimizzate sia dal punto di vista "grammaticale" che sintattico" e, in ogni caso di una corretta programmazione ... Mi piacerebbe sottoporvene una così mi potreste dare qualche ragguaglio generale di impostazione che ne dite? (ho fatto il programmatore per tanti anni (Assembler, Cobol, Progress) ma non conosco per niente il VBA)CiaoIo sono autodidatta. Ho iniziato a cercare di capire il codice dei programmi del mitico Commodore64 (in Basic e listate ... chilometriche). Oggi con VBA me la cavicchio.Normalmente, ma non nella generalità dei casi, quando crei una macro col registratore, vi sono pezzi di codice superflui e che sono quelli che rallentano l'esecuzione. Un esempio banale: voglio copiare il contenuto di una determinata cella e riportarlo in un'altra. Bene. Cosa fa VBA?prima seleziona la cella che voglio copiare, quindi la copia, poi seleziona la cella dove voglio incollare il contenuto e, alla fine, incolla. I due passi di .Select sono inutili.Prova a rileggere la macro e vedi cosa puoi eliminare.Ciao,MarioAllora, lo screenupdating funziona perfettamente, ma, ogni volta che nella macro cambio finestra, sul video compare la nuova finestra, come faccio a evitare questo? Insomma vorrei non vedere nulla riflesso sul video salvo la finestra da cui ho lanciato la Macro.
Grazie carissimi!
mmm, riscrivo: Allora, lo screenupdating funziona perfettamente, ma, ogni volta che nella macro cambio finestra, sul video compare la nuova finestra, come faccio a evitare questo? Insomma vorrei non vedere nulla riflesso sul video salvo la finestra da cui ho lanciato la Macro. Grazie!
ciao Abramo,
purtroppo non riesco a seguirti:
cosa intendi che "nella macro cambio finestra, sul video compare la nuova finestra, "
nella macro hai riferimenti di fogli???
e poi "vorrei non vedere nulla riflesso sul video salvo la finestra da cui ho lanciato la Macro"
se all'inizio della tua macro selezioni un foglio diverso e successivamente si eseguono i calcoli .... è normale non vedere il foglio dei calcoli (ma il foglio selezionato ed attivato) .. però non so se è questo che intendi.
ps: magari se alleghi il tuo file, senza dati sensibili, con il risultato che desideri, possiamo capire meglio ... fatto così di impeto, l'interpretazione è personale.
Ciano
agli amministratori .... cosa sbaglio per non riuscire a scrivere decentemente?.. ahahah... grazie mille
Ricominciamo da capo:
allora, con lo sceenupdating = false si riducono molto i tempi di esecuzione, ma quando nella macro cambio finestra questa mi cambia anche sullo schermo. Domanda come posso fare perché il programma rimanga sempre sulla finestra da dove ho lanciato la macro?
Grazie!
-
AutoreArticoli