Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

EXCEL2007 estrarre righe ordinandole

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

Re: EXCEL2007 estrarre righe ordinandole

Postdi dmmicheli » 02/07/14 15:00

ok proviamo a usare le macro...
Ho registrato la macro facendo su un foglio il filtro su una colonna... I dati estratti li ho copiati selezionando un intervallo di celle. Sono passato ad un altro foglio dove ho selezionato l'area, incollato e ordinato per una determinata colonna.
Dovrei ripetere la procedura per lo stesso foglio origine e 8 fogli destinazione diversi.
La sintassi generata è la seguente:
Sub Macro2()
'
' Macro2 Macro
'
' Scelta rapida da tastiera: CTRL+MAIUSC+A
'
ActiveSheet.Range("$A$1:$Y$5000").AutoFilter Field:=21, Criteria1:= _
"CRISTIAN"
Range("A5:V5030").Select
Selection.Copy
Sheets("CRISTIAN").Select
Range("A2:R38").Select
ActiveSheet.Paste
Application.CutCopyMode = False
ActiveWorkbook.Worksheets("CRISTIAN").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("CRISTIAN").Sort.SortFields.Add Key:=Range("P2:P32" _
), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("CRISTIAN").Sort
.SetRange Range("A2:R32")
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub
La seconda istruzione (Range("A5:V5030").Select) non funziona bene perchè in base al dato usato per filtrare a volte si deve prendere un range che parte da A3 a volte da A4 a volte da A7 etc...
Non sono riuscito a trovare sintassi soddisfacente.
Non volevo usare macro perchè volevo evitare di obbligare il compilatore a premere bottoni per copiare i dati dal foglio mittente ai destinatari ma volevo rendere automatica la copia ad ogni modifica di qualsiasi cella.
Grazie.
dmmicheli
Utente Junior
 
Post: 19
Iscritto il: 01/07/14 12:47

Sponsor
 

Re: EXCEL2007 estrarre righe ordinandole

Postdi ricky53 » 02/07/14 16:38

Ciao,
la prossima volta ricordati di utilizzare i TAG per il codice: il pulsante "CODE" presente sopra la finestra in cui scrivi le risposte.

Dovresti descrivere i passi che hai fatto: è preferibile.

Che versione di office utilizzi?



Volendo si può rendere tutto automatico, ossia l'utilizzatore non si accorgerebbe di nulla ma andiamo avanti per passi successivi.

Primo: rendere dinamico l'intervallo da filtrare e da copiare perchè il filtro produce righe da copiare di numero variabile con il filtro applicato.

Adesso devo scappare ... ci risentiamo questa sera.
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W7; Office 2003-10-13-16
Avatar utente
ricky53
Utente Senior
 
Post: 4223
Iscritto il: 11/04/09 19:29
Località: Italia

Re: EXCEL2007 estrarre righe ordinandole

Postdi ricky53 » 02/07/14 23:38

Ciao,
come promesso eccomi QUI.

Prova il seguente codice:
Codice: Seleziona tutto
Sub COPIA_DATI()
    Dim UR As Long
    Sheets("Foglio1").Select ' QUI  metti il nome del tuo folgio dalquale copiare i dati
   
    UR = Range("A" & Rows.Count).End(xlUp).Row
    ActiveSheet.Range("$A$1:$A$" & UR).AutoFilter Field:=1, Criteria1:="<>"
    ActiveSheet.ShowAllData
    Selection.AutoFilter

    UR = Range("A" & Rows.Count).End(xlUp).Row
    ActiveSheet.Range("$A$1:$Y$" & UR).AutoFilter Field:=21, Criteria1:= _
        "CRISTIAN"
       
    UR = Range("A" & Rows.Count).End(xlUp).Row
    Range("A5:V" & UR).Select
    Selection.Copy
    Sheets("CRISTIAN").Select
    UR = Range("A" & Rows.Count).End(xlUp).Row + 1
    Range("A" & UR).Select
    ActiveSheet.Paste
    Application.CutCopyMode = False
    ActiveWorkbook.Worksheets("CRISTIAN").Sort.SortFields.Clear
   
    UR = Range("A" & Rows.Count).End(xlUp).Row
    ActiveWorkbook.Worksheets("CRISTIAN").Sort.SortFields.Add Key:=Range("P2:P" & UR), _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("CRISTIAN").Sort
        .SetRange Range("A2:R" & UR)
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
End Sub

