Sviluppare funzionalita su Microsoft Office con VBA copia incolla righe tra fogli

Login Registrati
Stai vedendo 18 articoli - dal 1 a 18 (di 18 totali)
  • Autore
    Articoli
  • #47249 Score: 0 | Risposta

    Ciao.
    Nel workbook allegato ci sono 2 macro per copiare/incollare righe tra 2 fogli.

    La macro in modulo11
    Sub archivia_1()
    copia le righe selezionate da foglio "produttività" in foglio "archivio_altri"

    La macro in modulo16
    Sub archivia_1_input()
    copia le righe selezionate da foglio "input" in foglio "archivio_input"

    nel copia incolla le macro tolgono le convalida_dati e colori di sfondo presenti lasciando le formattazioni.

    per incolla le righe selezionare una riga e cliccare nel pulsante "archivia una riga selezionata"

    Il copia incolla della macro
    Sub archivia_1_input()
    funziona esatto.

    il copia incolla della macro
    Sub archivia_1()
    non incolla la formattazione esatta, ma spostata.

    La differenza tra i due fogli "archivio" è che nel foglio "archvio_altri" c'è una colonna in più A e quindi
    non incolla esatto, deve incollare nella colonna B.
    Spero di essermi spiegato

    Allegati:
    You must be logged in to view attached files.
    #47252 Score: 0 | Risposta

    LucaSR
    Partecipante
      15 pts

      In questo caso ti conviene estrarre non la riga intera ma la porzione di riga usata, creando un range che vada dalla prima cella usata all'ultima e poi incollarla nel foglio dalla seconda colonna.

      Mi spiego meglio, invece di usare EntireColumns per l'intera riga dovresti usare Range(prima cella, ultima cella a destra) tramite il metodo End, questo se tutte le celle sono contigue.

      #47253 Score: 0 | Risposta

      Copia già il range

      Range("A" & n & ":P" & n).Copy 'copia range

      #47254 Score: 0 | Risposta

      Probablimente bisogna modificare qui

      For i = 5 To 65536 'incolla dalla riga 4
      If ActiveSheet.Cells(i, 2) = vbNullString Then
      ActiveSheet.Cells(i, 2).Select

      Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:=False, Transpose:=False '<<< a colori

      #47255 Score: 0 | Risposta

      LucaSR
      Partecipante
        15 pts

        Dopo scrivi 

        Destination:=prima cella

        Prima cella del nuovo foglio partendo dalla colonna B

        #47256 Score: 0 | Risposta

        In che punto?

        #47257 Score: 0 | Risposta

        LucaSR
        Partecipante
          15 pts

          Subito dopo il Copy, spazio Destination...

          Edit:

          Esegui un ciclo di 65K di righe?? Hai effettivamente tutti questi dati?

          #47258 Score: 0 | Risposta

          Così dà errore sintassi

          Range("A" & n & ":P" & n).Copy Destination:= prima cella 'copia range

          #47259 Score: 0 | Risposta

          LucaSR
          Partecipante
            15 pts

            Sei serio?? 🤔

            Prima cella dovrà essere la prima cella del foglio in cui vuoi copiare 

            #47260 Score: 0 | Risposta

            Scusami ma sto in confusione

            #47261 Score: 0 | Risposta

            Ma così non incolla sulla seconda colonna ?

            For i = 5 To 65536 'incolla dalla riga 4
            If ActiveSheet.Cells(i, 2) = vbNullString Then
            'ActiveSheet.Cells(i, 2).Select

            ActiveSheet.Cells(i, 2)ActiveSheet.Cells(i, 2.PasteSpecial Paste:=xlPasteAll ', Operation:=xlNone, SkipBlanks:=False, Transpose:=False '<<< a colori
            'Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False '<<< solo valori

            #47263 Score: 0 | Risposta

            Il problema è che dopo il copia incolla da range A:P del foglio "produttività" a range B:Q del foglio "archivio_produttività" i riferimenti restano uguali.

            Esempio le  formattazioni celle J:K foglio produttività devono essere uguali a celle K:L del foglio "archivio_produttività" ma i riferimenti non cambiano

            #47264 Score: 0 | Risposta

            LucaSR
            Partecipante
              15 pts

              La formattazione devi prepararla prima nel foglio che ospiterà i nuovi valori, ad esempio testo/numeri/date.

              Poi quando crei la macro di copia del Range dal foglio iniziale, prima crei il range da copiare e dopo lo incolli nella prima cella disponibile nel foglio di destinazione, che nel tuo caso parte dalla colonna B

              #47265 Score: 0 | Risposta

              Il problema è che ho vari fogli con formattazioni diverse. Per non preparare le formattazioni in tutti i fogli di destinazione come i fogli di partenza, pensavano ci fosse qualcosa che copiasse da colonna A a colonna B con gli stessi riferinenti.

              #47271 Score: 0 | Risposta

              alexps81
              Moderatore
                55 pts

                Ciao @frank_ciccio

                scusa se insisto, ma già in un altro Thread avevo anche io esaminato questo tuo progetto e, ahimè malgrado la tua volontà di portare a termine il lavoro, ti avevo consigliato di rivederlo da cima a fondo perché ci sono tanti errori di fondo. Te ne riporto giusto uno che creerebbe tanti di quei problemi tanti da farti uscir di matto:

                in una delle routine presenti nei moduli, lanci l'istruzione Application.EnabledEvents = False poi, mentre il codice fa il suo decorso, ci sono delle condizioni che se per caso non vengono soddisfatte scatta un bellissimo (o bruttissimo...dipende) Exit Sub. Secondo te cosa succede da quel momento in poi? Io penso che gli eventi non ripartono più.

                Poi ci sono altri errori più o meno gravi...ma elencarli tutti si fa notte. Io te lo dico perché mi dispiacerebbe che tu perdessi tanto tempo per provare a risolvere un problema quando poi dopo se ne presenterebbero altri dieci...e magari non puoi risolverli tanto facilmente ma dovresti stravolgere tutto il codice creato fin ora. Il problema è che darti una mano a rifarlo daccapo vuol dire creare un progetto dalla A alla Z e purtroppo, malgrado io ti aiuterei volentieri, non sarebbe giusto. Mi dispiace dirti queste cose e non vorrei ci rimanessi male, ma anche io anni fa, ancora acerbo di conoscenze, incappavo in errori tali.

                 

                #47273 Score: 0 | Risposta

                Ho tolto

                Application.EnabledEvents = False 

                e alcuni

                if... exit sub.

                Ora la macro (penso) copia incolla e basta, ma non cambia nulla.

                Penso che la colpa che dopo il copia incolla da i riferimenti della formattazione si sballano

                Una mia curiosità c'è un modo per copiare incollare solo i colori della formattazione che è quello che mi interessa?

                 

                `Sub archivia_1_no_input(nomeFile As String)
                'per fogli action non input
                
                'Application.EnableEvents = False
                Application.ScreenUpdating = False
                ActiveSheet.Unprotect "987654"
                
                
                
                Dim n, i, x, nc As Long
                Dim avviso, Avviso2 As String
                Dim cella_attiva As String
                Dim nome1 As String
                Dim fogl1 As String
                
                
                'cella_attiva = Cells(ActiveWindow.RangeSelection.Row, 1).Value
                nome1 = ActiveSheet.Name
                
                avviso = MsgBox("Archivio il contenuto della < riga " & ActiveCell.Row & " / nr. " & cella_attiva & " > selezionata?. " & Chr(13) & _
                "La riga verrà archiviata nel foglio < Archivio_altri > ", vbYesNo + vbQuestion, "AVVISO")
                If avviso = vbNo Then Exit Sub
                
                
                
                If avviso = vbYes Then
                n = ActiveCell.Row
                If n < 7 Then
                
                
                
                MsgBox ("Le prime 6 righe non si possono archiviare"), vbCritical, ("ATTENZIONE!")
                Exit Sub
                Else
                'Application.EnableEvents = False
                
                '-------------------------------------------------------------------------
                 Sheets("archivio_altri").Select 'sprotegge archivio
                 ActiveSheet.Unprotect "987654"
                 
                 'Sheets("sicurezza").Select 'passa all'altro foglio
                 Sheets(nomeFile).Select 'passa all'altro foglio
                 
                 'Rows(n).EntireRow.Copy 'copia riga
                 Range("A" & n & ":P" & n).Copy  'copia range
                 
                 
                 'If Range("A" & n) = "" Then
                 'avviso = MsgBox("La riga < " & ActiveCell.Row & " > è vuota! " & Chr(13) & _
                        "Seleziona una riga non vuota.", vbOKOnly + vbCritical, "AVVISO")
                 'ActiveSheet.Protect "987654"
                 'Application.CutCopyMode = False
                 'Exit Sub
                 'End If
                 
                 
                 Sheets("archivio_altri").Select 'ritorna all'archivio
                
                For i = 5 To 65536 'incolla dalla riga 4
                If ActiveSheet.Cells(i, 2) = vbNullString Then
                ActiveSheet.Cells(i, 2).Select
                
                'ActiveSheet.Paste
                'Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                        ':=False, Transpose:=False
                        
                
                
                Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:=False, Transpose:=False '<<< a colori
                'Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False '<<< solo valori
                Range(Cells(i, 1), Cells(i, 17)).Validation.Delete
                Range(Cells(i, 1), Cells(i, 17)).Interior.Color = xlNone
                Range(Cells(i, 18), Cells(i, 18)).Interior.Color = xlNone ' Colora da A a Q
                 
                If ActiveSheet.Cells(i, 17) <> "" Then
                Range(Cells(i, 1), Cells(i, 17)).Validation.Delete
                Range(Cells(i, 1), Cells(i, 17)).FormatConditions.Delete
                Range(Cells(i, 1), Cells(i, 17)).Interior.Color = RGB(153, 255, 153) ' Colora da A a Q
                End If
                
                
                
                 
                 'Sheets("archivio_altri").Select 'riprotegge l'archivio
                ' Range("B5:R500").Select
                ' Selection.Locked = True
                ' ActiveSheet.Protect "987654"
                'ActiveSheet.Protect Password:="987654", DrawingObjects:=True, Contents:=True, Scenarios:=True _
                        , AllowFormattingCells:=False, AllowInsertingHyperlinks:=False, AllowFiltering:=True
                        
                        
                        
                '[A4].Select
                ActiveSheet.Cells(i, 1).Select 'seleziona cella 1 nuova riga inserita
                Application.CutCopyMode = False
                
                Exit For
                End If
                Next i
                
                  
                
                 'Sheets("sicurezza").Select 'ritorna all'altro foglio
                 Sheets(nomeFile).Select 'passa all'altro foglio
                 
                fogl1 = ActiveSheet.Name
                
                Sheets("archivio_altri").Unprotect "987654"
                Sheets("archivio_altri").Cells(i, 1) = fogl1 'seleziona cella 1 nuova riga inserita
                Sheets("archivio_altri").Protect "987654"
                 
                 
                '-------------------------------------------------------------------------
                 
                'Call EliminaRiga_2
                
                   'Application.CutCopyMode = False
                   
                '-----------------------------------------------------------------------
                
                End If
                End If
                
                '[A6].Select
                'Rows(n).Select 'seleziona riga
                
                'On Error Resume Next
                Cells(n, 1).Select        '<-- nuova riga inserita
                
                
                'ActiveSheet.Protect "987654"
                'ActiveSheet.Protect Password:="987654", DrawingObjects:=True, Contents:=True, Scenarios:=True _
                       , AllowFormattingCells:=False, AllowInsertingHyperlinks:=False, AllowFiltering:=True
                      
                
                'Application.EnableEvents = True
                Application.ScreenUpdating = True
                
                
                'Foglio2.Range("A6").Value = "1"
                'Foglio2.Range("A7").Value = "1"
                
                
                 
                End Sub
                `

                 

                #47294 Score: 0 | Risposta

                Probabilmente ci sarà qualcosa di più semplice.

                Ho fatto così:

                Nella macro "Sub archivia_1_no_input(nomeFile As String)" ho aggiunto 2 macro una che aggiunge una colonna A poi un'altra che elimina questa colonna nel foglio "produttività"
                La macro "Sub archivia_1_no_input(nomeFile As String)" ora copia incolla esatto come colori formattazione.

                 

                Allegati:
                You must be logged in to view attached files.
                #47326 Score: 0 | Risposta

                Ciao,

                la macro che ho modificato inserendo una nuova colonna funziona benino.

                Durante il "lavoro" della macro si visualizza la creazione e l'eliminazione della colonna A.

                All'inizio e alla chiusura delle macro in modulo11 "Sub archivia_1_no_input(nomeFile As String)" c'è

                Application.ScreenUpdating = False

                Application.ScreenUpdating = true

                ma serve a poco.

                Probabilmente è colpa anche delle altre macro richiamate con "Call" sempre dentro alla macro in modulo11.

                Il lavoro  è probabilmente  un pò incasinato ma non è mio ma l'ho eriditato da un collega.

                E' possibile almeno non visualizzare la colonna A quano viene creata e annullata?

                Per provare nel foglio "produttivita" selezionare una riga e poi cliccare nel pulsante "archivia 1 riga selezionata"

                 

                Allegati:
                You must be logged in to view attached files.
              Login Registrati
              Stai vedendo 18 articoli - dal 1 a 18 (di 18 totali)
              Rispondi a: copia incolla righe tra fogli
              Gli allegati sono permessi solo ad utenti REGISTRATI
              Le tue informazioni: