› Sviluppare funzionalita su Microsoft Office con VBA › Nascondere finestra
-
AutoreArticoli
-
perché in queste semplici istruzioni:
Sub Macro1() ' ' Macro1 Macro ' Windows("LOGISTA_ARTICOLI.xls").Activate Sheets("ARTICOLI").Select Sheets("ARTICOLI").Visible = False ' End Submi da il messaggio di errore:
"Impossibile impostare la proprietà visibile per la classe worksheet"
???
Grazie carisssimi!
Perchè il foglio "ARTICOLI" è già nascosto e quindi il codice non può selezionarlo (seconda riga del codice).
Imposta un On Error Resume Next oppure fai il controllo sulla visibilità del foglio in questione, nascondendolo se risulta visibile.
Nota: puoi anche non selezionare il foglio per renderlo invisibile, il comando funziona anche se è attivo un altro foglio.
Ma la cartella è protetta? o il foglio è stato nascosto "very hidden" ?
Dopo un paio di prove ci sono arrivato: il motivo vero è perchè tenti di nascondere l'ultimo foglio rimasto 🙂
Pertanto ti serve di fare un controllo (prima di nascondere il foglio interessato) che verifichi il numero di fogli residuo. prima di procedere col nascondimento del foglio.
if worksheets.count = 1 then exit subif worksheets.count = 1 then exit sub
Scusa vecchio frac ma worksheets.count restituirà sempre il numero di tutti fogli, indipendentemente dalla proprietà .Visible.
Aaah! E' vero! Anzi il foglio "ARTICOLI" è l'unico foglio della cartella! Ma guarda un po' dove sta l'inghippo, certo siete proprio bravi! Io ho fatto un grosso programma con diverse macro per gestire gli ordini di una tabaccheria, molto complesso e articolato (ordine, carico, statistiche, ...) ma, incredibile, non sono molto esperto in VBA (solo ho fatto il programmatore per 40 anni (Assembler, Cobol, Basic, Progress).
Il programma funziona bene, ma ora sto cercando di "raffinare" le istruzioni per farlo andare un po' più veloce nelle esecuzioni delle macro e per monitorare le stesse durante il processo, e quindi cerco di approfondire il VBA.
Conosco l'istruzione ScreeUpdating False (dietro vostro suggerimento) ma quando in una macro cambio finestra o foglio questo cambia anche su video. Vorrei che le esecuzioni delle macro procedessero nascoste, mentre sulla finestra da cui vengono lanciate comparissero in successione i vari passi del lavoro.
Come posso fare? Suggerimenti? (a parte studiare, umilmente, il VBA ...)
Grazie!!!!
worksheets.count restituirà sempre il numero di tutti fogli
Ho trovato l'icona che arrossisce per l'imbarazzo
Bè allora bisognerebbe impostare un piccolo loop che conti i fogli visibili... Per fortuna nel caso del nostro amico il problema non si pone:
il foglio "ARTICOLI" è l'unico foglio della cartella
quando in una macro cambio finestra o foglio questo cambia anche su video
Nella maggior parte delle operazioni non serve selezionare un foglio o un range per farci qualcosa, perchè puoi riferirtici senza doverlo prima attivare. Comunque non riesco a riprodurre questo cambio di finestra se Application.ScreenUpdating è False.
per essere più chiari mai usare Select non solo in questo caso ma sempre, anche nelle operazioni di copia incolla
invece di
Sheets(1).select Range1.copy Sheets(2).select Range2.Pasteusare
Sheets(1).Range1.copy Sheets(2).Range2
Certamente, per esempio se selezioni un foglio e poi ci fai operazioni come prima cosa ti mostra il foglio e poi fa il resto.
Nel tuo caso se il foglio è già nascosto non puoi selezionarlo e ti da errore.
Inoltre nel programmare puoi dimenticarti dove sei, se non usi select e metti tutti i riferimenti questo non può accadere.
Select è utilizzato dal registratore, ma il codice prodotto dal registratore non è ottimizzato, è utile solo come esempio per i comandi che non conosci.
Il registratore sarebbe il compilatore immagino ...
cosa vuoi dire con "è utile solo come esempio per i comandi che non conosci."?
Sto parlando del Registratore di macro https://support.office.com/it-it/article/automatizzare-le-attivit%C3%A0-con-il-registratore-macro-974ef220-f716-4e01-b015-3ea70e64937b
Il codice che hai mostrato sembra originato dal registratore
Ooh! E' proprio così! Inizialmente ho proprio usato il registratore e poi ho usato il metodo di soluzione proposto per sviluppare altre macro, perpetrando, ovviamente, la soluzione schematica ma non ottimale.
Grazie!
cosa vuoi dire con "è utile solo come esempio per i comandi che non conosci."?
Patel intende dire che si può utilizzare la funzionalità di registrazione automatica delle macro per farsi un'idea di come VBA imposta un comando sconosciuto o esegue in automatico un'operazione manuale. Poi però il codice prodotto va riesaminato, scremato, ottimizzato, dal momento che la "registrazione" della macro non utilizza cicli nè esegue le operazioni di copia e incolla in modo intelligente. Va bene pertanto per conoscere un metodo o una proprietà (cosa che si può comunque scoprire consultando la guida o sfruttando il Visualizzatore di oggetti), ma non per applicare in produzione del codice definitivo.
Riassunto: il codice prodotto dal registratore di macro, per funzionare, funziona. Ma fa schifo 😉
Allora, invece di così:
Windows("LOGISTA_MACRO.xls").Activate Sheets("Macro").Select Cells(19, "O") = Cells(19, "P")meglio così:
Windows("LOGISTA_MACRO.xls").Activate With Sheets("Macro") .Cells(19, "O") = .Cells(19, "P") end withma perché così mi da errore?
' Windows("LOGISTA_MACRO.xls").Activate With Windows("LOGISTA_MACRO.xls").Sheets("Macro") .Cells(19, "O") = .Cells(19, "P") End withprecisamente:
"Impossibile trovare il metodo o il membro dei dati"
cioè, perché quest'istruzione da quell'errore?
Windows("LOGISTA_MACRO.xls").Sheets("Macro").Cells(19, "O") = Windows("LOGISTA_MACRO.xls").Sheets("Macro").Cells(19, "P")Come faccio a riferirmi ad una cella in in un <em>altro</em> Foglio, che si trova in un'<em>altra</em> Tabella, senza prima attivare l'uno e l'altra.
Ho capito come non attivare il Foglio: Sheets(2).Cells(...), ma non so come fare senza attivare <em>prima</em> la Tabella Windows(2) perché: Windows(2).Sheets(2).Cells(...) non funziona.
meglio così:
Windows("LOGISTA_MACRO.xls").Activate With Sheets("Macro") .Cells(19, "O") = .Cells(19, "P") end withmolto meglio, ma perché hai bisogno di Windows("LOGISTA_MACRO.xls").Activate ? con Windows non puoi usare With, Prova ad usare WorkBooks
Ho capito come non attivare il Foglio: Sheets(2).Cells(...), ma non so come fare senza attivare <em>prima</em> la Tabella Windows(2) perché: Windows(2).Sheets(2).Cells(...) non funziona.
Probabilmente non hai attivato i riferimenti corretti. Ho creato due file, a.xlsx e b.xlsx, li ho aperti e in b.xlsx ho eseguito questa istruzione:
Workbooks("b.xlsx").Worksheets("foglio2").Cells(2, 2) = Workbooks("a.xlsx").Worksheets("foglio1").Cells(1, 1)che scrive nella cella B2 del foglio2 di b.xlsx il contenuto della cella A1 del foglio1 di a.xlsx (e funziona).
In pratica invece di Windows() devi usare Workbooks(). Nota che entrambi i file devono essere aperti perchè se uno dei due è chiuso ottieni l'errore "indice non incluso nell'intervallo". Se prevedi di non aprire entrambi i file bisogna usare una tecnica leggermente diversa (i.e., aprire il file, leggerlo, copiare il valore desiderato e chiuderlo senza salvare).
prova ad usare WorkBook
E patel mi ha battuto sul tempo mentre scrivevo 🙂
Perfettooo! con workbooks funziona tutto, ora ho solo da correggere le 180 macro ... in questo modo più razionale e siamo già un passo avanti (come si dice "chi non ha testa abbia gambe").
Però ditemi: che differenza cielo fra Windows e Workbooks, fra Sheets e worksheets?
Poi, potreste consigliarmi un link, o anche, se credete, un manuale VBA da acquistare, in ITALIANO, dove studiare il VBA.
Grazie!
Avete qualche suggerimento <em>grammaticale</em> da fare su questa sub?
Sub M_DATE_PROG() ' Application.ScreenUpdating = True Application.DisplayStatusBar = True Application.StatusBar = "Date Progressivo in corso ..." Application.Wait (Now + TimeValue("0:00:01")) Application.ScreenUpdating = False With Workbooks("LOGISTA_MACRO.xls").Sheets("Macro") .Cells(19, "O") = .Cells(19, "P") .Cells(20, "O") = .Cells(20, "P") .Cells(19, "B") = .Cells(19, "L") .Cells(19, "C") = .Cells(19, "M") .Cells(20, "B") = .Cells(19, "B") - 1 .Cells(21, "C") = .Cells(19, "B") - .Cells(22, "Q") .Cells(22, "B") = .Cells(22, "Q") .Cells(20, "E") = "OK" .Cells(16, "A") = "DATE PROGRESSIVO" .Cells(17, "A") = "INSERITE" .Cells(17, "A").Select End With 'LOGISTA_MACRO.MACRO Application.StatusBar = "pronto" Application.ScreenUpdating = True ' End SubE' meglio usare Sheets o Worksheets?
E' meglio usare Sheets o Worksheets?
L'insieme WorkSheets() contiene solo i riferimenti ai fogli di lavoro, mentre Sheets() include anche i Charts (i grafici). Tecnicamente quindi è più corretto WorkSheets se lavori solo coi fogli.
Windows() è una proprietà dell'oggetto Workbook ed è l'insieme delle finestre aperte. Invece Workbooks è l'oggetto padre che rappresenta le cartelle di lavoro. Mentre puoi avere solo un Workbook, puoi avere più Windows che si riferiscono allo stesso Workbook (per esempio quando lo dividi), e contiene le finestre visibili e nascoste del file aperto.
potreste consigliarmi un link
Una piccola base di partenza la puoi trovare in fondo alla pagina del nostro forum (anche di questa pagina), sezione Tutorials.
qualche suggerimento <em>grammaticale</em> da fare su questa sub?
Cosa vorresti sapere? se funziona? se è scritta bene? Un suggerimento "grammaticale" non c'è perchè non ci sono errori, se vuoi puoi evitare di ripetere Application utilizzando il costrutto With:
Option Explicit Sub M_DATE_PROG() ' With Application .ScreenUpdating = True .DisplayStatusBar = True .StatusBar = "Date Progressivo in corso ..." .Wait (Now + TimeValue("0:00:01")) .ScreenUpdating = False ..... End With ..... End SubUn consiglio finale è di abituarti a usare Option Explicit in testa ai tuoi moduli e di dichiarare sempre le variabili che utilizzi e il loro tipo.
Vecchio Frac Grazie! Sei veramente molto cortese. Sei stato chiarissimo! Seguirò i tuoi consigli.
Intanto ho fatto un bel passo avanti: ora so come evitare che le macro saltino da una finestra all'altra durante l'esecuzione e dunque, posso monitorizzare il procedere dei passi nella finestra MACRO che, in pratica, è il "pannello di controllo" dell'intera procedura.
Grazie ancora, ma, temo, avrò bisogno di altri suggerimenti, a presto ...
-
AutoreArticoli
