Condividi tramite

Copiare righe da vari fogli excel a un determinato foglio

Anonimo
2018-08-06T15:19:55+00:00

Buon pomeriggio a tutt*,

ho cercato e ricercato soluzioni simili ma non ne vengo a capo.

Vi porgo il mio problema.

Ho un file excel con fogli di lavoro ognuno per ogni mese e altri fogli di lavoro, nei fogli di lavoro mensili ho una tabella e vorrei che per ogni foglio vengano copiate le righe in un nuovo foglio se una colonna delle varie tabelle (che sono tutte uguali) ha No all'interno. Oltre a questo nel nuovo foglio non servono tutte le colonne della tabella, ma solo alcune di queste. Inoltre, sarebbe utile ordinarle per data di scadenza e quando l'opzione passa da No a Si, si tolga l'intera riga.

Siccome è un po complicato spiegare metto il link di un file con dati fittizi e molto semplificata.

Vorrei che nel foglio Card18 vengano copiate solo le colonne riportate, che si trovano nelle tabelle Gen18, Feb18, Mar18.

Spero di essere stata chiara ma ne dubito :)

Grazie comunque per le eventuali risposte.

https://www.dropbox.com/s/g1zpgkoiio77qls/esempio.xlsx?dl=0

Microsoft 365 e Office | Excel | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

  1. Anonimo
    2018-08-08T13:15:36+00:00

    Ciao Eva,

    Chiedo scusa perché ritorno tardivavamente alla tua domanda!

    Prova a sostituire il codice precedente con la seguente versione:

    '=========>>

    Option Explicit

    Option Compare Text

    '--------->>

    Public Sub Aggiorna_Card(aSH As Worksheet)

        Dim WB As Workbook

        Dim SH As Worksheet

        Dim srcSH As Worksheet

        Dim srcRng As Range, deatRng As Range

        Dim LObj As ListObject

        Dim arrIn As Variant, arrOut() As Variant

        Dim arrColonne As Variant

        Dim Res As Variant

        Dim vVal As Variant

        Dim arrMese As Variant

        Dim aStr As String, bStr As String

        Dim i As Long, j As Long, k As Long

        Dim iCtr As Long, jCtr As Long, iCol As Long

        Dim bFlag As Boolean

        Const sColonne_Da_Copiare As String = _

                                                 "1,2,4,6,7,8,9,10"       '<<=== Modifica

        Const iColonna_Attivata As Long = 13               '<<=== Modifica

        Const sPrefisso As String = "Card_"                     '<<=== Modifica

        Set WB = ThisWorkbook

        arrMese = Application.GetCustomListContents(3)

        arrColonne = Split(sColonne_Da_Copiare, ",")

        For Each SH In WB.Worksheets

            With SH

                aStr = .Name

                bStr = Left(aStr, 3)

                Res = Application.Match(bStr, arrMese, 0)

                If Not IsError(Res) Then

                    Set srcRng = .ListObjects(sPrefisso & aStr).DataBodyRange

                    arrIn = srcRng.Value2

                    For i = LBound(arrIn) To UBound(arrIn)

                        If arrIn(i, iColonna_Attivata) = "NO" Then

                            iCtr = iCtr + 1

                            ReDim Preserve arrOut(1 To 8, 1 To iCtr)

                            For j = LBound(arrColonne) To UBound(arrColonne)

                                jCtr = jCtr + 1

                                iCol = arrColonne(jCtr - 1)

                                vVal = arrIn(i, iCol)

                                arrOut(jCtr, iCtr) = vVal

                            Next j

                            jCtr = 0

                        End If

                    Next i

                End If

            End With

        Next SH

        bFlag = CBool(iCtr)

        If bFlag Then

            arrOut = Application.Transpose(arrOut)

        End If

        With aSH.ListObjects(1)

            If Not .DataBodyRange Is Nothing Then

                .DataBodyRange.Delete

            End If

            If bFlag Then

                .HeaderRowRange.Offset(1). _

                        Resize(UBound(arrOut)).Value2 = arrOut

                .Range.Sort key1:=.ListColumns(4), _

                            order1:=xlAscending, _

                            Header:=xlYes, _

                            OrderCustom:=1, _

                            MatchCase:=False, _

                            Orientation:=xlTopToBottom

            End If

        End With

    End Sub

    '<<=========

    ===

    Regards,

    Norman

    La risposta è stata utile?

    1 persona ha trovato utile questa risposta.
    0 commenti Nessun commento