ATTENZIONE: non sono entrato nei meriti degli intervalli selezionati e sul sort dando per scontato che i dati presenti nel codice fossero giusti.

Ho solo reso dinamico l'intervallo da copiare e l'intervallo su cui copiare.


Prova e ... sono QUI !!!
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W7; Office 2003-10-13-16
Avatar utente
ricky53
Utente Senior
 
Post: 4223
Iscritto il: 11/04/09 19:29
Località: Italia

Re: EXCEL2007 estrarre righe ordinandole

Postdi dmmicheli » 03/07/14 07:59

Ciao Ricky non riuscendo ad applicare la formula di Canapone che comunque sembra poter dare origine a problemi ho provato a fare qcosa in VBA. Di seguito quello che ho fatto e che dovrei replicare per 8 fogli di destinazione (1 origine).
Non ho mai preso in considerazione il VBA perchè volevo evitare di far premere bottoni sperando di aggiornare i fogli destinazione automaticamente ad ogni cambio cella.
Non sono sicuro che tutte le istruzioni sono corrette e sono sicuro che si possa migliorare.
Non voglio copiare l'intestazione e i formati che nei fogli destinazione devono rimanere invariati. Ho trovato il metodo CurrentRegion.SpecialCells(xlCellTypeVisible).Copy che mi copia anche le intestazioni e quindi ho poi dovuto fare sh2.Range("A2:AA2").ClearContents per cancellarle.
Chiedo se mancano altre istruzioni o se ce ne sono di superflue.
Poi a tuo avviso quando devo chiamare la form?
Grazie
Codice: Seleziona tutto
Public Sub mCopia()

    'dichiaro le variabili
    Dim wk As Workbook
    Dim sh1 As Worksheet
    Dim sh2 As Worksheet

    'inserisco il criterio di ricerca e impedisco
    'lo sfarfallio del monitor
    With Application
        .ScreenUpdating = False
    End With
    'metto un riferimento al workbook che contiene il codice
    Set wk = ThisWorkbook
    'metto un riferimento ai fogli;
    'Foglio1 dove ho la tabella da cui
    'copiare i dati, Foglio2 dove voglio
    'incollare i dati filtrati
    With wk
        Set sh1 = .Worksheets("Lavorazione")
        Set sh2 = .Worksheets("Amos")
    End With
    'eseguo il filtro/copia/incolla
    With sh1
        'metto il filtro automatico e gli passo
        .Range("A1").AutoFilter Field:=21, _
            Criteria1:="AMOS"
        'elimino tutti i dati presenti
        'nel Foglio2''''
        sh2.Range("A2:AA500").ClearContents
       
        'copio/incollo
        .Range("A2").CurrentRegion.SpecialCells( _
            xlCellTypeVisible).Copy '_
sh2.Range("A2").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
 
        sh2.Range("A2:AA2").ClearContents
        'riprisitno il filtro e Pulisco memoria
      Application.CutCopyMode = False
        .Range("A1").AutoFilter Field:=21
    End With

With sh2.Sort
.SortFields.Clear
Range("A2:AA500").Sort Key1:=Range("P2"), Order1:=xlAscending, Header:=xlNo, _
                       Key2:=Range("A2"), Order1:=xlAscending, Header:=xlNo

End With

    'ripristino l'aggiornamento del monitor
    With Application
        .ScreenUpdating = True
    End With

    'Set a Nothing delle variabili oggetto
    Set sh2 = Nothing
    Set sh1 = Nothing
    Set wk = Nothing

End Sub
dmmicheli
Utente Junior
 
Post: 19
Iscritto il: 01/07/14 12:47

Re: EXCEL2007 estrarre righe ordinandole

Postdi dmmicheli » 03/07/14 08:19

Scusa non avevo visto i post successivi. Uso office 2007. Provando a usare il tuo codice ho notato che copia 2 volte i dati e copia anche i formati che non voglio fare.. Mi sembra anche che ci mette più tempo di quello che ho fatto io. Puoi per favore controllare quello che ho fatto io che ho allegato nel post precedente? In più mi piacerebbe all'inizio testare se è attivo il filtro automatico, se lo è lo rimetto se non lo è lo tolgo. Scusa ancora se ho fatto un pò di casino con i post...
dmmicheli
Utente Junior
 
Post: 19
Iscritto il: 01/07/14 12:47

Re: EXCEL2007 estrarre righe ordinandole

Postdi Anthony47 » 03/07/14 13:38

Si puo' avere un esempio corretto di file, in modo da lavorare senza equivoci?

Ciao a tutti.
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13891
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: EXCEL2007 estrarre righe ordinandole

Postdi dmmicheli » 03/07/14 14:58

dmmicheli
Utente Junior
 
Post: 19
Iscritto il: 01/07/14 12:47

Re: EXCEL2007 estrarre righe ordinandole

Postdi dmmicheli » 03/07/14 15:58

Scusa non ti ho detto il foglio Lavorazione è il mittente mentre i fogli con gli 8 nomi sono i destinatari. Ciao Grazie
dmmicheli
Utente Junior
 
Post: 19
Iscritto il: 01/07/14 12:47

Re: EXCEL2007 estrarre righe ordinandole

Postdi Anthony47 » 03/07/14 18:46

Prova con questo codice, da inserire in un "Modulo standard" del vba:
Codice: Seleziona tutto
Sub DMSplit()
Dim MErr As String, I As Long, LastU As Long, ColNum As Long
'
With Sheets("Lavorazione")
ColNum = .Cells(1, Columns.Count).End(xlToLeft).Column
LastU = .Cells(Rows.Count, "U").End(xlUp).Row
For I = 2 To LastU
    If ShExists(.Cells(I, "U")) Then
        Sheets(.Cells(I, "U").Value).Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Resize(1, ColNum).Value = _
           .Cells(I, 1).Resize(1, ColNum).Value
    Else
        MErr = MErr & vbCrLf & String(5, " ") & Cells(I, "U")
    End If
Next I
End With
If Len(MErr) > 0 Then
    MsgBox ("Completato con errore sui seguenti nominativi:" & MErr)
Else
    MsgBox ("Completato")
End If
End Sub

Function ShExists(ByVal mySh As String) As Boolean
'
On Error Resume Next
ShExists = Len(Sheets(mySh).Name) > 0
'
End Function
Da excel: Alt-F11 per aprire l' editor delle macro; Menu /Inserisci /Modulo; copia il codice e incollalo nel frame di dx.
Poi manda in esecuzione la DMSplit: da Excel premi Alt-F8, scegli DMSplit dall' elenco che ti propone, premi Esegui.

La macro alloca tutte le righe presenti sul foglio "Lavorazione" nei vari fogli operatore, secondo il contenuto di colonna U, accodando i nuovi dati a quanto gia' presente nei vari fogli.
Qualora mancasse il foglio di qualche nominativo sara' creato un messaggio di errore.
OPERAZIONE PROPEDEUTICA e' ripulire tutti i fogli dalle formule ora presenti, altrimenti troverai i dati in coda alle formule, cioe' dopo riga 500.

Ciao, fai sapere.
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13891
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: EXCEL2007 estrarre righe ordinandole

Postdi dmmicheli » 04/07/14 19:54

Ciao ho seguito tutte le tue istruzioni e ho trovato i seguenti punti che non vanno:
1. La macro copia anche le colonne nascoste che non erano previste nei fogli di destinazione e quindi c'è un disallineamento di colonne.
2. Non ordina i fogli di destinazione per PRIORITA e poi DATA
3. Se si modifica un nome di un operatore nel foglio mittente (Lavorazione) e si esegue la macro rimane sporco il foglio di destinazione per l'operatore sostituito (non viene cancellata la riga). Forse per lo stesso problema ad ogni esecuzione di macro aggiunge le righe.
4. La macro non è collegata automaticamente ad ogni modifica campo del foglio "Lavorazione" per cui si obbliga l'utente a lanciarla manualmente.
Buona serata.
dmmicheli
Utente Junior
 
Post: 19
Iscritto il: 01/07/14 12:47

Re: EXCEL2007 estrarre righe ordinandole

Postdi Anthony47 » 05/07/14 02:09

Prego.

Comunque se le cose non le dici io non vado a leggere i 25 messaggi precedenti per farmi un' idea della richiesta ne' conto le colonne per vedere quante sono nascoste...

Per skippare le colonne nascoste, sostituisci le righe
Sheets(.Cells(I, "U").Value).Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Resize(1, ColNum).Value = _
.Cells(I, 1).Resize(1, ColNum).Value
con
Codice: Seleziona tutto
        .Cells(I, 1).Resize(1, ColNum).SpecialCells(xlVisible).Copy
        Sheets(.Cells(I, "U").Value).Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).PasteSpecial _
            Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False


Te l' avevo detto che la macro "accodava" all' elenco preesistente.
Volendo puoi ripulire tutti i fogli "operatore" a inizio macro inserendo queste istruzioni subito prima della riga With Sheets("Lavorazione"):
Codice: Seleziona tutto
Dim Operat As Range
For Each Operat In Range("OPERATORI")
    If ShExists(Operat.Value) Then
        Sheets(Operat.Value).Range("A2:AZ1000").ClearContents
    End If
Next Operat
Questa ripulisce l' intervallo Range("A2:AZ10000"); se ti serve pulire un' area diversa modifica l' istruzione "ClearContents"

Se vuoi ordinare in un qualche modo i fogli creati dalla macro:
-seleziona un foglio Operatore qualsiasi
-registrati una macro mentre ordini quel foglio come ti serve

Poi verso la fine della macro, subito dopo la riga End With, aggiungi questo codice
Application.CutCopyMode = False
Codice: Seleziona tutto
For Each Operat In Range("OPERATORI")
    If ShExists(Operat.Value) Then
        Call TuaMacroDiOrdinamento      '<<< Il vero nome della macro registrata
    End If
Next Operat


Dopo queste modifiche:
-all' avvio la macro cancella ogni foglio Operatore, da riga 2 verso il basso per 10mila righe...
-...copia i dati da Lavorazione ai vari fogli Operatore ignorando le colonne nascoste...
-...ordina il contenuto di ogni foglio Operatore come previsto dalla macro autoregistrata

Se l' operatore modifica dei campi dovrebbe anche sapere come processare la modifica... Comunque se invece vuoi lanciare la macro ad ogni modifica su foglio Lavorazione:
-tasto dx sul tab col nome foglio "Lavorazione"; scegli Visualizza codice
-incolla nel frame di dx questo codice
Codice: Seleziona tutto
Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False
Call DMSplit
Sheets("Lavorazione").Select
Application.ScreenUpdating = True
End Sub

In questo caso la macro partira' automaticamente a ogni cambiamento apportato sul foglio.

Ciao
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13891
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: EXCEL2007 estrarre righe ordinandole

Postdi dmmicheli » 05/07/14 15:30

Ciao scusa se sono stato superficiale e non ho dettagliato...
Ho provato e tutto funziona come volevo funzionasse. Non ho fatto la macro per ordinare i fogli destinatari ma ho preferito inserire il codice che già mi avevi suggerito che riporto di seguito:
Codice: Seleziona tutto
For Each Operat In Range("OPERATORI")
    If ShExists(Operat.Value) Then
'        Call TuaMacroDiOrdinamento      '<<< Il vero nome della macro registrata
With ActiveWorkbook.Worksheets(Operat.Value).Sort
 
.SortFields.Clear
.SortFields.Add Key:=Range("P2"), _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
.SortFields.Add Key:=Range("A2"), _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        .SetRange Range("A2:AA500")
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
        End With
    End If

Ora è tutto ok, grazie ancora e complimenti per la competenza e la disponibilità.
dmmicheli
Utente Junior
 
Post: 19
Iscritto il: 01/07/14 12:47

Precedente

Torna a Applicazioni Office Windows


Topic correlati a "EXCEL2007 estrarre righe ordinandole":


Chi c’è in linea

Visitano il forum: Nessuno e 11 ospiti