Macro per creare tabella



  • Macro per creare tabella
    di Gabriele (utente non iscritto) data: 08/12/2015 19:50:07

    Salve a tutti, sono nuovo di questo forum! Mi sono avvicinato da poche settimane ad Excel e vba, ma con quest'ultimo faccio proprio a cazzotti

    Vi scrivo per chiedervi una soluzione al mio problema. In pratica mi servirebbe una macro che faccia i seguenti passaggi:

    1-Cambio di valore in una determinata cella (esempio: A1)
    2-Copia dei valori di determinate celle (Es : C1, C2, D1, D2)
    3-Incolla i valori copiati in altre celle o in una tabella.
    4-Cambia nuovamente il valore della cella A1.
    5-Copia dei nuovi valori delle stesse celle del passo 2 ( quindi: C1, C2, D1, D2)
    6-Incolla i valori copiati nelle celle sottostanti a quelle del passo 3(per creare una tabella) oppure negli spazi sottostanti alla tabella creata nel passo 3.
    7-Iterare per "i" volte.

    PS: Al passo 1 il valore della cella deve cambiare, ad ogni iterazione, secondo una determinata legge, ad esempio deve il valore deve sempre essere moltiplicato per 2 oppure deve essere sempre sommato con 5.


    So di chiedervi molto, ma stando in alto mare con il linguaggio vba, mi dareste veramente una grandissima mano!
    Grazie in anticipo a tutti coloro che leggeranno e/o risponderanno. Rimango disponibile per qualsiasi chiarimento riguardo la richiesta!



  • di alfrimpa data: 08/12/2015 20:01:06

    Ciao Gabriele

    Sarebbe utile che tu allegassi un file di esempio (con dati fittizi ma strutturalmente uguale al tuo) ove mostri anche il risultato desuderato.

    Alfredo





  • di Gabriele (utente non iscritto) data: 08/12/2015 20:55:59

    Innanzitutto grazie della risposta Alfredo!
    Al momento non ho scritto nulla su Vba, al massimo potrei allegare il foglio di lavoro con tutto lo scritto sopra, ma non so se può risultare utile come cosa. Vi chiedo un grande favore proprio perché non sono praticamente capace di scrivere un codice in vba!



  • di alfrimpa data: 08/12/2015 21:02:00

    Ma io non ti avevo chiesto del codice VBA (a quello penseremo poi) ma un file dove tu mostri la situazione da dove parti ed il risultato che vuoi ottenere.

    Alfredo





  • di Gabriele (utente non iscritto) data: 08/12/2015 22:51:15

    Scusami per il ritardo ma ho dovuto cambiare un po' di cose, comunque nel file sono presenti tutte le richieste. Spero di essere stato chiaro con le spiegazioni! Grazie ancora per l'aiuto!



  • di Luca73 data: 09/12/2015 11:36:31

    Ciao
    Non mi è assolutamente chiaro come vuoi far modificare la cella G9.
    Nel File scrivi
    4-Reinizio dal punto 1, facendo però variare il contenuto della cella G9 (ad esempio ad ogni iterazione sommo 5)

    Ora al passo 1 la cella vale =(210*PI.GRECO())/180 = 3.665191429
    quale valore vorresti assumesse al passo 2
    io penso to voglia =(215*PI.GRECO())/180 = 3.752457892 (angolo +5 gradi) e non 8.665191429 valore più 5

    Mi confermi?









  • di Gabriele (utente non iscritto) data: 09/12/2015 11:42:23

    Si si confermo! Grazie per l'interessamento!



  • di Luca73 data: 09/12/2015 11:52:17

    Prova a vedere se il File allegato fa al caso tuo
    ho creato le due macro qui sotto riportate la seconda è legata al pulsante.
    Ciao
    Luca

     
    Option Explicit
    
    Sub RiempieTabella()
    Dim PrimaCella As Range
    Dim CellaW As Range
    Set PrimaCella = Range("C56")
    
    If PrimaCella.Offset(1, 0) = "" Then
        Set CellaW = PrimaCella.Offset(1, 0)
    Else
        Set CellaW = PrimaCella.End(xlDown).Offset(1, 0)
    End If
    CellaW.Offset(0, 0) = Range("G9")  'C
    CellaW.Offset(0, 1) = Range("Z27") 'D
    CellaW.Offset(0, 2) = Range("Z28") 'E
    CellaW.Offset(0, 3) = Range("T40") 'F
    CellaW.Offset(0, 4) = Range("T41") 'G
    CellaW.Offset(0, 5) = Range("T53") 'H
    CellaW.Offset(0, 6) = Range("T54") 'I
    CellaW.Offset(0, 7) = Range("S27") 'J
    CellaW.Offset(0, 8) = Range("S28") 'K
    
    
    End Sub
    
    
    
    Sub Cicla()
    Dim Inizio
    Dim Numero
    Dim Passo
    Dim Procedo
    Dim Index
    Procedo = MsgBox("Procedo cancellando i Dati Precedenti?", vbYesNo + vbQuestion, "CANCELLO")
    If Procedo = vbNo Then Exit Sub
    Range(Range("C57"), Range("C57").End(xlDown).Offset(0, 8)).ClearContents
    Inizio = InputBox("Inserisci Valore Iniziale", "INIZIO", 210) * 1
    Numero = InputBox("Inserisci Numero di Passi", "NUMERO PASSI", 10) * 1
    Passo = InputBox("Inserisci PAsso Di Calcolo", "PASSO", 5) * 1
    
    
    For Index = 1 To Numero
        
        Range("G9").Formula = "=(" & (Inizio + (Index - 1) * Passo) & "*PI())/180"
        'Range("G9").Formula = "=" & (Inizio + (Index - 1) * Passo) & "*PI.greco())/180"
        Call RiempieTabella
    Next Index
    
    End Sub
    






  • di Gabriele (utente non iscritto) data: 09/12/2015 15:05:20

    Ti ringrazio veramente per questi due codici, davvero mi sono di estrema utilità! Il primo codice tuttavia mi copia solamente la prima riga e non itera, magari sbaglio io l'interpretazione! Vorrei sapere inoltre, visto che devo applicare questo codice ad altri fogli di lavoro, dove e cosa devo modificare per creare una tabella differente, magari in una parte del foglio Excel differente o con colonne aggiuntive oppure ancora selezionando altri elementi da copiare nella tabella. Grazie ancora della disponibilità, veramente!



  • di Luca73 data: 09/12/2015 16:36:40

    Ciao
    Hai ragione il primo codice serve solo a copiare i dati nella prima colonna libera della tua tabella.
    Però lo stesso codice viene richiamato all'interno della seconda macro (istruzione Call RiempieTabella)
    A tutti gli effetti potresti unificarle (vedi sotto)

    Per Modificare nel primo codice l'unico dato è la posizione della cella in alto a sinistra Set PrimaCella = Range("C56")
    le altre le ottiene per spostamento da quella stessa cella.
    le istruzione del to CellaW.Offset(A, B) = Range("G9") 'C immettono nella cella di lavoro (Cella W che è la prima libera sotto la C56) con uno spostamento di A righe e B colonna il valore che trovano nel range specificato a destra (nell'esempio G9)

    Il secondo codice per prima cosa cancella tutti i dati nella tabella
    Range(Range("C57"), Range("C57").End(xlDown).Offset(0, 8)).ClearContents ovvero parte da C57 e seleziona tutti i valori fino all'ultimo in basso e poi seleziona le 8 colonne a destra

    poi cicla e cambia la formula in G9
    Range("G9").Formula = "=(" & (Inizio + (Index - 1) * Passo) & "*PI())/180"

    Ciao
    Luca
     
     
    Option Explicit
    
    Sub Cicla()
    
    Dim Inizio
    Dim Numero
    Dim Passo
    Dim Procedo
    Dim Index
    Dim PrimaCella As Range
    Dim CellaW As Range
    
    Procedo = MsgBox("Procedo cancellando i Dati Precedenti?", vbYesNo + vbQuestion, "CANCELLO")
    If Procedo = vbNo Then Exit Sub
    
    Set PrimaCella = Range("C56")
    Range(Range("C57"), Range("C57").End(xlDown).Offset(0, 8)).ClearContents
    Inizio = InputBox("Inserisci Valore Iniziale", "INIZIO", 210) * 1
    Numero = InputBox("Inserisci Numero di Passi", "NUMERO PASSI", 10) * 1
    Passo = InputBox("Inserisci PAsso Di Calcolo", "PASSO", 5) * 1
    
    For Index = 1 To Numero 
        Range("G9").Formula = "=(" & (Inizio + (Index - 1) * Passo) & "*PI())/180"
        If PrimaCella.Offset(1, 0) = "" Then
            Set CellaW = PrimaCella.Offset(1, 0)
        Else
            Set CellaW = PrimaCella.End(xlDown).Offset(1, 0)
        End If
        CellaW.Offset(0, 0) = Range("G9")  'C
        CellaW.Offset(0, 1) = Range("Z27") 'D
        CellaW.Offset(0, 2) = Range("Z28") 'E
        CellaW.Offset(0, 3) = Range("T40") 'F
        CellaW.Offset(0, 4) = Range("T41") 'G
        CellaW.Offset(0, 5) = Range("T53") 'H
        CellaW.Offset(0, 6) = Range("T54") 'I
        CellaW.Offset(0, 7) = Range("S27") 'J
        CellaW.Offset(0, 8) = Range("S28") 'K
    Next Index
    
    End Sub






  • di Gabriele (utente non iscritto) data: 11/12/2015 11:01:27

    Grazie ancora Luca per l'interesse ed il tempo dedicatomi. Sto provando ad applicare lo stesso codice per un altro foglio di lavoro, incluso nella stessa cartella di lavoro. Ho sostanzialmente capito cosa modificare, tuttavia la macro non fa come dovrebbe: in pratica invece che fare un'intera tabella mi riempie solo le prime due righe. Cosa sto sbagliando????

    Grazie ancora!


     
    Option Explicit
    
    Sub RiempieTabellaQuad()
    Dim PrimaCella As Range
    Dim CellaW As Range
    Set PrimaCella = Range("C98")
    
    If PrimaCella.Offset(1, 0) = "" Then
        Set CellaW = PrimaCella.Offset(1, 0)
    Else
        Set CellaW = PrimaCella.End(xlDown).Offset(1, 0)
    End If
    CellaW.Offset(0, 0) = Range("H9")  'C
    CellaW.Offset(0, 1) = Range("Z91") 'D
    CellaW.Offset(0, 2) = Range("Z92") 'E
    CellaW.Offset(0, 3) = Range("E109") 'F
    CellaW.Offset(0, 4) = Range("E110") 'G
    CellaW.Offset(0, 5) = Range("E121") 'H
    CellaW.Offset(0, 6) = Range("E122") 'I
    CellaW.Offset(0, 7) = Range("S91") 'J
    CellaW.Offset(0, 8) = Range("S92") 'K
    
    
    End Sub
    
    
    
    Sub CiclaQuad()
    Dim Inizio
    Dim Numero
    Dim Passo
    Dim Procedo
    Dim Index
    Procedo = MsgBox("Procedo cancellando i Dati Precedenti?", vbYesNo + vbQuestion, "CANCELLO")
    If Procedo = vbNo Then Exit Sub
    Range(Range("U99"), Range("U99").End(xlDown).Offset(0, 8)).ClearContents
    Inizio = InputBox("Inserisci Valore Iniziale", "INIZIO", 210) * 1
    Numero = InputBox("Inserisci Numero di Passi", "NUMERO PASSI", 10) * 1
    Passo = InputBox("Inserisci PAsso Di Calcolo", "PASSO", 5) * 1
    
    
    For Index = 1 To Numero
        
        Range("H9").Formula = "=(" & (Inizio + (Index - 1) * Passo) & "*PI())/180"
        'Range("H9").Formula = "=" & (Inizio + (Index - 1) * Passo) & "*PI.greco())/180"
        Call RiempieTabellaQuad
    Next Index
    
    End Sub



  • di Luca73 data: 11/12/2015 12:11:11

    Ciao così su due piedi non capisco l'errore a a parte un errore nelle celle da cancellare.
    Se mi mandi il file cerco di vedere.
    Noto che c'è una incongruenza tra l'intervallo dove scrive e quello dove cancella.
    Ciao
    Luca