Acquista i nostri libri consigliati su Amazon.it
+ Rispondi al messaggio
Pagina 1 di 2 12 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16

Raggruppa e/o elimina righe con macro

  1. #1
    surfgarden non è in linea Scolaretto
    Post
    146
    Like Inviati  
    0
    Like Ricevuti  
    0
    Ciao a tutti. Sicuramente sto chiedendo banalità, ma con la ricerca nella rete mi sto perdendo.
    Sulla colonna A ho dei valori di testo. Sulla colonna B dei valori numerici.
    Senza utilizzare i "soliti stratagemmi" per raggiungere lo scopo,
    1) Vorrei raggruppare tutte le righe (..e solo quelle righe!) che hanno in A un determinato testo, sommandone i valori corrispondenti in B.
    2) Vorrei poi eliminare tutte quelle righe che in A hanno altri determinati valori di testo

    Faccio un esempio di ciò che cerco. Se ho:

    pecore	1
    maiali	10
    capre	100
    galline 1000
    oche	90
    pecore	2
    maiali	40
    capre	200
    galline 1000
    oche	80
    pecore	3
    maiali	70
    capre	300
    
    e desidero raggruppare le pecore e far sparire galline e oche. Ossia ottenere sul foglio:

    pecore	6
    maiali	10
    capre	100
    maiali	40
    capre	200
    maiali	70
    capre	300
    
    certamente potrei utilizzare la funzione =SOMMA.SE() per le pecore, ed eliminare le righe con Trova e seleziona
    Non ho gran confidenza con le tabelle Pivot. Provando ho ottenuto che mi vengono restituiti i dati ma raggruppati su tutti i valori di A, oppure su determinati scelti, escludendomi gli altri (mentre io li voglio restituiti senza raggruppamento!)
    Possibilmente, per ottenere l'obiettivo sopra illustrato, preferirei la via della Macro, da applicare al foglio se e quando voglio.
    Ringrazio chiunque mi desse una valida dritta
    Ultima modifica di surfgarden; 22-10-2020 13:42  Motivo: specifica

  2. #2
    Sgrubak ora è in linea Scribacchino
    Post
    555
    Like Inviati  
    9
    Like Ricevuti  
    3
    Ciao surfgarden,

    io non la classificherei nelle banalità. È già qualcosa con cui divertirsi.
    Partendo dal presupposto che è piuttosto generica come richiesta, per non scadere nella "pappa pronta", ti lascio due righe su come approccerei io al problema in questione.
    Suddividerei la logica della routine in 3 fasi:
    1)Leggo da celle ben precise i parametri che definiscono i raggruppamento e le esclusioni;
    2)Leggo ed elaboro la base dati di partenza secondo i criteri di cui al punto 1;
    3)Scrivo in celle ben definite i risultati dell'elaborazione

    La fase 2 è gestibile con cicli (a tua scelta For, For Each o Do, dipende dal tuo stile) e con qualche If... È probabile che anche l'utilizzo di Array possa fare al caso tuo.

    Fa qualche tentativo, e poi vediamo di aggiustare il tiro.

  3. #3
    surfgarden non è in linea Scolaretto
    Post
    146
    Like Inviati  
    0
    Like Ricevuti  
    0
    Quote Originariamente inviato da Sgrubak Visualizza il messaggio
    Partendo dal presupposto che è piuttosto generica come richiesta, per non scadere nella "pappa pronta", ti lascio due righe su come approccerei io al problema in questione.
    Ciao Sgrubak. Scusa per la lunga tempistica.

    Grazie di essermi venuto ancora in aiuto, e visto che già conosci la questione, un paio di precisazioni.
    In realtà non è un caso scolastico o ludico, ma l'ultimo passaggio di quell'elaborazione degli estratti conto in cui mi hai aiutato la settimana scorsa nel precedente thread, prima di accodare il foglio ad una tabella di access.
    In casa mia, i bimbi ascoltano tutto il giorno "Nella vecchia fattoria".. da cui.. gli animali !
    Pecore altro non sono che le odiose COMMISSIONI su bonifici, ricariche, ecc.. che mi impesterebbero il db di record con valori irrisori. Oche e galline le voci da non contabilizzare in quanto non rappresentano entrate/uscite, bensì semplici spostamenti (versamenti, giroconto,..).
    Ma rimaniamo pure in campagna )

    Quote Originariamente inviato da Sgrubak Visualizza il messaggio
    Suddividerei la logica della routine in 3 fasi:
    1)Leggo da celle ben precise i parametri che definiscono i raggruppamento e le esclusioni;
    2)Leggo ed elaboro la base dati di partenza secondo i criteri di cui al punto 1;
    3)Scrivo in celle ben definite i risultati dell'elaborazione
    Inizialmente avevo posto una colonna per i parametri. Poi, visto che i parametri saranno solo 2 (io ne ho aggiunto un terzo solo ..di scorta), senza fare riferimenti ad altri fogli, li ho impostati direttamente in codice. Così non dovrò nemmeno preoccuparmi di preservarli eliminando le righe

    Quote Originariamente inviato da Sgrubak Visualizza il messaggio
    La fase 2 è gestibile con cicli (a tua scelta For, For Each o Do, dipende dal tuo stile) e con qualche If... È probabile che anche l'utilizzo di Array possa fare al caso tuo.

    Fa qualche tentativo, e poi vediamo di aggiustare il tiro.
    Mi vergogno a dirlo, ma non ho ancora imparato a debbuggare e ciclare (cioè l'ABC del VBA)
    Stanotte, con un po' di ricerche e tutorial, sono riuscito a scrivere "molto grezzamente" un abbozzo di codice funzionante per l'eliminazione delle righe (che ovviamente in seguito avverrà su altro foglio)
    Sub EliminaPolli()
    
    Dim i As Integer
    Dim p As String
    Dim g As String
    Dim o As String
    
    p = "pecore"
    g = "galline"
    o = "oche"
    
        For i = 2 To 25
              If Cells(i, 1) <> g And Cells(i, 1) <> o Then
                  Cells(i, 6) = Cells(i, 1)   
                  Cells(i, 7) = Cells(i, 2)
    		' .... altre colonne, ma devo imparare a scriverlo come A2:E25
            End If
        Next
             For i = 2 To 25
            If Cells(i, 6).Value = "" Then Cells(i, 6).EntireRow.Delete
            If Cells(i, 7).Value = "" Then Cells(i, 7).EntireRow.Delete
        Next
    End Sub
    
    Mi mancherebbe solo il Pivot sulle pecore, su cui cercherò qualcosa nei prossimi momenti liberi.
    Ultima modifica di surfgarden; 24-10-2020 11:57 

  4. #4
    surfgarden non è in linea Scolaretto
    Post
    146
    Like Inviati  
    0
    Like Ricevuti  
    0
    ...CI SONO RIUSCITO !!!

    Sub EliminaPolli_e_SommaPecore()
    
    Dim i As Integer, j As Double, r As Long
    Dim ka, kb, k()
    
    Dim p As String
    Dim g As String
    Dim o As String
    Dim ur As String
    
    p = "pecore"
    g = "galline"
    o = "oche"
    
    ur = Cells(Rows.Count, 1).End(xlUp).Row
    
        For i = 2 To ur
              If Cells(i, 1) <> g And Cells(i, 1) <> o And Cells(i, 1) <> p Then
                  Cells(i, 6) = Cells(i, 1)
                  Cells(i, 7) = Cells(i, 2)
            End If
        Next
       
        r = Range("A" & Rows.Count).End(3).Row
    
        ka = Range("A1:A" & r)  'Range di una sola colonna
        kb = Range("B1:B" & r)  'Somma i valori da una sola colonna!
    
        ReDim k(1 To UBound(ka, 1), 1 To 1)
        j = 0
        For i = 1 To UBound(ka, 1)
            If ka(i, 1) = p Then
                j = kb(i, 1) + j
                k(i, 1) = j
            End If
        Next
    
        Cells((UBound(k, 1) + 1), 6) = p
        Cells((UBound(k, 1) + 1), 7) = j 'Risultato Finale
    End Sub
    
    Ho tolto l'eliminazione delle righe. Ora mi restano solo le celle vuote nelle colonne F e G.
    Con altro ciclo copio i soli valori presenti in F e G su nuovo foglio e.... il gioco è fatto!

    Ultima modifica di surfgarden; 25-10-2020 08:51  Motivo: cambiata variabile

  5. #5
    Marius44 non è in linea Scolaretto
    Post
    357
    Like Inviati  
    0
    Like Ricevuti  
    4
    Buona domenica a tutti
    SE vuoi "eliminare" le righe procedi in questo modo:
    a) elimina le righe partendo dal basso;
    b) esegui la somma delle righe che ti interessano.
    In altre parole, prima di avviare la macro che hai compilato, elimina le righe (mi raccomando, da sotto in sù).
    Ciao,
    Mario

  6. #6
    surfgarden non è in linea Scolaretto
    Post
    146
    Like Inviati  
    0
    Like Ricevuti  
    0
    Quote Originariamente inviato da Marius44 Visualizza il messaggio
    Buona domenica a tutti
    SE vuoi "eliminare" le righe procedi in questo modo:
    a) elimina le righe partendo dal basso;
    b) esegui la somma delle righe che ti interessano.
    In altre parole, prima di avviare la macro che hai compilato, elimina le righe (mi raccomando, da sotto in sù).
    Ciao,
    Mario
    Grazie.
    Si, avevo appena risolto. Infatti al primo ciclo non mi eliminava tutte le righe. Poi, cercando sul web, ho trovato la soluzione "step = -1"
    Sub Elimina_Righe()
    Dim Intervallo As Range
    Dim Righe, R, Colonne, C, FL As Boolean
    ActiveSheet.Select
    Set Intervallo = ActiveSheet.UsedRange
    Righe = Intervallo.Rows.Count
    Colonne = Intervallo.Columns.Count
    For R = Righe To 1 Step -1 
    FL = False
    For C = 1 To Colonne
    If Intervallo(R, C) <> "" Then
    FL = True
    End If
    Next
    If FL = False Then
    Intervallo(R, 1).EntireRow.Delete
    End If
    Next
    End Sub
    
    Grazie

  7. #7
    Sgrubak ora è in linea Scribacchino
    Post
    555
    Like Inviati  
    9
    Like Ricevuti  
    3
    Quote Originariamente inviato da surfgarden Visualizza il messaggio
    ...CI SONO RIUSCITO !!!
    Ottimo!
    Un paio di suggerimenti al volo: nella sub EliminaRighe, aggiungi un Exit For:
    If Intervallo(R, C) <> "" Then
        FL = True
        Exit For
        End If
    Next
    
    Se hai già trovato una colonna piena, non ti serve a nulla continuare a controllare anche le successive.

    In EliminaPolli_e_SommaPecore(), porta la scrittura nella cella del valore di [j] fuori dal ciclo. Ti basta una sola volta alla fine, non rifarlo ad ogni passaggio:
    For i = 1 To UBound(ka, 1)
        If ka(i, 1) = p Then  j = kb(i, 1) + j
    Next
    k(i, 1) = j
    
    Infine, ma solo per mio gusto personale, racchiuderei entrambe le routine in una unica e sfrutterei le proprietà ScreenUpdating e Calculation:
    Sub FiltraERaggruppa()
        
        With Application
            .ScreenUpdating = False
            .Calculation = xlCalculationManual
        End With    
        
        EliminaRighe
        EliminaPolli_e_SommaPecore
        
        With Application
            .Calculation = xlCalculationAutomatic
            .ScreenUpdating = True
        End With
    End Sub
    
    Attenzione infine alla variabile [ur] che hai dichiarato come String. Usandola per ciclare righe, valuta se ti serva una Long o se ti basta una Integer.

  8. #8
    surfgarden non è in linea Scolaretto
    Post
    146
    Like Inviati  
    0
    Like Ricevuti  
    0
    Quote Originariamente inviato da Sgrubak Visualizza il messaggio
    Ottimo!
    Un paio di suggerimenti al volo: nella sub EliminaRighe, aggiungi un Exit For:
    ..
    Se hai già trovato una colonna piena, non ti serve a nulla continuare a controllare anche le successive.
    Grazie, ma quella macro non mi andava più bene.
    Infatti quel codice (ovviamente preso dal web! ..io non ne sarei certo stato in grado!) mi verifica su tutte le colonne se tutta la riga è vuota. Va bene .."in campagna", ma non "in città"...
    Sull'elaborazione del e/c bancario, ho altri campi compilati,
    quindi devo verificare che solo su una determinata colonna la cella sia vuota, ed in base a quella cella eliminare la riga!
    Questa è la nuova istruzione, che fa ciò che serve a me:
    Sub Cancella_riga_su_colonna_vuota()
    Dim ur As String  ' o Integer, o Long.. funzionano tutte e non noto differenze. Sicuramente Integer sarà la più rapida
    Dim i As Integer
    Dim R As Long
    
    ur = Range("Q" & Rows.Count).End(xlUp).Row
    For i = ur To 2 Step -1
    If Range("Q" & i) = "" Then
    Range("Q" & i).Select
    Selection.EntireRow.Delete
    End If
    Next i
    
    Quote Originariamente inviato da Sgrubak Visualizza il messaggio
    In EliminaPolli_e_SommaPecore(), porta la scrittura nella cella del valore di [j] fuori dal ciclo. Ti basta una sola volta alla fine, non rifarlo ad ogni passaggio:
    For i = 1 To UBound(ka, 1)
        If ka(i, 1) = p Then  j = kb(i, 1) + j
    Next
    k(i, 1) = j
    
    scritta così, mi dà errore (indice non incluso nell'intervallo)

    Quote Originariamente inviato da Sgrubak Visualizza il messaggio
    Infine, ma solo per mio gusto personale, racchiuderei entrambe le routine in una unica e sfrutterei le proprietà ScreenUpdating e Calculation:
    ...
    Grazie per la dritta. Appena sistemo altri "problemucci" la applico.
    Finchè non è tutto a posto, eseguo una routine alla volta.
    Se copio i risultati su nuova cartella, le macro trattate in questo thread sono istantanee.
    Sulla cartella originaria invece, anche se copia/incollati "speciali" di solo valore su nuovo foglio, mi parte un loop inaccettabile (alcuni minuti per eseguire la macro su 167 righe!!!); a meno che non interrompo con CANC, e allora la compilazione scorre abbastanza veloce.
    Ma tutta la cartella crea ritardi assurdi, anche semplicemente nell'apertura e chiusura.

    Quote Originariamente inviato da Sgrubak Visualizza il messaggio
    Attenzione infine alla variabile [ur] che hai dichiarato come String. Usandola per ciclare righe, valuta se ti serva una Long o se ti basta una Integer.
    Ok. Grazie

  9. #9
    Sgrubak ora è in linea Scribacchino
    Post
    555
    Like Inviati  
    9
    Like Ricevuti  
    3
    Quote Originariamente inviato da surfgarden Visualizza il messaggio
    scritta così, mi dà errore (indice non incluso nell'intervallo)
    È stata una svista mia. Ho "copiaincollato" la riga di codice dimenticando che [i] non è visibile esternamente al ciclo. Intendevo che ti potrebbe essere sufficiente
    Cells((UBound(k, 1) + 1), 7) = j 'Risultato Finale
    
    Ma onestamente non mi sono applicato molto sul capire come hai strutturato il foglio... Resta il concetto che se già aggiorni [j] non ti serve riscriverla ogni volta da qualche parte, ma solo una volta alla fine.

    Quote Originariamente inviato da surfgarden Visualizza il messaggio
    Se copio i risultati su nuova cartella, le macro trattate in questo thread sono istantanee.
    Sulla cartella originaria invece, anche se copia/incollati "speciali" di solo valore su nuovo foglio, mi parte un loop inaccettabile...
    Allora 2 considerazioni:
    1) Le proprietà che ti ho suggerito ti faranno comodo. Velocizzano sensibilmente l'esecuzione del codice, anche se a quanto dici, in una cartella nuova non percepisci rallentamenti.
    2) Nella cartella originaria hai qualche Sub sbagliata che rallenta tutto. Li ti serve un bel punto d'interruzione all'inizio e poi il buon caro vecchio tasto F8. Controlla di non passare più volte per la stessa Function/Sub, o di finire in qualche routine che volevi togliere e hai dimenticato.

  10. #10
    surfgarden non è in linea Scolaretto
    Post
    146
    Like Inviati  
    0
    Like Ricevuti  
    0
    Quote Originariamente inviato da Sgrubak Visualizza il messaggio
    .. Resta il concetto che se già aggiorni [j] non ti serve riscriverla ogni volta da qualche parte, ma solo una volta alla fine.
    OK. Capito il concetto. Con calma mi studio bene il codice e cerco di applicare

    Quote Originariamente inviato da Sgrubak Visualizza il messaggio
    Allora 2 considerazioni:
    1) Le proprietà che ti ho suggerito ti faranno comodo. Velocizzano sensibilmente l'esecuzione del codice, anche se a quanto dici, in una cartella nuova non percepisci rallentamenti.
    2) Nella cartella originaria hai qualche Sub sbagliata che rallenta tutto. Li ti serve un bel punto d'interruzione all'inizio e poi il buon caro vecchio tasto F8. Controlla di non passare più volte per la stessa Function/Sub, o di finire in qualche routine che volevi togliere e hai dimenticato.
    Ho rifatto l'intera cartella, eliminando fogli e riferimenti inutili, nonché le annualità precedenti.
    Ora apertura e chiusura della cartella sono ok.
    La velocità di esecuzione della Sub EliminaPolli..() su 167 righe è di circa 37 secondi (salvo esc che accelera e conclude subito), mentre la Sub Cancella_riga..() impiega 17 secondi per eliminare le righe. Su entrambe ho applicato ur as integer.
    Su foglio di cartella "vergine" invece, sono appunto istantanea la prima, poco più di 2 sec. la seconda.
    E' sicuramente migliorato, ma se le righe fossero 16.000 avremmo una macro che impiega un'ora.

    In VBA ho solo tre macro. Le due in questione e quella tua del #ConfrontaInverso
    Il resto sono funzioni native di excel

    Se anche l'obiettivo è raggiunto, e per le mie esigenze..30 secondi non mi fanno la differenza (senza contare che in access accoderei in ogni caso da un foglio di altra cartella), capisco che gli errori di routine vanno scoperti e risolti.
    Appena riesco, mi dedico al debug... non accetto più da me stesso con questo mio limite.
    Ti aggiorno quando risolvo

    Grazie mille di nuovo

+ Rispondi al messaggio
Pagina 1 di 2 12 ultimoultimo

Potrebbero interessarti anche ...

  1. Raggruppa e conta
    Da Lelec nel forum Microsoft Access
    Risposte: 5
    Ultimo Post: 08-08-2017, 18:36
  2. Risposte: 21
    Ultimo Post: 18-11-2014, 22:36
  3. Elimina riga e righe vuote
    Da M4ndr4k377 nel forum Visual Basic .Net
    Risposte: 8
    Ultimo Post: 04-10-2014, 23:07
  4. Velocizzare macro elimina righe
    Da pablo.carnevali nel forum Microsoft Excel
    Risposte: 6
    Ultimo Post: 25-03-2014, 23:19
  5. elimina righe uguali
    Da pricious nel forum Microsoft Word
    Risposte: 5
    Ultimo Post: 08-06-2005, 16:53