Creare un array da un range e ordinarlo per il primo valore

Anonimo
2020-04-12T17:41:08+00:00

Ciao a tutti 

ho il seguente range (tab a sinistra) dal quale vorrei ottenere un array ordinato per nominativo (tab a destra)

qualche suggerimento?

grazie e buon tutto

domenico

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
2020-04-13T00:05:22+00:00

Ciao Domenico,

grazie per il vostro interessamento. Probabilmente non sono stato chiaro nell'esposizione del problema.

Quando ho parlato di array, intendevo l'utilizzo di un codice vba che mi restituisse un array ordinato per nominativo.

Tale array sarà poi sfruttato sempre tramite codice per ulteriori necessità.

Es:

sub testo

....

mArr=range ("B4:F7")

...ordinamento secondo col B ????

Prova la seguente UDF Foo:

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

Option Explicit

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

Public Function Foo(R) As Variant

    Dim arrIn As Variant

    Dim UB As Long

    arrIn = R.Value

    UB = UBound(arrIn)

    QuickSort arrIn, 1, 1, UB, True

    Foo = arrIn

End Function

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

Public Sub QuickSort(SortArray, col, L, R, bAscending)

'\ TomOgilvy: http://goo.gl/ninpZW

'Originally Posted by Jim Rech 10/20/98 Excel.Programming

'Modified to sort on first column of a two dimensional array

'Modified to handle a second dimension greater than 1 (or zero)

'Modified to do Ascending or Descending

    Dim i, j, X, Y, mm

    i = L

    j = R

    X = SortArray((L + R) / 2, col)

    If bAscending Then

        While (i <= j)

            While (SortArray(i, col) < X And i < R)

                i = i + 1

            Wend

            While (X < SortArray(j, col) And j > L)

                j = j - 1

            Wend

            If (i <= j) Then

                For mm = LBound(SortArray, 2) To UBound(SortArray, 2)

                    Y = SortArray(i, mm)

                    SortArray(i, mm) = SortArray(j, mm)

                    SortArray(j, mm) = Y

                Next mm

                i = i + 1

                j = j - 1

            End If

        Wend

    Else

        While (i <= j)

            While (SortArray(i, col) > X And i < R)

                i = i + 1

            Wend

            While (X > SortArray(j, col) And j > L)

                j = j - 1

            Wend

            If (i <= j) Then

                For mm = LBound(SortArray, 2) To UBound(SortArray, 2)

                    Y = SortArray(i, mm)

                    SortArray(i, mm) = SortArray(j, mm)

                    SortArray(j, mm) = Y

                Next mm

                i = i + 1

                j = j - 1

            End If

        Wend

    End If

    If (L < j) Then Call QuickSort(SortArray, col, L, j, bAscending)

    If (i < R) Then Call QuickSort(SortArray, col, i, R, bAscending)

End Sub

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

La UDF Foo rappresenta una funzione matriciale che deve essere confermata con CTRL+MAISC+INVIO

Potresti scaricare il mio file di prova Domenico20200413.xlsm

===

Regards,

Norman

La risposta è stata utile?

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

4 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2020-04-13T07:49:03+00:00

    ciao Norman

    grazie, ho risolto in base alle tue indicazioni. In realtà a me non serviva una udf ma un semplice codice che resiìtituisse un array ordinato.

    Probabilmente sono io che ho portato fuori strada.

    Pertanto ho eliminato la function Foo ed ho passato i dati dal mio codice al tuo QSort che è quello che non riuscivo a fare.....

    carissimi saluti

    domenico

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2020-04-12T21:15:45+00:00

    ciao a tutti

    grazie per il vostro interessamento. Probabilmente non sono stato chiaro nell'esposizione del problema.

    Quando ho parlato di array, intendevo l'utilizzo di un codice vba che mi restituisse un array ordinato per nominativo.

    Tale array sarà poi sfruttato sempre tramite codice per ulteriori necessità.

    Es:

    sub testo

    ....

    mArr=range ("B4:F7")

    ...ordinamento secondo col B ????

    grazie e saluti

    domenico

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2020-04-12T19:29:39+00:00

    Buonasera

    la formula proposta da Daniele funziona solo sul 365..

    Per versioni precedenti in I4 da attivare con CTRL+SHIFT+INVIO e trascinare a destra e in basso

    =SE.ERRORE(INDICE(B$4:B$10;CONFRONTA(0;CONTA.SE($B$4:$B$10;"<"&$B$4:$B$10)-SOMMA(CONTA.SE($B$4:$B$10;$I$3:$I3));0));"")

    P.S. considera che la formula gestisce le celle vuote ed estrae la lista univoca se dovessi avere dei duplicati da portare in elenco bisogna percorrere una strada diversa

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2020-04-12T17:50:16+00:00

    Ciao Domenico,

    sono Daniele un consulente indipendente,

    non si vede la riga, suppongo che sia la riga numero 4, nel caso usa questa formula nel range I4

    =DATI.ORDINA(C4:G7;1;1;FALSO)
    

    Esempio:

    https://1drv.ms/x/s!AmEDljrOgi7E6R4AKUF2z0Y4lEh...

    Saluti,

    Daniele

    La risposta è stata utile?

    0 commenti Nessun commento