Risposta accettata dall'autore della domanda

  1. Anonimo
    2018-08-06T18:21:49+00:00

    Ciao evoich8,

    ho cercato e ricercato soluzioni simili ma non ne vengo a capo.

    Vi porgo il mio problema.

    Ho un file excel con fogli di lavoro ognuno per ogni mese e altri fogli di lavoro, nei fogli di lavoro mensili ho una tabella e vorrei che per ogni foglio vengano copiate le righe in un nuovo foglio se una colonna delle varie tabelle (che sono tutte uguali) ha No all'interno. Oltre a questo nel nuovo foglio non servono tutte le colonne della tabella, ma solo alcune di queste. Inoltre, sarebbe utile ordinarle per data di scadenza e quando l'opzione passa da No a Si, si tolga l'intera riga.

    Siccome è un po complicato spiegare metto il link di un file con dati fittizi e molto semplificata.

    Vorrei che nel foglio Card18 vengano copiate solo le colonne riportate, che si trovano nelle tabelle Gen18, Feb18, Mar18.

    Spero di essere stata chiara ma ne dubito :)

    Grazie comunque per le eventuali risposte.

    https://www.dropbox.com/s/g1zpgkoiio77qls/esempio.xlsx?dl=0

    Prova qualcosa del genere:

    • Fai clic dx sulla linguetta del foglio Card18
    • Seleziona l'opzione Visualizza Codice dal menu contestuale risultante
    • Incolla il seguente codice:

    '=========>>

    Option Explicit

    '--------->>

    Private Sub Worksheet_Activate()

        Call Aggiorna_Card(Me)

    End Sub

    '<<=========

    • Alt+IM per inserire un nuovo modulo di codice
    • Nel nuovo modulo vuoto, incolla il seguente codice:

    '=========>>

    Option Explicit

    Option Compare Text

    '--------->>

    Public Sub Aggiorna_Card(aSH As Worksheet)

        Dim WB As Workbook

        Dim SH As Worksheet

        Dim srcSH As Worksheet

        Dim srcRng As Range, deatRng As Range

        Dim LObj As ListObject

        Dim arrIn As Variant, arrOut() As Variant

        Dim arrColonne As Variant

        Dim Res As Variant

        Dim arrMese As Variant

        Dim aStr As String, bStr As String

        Dim i As Long, j As Long, k As Long

        Dim iCtr As Long, jCtr As Long, iCol As Long

        Const sPrefix As String = "Card"

        Const sColonne_Da_Copiare As String = "1,2,4,5,7,9"

        Set WB = ThisWorkbook

        arrMese = Application.GetCustomListContents(3)

        arrColonne = Split(sColonne_Da_Copiare, ",")

        For Each SH In WB.Worksheets

            With SH

                aStr = .Name

                bStr = Left(aStr, 3)

                Res = Application.Match(bStr, arrMese, 0)

                If Not IsError(Res) Then

                    Set srcRng = .ListObjects(1).DataBodyRange

                    arrIn = srcRng.Value

                    '                jCtr = 0

                    For i = LBound(arrIn) To UBound(arrIn)

                        If arrIn(i, 9) = "NO" Then

                            iCtr = iCtr + 1

                            ReDim Preserve arrOut(1 To 6, 1 To iCtr)

                            For j = LBound(arrColonne) To UBound(arrColonne)

                                jCtr = jCtr + 1

                                iCol = arrColonne(jCtr - 1)

                                If iCol = 3 Or iCol = 4 Then

                                    arrOut(jCtr, iCtr) = CLng(arrIn(i, iCol))

                                Else

                                    arrOut(jCtr, iCtr) = arrIn(i, iCol)

                                End If

                            Next j

                            jCtr = 0

                        End If

                    Next i

                End If

            End With

        Next SH

        arrOut = Application.Transpose(arrOut)

        With aSH.ListObjects(1)

            If Not .DataBodyRange Is Nothing Then

                .DataBodyRange.Delete

            End If

            .HeaderRowRange.Offset(1). _

                    Resize(UBound(arrOut)).Value2 = arrOut

            .Range.Sort key1:=.ListColumns(4), _

                        order1:=xlAscending, _

                        Header:=xlYes, _

                        OrderCustom:=1, _

                        MatchCase:=False, _

                        Orientation:=xlTopToBottom

        End With

    End Sub

    '<<========= 

    • Alt+Q per chiudere l'editor di VBA e tornare a Excel
    • Salva il file con l’estensione xlsm

    Ogni volta che il foglio Card18 venga selezionato, i dai nella sua tabella verranno automaticamente aggiornati.

    Potresti scaricare il mio file di prova Evoich20180806.xlsm

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento

14 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2018-08-07T10:38:08+00:00

    Ho fatto come mi ha detto.

    Per quanto riguarda il codice ho cambiato le varie colonne da copiare che nel file originale sono diverse.

    Però mi da errore alla riga:

       If arrIn(i, 9) = "NO" Then

    Ho cambiato 9, che è il numero della colonna da controllare se c'è Si/No, con il numero della colonna del file originale (che è 13), ma continua a darmi lo stesso errore.

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2018-08-07T10:03:01+00:00

    Ciao Eva,

    il file semplificato con il Suo codice funziona esattamente come vorrei funzionasse il file originale, grazie grazie grazie.

    Mi fa molto piacere.

    Vorrei chiederti gentilmente di controllare l'opzione Contrassegna come risposta dal menu a discesa - Strumenti avanzati, sotto la rispettiva risposta.

    In questo modo, le risposte convalidate saranno promosse immediatamente al di sotto della domanda iniziale, e tutti gli altri lettori che hanno la stessa preoccupazione , saranno in grado di trovare più facilmente la risposta, durante la loro ricerca nel nostro forum e su internet.

    Un consiglio su come posso adattare il codice? 

    Senza conoscenza della disposizione dei dati nel file vero, credo sia davvero molto difficile offrirti consigli utili oltre all'adatta modifica dei valori assegnati alla costante sColonne:

        Const sColonne_Da_Copiare As String = "1,2,4,5,7,9"

     dove  1,2,4,5,7,9  rappresentono il numero di colonna delle colonne di interesse.        

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2018-08-07T09:42:23+00:00

    Buongiorno,

    il file semplificato con il Suo codice funziona esattamente come vorrei funzionasse il file originale, grazie grazie grazie.

    Un consiglio su come posso adattare il codice? 

    Grazie mille, Eva

    La risposta è stata utile?

    0 commenti Nessun commento