macro per copiaincolla



  • macro per copia/incolla
    di quicksteep (utente non iscritto) data: 10/08/2016 10:00:14

    Buongiorno a tutti, ho un problema che non riesco a risolvere, ve lo espongo nel modo più preciso e sintetico che posso:
    problema: voglio copiare un certo numero di celle non consecutive, ma con intervallo regolare, da un foglio excel e incollarle non in successione, ma con un intervallo regolare, in un secondo foglio.

    - ho due fogli excel, nel primo, chiamiamolo "A", ho circa 11000 righe nella colonna D, più precisamente da D3 a D10776, partendo dal contenuto della cella D3 vorrei copiare il contenuto di una cella ogni 27 (quindi d3, d30, d57...ecc) e incollarle nel secondo foglio excel, chiamiamolo "B", non in sequenza, ma partendo dalla cella c24 ogni 13 celle.
    Più precisamente vorrei che il contenuto della cella d3 del foglio "A" venisse incollata nella cella c24 del foglio "B", la cella d30 del foglio "A" nella cella c37 del foglio "B", e così via fino alla cella cella d10776 del foglio "A" che andrà incollata nella cella c5211 del foglio "B".

    Ho provato a scrivere qualche macro, ma...niente da fare, l'unico risultato positivo l'ho ottenuto registrando la macro con un copia/incolla della prima cella d3 in c24, ma poi non riesco a rendere automatica la progressione.

    spero di essere riuscito a spiegare il problema.
    grazie in anticipo/fabio



  • di Vecchio Frac data: 10/08/2016 10:08:46

    Ciao quicksteep,
    se può consolarti è ben fattibile e non è nemmeno eccessivamente complesso, anzi direi che la maggior parte l'hai fatta descrivendo l'algoritmo che ti serve :) ora basta tradurlo correttamente in codice e vedrai che funziona.
    Se hai provato a scrivere qualcosa ma non funziona, partiamo da lì, mostra un po' di codice e vedremo di convincerlo a fare la cosa giusta :)
    Dipende anche dalle tue basi di partenza... sai cosa è un ciclo For...Next? come si usa Step? come funziona la copia di un valore da una zona all'altra?
    Coraggio :)





  • di quicksteep (utente non iscritto) data: 10/08/2016 10:36:21

    Ciao, prima di tutto grazie per la risposta, in realtà conosco bene excel, ma ben poco le macro e vba, però sono molto volenteroso!!!
    allego l'unica cosa che sono riuscito a scrivere, anche se non credo sia utile, nel frattempo vado a leggere qualcosa sul ciclo For...ecc...ecc
     
    Range("D3").Select
    Selection.Copy
    Sheets("RIP. CONSUNTIVO").Select
    Range("C24").Select
    ActiveSheet.Paste Link:=True
    Sheets("riepilogo").Select
    ActiveWindow.SmallScroll Down:=15
    Range("D30").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("RIP. CONSUNTIVO").Select
    ActiveWindow.SmallScroll Down:=15
    Range("C37").Select
    ActiveSheet.Paste Link:=True
    Sheets("riepilogo").Select



  • di Vecchio Frac data: 10/08/2016 10:52:30

    Di solito registrare una macro è utile per conoscere il meccanismo qualche comando che non si usa spesso. Il codice prodotto è spesso da rivedere e a volte, come in questo caso, fuorviante.
    Leggi nella guida il funzionamento di For...Next...Step.
    Poi riprendi la tua descrizione dell'algoritmo e cerca di ragionare come se fossi tu Excel che deve eseguire un compito specifico; ti do uno spunto (praticamente è la soluzione):
    "L'algoritmo dovrà scandire il range iniziale con un contatore a passi di 27, ad ogni passaggio esaminare la cella in "riga=contatore, colonna nota" e assegnare tale valore alla cella identificata dalla riga (aumentata ad ogni passaggio di 13) e colonna desiderata del foglio target".
    Come vedi è la tua descrizione dell'algoritmo scritta in modo più formale per Excel.
    Vai, produci e torna qui :)





  • di quickspeep (utente non iscritto) data: 10/08/2016 15:11:51

    Ciao,
    come si dice tra il dire e il fare ... ho letto e credo anche di aver capito come funziona for/step/next...da li a saperlo anche scrivere ce ne vuole!!!
    in ogni caso ti allego quello che sono riuscito a scrivere...il 3 e il 10776 sono i numeri delle righe da cui partire e dove fermarsi (ma ho il dubbio che non li riconosca come tali) il 27 è l'incremento. Non so proprio come indicare l'incremento di 13, forse ci vuole un nuovo for con i dati del secondo foglio?
    beh...dammi una indicazione e io vado avanti a riflettere e a provare
    grazie in anticipo (come minimo per la pazienza!!!)
    fabio
     
    For i = 3 To 10776 Step 27
        Sheets("SCHEDA").Select
        Range("D3").Select
            Selection.Copy
        Sheets("RIP. CONSUNTIVO").Select
        Range("C24").Select
             ActiveSheet.Paste Link:=True
                Next



  • di Vecchio Frac data: 10/08/2016 15:36:45

    Bravo per l'impegno. Allora eccoti qualche indicazione.
    Anzitutto è bene riportare un codice completo, con Sub / End Sub (cioè l'intero corpo della routine) in modo da poter verificare subito se ci sono tutti gli elementi di validità formale del codice.

    Nel merito, per il frammento di codice che proponi (naturalmente deve essere piùà corposo) è giusto il concetto dello Step.
    Puoi evitare di "Select-ionare" ad ogni passaggio del ciclo i due fogli interessati perchè .Copy accetta un parametro Destination (posizionati su Copy e consulta la guida del metodo Copy di un oggetto Range).
    ne guadagnerà sia la leggibilità che la velocità di esecuzione.
    Ora però devi sistemare il fatto che vuoi copiare in una posizione ben precisa... conosci Cells e i suoi parametri? Dai un'occhiata anche a Cells!
    Tra parentesi: ti farò arrivare a capire che non serve sempre copiaincollare un valore per farlo arrivare a destinazione... puoi semplicemente assegnare a una cella il valore di un'altra cella, per esempio così: range("A5") = range("B12").

    p.s. il codice per te, già bello pronto e funzionante, è qui che ti aspetta sul mio desktop... se non hai voglia di provare a fare da solo te lo allego, ma ti invito prima a fare uno sforzo e vedrai che soddisfazioni ^_^





  • di quicksteep (utente non iscritto) data: 11/08/2016 12:07:36

    Buongiorno,
    e prima di tutto grazie della tua disponibilità, mi sono anche letto tutto il corso che è presente sul sito!!!
    Ho cercato di capire la funzione copy e anche cells, ma non riesco a scrivere niente che sia utilizzabile, ne manca sempre un pezzo.
    dimmi almeno se ho capito bene la teoria:
    ci vorranno due cicli for, uno per copiare le celle a intervalli di 27 e uno per incollarle nel secondo foglio a intervalli di 13. E per fare questo non è necessario copiare e incollare ma con la funzione copy trasferire il contenuto di una cella ad un altra.
    in pratica tanta buona volontà ma ... insufficienti competenze per scriverlo nella routine

    a questo punto accetterei il tuo codice così come lo descrivi "bello pronto e funzionante" vorrei però che mi dessi ancora un aiuto a capire

    grazie/fabio



  • di Vecchio Frac data: 11/08/2016 14:20:52

    Ieri poi per strafare ne ho realizzate due versioni, una semplice e una più carina ma anche più esotica ^_^ Poi le vedremo tutte e due.
    Dunque per risponderti non servono due cicli.
    Serve un ciclo For che scandagli il range di partenza (diciamo così) una cella alla volta a blocchi (passi) di 27 celle alla volta, e all'interno del medesimo ciclo vada a scrivere nella cella di destinazione a blocchi (passi) di 13 celle. Il numero di riga della cella di destinazione è contenuto in una variabile contatore.
    All'interno del ciclo For questo contatore prima del successivo Next viene incrementato di 13 unità (passi) per avere il nuovo riferimento della prossima cella di destinazione.
    Ti ricordo che puoi/vuoi evitare Copy e Paste semplicemente così:
    foglio1.Cells(riga, colonna) = foglio2.Cells(riga, colonna)

    Ora secondo me sei in grado di farcela :)
    (ma non ti lascio solo, poi ti farò vedere la mia proposta).