Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    Excel - Numero progressivo

    Buongiorno ragazzi,
    sto creando una macro in Excel, ma non essendo esperto di programmazione volevo avere un aiuto da voi. In particolare ho scritto questo nella mia macro:

    codice:
    Sub Macro1()
    '
    ' Macro1 Macro
    
        Dim i As Integer
    i=0
        i = i + 1
        
        
        Sheets("Nuovo").Select
        Sheets("Nuovo").Copy After:=Sheets(i)
            
            
        Range("I20").Select ' Seleziona la cella
    
    ActiveCell.FormulaR1C1 = i
    End Sub
    In pratica questa macro copia un foglio già esistente(Nuovo) e gli assegna un nome "Nuovo(2)", con un numero progressivo, che dovrebbe essere 1, invece visualizzo 2. Come mai?

    Poi volevo aggiungere ad una determinata cella(I20), la mia variabile i, però ogni volta che creo una nuovo foglio dovrebbe aumentare, invece non lo effettua(ci vorrà un ciclo), come posso risolvere?


    Grazie per l'aiuto in anticipo!

  2. #2
    Ciao,
    il nome è Nuovo(2) perché viene assegnato in automatico da excel, se vuoi dargliene uno specifico devi impostare la proprietà Name.

    Riguardo alla cella I20, il motivo per cui imposta sempre 1 è che ogni volta che la macro viene eseguita si ricomincia daccapo e i vecchi valori delle variabili vengono persi (e anche se non fossero persi la i verrebbe comunque reinizializzata dalla Dim e dalla successiva impostazione a zero).

    Come hai correttamente osservato, per fare quello che ti serve occorre un ciclo, cioè un'istruzione (come la For ... Next) che permetta di eseguire per un certo numero di volte la copia del foglio, l'assegnazione del nome e l'impostazione della variabile (il tutto eseguendo una sola volta la macro).

    Una cosa di questo genere:

    codice:
    Sub Macro1()
    '
    ' Macro1 Macro
    
        Dim i As Integer
        
        For i = 1 To 5
           Sheets("Nuovo").Copy After:=Sheets(i)
           ActiveSheet.Name = "Nuovo(" & i & ")"
           ActiveSheet.[I20] = i
        Next
            
    
    End Sub
    L'istruzione For è uno dei modi per eseguire un ciclo (ce ne sono anche altri), in questo caso il ciclo viene eseguito 5 volte incrementando ogni volta l'indice i partendo da 1.

    Per copiare il foglio non è necessario selezionarlo prima (a meno che tu non ne abbia bisogno per altri motivi), basta semplicmente indicarne il nome prima del metodo Copy.

    Il nome di ogni foglio, come vedi, lo costruisco concatenando tre pezzi: una striga fissa "Nuovo(" poi il valore di i e poi un'altra stringa fissa ")" ma tu puoi utilizzare anche altre regole se preferisci.

    Nota che la copia rende attivo il nuovo foglio quindi per attribuirgli il nome si può far far riferimento semplicemente ad ActiveSheet.

    Infine, per assegnare il valore ad una cella bisogna utilizzare la proprietà "Value" (che è il default, quindi non occorre neanche indicarla), non la "FormulaR1C1" che serve per assegnare una formula in formato R1C1 e non occorre neanche la select preventiva, basta semplicemente assegnarle il valore.
    La democrazia rappresentativa ha fatto il suo tempo, è ora di passare alla democrazia diretta.
    www.beppegrillo.it

  3. #3
    Ti ringrazio per la risposta e per la spiegazione.


    Però c'è un problema, quando clicco sulla macro, mi crea subito 5 fogli nuovi ed esegue perfettamente quello che io desideravo; ma non voglio che crei subito 5 fogli, ma bensì un foglio e poi esegua le operazioni che desidero.

    Modificando così:

    codice:
    For i = 1 To 1
           Sheets("Nuovo").Copy After:=Sheets(i)
           ActiveSheet.Name = "Nuovo(" & i & ")"
           ActiveSheet.[I20] = i
        Next
    Mi genera un nuovo foglio, lo rinomina perfettamente, ma imposta alla Cella I20 sempre 1. Ovviamente prima il ciclo, girando 5 volte e quindi impostava il numero progressivo nella mia cella in modo corretto. Ora con questa modifica se clicco, il ciclo gira una volta, ma sbaglia ad impostare il numero nella cella I20. Come devo modificare?


    Grazie ancora!

  4. #4
    Se le "operazioni che desideri" possono essere eseguite con VBA, allora basta metterle dentro il ciclo in modo che vengano eseguite per ogni nuovo foglio creato.

    Se invece fra una copia e l'altra vuoi eseguire operazioni di altro tipo, esterne al VBA, allora devi per forza interrompere la macro che quindi creerà un foglio per volta senza nessun ciclo (fare un ciclo di un solo giro è inutile).

    In questo caso però, quando la macro parte, ha bisogno di sapere che numero assegnare al nuovo foglio e questo si può fare in vari modi, dipende dalle tue esigenze.

    Un modo potrebbe essere quello di contare i fogli esistenti e crearne uno con quel numero:

    codice:
    Sub Macro1()
    '
    ' Macro1 Macro
    
        Dim i As Integer
        
        i = Sheets.Count
    
        Sheets("Nuovo").Copy After:=Sheets(i)
        ActiveSheet.Name = "Nuovo(" & i & ")"
        ActiveSheet.[I20] = i
            
    End Sub

    In questo modo se esiste solo "Nuovo" il count sarà 1 e verrà creato "Nuovo(1)", all'esecuzione successiva il count sarà 2 e verrà creato "Nuovo(2)" e così via
    La democrazia rappresentativa ha fatto il suo tempo, è ora di passare alla democrazia diretta.
    www.beppegrillo.it

  5. #5
    Una spiegazione perfetta. Tutti dovrebbero essere come te NonCeLaFaccio+. Complimenti e Grazie mille!



    Ps.
    Ho risolto!

  6. #6
    Per carità, basto io ad annoiare a sufficienza il mondo

    Grazie comunque.
    Ciao
    La democrazia rappresentativa ha fatto il suo tempo, è ora di passare alla democrazia diretta.
    www.beppegrillo.it

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.