Acquista i nostri libri consigliati su Amazon.it
+ Rispondi al messaggio
Visualizzazione dei risultati da 1 a 10 su 10

VBA: Copiare righe e incollarle successivamente

  1. #1
    Gabor non è in linea Novello
    Ciao a tutti!
    Premetto che sono totalmente newbie in ambito VBA e stavo spulciando il web in cerca di soluzioni a un mio problema. Sono capitato qua a leggere un po' di discussioni ma non avendo trovato una soluzione soddisfacente ho deciso di esporvela direttamente.
    Ho un foglio di Excel così strutturato:



    Ciò che devo fare consiste nel copiare ogni singola riga di dati, partendo dalla terza quindi, e inserirla per un numero variabile di volte al di sotto in modo da ottenere un risultato come questo:



    Una nota importante è che per ogni foglio di lavoro, il numero di righe da inserire è il medesimo. Questo varia solo da un foglio di lavoro ad un altro. Ad esempio nel "foglio 2", al posto di copiare e incollare una riga di dati per solo 3 volte, mi sarà necessario farlo 5 volte.

    Il problema per me rappresenta la mole di dati su cui apportare questa modifica, centinaia di righe da copiare e inserire per X volte.

    Ciò che sono riuscito a creare dal basso della mia ignoranza in VBA è questo:

    -------------
    Sub prova()

    On Error Resume Next
    ActiveCell.EntireRow.Resize(Int(InputBox("Numero righe"))).insert

    End Sub
    -------------

    Certo è che questa macro non ha risolto praticamente nulla del mio problema visto che comunque devo spostare il mouse di volta in volta per l'inserimento di righe e poi comunque effettuare il copia-incolla nelle righe appena inserite.

    Potreste darmi qualche dritta?

    Grazie in anticipo per la disponibilità!

  2. #2
    Chico non è in linea Scolaretto
    ciao Gabor,
    sperando di aver capito il tuo problema, risolverei la cosa, senza l'uso di VBA, in questo modo:
    1. copio tutto il contenuto del foglio per 3 (o più) volte (ottenendo tutte le righe necessarie ma in modo disordinato)
    2. con il comando ordina dati, riordino il tutto

  3. #3
    ricky53 non è in linea Scribacchino
    Ciao,
    tu hai scritto
    ... Questo varia solo da un foglio di lavoro ad un altro. Ad esempio nel "foglio 2", al posto di copiare e incollare una riga di dati per solo 3 volte, mi sarà necessario farlo 5 volte.
    Quindi la domanda è: come si viene a sapere quante volte va copiata la stessa riga in ogni foglio ?
    Sempre con "InputBox" ?
    ℹ️ Leggi di più su ricky53 ...

  4. #4
    Gabor non è in linea Novello
    Quote Originariamente inviato da Chico Visualizza il messaggio
    ciao Gabor,
    sperando di aver capito il tuo problema, risolverei la cosa, senza l'uso di VBA, in questo modo:
    1. copio tutto il contenuto del foglio per 3 (o più) volte (ottenendo tutte le righe necessarie ma in modo disordinato)
    2. con il comando ordina dati, riordino il tutto
    Ci avevo pensato, il problema è che se ci fosse qualcosa di più diretto potrei risparmiare molto tempo. Purtroppo sono operazioni che dovrei fare quasi quotidianamente, per centinaia di righe di dati, per decine di fogli di lavoro e per un certo numero di file.

    Quote Originariamente inviato da ricky53 Visualizza il messaggio
    Quindi la domanda è: come si viene a sapere quante volte va copiata la stessa riga in ogni foglio ?
    Sempre con "InputBox" ?
    In linea di massima sì, non ho trovato di meglio per avere una base di macro un po' standardizzata.

  5. #5
    ricky53 non è in linea Scribacchino
    Ciao,
    per me è meglio avere un nuovo foglio (di nome "Riepilogo") nel quale scrivere in colonna "A" da "A2" in giù i nomi dei fogli e in colonna "B" il numero di volte cui ripetere ogni riga dei vari fogli.

    Intanto ecco la prima macro che "imposta" i nomi dei fogli nella colona "A" del foglio "Riepilogo"
    Option Explicit
    
    Sub Scrivi_Nomi_Fogli()
        Dim Wb As Workbook, Ws As Worksheet, I As Integer, Foglio As Worksheet
        
        Set Wb = Workbooks(ActiveWorkbook.Name)
        Set Ws = Sheets("Riepilogo")
        Ws.Range("A:A").ClearContents
        Ws.Range("A1") = "Nome Fogli"
        Ws.Range("B1") = "Numero volte"
        I = 2
        For Each Foglio In Wb.Worksheets
            If Foglio.Name <> Ws.Name Then
                Ws.Cells(I, 1) = Foglio.Name
                I = I + 1
            End If
        Next Foglio
        Ws.Columns("A:B").EntireColumn.AutoFit
        MsgBox "Nel foglio  'Riepilogo'  sono stati scritti  '" & I - 2 & "'  nomi dei fogli"
    End Sub
    

    ATTENZIONE: prima di eseguire la macro devi inserire un nuovo foglio ed assegnarli il nome "Riepilogo"
    ℹ️ Leggi di più su ricky53 ...

  6. #6
    Gabor non è in linea Novello
    In effetti può essere utile avere un foglio di supporto dove inserire i parametri, però non avendo tutta questa dimestichezza con il VBA non mi sarebbe di molto aiuto.

    Comunque, pacioccando un po' e prendendo spunto da qualcosa che ho trovato in giro ho tirato su questa macro:

    Sub prova2()
    
    Dim theEnd As Long
    
    theEnd = 9999
    
    For x = 1 To theEnd
    
      If Range("A" & x + 1) > Range("A" & x) Then
    
        Range("A" & x + 2).Select
        Selection.EntireRow.Insert
        theEnd = theEnd + 1
        x = x + 1
    
      End If
    
    Next x
    
    End Sub
    
    Sono riuscito a inserire tutte le righe necessarie impostando la macro con uno shortcut.
    L'unica pecca è che non mi copia le formule e/o i valori della riga precedente e devo provvedere manualmente. Esiste una via semplice per ovviare a questo problema?

    Grazie per l'aiuto!

  7. #7
    ricky53 non è in linea Scribacchino
    Ciao,
    prima di dire che non ti sarebbe di aiuto avresti dovuto provarla.
    Possibile che non abbia avuto neanche la curiosità di provare ?

    Allora non ti interesserà neanche avere il codice che ho scritto per copiare n-volte le varie righe di tutti i fogli?

    Sicuro che quanto tu hai scritto dicendo che ti occorre sia proprio quello che ti occorre ???
    Adesso fai riferimento a formule ... ???


    Analizzando il tuo codice ricavo che inserisca una riga VUOTA ogni riga con dati e, come hai scritto tu, NON copia nulla.
    Però tra la prima riga e la seconda non inserisce nulla !

    A cosa serve fare quanto il codice fa?


    Puoi inviare un file di esempio ma senza dati riservati?
    Dovresti riportare la situazione iniziale dei dati e su un altro foglio come vorresti che i dati fossero scritti.
    ℹ️ Leggi di più su ricky53 ...

  8. #8
    Gabor non è in linea Novello
    Scusami ma non ho capito il motivo di questo tuo post.

    Certo che l'ho provata e ripeto quello che ho scritto prima ovvero che, ora come ora, "non avendo tutta questa dimestichezza con il VBA, non mi sarebbe di molto aiuto". Ho premesso che di VBA non so quasi niente considerando il fatto che è da pochi giorni che lo uso e ci sto prendendo pian piano familiarità; ad esempio, tutte le basi di sintassi le sto scoprendo di volta in volta.
    Ho usato il tuo codice, ho visto i risultati prodotti e l'ho salvato per un'eventuale futuro in cui abbia la possibilità di sfruttarlo appieno. Ripeto a costo di sembrar banale, ora come ora non saprei come sfruttare quello che mi hai passato e per questo ho intrapreso altre strade curiosando qua e là ed estrapolando parti di codice da macro che trovavo in giro.

    Quello di cui ho bisogno è esattamente quello che ho scritto nel mio primo post e sì, ne sono sicuro.
    Con formule intendo che quei dati non sono scritti a mano da qualche anima pia ma bensì sono dei semplici collegamenti a un altro foglio che funge da DB; quest'ultimo viene aggiornato di volta in volta tramite interrogazioni con un software che si interfaccia con Excel.
    Partendo dalla prima riga dell'immagine che ho postato, le formule scritte in ogni cella sono:
    =db!$H19 | =db!$G19*1 | =db!$F19 | =db!$I19 | =db!$J19*1 | =db!$K19*1
    
    Quello che ho raggiunto è un primo risultato, visto che non ho richiesto la "pappa pronta" come citata da REGOLAMENTO ma bensì qualche dritta per poter migliorare una base di partenza. Questa era rappresentata dal mio primo esperimento che ho scritto nel mio primo post ovvero:
    Sub prova()
    
    On Error Resume Next
    ActiveCell.EntireRow.Resize(Int(InputBox("Numero righe"))).insert
    
    End Sub
    
    che effettivamente faceva abbastanza pena.

    Tramite la seconda macro che sono riuscito a mettere in piedi almeno ho raggiunto un primo punto ovvero l'inserimento dell'esatto numero di righe vuote che mi servono senza troppe complicazioni.

    Per ovvie ragioni non posso riportare i fogli originali visto che contengono dati sensibili e per questo motivo ho inserito le due immagini sperando che risultassero abbastanza chiare.

    Ecco qua il file di esempio:
    prova_2.0

    Spero di non aver recato offesa ma, se così fosse, sappi che non era minimamente mia intenzione.

    PS.
    Mi sono accorto ora che le formule di collegamento nel file di esempio mancano del "*1" sopracitato per le colonne "D", "G" e "H". Spero non sia un problema...
    Ultima modifica di Gabor; 12-07-2013 11:38 

  9. #9
    Gabor non è in linea Novello
    Ho fatto qualche prova per poter copiare il contenuto delle righe insieme all'aggiunta di righe blank tramite l'istruzione

    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    
    Facendo una selezione puntuale del range alle righe che mi servono più o meno funziona, anche se non è proprio il massimo ai miei fini.
    Avete qualche idea per ottimizzarla in un ciclo combinato magari all'inserimento delle righe blank? Per ora i risultati che ho ottenuto sono pessimi e il più delle volte mi appare il warning del debug perché la macro non funge. xD

  10. #10
    ricky53 non è in linea Scribacchino
    Ciao,
    nessuna offesa mi sembrava,da quanto avevi scritto, che tu non avessi provato.


    Mi fa piacere sapere che hai letto il regolamento e che ti stai muovendo cercando in giro e volendo essere autonomo.
    BENE e BRAVO !!!

    Secondo me quanto ti ho inviato ti può essere utile se applicato al discorso che ti avevo fatto ed è la prima fase.
    Manca la fase 2 che ho ultimato ieri sera prima di leggere quanto ti hai scritto oggi.
    Ti invio il codice,

    Sub Copia_Dati_Multipli()
        Dim Wb As Workbook, Ws As Worksheet, RR As Integer, UC As Integer, UR As Integer, I As Integer, J As Integer, X As Integer
        Dim Appoggio As Worksheet
        
        Set Wb = Workbooks(ActiveWorkbook.Name)
        Set Ws = Sheets("Riepilogo")
        Ws.Select
        
        UR = Ws.Range("A" & Rows.Count).End(xlUp).Row
        For I = 2 To UR
            RR = Sheets(Ws.Cells(I, 1).Text).Range("A" & Rows.Count).End(xlUp).Row
            UC = Sheets(Ws.Cells(I, 1).Text).Range("A1").End(xlToRight).Column
            J = 2
            Set Appoggio = Sheets(Ws.Cells(I, 1).Text)
            For X = 2 To RR
                Appoggio.Range("$A$" & J & ":" & Appoggio.Cells(J, UC).Address).Copy
                Appoggio.Range("$A$" & J + 1 & ":" & Appoggio.Cells(J + Ws.Cells(I, 2), UC).Address).Insert Shift:=xlDown
                J = J + Ws.Cells(I, 2) + 1
            Next X
        Next I
        MsgBox "Sono state inserite le righe necessarie in ogni foglio"
    End Sub
    
    non ho letto tutto quello che hai scritto (sto scappando) e non ho scaricato il tuo file.

    La presenza delle formule è una cosa che hai aggiunto dopo e che rende diverso il modo di operare.

    Il codice che ti ho inviato ovviamente non poteva tenerne conto.

    A stasera.
    Ultima modifica di ricky53; 12-07-2013 16:22 
    ℹ️ Leggi di più su ricky53 ...

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. Non copiare Righe vuote
    Da Codice_da_Vinci nel forum Microsoft Excel
    Risposte: 1
    Ultimo Post: 06-06-2013, 07:38
  2. Copiare n righe tra sheets
    Da PiE81 nel forum Microsoft Word
    Risposte: 2
    Ultimo Post: 23-03-2011, 08:30
  3. copiare le righe dal datagridview1 al datagridview2
    Da massimoflorian nel forum Visual Basic .Net
    Risposte: 2
    Ultimo Post: 07-09-2009, 21:22
  4. Copiare tutte le righe del DataGrid
    Da clock62 nel forum Visual Basic 6
    Risposte: 2
    Ultimo Post: 18-03-2008, 11:59
  5. Copiare righe di Recordset
    Da Ciube nel forum Visual Basic 6
    Risposte: 3
    Ultimo Post: 17-02-2005, 10:25