Risultati da 1 a 17 di 17

Discussione: [Excel 2003+VBA] Raggruppare righe e colonne



  1. #1
    L'avatar di Powerwin
    Clicca e Apri
    Data Registrazione
    Mar 2016
    Località
    Milano
    Messaggi
    1404
    Versione Office
    2016 - 2010
    Likes ricevuti
    194
    Likes dati
    71

    [Excel 2003+VBA] Raggruppare righe e colonne

    Buongiorno a tutti, premetto che son 2 giorni che consulto tutto il forum e che scandaglio la rete alla ricerca di qualche soluzione al mio quesito ma ho trovato piccole soluzioni parziali che hanno confuso ulteriormente il mio unico neurone.

    Ringrazio sin da ora chiunque riuscisse o volesse darmi qualche consiglio o anche un piccolo input su come operare per risolvere il mio problema.

    Ciò che vi mostro è parte di un progetto più grande e questa è la parte conclusiva.

    Situazione iniziale:



    Situazione finale:


    E’ un master in excel che si alimenta da un DB con i soli record relativi ad un cliente, fissato a valori e in ultima battuta deve essere presentato come nella situazione finale.
    Il mio approccio è questo:

    1) verifico/conto quante sono le celle in colonna “piene”
    Max_col = Sub ContaCelle()
    endcol = Cells(1, Cells.Columns.Count).End(xlToLeft).Column

    2) conto quante celle contengono un certo ID
    Num_col = CONTA.SE($B$1:$M$1;"*1.*")

    3) sottraggo alle colonne totali quelle che non hanno il primo ID
    Rag_col = Max_col - (Max_col-Num_col)

    4) poi creerei un ciclo con una variabile che si incrementa per selezionare le colonne da raggruppare meno la prima per ogni gruppo che è la colonna di totalizzazione.
    5) Il tutto verrà ripetuto per il raggruppamento delle righe

    Ma qui mi sto perdendo….spero soltanto di esser stato abbastanza chiaro su ciò che dovrei ottenere e scusatemi se ho sbagliato qualcosa

  2. #2
    L'avatar di Powerwin
    Clicca e Apri
    Data Registrazione
    Mar 2016
    Località
    Milano
    Messaggi
    1404
    Versione Office
    2016 - 2010
    Likes ricevuti
    194
    Likes dati
    71
    Dopo 10 giorni senza alcun intervento direi che il crossposting decada, mi vedo costretto a cercare aiuto altrove, resta salvo che il forum è decisamente interessante

  3. #3

    L'avatar di cromagno
    Clicca e Apri
    Data Registrazione
    Aug 2015
    Località
    Sardegna
    Età
    37
    Messaggi
    4025
    Versione Office
    2013
    Likes ricevuti
    1228
    Likes dati
    923
    Citazione Originariamente Scritto da Powerwin Visualizza Messaggio
    Dopo 10 giorni senza alcun intervento direi che il crossposting decada, mi vedo costretto a cercare aiuto altrove, resta salvo che il forum è decisamente interessante
    Ciao Powerwin,
    sinceramente la tua domanda mi era sfuggita... :186:

    Comunque, per ottenere più facilmente delle risposte è sempre buona norma allegare il file (o uno simile) per evitare che chi volesse aiutarti demorda solo per non doversi ricreare il file da zero.

    Se vuoi postare su altri forum... per me va bene (visto che non hai ottenuto risposte e che hai comunque avvisato.... anche se l'ultima parola spetterebbe comunque a Gerardo).

    "Sono le persone che nessuno immagina che possano fare certe cose, quelle che fanno cose che nessuno può immaginare."

  4. #4
    L'avatar di Powerwin
    Clicca e Apri
    Data Registrazione
    Mar 2016
    Località
    Milano
    Messaggi
    1404
    Versione Office
    2016 - 2010
    Likes ricevuti
    194
    Likes dati
    71
    Citazione Originariamente Scritto da cromagno Visualizza Messaggio
    Ciao Powerwin,
    sinceramente la tua domanda mi era sfuggita... :186:

    Comunque, per ottenere più facilmente delle risposte è sempre buona norma allegare il file (o uno simile) per evitare che chi volesse aiutarti demorda solo per non doversi ricreare il file da zero.
    Il file posso anche postarlo ma non contiene dati tanto il problema non è legato ai dati ma al raggruppamento di colonne con un determinato ID o righe con un determinato nome/parametro

    Citazione Originariamente Scritto da cromagno Visualizza Messaggio
    Se vuoi postare su altri forum... per me va bene (visto che non hai ottenuto risposte e che hai comunque avvisato.... anche se l'ultima parola spetterebbe comunque a Gerardo).
    Aspetterò il parere di Gerardo in merito a postare altrove :43:

  5. #5
    L'avatar di patel
    Clicca e Apri
    Data Registrazione
    Mar 2016
    Località
    Livorno
    Età
    72
    Messaggi
    1115
    Versione Office
    2010
    Likes ricevuti
    143
    Likes dati
    1
    sugli altri forum le persone che rispondono sono le stesse e se non alleghi il file e non spieghi più chiaramente otterrai lo stesso risultato.

  6. #6
    L'avatar di Powerwin
    Clicca e Apri
    Data Registrazione
    Mar 2016
    Località
    Milano
    Messaggi
    1404
    Versione Office
    2016 - 2010
    Likes ricevuti
    194
    Likes dati
    71
    Citazione Originariamente Scritto da patel Visualizza Messaggio
    sugli altri forum le persone che rispondono sono le stesse e se non alleghi il file e non spieghi più chiaramente otterrai lo stesso risultato.
    Vi posto il file, per i chiarimenti dovete chiedere voi cosa non vi è chiaro
    File Allegati File Allegati

  7. #7
    L'avatar di Marius44
    Clicca e Apri
    Data Registrazione
    Sep 2015
    Località
    Catania
    Età
    73
    Messaggi
    3222
    Versione Office
    Excel2010
    Likes ricevuti
    627
    Likes dati
    155
    Salve a tutti
    Due premesse:
    Il foglio sul quale applicare la macro NON DEVE avere già raggruppamenti (altrimenti li sovrascrive)
    La macro è valida fino alla colonna Z (se la colonna ha doppie lettere, la macro non funziona).

    Se ho capito quello che vuoi fare prova con questa macro (da associare ad un pulsante NON ActiveX)
    Codice: 
    Option Explicit
    Sub Raggruppa()
    Dim ur As Long, i As Long, j As Long
    Dim aa As String, bb As String, righe As String, colonne As String, let1 As String, let2 As String
    'righe
    ur = Cells(Rows.Count, 1).End(xlUp).Row
    For i = 2 To ur
        aa = Cells(i, 1).Text
        For j = i + 1 To ur + 1
            bb = Cells(j, 1).Text
            If aa <> bb Or bb = "" Then
                righe = i & ":" & j - 2
                Rows(righe).Rows.Group
                i = j - 1: c = 0: GoTo 1
            End If
        Next j
    1 Next i
    'colonne
    ur = Cells(1, Columns.Count).End(xlToLeft).Column
    For i = 2 To ur
        aa = Left(Cells(1, i), 1)
        For j = i + 1 To ur + 1
            bb = Left(Cells(1, j), 1)
            If aa <> bb Or bb = "" Then
                let1 = Chr(i + 64): let2 = Chr(j + 62)
                colonne = let1 & ":" & let2
                Columns(colonne).Columns.Group
                i = j - 1: c = 0: GoTo 2
            End If
        Next j
    2 Next i
    End Sub
    Fai sapere se va bene. Ciao,
    Mario

  8. #8
    L'avatar di Powerwin
    Clicca e Apri
    Data Registrazione
    Mar 2016
    Località
    Milano
    Messaggi
    1404
    Versione Office
    2016 - 2010
    Likes ricevuti
    194
    Likes dati
    71
    Intanto grazie a Marius per la risposta e per aver postato il codice, confermo che il foglio non avrà già raggruppamenti, l'unico problema sarà il numero di colonne perchè non so a priori se andrò oltre la colonna Z, ma è un gran passo avanti.
    Ora cercherò di capire il codice e lo applicherò poi vi farò sapere.
    Grazie ancora


    Aggiungo che l'ho provato, hai capito benissimo il problema Marius, ho definito la variabile c come Long visto che l'Option Explicit richiede che le variabili siano definite, e il codice funziona, ora devo capire bene come funziona per apportare le dovute modifiche e per raggruppare le colonne lasciando visibile la prima e non l'ultima appartenente al gruppo.

    :255:grazie

  9. #9

    L'avatar di cromagno
    Clicca e Apri
    Data Registrazione
    Aug 2015
    Località
    Sardegna
    Età
    37
    Messaggi
    4025
    Versione Office
    2013
    Likes ricevuti
    1228
    Likes dati
    923
    Ciao a tutti,

    vedo che Mario (un saluto) ti ha già proposto una soluzione :246:

    Ieri avevo iniziato a creare un file che ho potuto finire solo oggi. In sostanza la logica è molto simile a quella utilizzata da Mario ma con l'uso di due matrici.

    Codice: 
    Sub Raggruppa()
    Dim uRiga As Long, uCol As Long, i As Long, CheckRighe(), CheckCol()
    Dim Posizione As Long, j As Long, Nome1 As String, Nome2 As String
    Dim RigMatr As Long, ColMatr As Long
    
    
    Application.ScreenUpdating = False
    With ActiveSheet
        .Cells.ClearOutline
        .Rows.Hidden = False
        .Columns.Hidden = False
    End With
    
    
    uRiga = Range("A" & Rows.Count).End(xlUp).Row
    uCol = Cells(1, Columns.Count).End(xlToLeft).Column
    ReDim CheckRighe(1 To uRiga - 1, 1 To 2)
    ReDim CheckCol(1 To uCol - 1, 1 To 2)
    
    
    For i = 2 To uRiga
        If Cells(i, 1).Value = Cells(i - 1, 1) Then
            RigMatr = RigMatr + 1
            Posizione = Posizione + 1
            CheckRighe(Posizione, 1) = Cells(i, 1).Row
            For j = i + 1 To uRiga + 1
                If Cells(j, 1).Value <> Cells(j - 1, 1) Then
                    CheckRighe(Posizione, 2) = Cells(j - 1, 1).Row
                    i = CheckRighe(Posizione, 2)
                    GoTo prossimoR
                End If
            Next j
        End If
    prossimoR:
    Next i
    
    
    Posizione = 0
    
    
    For i = 2 To uCol
        Nome1 = Right(Cells(1, i).Value, Len(Cells(1, i).Value) - InStr(1, Cells(1, i).Value, "_"))
        Nome2 = Right(Cells(1, i - 1).Value, Len(Cells(1, i - 1).Value) - InStr(1, Cells(1, i - 1).Value, "_"))
        If Nome1 = Nome2 Then
            ColMatr = ColMatr + 1
            Posizione = Posizione + 1
            CheckCol(Posizione, 1) = Cells(1, i).Column
            For j = i + 1 To uCol + 1
                Nome1 = Right(Cells(1, j).Value, Len(Cells(1, j).Value) - InStr(1, Cells(1, j).Value, "_"))
                Nome2 = Right(Cells(1, j - 1).Value, Len(Cells(1, j - 1).Value) - InStr(1, Cells(1, j - 1).Value, "_"))
                If Nome1 <> Nome2 Then
                    CheckCol(Posizione, 2) = Cells(1, j - 1).Column
                    i = CheckCol(Posizione, 2)
                    GoTo prossimoC
                End If
            Next j
        End If
    prossimoC:
    Next i
    
    
    For i = 1 To RigMatr
        Rows(CheckRighe(i, 1) & ":" & CheckRighe(i, 2)).Group
        Rows(CheckRighe(i, 1) & ":" & CheckRighe(i, 2)).Hidden = True
    Next i
    
    
    For i = 1 To ColMatr
        Columns(CheckCol(i, 1)).Resize(, CheckCol(i, 2) - CheckCol(i, 1) + 1).Group
        Columns(CheckCol(i, 1)).Resize(, CheckCol(i, 2) - CheckCol(i, 1) + 1).Hidden = True
    Next i
    Application.ScreenUpdating = True
    End Sub
    Per avviare il codice puoi fare "doppio click" sopra la cella A1.
    Non avevo capito se i gruppi delle righe e delle colonne fossero sempre uguali.... quindi li ho trattati separatamente.

    Ti allego il file...
    File Allegati File Allegati

    "Sono le persone che nessuno immagina che possano fare certe cose, quelle che fanno cose che nessuno può immaginare."

  10. I seguenti utenti hanno dato un "Like"


  11. #10
    L'avatar di Powerwin
    Clicca e Apri
    Data Registrazione
    Mar 2016
    Località
    Milano
    Messaggi
    1404
    Versione Office
    2016 - 2010
    Likes ricevuti
    194
    Likes dati
    71
    Grazie mille anche a te Cromagno, proverò sicuramente anche questa soluzione :246: poi a lavoro ultimato posterò il file ultimato per aiutare chiunque si possa trovare di fronte ad un problema simile.

    Rispondo direttamente in questo messaggio, la soluzione di Cromagno è PERFETTA!!!, mi risolve anche il problema delle colonne oltre la AA, ora devo solo capire bene come funziona il tuo codice. :255::255: Grazie di nuovo a tutti (Marius44 e Cromagno in particolare per l'aiuto e Gerardo per aver messo a disposizione il Forum)

  12. #11
    L'avatar di Powerwin
    Clicca e Apri
    Data Registrazione
    Mar 2016
    Località
    Milano
    Messaggi
    1404
    Versione Office
    2016 - 2010
    Likes ricevuti
    194
    Likes dati
    71
    Un solo piccolo chiarimento sul codice, se volessi utilizzare il primo carattere di ogni stringa per raggruppare le colonne devo agire sul calcolo delle 2 variabili Nome1 e Nome2, andando a confrontare se i primi caratteri di ogni stringa sono uguali/differenti...corretto?

  13. #12

    L'avatar di cromagno
    Clicca e Apri
    Data Registrazione
    Aug 2015
    Località
    Sardegna
    Età
    37
    Messaggi
    4025
    Versione Office
    2013
    Likes ricevuti
    1228
    Likes dati
    923
    Citazione Originariamente Scritto da Powerwin Visualizza Messaggio
    Un solo piccolo chiarimento sul codice, se volessi utilizzare il primo carattere di ogni stringa per raggruppare le colonne devo agire sul calcolo delle 2 variabili Nome1 e Nome2, andando a confrontate se i primi caratteri di ogni stringa sono uguali/differenti...corretto?
    Ciao,
    si, le variabili "Nome1" e "Nome2" le ho utilizzate proprio per il confronto delle stringhe.

    "Sono le persone che nessuno immagina che possano fare certe cose, quelle che fanno cose che nessuno può immaginare."

  14. #13
    L'avatar di Powerwin
    Clicca e Apri
    Data Registrazione
    Mar 2016
    Località
    Milano
    Messaggi
    1404
    Versione Office
    2016 - 2010
    Likes ricevuti
    194
    Likes dati
    71
    Citazione Originariamente Scritto da cromagno Visualizza Messaggio
    Ciao,
    si, le variabili "Nome1" e "Nome2" le ho utilizzate proprio per il confronto delle stringhe.
    :286: grazie ancora

  15. #14
    L'avatar di Powerwin
    Clicca e Apri
    Data Registrazione
    Mar 2016
    Località
    Milano
    Messaggi
    1404
    Versione Office
    2016 - 2010
    Likes ricevuti
    194
    Likes dati
    71
    Citazione Originariamente Scritto da Powerwin Visualizza Messaggio
    :286: grazie ancora
    Posto la soluzione finale adattata alla mia esigenza

    Codice: 
    Sub Raggruppa()Dim uRiga As Long, uCol As Long, i As Long, CheckRighe(), CheckCol()
    Dim Posizione As Long, j As Long, Nome1 As String, Nome2 As String
    Dim RigMatr As Long, ColMatr As Long
    
    
    Application.ScreenUpdating = False
    With ActiveSheet
        .Cells.ClearOutline
        .Rows.Hidden = False
        .Columns.Hidden = False
    End With
    
    
    uRiga = Range("A" & Rows.Count).End(xlUp).Row
    uCol = Cells(1, Columns.Count).End(xlToLeft).Column
    ReDim CheckRighe(1 To uRiga - 1, 1 To 2)
    ReDim CheckCol(1 To uCol - 1, 1 To 2)
    
    
    For i = 2 To uRiga
        If Cells(i, 1).Value = Cells(i - 1, 1) Then
            RigMatr = RigMatr + 1
            Posizione = Posizione + 1
            CheckRighe(Posizione, 1) = Cells(i, 1).Row
            For j = i + 1 To uRiga + 1
                If Cells(j, 1).Value <> Cells(j - 1, 1) Then
                    CheckRighe(Posizione, 2) = Cells(j - 1, 1).Row
                    i = CheckRighe(Posizione, 2)
                    GoTo prossimoR
                End If
            Next j
        End If
    prossimoR:
    Next i
    
    
    Posizione = 0
    
    
    For i = 2 To uCol
        Nome1 = Left(Cells(1, i).Value,1)
        Nome2 = Left(Cells(1, i - 1).Value,1)
        If Nome1 = Nome2 Then
            ColMatr = ColMatr + 1
            Posizione = Posizione + 1
            CheckCol(Posizione, 1) = Cells(1, i).Column
            For j = i + 1 To uCol + 1
                Nome1 = Left(Cells(1, j).Value,1)
                Nome2 = Left(Cells(1, j - 1).Value,1)
                If Nome1 <> Nome2 Then
                    CheckCol(Posizione, 2) = Cells(1, j - 1).Column
                    i = CheckCol(Posizione, 2)
                    GoTo prossimoC
                End If
            Next j
        End If
    prossimoC:
    Next i
    
    
    For i = 1 To RigMatr
        Rows(CheckRighe(i, 1) & ":" & CheckRighe(i, 2)).Group
        Rows(CheckRighe(i, 1) & ":" & CheckRighe(i, 2)).Hidden = True
    Next i
    
    
    For i = 1 To ColMatr
        Columns(CheckCol(i, 1)).Resize(, CheckCol(i, 2) - CheckCol(i, 1) + 1).Group
        Columns(CheckCol(i, 1)).Resize(, CheckCol(i, 2) - CheckCol(i, 1) + 1).Hidden = True
    Next i
    Application.ScreenUpdating = True End Sub
    Così facendo verifico se il primo carattere di una stringa è diverso da quello successivo.

  16. #15
    L'avatar di gabrig
    Clicca e Apri
    Data Registrazione
    Jan 2017
    Località
    Milano
    Età
    34
    Messaggi
    19
    Versione Office
    2007 - 2010
    Likes ricevuti
    3
    Likes dati
    5

    Re: [Excel 2003+VBA] Raggruppare righe e colonne

    Buondì a tutti!
    Dopo varie ricerche sono approdato a questa vecchia discussione. Vi anticipo che Excel lo uso discretamente bene ma sono a digiuno nell'ambito VBA.
    Ho un'esigenza molto simile a quella di Powerwin:
    vorrei creare una struttura in automatico ma per quanto riguarda le righe ho bisogno di raggrupparle in base al colore (o altra caratteristica di formattazione). Inoltre la struttura ha 4 livelli e non uno solo.
    Per quanto riguarda le colonne invece la discriminante è il valore delle celle ma le colonne devo dire sono meno importanti in quanto posso farlo manualmente essendo un numero limitato rispetto alle righe che sono migliaia.
    Allego file di esempio dove sul foglio 1 vi è la situazione iniziale e sul foglio 2 quello che vorrei ottenere.
    Spero qualcuno abbia una soluzione anche per questo problema
    Grazie a tutti per l'attenzione
    File Allegati File Allegati

  17. #16
    L'avatar di Powerwin
    Clicca e Apri
    Data Registrazione
    Mar 2016
    Località
    Milano
    Messaggi
    1404
    Versione Office
    2016 - 2010
    Likes ricevuti
    194
    Likes dati
    71

    Re: [Excel 2003+VBA] Raggruppare righe e colonne

    Ciao Gabrig, visto che sei nuovo ti suggerisco di aprire una discussione nuova in quanto non ci si accoda mai con problematiche simili, ma diverse tra loro.
    Avvisi generali e importanti, pena CHIUSURA thread e/o BAN. Il crossposting è vietato. Le richieste di "pappa pronta" sono vietate. Utilizzate i tag CODE per il codice. Leggere il Regolamento per chiarimenti PRIMA di creare nuovi thread.



  18. I seguenti utenti hanno dato un "Like"


  19. #17
    L'avatar di gabrig
    Clicca e Apri
    Data Registrazione
    Jan 2017
    Località
    Milano
    Età
    34
    Messaggi
    19
    Versione Office
    2007 - 2010
    Likes ricevuti
    3
    Likes dati
    5

    Re: [Excel 2003+VBA] Raggruppare righe e colonne

    Ok grazie! e scusate

Discussioni Simili

  1. [Risolto] Raggruppare righe e colonne in base a formattazione
    Di gabrig nel forum Domande su Excel VBA e MACRO
    Risposte: 19
    Ultimo Messaggio: 06/03/17, 15:34
  2. [Risolto] raggruppare righe
    Di marco71 nel forum Domande su Excel in generale
    Risposte: 3
    Ultimo Messaggio: 04/01/17, 16:07
  3. [EXCEL 2003] Trasporre due o più righe in una singola colonna
    Di AiaceT nel forum Domande su Excel VBA e MACRO
    Risposte: 16
    Ultimo Messaggio: 30/12/16, 00:21
  4. [Risolto] raggruppare dati di due colonne alternandoli secondo una determinata sequenza
    Di lauriciano78 nel forum Domande su Excel in generale
    Risposte: 4
    Ultimo Messaggio: 22/12/16, 21:28
  5. [EXCEL 2003] Trasporre due o più righe in una singola colonna
    Di AiaceT nel forum Domande su Excel in generale
    Risposte: 1
    Ultimo Messaggio: 16/12/16, 06:31

Permessi di Scrittura

  • Tu non puoi inviare nuove discussioni
  • Tu non puoi inviare risposte
  • Tu non puoi inviare allegati
  • Tu non puoi modificare i tuoi messaggi
  •