Raggruppamento dati da una matrice

Anonimo
2017-06-24T10:03:33+00:00

Buongiorno.

Ho la necessita che da una matrice di dati in un Foglio vorrei raggruppare in modalità diversi i dati in due altri Fogli. Non sono riuscito a farlo con le Funzioni presenti in Excel e chiedo perciò che qualcuno possa gentilmente aiutarmi con un codice.

Allego una immagine della Matrice di base e del tipo di raggruppamento che vorrei. Le variabili sono nella colonna C della matrice di base e possono assumere valore di "L" , di "P" o nessun valore. Il raggruppamento vorrei avvenisse secondo lo schema.

Spero di essere riuscito a spiegarmi bene.

Grazie per l'aiuto.

Giuseppe

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

Anonimo
2017-06-24T15:39:06+00:00

Non vorrei avere inteso male ma, dall'esempio riportato la soluzione con formula dovrebbe essere semplice.

Mantenendo i riferimenti dell'esempio, in Foglio2

in A1: digitare L o P

In A2: =SE(RIF.COLONNA()<=CONTA.SE(Foglio1!$C$4:$C$100;$A$1);$A$1;"")

in **A3: =SE.ERRORE(INDICE(Foglio1!$A$4:$A$100;PICCOLO(SE(Foglio1!$C$4:$C$100=$A$1;RIF.RIGA($C$4:$C$100)-3;"");RIF.COLONNA()));"")**quest'ultima formula è matriciale, una volta copiata nella barra delle formule va confermata con Ctrl+Miusc+Invio

entrambe le formule vanno trascinate a destra a volontà.

Ovviamente il Foglio3 è l'esatta copia del Foglio2 con l'eccezione di inserire in A1 la lettera alternativa (L o P).

PS: applicare poi questa soluzione al file indicato mi sembra piuttosto intuitiva.

La risposta è stata utile?

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

Risposta accettata dall'autore della domanda

Anonimo
2017-07-01T14:21:09+00:00

in B5: =SE.ERRORE(INDICE('WPsL&P'!$C$7:$C$31;PICCOLO(SE('WPsL&P'!$D$7:$D$31='WPsL&P'!$A$2;RIF.RIGA($D$7:$D$31)-6;"");RIF.COLONNA(A1)));"")

in B8: =SE.ERRORE(INDICE('WPsL&P'!$C$7:$C$31;PICCOLO(SE('WPsL&P'!$D$7:$D$31='WPsL&P'!$A$3;RIF.RIGA($D$7:$D$31)-6;"");RIF.COLONNA(A1)));"")

entrambe matriciali, da trascinare a destra.

La risposta è stata utile?

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2017-06-25T16:03:26+00:00

Certo che se nel tuo file cambi le coordinate dei dati rispetto all'esempio iniziale occorre ovviamente fare lo stesso nella formula.

Vediamo se ho capito:

=SE.ERRORE(INDICE('WPsL&P'!$A$7:$A$31;PICCOLO(SE('WPsL&P'!$D$7:$D$31='WPsL&P'!$A$3;RIF.RIGA($D$7:$D$31)-6;"");RIF.COLONNA(A1)));"") matriciale

PS: le modifiche sono in grassetto e riguardano unicamente una riallocazione dei riferimenti di ricerca.

Fai sapere.

PS: considerato poi che i dati in colonna A non sono altro che una successione di numeri naturali con ragione 1, la formula si potrebbe accorciare in:

=SE.ERRORE(PICCOLO(SE('WPsL&P'!$D$7:$D$31='WPsL&P'!$A$3;RIF.RIGA($D$7:$D$31)-6;"");RIF.COLONNA(A1));"") sempre matriciale.

provala e vedi se fa ciò che ti aspetti.

La risposta è stata utile?

0 commenti Nessun commento

