Login Registrati
Stai vedendo 24 articoli - dal 1 a 24 (di 24 totali)
  • Autore
    Articoli
  • #19580 Score: 0 | Risposta

    ABRAMO48
    Partecipante
      1 pt

      perché in queste semplici istruzioni:

      Sub Macro1()
      '
      ' Macro1 Macro
      '
        Windows("LOGISTA_ARTICOLI.xls").Activate
          Sheets("ARTICOLI").Select
          Sheets("ARTICOLI").Visible = False
      '
      End Sub
      

      mi da il messaggio di errore:

      "Impossibile impostare la proprietà visibile per la classe worksheet"

      ???

       

      Grazie carisssimi!

       

       

      #19582 Score: 0 | Risposta

      vecchio frac
      Senior Moderator
        272 pts

        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.

        #19583 Score: 0 | Risposta

        vecchio frac
        Senior Moderator
          272 pts

          Ma la cartella è protetta? o il foglio è stato nascosto "very hidden" ?

          #19584 Score: 0 | Risposta

          vecchio frac
          Senior Moderator
            272 pts

            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 sub

             

             

            #19591 Score: 0 | Risposta

            scossa
            Partecipante
              37 pts

              vecchio frac ha scritto:

              if worksheets.count = 1 then exit sub

               

              Scusa vecchio frac ma worksheets.count restituirà sempre il numero di tutti fogli, indipendentemente dalla proprietà .Visible.

              #19592 Score: 0 | Risposta

              ABRAMO48
              Partecipante
                1 pt

                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!!!!

                #19594 Score: 0 | Risposta

                vecchio frac
                Senior Moderator
                  272 pts

                  scossa ha scritto:

                  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:

                  ABRAMO48 ha scritto:

                  il foglio "ARTICOLI" è l'unico foglio della cartella

                  ABRAMO48 ha scritto:

                  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.

                  #19597 Score: 0 | Risposta

                  patel
                  Moderatore
                    51 pts

                    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.Paste

                    usare

                    Sheets(1).Range1.copy Sheets(2).Range2

                    #19598 Score: 0 | Risposta

                    ABRAMO48
                    Partecipante
                      1 pt

                      Perché "mai usare Select?

                      Rallenta la velocità di esecuzione?

                      #19599 Score: 0 | Risposta

                      patel
                      Moderatore
                        51 pts

                        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.

                        #19600 Score: 0 | Risposta

                        ABRAMO48
                        Partecipante
                          1 pt

                          Il registratore sarebbe il compilatore immagino ...

                          cosa vuoi dire con "è utile solo come esempio per i comandi che non conosci."?

                          #19604 Score: 0 | Risposta

                          patel
                          Moderatore
                            51 pts

                            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

                            #19606 Score: 0 | Risposta

                            ABRAMO48
                            Partecipante
                              1 pt

                              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!

                              #19607 Score: 0 | Risposta

                              vecchio frac
                              Senior Moderator
                                272 pts

                                ABRAMO48 ha scritto:

                                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 😉

                                #19685 Score: 0 | Risposta

                                ABRAMO48
                                Partecipante
                                  1 pt

                                  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 with

                                  ma perché così mi da errore?

                                   '  Windows("LOGISTA_MACRO.xls").Activate
                                     
                                  With Windows("LOGISTA_MACRO.xls").Sheets("Macro")
                                      .Cells(19, "O") = .Cells(19, "P")
                                  End with

                                  precisamente:

                                  "Impossibile trovare il metodo o il membro dei dati"

                                  #19686 Score: 0 | Risposta

                                  ABRAMO48
                                  Partecipante
                                    1 pt

                                    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")
                                    #19691 Score: 0 | Risposta

                                    ABRAMO48
                                    Partecipante
                                      1 pt

                                      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.

                                      #19693 Score: 0 | Risposta

                                      patel
                                      Moderatore
                                        51 pts

                                        ABRAMO48 ha scritto:

                                        meglio così:

                                        Windows("LOGISTA_MACRO.xls").Activate
                                           
                                        With Sheets("Macro")
                                            .Cells(19, "O") = .Cells(19, "P")
                                        end with

                                        molto meglio, ma perché hai bisogno di Windows("LOGISTA_MACRO.xls").Activate ? con Windows non puoi usare With, Prova ad usare WorkBooks

                                        #19695 Score: 0 | Risposta

                                        vecchio frac
                                        Senior Moderator
                                          272 pts

                                          ABRAMO48 ha scritto:

                                          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).

                                          #19696 Score: 0 | Risposta

                                          vecchio frac
                                          Senior Moderator
                                            272 pts

                                            patel ha scritto:

                                            prova ad usare WorkBook

                                            E patel mi ha battuto sul tempo mentre scrivevo 🙂

                                            #19704 Score: 0 | Risposta

                                            ABRAMO48
                                            Partecipante
                                              1 pt

                                              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!

                                              #19705 Score: 0 | Risposta

                                              ABRAMO48
                                              Partecipante
                                                1 pt

                                                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 Sub
                                                

                                                E' meglio usare Sheets o Worksheets?

                                                #19727 Score: 0 | Risposta

                                                vecchio frac
                                                Senior Moderator
                                                  272 pts

                                                  ABRAMO48 ha scritto:

                                                  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.

                                                  ABRAMO48 ha scritto:

                                                  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.

                                                  ABRAMO48 ha scritto:

                                                  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 Sub
                                                     

                                                  Un 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.

                                                  #19737 Score: 0 | Risposta

                                                  ABRAMO48
                                                  Partecipante
                                                    1 pt

                                                    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 ... 

                                                  Login Registrati
                                                  Stai vedendo 24 articoli - dal 1 a 24 (di 24 totali)
                                                  Rispondi a: Nascondere finestra
                                                  Gli allegati sono permessi solo ad utenti REGISTRATI
                                                  Le tue informazioni: