LoginRegistrati
Stai vedendo 25 articoli - dal 1 a 25 (di 45 totali)
  • Autore
    Articoli
  • #19803 Risposta

    ABRAMO48
    Partecipante
      1 pt

      prendiamo il caso:

      With workBooks(A).Workshits(A)

      .cells(1) = .cells(10)

      .cells(2) = .cells(20)

      .cells(3) = .cells(30)

      ...

      End with

      Bene, si evita di ripetere "workBooks(A).Workshits(A)".

      Ma, se fosse invece:

      With workBooks(A).Workshits(A)

      .cells(1) = workBooks(B).Workshits(B).cells(10)

      .cells(2) = workBooks(B).Workshits(B).cells(20)

      .cells(3) = workBooks(B).Workshits(B).cells(30)

      ...

      end with

      domanda:

      E' possibile evitare, nel secondo caso, la ripetizione di "workBooks(B).Workshits(B)"?

      Grazie!

       

      #19806 Risposta
      patel
      patel
      Moderatore
        39 pts

        secondo me non è possibile

        #19808 Risposta
        Marius44
        Marius44
        Moderatore
          21 pts

          Ciao

          Ha ragione patel (ciao Andrea) ma potresti "accorciare" la scrittura settando il secondo Foglio.

          Per esempio:

          set sh2 = workBooks(B).Workshits(B)

          With workBooks(A).Workshits(A)

          .cells(1) = sh2.cells(10)

          .cells(2) = sh2.cells(20)

          .cells(3) = sh2.cells(30)

          ...

          end with

          Ciao,

          Mario

          #19810 Risposta
          Luca73
          Luca73
          Partecipante
            28 pts

            Ciao Concordo

            con patel a Marius (ciao entrambi)  avrei pensato anche io alla soluzione con una variabile

            L'altra cosa da valutare in caso di ciclicità ricorrente è la possibilità di usare un ciclo e una variabile che si incrementa (automativcamnte con un ciclo for o con apposita istruzione) e una definizione tramite l'indice o del range oppure con un offset

            CIao

            Luca

             

            #19821 Risposta

            vecchio frac
            Senior Moderator
              171 pts

              ABRAMO48 ha scritto:

              workBooks(B).Workshits(B)

              Va bene  che certe volte i prodotti Microsoft sono una schifezza, ma chiamarli così ("shits") mi sembra eccessivo   

              #19823 Risposta

              ABRAMO48
              Partecipante
                1 pt

                ahaha, "shits" ... ma guarda come ci si va a rovinare ... Quando si dice "parla come mangi" ... 

                Ciao vecchio frac,

                "con la faccia sotto i tuoi piedi, e ti puoi anche muovere" (Benigni-Troisi "Non ci resta che piangere")

                #19825 Risposta

                ABRAMO48
                Partecipante
                  1 pt

                  Ma allora potrei fare benissimo a meno della with-end with:

                  set AA = workBooks(A).Worksheets(A)

                  set BB = workBooks(B).Worksheets(B)

                  AA.cells(1) = BB.cells(10)

                  AA.cells(2) = BB.cells(20)

                  AA.cells(3) = BB.cells(30)

                  ...

                  Anzi, definirle pubbliche, definire così tutte le worksheets in tutte i workbooks e ogni volta che mi riferisco ad una Cells o ad un Range usare:

                  AA.Cells() o AA.Range o BB.Cells() o BB.Range etc. etc.

                   

                  #19826 Risposta

                  ABRAMO48
                  Partecipante
                    1 pt

                    ma, per esempio, una

                    set AA = workBooks(A).Worksheets(A)

                    definita in una sub è valida solo in quella sub e quindi dovrei ripeterla in ogni sub, o no? Se è così

                    come faccio per definirla una volta sola (public?) e usarla (AA.Cells per esempio) poi in tutte le sub?

                    #19827 Risposta
                    patel
                    patel
                    Moderatore
                      39 pts

                      basta definirla fuori della sub in un modulo standard che può essere anche quello delle sub.

                      set AA = workBooks(A).Worksheets(A)
                      set BB = workBooks(B).Worksheets(B)
                      sub miasub1()
                        AA.cells(1) = BB.cells(10)
                        AA.cells(2) = BB.cells(20)
                        AA.cells(3) = BB.cells(30)
                      End sub
                      sub miasub2()
                        AA.cells(11) = BB.cells(10)
                        AA.cells(21) = BB.cells(20)
                        AA.cells(31) = BB.cells(30)
                      End sub
                      #19828 Risposta

                      vecchio frac
                      Senior Moderator
                        171 pts

                        patel ha scritto:

                        basta definirla fuori della sub in un modulo standard che può essere anche quello delle sub.

                        Questo è giusto, ma l'esempio di patel va leggermente spiegato: devi dichiarare Public le variabili oggetto che si riferiscono ai fogli, e l'assegnazione con Set non può essere fatta al di fuori di una routine. Bisogna anche definire A e B e l'esempio vuole che i due file siano già aperti:

                        'modulo standard
                        Option Explicit
                        
                        Public AA As Worksheet
                        Public BB As Worksheet
                        
                        Sub init()
                        Dim A As String
                        Dim B As String
                        
                            A = ThisWorkbook.Name
                            B = "test.xlsx"   
                            ' nota: i due workbooks devono essere già aperti
                            Set AA = workBooks(A).Worksheets("Foglio1")
                            Set BB = workBooks(B).Worksheets("Foglio2")
                        End Sub
                        
                        Sub miasub1()
                          AA.cells(1) = BB.cells(10)
                          AA.cells(2) = BB.cells(20)
                          AA.cells(3) = BB.cells(30)
                        End sub
                        
                        Sub miasub2()
                          AA.cells(11) = BB.cells(10)
                          AA.cells(21) = BB.cells(20)
                          AA.cells(31) = BB.cells(30)
                        End sub

                        Qui, la sub "init" va chiamata e lanciata prima di chiamare miasub1 e miasub2, allo scopo di referenziare correttamente le variabili AA e BB. In alternativa si può inserire la dichiarazione delle due Public in ThisWorkbook e il codice di inizializzazione con Set dentro l'evento di apertura del Workbook.

                        #19830 Risposta
                        patel
                        patel
                        Moderatore
                          39 pts

                          Sono stato troppo frettoloso e senza testare, comunque non so se vale la pena di lavorare in questo modo, io non lo faccio.

                          #19833 Risposta
                          Luca73
                          Luca73
                          Partecipante
                            28 pts

                            Ciao

                            Ho una domanda nell'esempio fatto da VF 

                            la sub init deve essere richiamata o prima della sub miasub1 (o 2) oppure all'interno della stessa.

                            Corretto?

                            altrimenti non valorizzo le variabili

                             

                            #19834 Risposta

                            vecchio frac
                            Senior Moderator
                              171 pts

                              Sì, naturalmente prima dell'esecuzione delle istruzioni di assegnazione (Set). Per questo dicevo che si potrebbero anche inserire nell'evento Open del Workbook, così si è sicuri che le assegnazioni vengono eseguite prima di tutte le successive routine.

                              #19835 Risposta
                              Luca73
                              Luca73
                              Partecipante
                                28 pts

                                Ops Scusa VF non avevo letto la postilla sotto il codice....

                                #19855 Risposta

                                ABRAMO48
                                Partecipante
                                  1 pt

                                  Per quanto mi riguarda, concluderei che così:

                                  sub miasub1()
                                  
                                  set AA = workBooks(A).Worksheets(A)
                                  set BB = workBooks(B).Worksheets(B)
                                  
                                    AA.cells(1) = BB.cells(10)
                                    AA.cells(2) = BB.cells(20)
                                    AA.cells(3) = BB.cells(30)
                                  End sub

                                  Trovo sia molto pratico e chiaro, in ogni sub, dichiarare a che WorkBooks e Worksheets ci si riferisce. Meglio del sistema With-End With che "incastra" le istruzioni. Con due lettere si può identificare ogni foglio in qualsiasi tabella e il codice risulta sicuro, semplice, essenziale e chiaro.

                                  Controindicazioni, secondo voi?

                                  #19865 Risposta

                                  vecchio frac
                                  Senior Moderator
                                    171 pts

                                    Nessuna controindicazione, il costrutto With - End With nasce per semplificare l'utilizzo di oggetti padre quando si devono impostare proprietà a cascata che si riferiscono allo stesso oggetto. Semplificazione per chi scrive codice, non per il compilatore. E non è affatto un problema di incastro di istruzioni. Ricordati però Option Explicit e la dichiarazione delle variabili. Questo è più importante del fatto di decidere di usare/non usare With.

                                    #19867 Risposta

                                    ABRAMO48
                                    Partecipante
                                      1 pt

                                      Parlavo di "incastro", in quanto un istruzione tipo .cells trova il suo indirizzo preciso "all'interno" di una with-end with, mentre una MM.cells è definita "di per se".

                                      Aggiungo che ho definito una: Public MM As Worksheet (e consimili).

                                      Ma spiegami, perché la definizione esplicita delle variabili è così importante, vedo che insisti molto su questo ...

                                      Poi, immagino che ogni volta che eseguo una sub, questa viene compilata prima di essere eseguita, o meglio, può darsi che venga compilato l'intero progetto prima di eseguire anche una sola sub? (altrimenti come fa a vedere le variabili public (p.e) che sono dichiarate al di fuori delle sub?)

                                      #19869 Risposta
                                      patel
                                      patel
                                      Moderatore
                                        39 pts

                                        In un programma con molte istruzioni può capitare di fare errori di battitura e sbagliare il nome di una variabile, la direttiva Option explicit ti obbliga a dichiarare tutte le variabili e ti segnala errore se incontra una variabile non dichiarata e te la evidenzia facendoti risparmiare il tempo per cercarla.

                                        #19872 Risposta

                                        ABRAMO48
                                        Partecipante
                                          1 pt

                                          Una domanda:

                                          se devo riferirmi, semplicemente, alla cella A1 è più sensato (nel contesto VBA) usare:

                                          Range("A1")

                                          o

                                          Cells(1, "A")

                                          #19878 Risposta

                                          vecchio frac
                                          Senior Moderator
                                            171 pts

                                            Le due istruzioni sono equivalenti. Puntano allo stesso oggetto. Non cercare un significato di "sensatezza", una o l'altra soluzione dipende dal contesto in cui ti trovi e anche dal tuo stile di scrivere codice.

                                            Se vogliamo spaccare il capello in quattro, la proprietà Cells lavora meglio con i numeri, per cui sarebbe meno faticoso per l'interprete ricevere un Cells(1, 1) piuttosto che un Cells(1, "a"), per non costringerlo a spendere qualche micron per convertire il carattere alfabetico nel corrispondente numero che identifica la colonna.

                                             

                                            #19881 Risposta
                                            patel
                                            patel
                                            Moderatore
                                              39 pts

                                              tutto dipende dal contesto, Range("A1") è più leggibile, ma se sei in un ciclo conviene usare cells(numriga,numcolonna)

                                              #19882 Risposta

                                              ABRAMO48
                                              Partecipante
                                                1 pt

                                                E' possibile, saltare la select? Come?

                                                O1.Range("BL1:BL1").Select
                                                    Selection.AutoFill Destination:=O1.Range("BL1:BL400"), Type:=xlFillDefault

                                                 

                                                #19883 Risposta

                                                ABRAMO48
                                                Partecipante
                                                  1 pt

                                                  Tutto chiaro su Range/Cells

                                                  Grazie!

                                                  #19884 Risposta

                                                  vecchio frac
                                                  Senior Moderator
                                                    171 pts

                                                    ABRAMO48 ha scritto:

                                                    E' possibile, saltare la select?

                                                    Normalmente non serve pre-selezionare un range per farci qualcosa, perchè si risparmiano millisecondi 🙂

                                                    Quindi oltre che essere possibile è anche consigliabile farlo.

                                                    O1.Range("BL1:BL1").AutoFill Destination:=O1.Range("BL1:BL400"), Type:=xlFillDefault

                                                    Perchè è possibile questo? perchè l'oggetto Selection è un oggetto speciale di tipo range di cui ne eredità metodi e proprietà (come Autofill). Pertanto non serve selezionare un range, costruendo così un nuovo oggetto Range, solo per invocarne un suo metodo, quando puoi applicare il metodo direttamente al range originale.

                                                    E nell'esempio, se O1 è già un foglio selezionato, puoi anche ometterlo. Qualche volta è invece necessario selezionare esplicitamente foglio e range, ma quando ti salta fuori l'errore... te ne accorgi 🙂

                                                    #19887 Risposta
                                                    patel
                                                    patel
                                                    Moderatore
                                                      39 pts

                                                      patel ha scritto:

                                                      In un programma con molte istruzioni può capitare di fare errori di battitura e sbagliare il nome di una variabile, la direttiva Option explicit ti obbliga a dichiarare tutte le variabili e ti segnala errore se incontra una variabile non dichiarata e te la evidenzia facendoti risparmiare il tempo per cercarla.

                                                      VF, mi aspettavo un commento da parte tua   sei troppo impegnato ?

                                                    LoginRegistrati
                                                    Stai vedendo 25 articoli - dal 1 a 25 (di 45 totali)
                                                    Rispondi a: With – End with
                                                    Gli allegati sono permessi solo ad utenti REGISTRATI
                                                    Le tue informazioni:



                                                    vecchio frac - 2750 risposte

                                                    albatros54
                                                    albatros54 - 1009 risposte

                                                    patel
                                                    patel - 909 risposte

                                                    Marius44
                                                    Marius44 - 786 risposte

                                                    Luca73
                                                    Luca73 - 675 risposte