12 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2017-06-24T13:04:12+00:00

    Grazie Norman!!

    Ho provato il tuo codice. Ho una osservazione:

    Ogni volta che modifico le variabili "L" o "P" nel Foglio 1 ed eseguo il codice vengono creati 2 nuovi Fogli nei quali viene eseguito il raggruppamento. Io ho la necessità di raggruppare "L" sempre nello stesso Foglio2 e "P" sempre nello stesso Foglio3 e sempre nella stessa posizione (Riga) a partire ad esempio da B5 del Foglio2 e C6 del Foglio3.

    Sarebbe meglio avere il codice in due parti eseguibili indipendentemente: Uno per il raggruppamento di L e uno per il raggruppamento di P.

    Grazie ancora Norman,

    Giuseppe

    Ti mando il File così forse riesco a farmi capire meglio. Nel Foglio2 ho evidenziato in giallo dove voglio il raggruppamento delle P. Il raggruppamento delle L Poiché per ogni colonna c'è una sola L mi è stato facile risolvere come puoi vedere tu stesso.

    Grazie

    https://www.dropbox.com/s/29tdk5d3183eagp/WORK%20PLAN.xlsm?dl=0

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2017-06-24T11:36:38+00:00

    Ciao Giuseppe,

    Buongiorno.

    Ho la necessita che da una matrice di dati in un Foglio vorrei raggruppare in modalità diversi i dati in due altri Fogli. Non sono riuscito a farlo con le Funzioni presenti in Excel e chiedo perciò che qualcuno possa gentilmente aiutarmi con un codice.

    Allego una immagine della Matrice di base e del tipo di raggruppamento che vorrei. Le variabili sono nella colonna C della matrice di base e possono assumere valore di "L" , di "P" o nessun valore. Il raggruppamento vorrei avvenisse secondo lo schema.

    • Alt+F11 per aprire l'editor di VBA
    • Alt+IM per inserire un nuovo modulo di codice
    • Nel nuovo modulo vuoto, incolla il seguente codice:

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

    Option Explicit

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

    Public Sub Tester()

        Dim WB As Workbook

        Dim srcSH As Worksheet, destSH As Worksheet

        Dim srcRng As Range, destRng As Range

        Dim arrIn As Variant, arrUnique As Variant, arrOut() As Variant

        Dim LRow As Long

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

        Dim CalcMode As Long

        Const sFoglio As String = "Foglio1"                 '<<=== Modifica

        Const iRigaIntestazioni  As Long = 3                '<<=== Modifica

        Set WB = ThisWorkbook

        Set srcSH = WB.Sheets(sFoglio)

        With srcSH

            LRow = LastRow(srcSH, .Columns("A:A"))

            Set srcRng = .Range("A" & iRigaIntestazioni + 1) _

                                        .Resize(LRow - iRigaIntestazioni, 3)

        End With

        arrIn = srcRng.Value

        arrUnique = SortedUniqueList(srcRng.Columns(3).Value)

        On Error GoTo XIT

        With Application

            CalcMode = .Calculation

            .Calculation = xlCalculationManual

            .ScreenUpdating = False

        End With

        For i = 1 To UBound(arrUnique)

            k = 0

            For j = 1 To UBound(arrIn)

                If arrIn(j, 3) = arrUnique(i) Then

                    k = k + 1

                    ReDim Preserve arrOut(1 To 2, 1 To k)

                    arrOut(1, k) = arrIn(j, 3)

                    arrOut(2, k) = arrIn(j, 1)

                End If

            Next j

            With WB

                Set destSH = .Sheets.Add(After:=.Sheets(.Sheets.Count))

            End With

            Set destRng = destSH.Range("A2").Resize(2, UBound(arrOut, 2))

            With destRng

                .Value = arrOut

                .HorizontalAlignment = xlCenter

                .VerticalAlignment = xlCenter

            End With

            Erase arrOut

        Next i

            Call MsgBox( _

                 Prompt:="Finito!", _

                 Buttons:=vbInformation, _

                 Title:="REPORT")

    XIT:

        With Application

            .Calculation = CalcMode

            .ScreenUpdating = True

        End With

    End Sub

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

    Public Function LastRow(SH As Worksheet, _

                            Optional Rng As Range, _

                            Optional minRow As Long = 1)

        If Rng Is Nothing Then

            Set Rng = SH.Cells

        End If

        On Error Resume Next

        LastRow = Rng.Find(What:="*", _

                           After:=Rng.Cells(1), _

                           Lookat:=xlPart, _

                           LookIn:=xlFormulas, _

                           SearchOrder:=xlByRows, _

                           SearchDirection:=xlPrevious, _

                           MatchCase:=False).Row

        On Error GoTo 0

        If LastRow < minRow Then

            LastRow = minRow

        End If

    End Function

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

    Public Function SortedUniqueList(V As Variant)

        Dim oSortedUniqueList As Object

        Dim arrOut() As Variant

        Dim sStr As String

        Dim i As Long

        Set oSortedUniqueList = CreateObject("System.Collections.Sortedlist")

        With oSortedUniqueList

            For i = LBound(V) To UBound(V, 1)

                sStr = V(i, 1)

                If Not sStr = vbNullString Then

                    If Not .ContainsKey(sStr) Then

                        .Add Key:=sStr, Value:=i

                    End If

                End If

            Next i

            ReDim arrOut(1 To .Count)

            For i = 0 To .Count - 1

                arrOut(i + 1) = .GetKey(i)

            Next i

        End With

        SortedUniqueList = arrOut

    End Function

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

    • Alt+Q per chiudere l'editor di VBA e tornare a Excel
    • Salva il file con l’estensione xlsm
    • Alt+F8 per aprire  la finestra di gestione delle macro
    • Seleziona Tester | Esegui

    Potresti scaricare il mio file di prova Giuseppe20160624.xlsm

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento