Condividi tramite

Cerca e restituisci piu' valori sulla stessa riga

Anonimo
2013-05-18T20:06:02+00:00

Ciao a tutti,

utilizzo una funzione trovata sulla rete che cerca e restituisce piu' valori concatenati sulla stessa riga.

Ho fatto una prova su un pentium 4 e dopo circa 2 ore ho ottenuto il risultato atteso.

Vi chiedo se e' possibile velocizzare i risultati ottenuti da parte della function --> vedi foglio "output".

Grazie a tutti,

A.

https://skydrive.live.com/redir.aspx?cid=dd405b0d5a6097c5&resid=DD405B0D5A6097C5!127&parid=root

file: Cerca_Concatena_UDF

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

  1. Anonimo
    2013-05-19T15:23:33+00:00

    Ciao a tutti,

    utilizzo una funzione trovata sulla rete che cerca e restituisce piu' valori concatenati sulla stessa riga.

    Ho fatto una prova su un pentium 4 e dopo circa 2 ore ho ottenuto il risultato atteso.

    Vi chiedo se e' possibile velocizzare i risultati ottenuti da parte della function --> vedi foglio "output".

    Grazie a tutti,

    A.

    Ciao Antonino69,

    dal foglio allegato non riesco a vedere come utilizzi la funzione, anche se credo di aver compreso le tue necessità.

    La causa principale della lentezza della tua funzione, è da imputare ai continui accessi al foglio di lavoro da parte del codice VBA. Molto meglio caricare tutti i dati che servono in memoria e lavorare su questi. E' molto più veloce!

    La tua funzione di ricerca potrebbe, perciò, essere scritta così:


    Function CercaVertAndyCap(rngDove As Range, vbValore As Variant) As Variant

    ' ATTENZIONE:

    ' rngDove è un range composto da due colonne che contengono rispettivamente:

    '   la prima   i valori sui quali effettuare la ricerca

    '   la seconda i valori da concatenare

    ' ho tralasciato il parametro colonna (in questo esempio, in quanto superfluo)

    ' la funzione va richiamata così: =CercaVertAndyCap(input!$A$2:$B$2504;output!A5)

    '

    Dim vbTabella As Variant

    Dim sRisultato As String

    Dim i As Long

    vbTabella = rngDove.Value

    For i = 1 To UBound(vbTabella)

    If (vbValore = vbTabella(i, 1)) Then sRisultato = sRisultato & vbTabella(i, 2) & "; "

    Next

    If (Len(sRisultato) > 0) Then

    CercaVertAndyCap = Mid(sRisultato, 1, Len(sRisultato) - 2)

    Else

    CercaVertAndyCap = CVErr(xlErrNA)

    End If

    End Function


    Attenzione però:

    • trattandosi di intervalli di dati abbastanza grandi, se la copi/incolli per 25.000 righe i tempi di calcolo si allungheranno proporzionalmente, anche se complessivamente saranno di molto inferiori alle tue due ore.

    Sempre nell'ottica di ridurre ulteriormente i tempi di esecuzione, un approccio diverso, può essere quello di utilizzare una sub in luogo della function:


    Sub ConcatenaStatico()

    Dim avResult() As Variant

    Dim vbTabella As Variant, vbValoriDaRicercare As Variant

    Dim sRisultato As String

    Dim lInd1 As Long, lInd2 As Long, lDim1 As Long, lDim2 As Long

    '---------- carica in memoria le prime due colonne del foglio input (valori da cercare/concatenare)

    With Sheets("input").UsedRange

    vbTabella = .Resize(.Rows.Count, 2).Value

    End With

    lDim1 = UBound(vbTabella)

    '---------- carica in memoria le prima colonna del foglio output (valori da ricercare)

    With Sheets("output").UsedRange

    vbValoriDaRicercare = .Resize(.Rows.Count, 1).Value

    End With

    '---------- dimensiona il risultato

    lDim2 = UBound(vbValoriDaRicercare)

    ReDim avResult(1 To lDim2)

    '---------- la prima riga contiene l'intestazione, perciò la salto

    For lInd1 = 2 To lDim2

    sRisultato = vbNullString

    For lInd2 = 2 To lDim1

    If (vbValoriDaRicercare(lInd1, 1) = vbTabella(lInd2, 1)) Then

    sRisultato = sRisultato & vbTabella(lInd2, 2) & "; "

    End If

    Next

    If (Len(sRisultato) > 0) Then

    avResult(lInd1) = Mid(sRisultato, 1, Len(sRisultato) - 2)

    Else

    avResult(lInd1) = CVErr(xlErrNA)

    End If

    Next

    '---------- incolla il risultato nella colonna 5 del foglio 'output'

    Sheets("output").Cells(1, 5).Resize(lDim2, 1).Value = WorksheetFunction.Transpose(avResult)

    End Sub


    Facendo così, il tempo si riduce drasticamente a meno di 1/2 minuto.

    Un saluto,

    Andrea.

    La risposta è stata utile?

    0 commenti Nessun commento

3 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2014-04-09T08:17:08+00:00

    Ciao Antonino,

    ti confesso che non ho guardato con attenzione come sono strutturate le tue tabelle, forse l'utilizzo di dati ordinati e/o raggruppati, se questo è possibile, potrebbe ulteriormente ottimizzare i tempi.

    Ti ringrazio per il riscontro.

    Un saluto anche a te,

    Andrea

    Ciao,

    utilizzo da tempo la function "CercaVertAndyCap" senza nessun problema.

    Avendo intenzione di passare ad una formula che faccia lo stesso lavoro della "function" desideravo sapere  se e' possibile apportare miglioramenti significativi alla formula (colonna E) che è presente nel file condiviso.

    Ringrazio tutti quelli che volessero darmi un loro contributo.

    Saluti,

    A.

    nota: i dati su cui lavoro non sono mai ordinati e raggruppati

    https://skydrive.live.com/redir.aspx?cid=dd405b0d5a6097c5&resid=DD405B0D5A6097C5!127&parid=root

    file: Cerca_Concatena_Formula

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2013-05-20T07:36:30+00:00

    Ciao AndyCap64,

    ho provato sia la function e la sub sul pc dell'ufficio.

    I risultati di calcolo per la function si aggirano nell'ordine dei 5 minuti su circa 25.000 righe,

    invece per la sub stiamo sotto il 1/2 minuto.

    Ringraziandoti per la tua disponibilità e il tempo impiegato,

    Ti saluto e alla prossima.

    A.

    Ciao Antonino,

    ti confesso che non ho guardato con attenzione come sono strutturate le tue tabelle, forse l'utilizzo di dati ordinati e/o raggruppati, se questo è possibile, potrebbe ulteriormente ottimizzare i tempi.

    Ti ringrazio per il riscontro.

    Un saluto anche a te,

    Andrea

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2013-05-20T07:06:03+00:00

    Ciao AndyCap64,

    ho provato sia la function e la sub sul pc dell'ufficio.

    I risultati di calcolo per la function si aggirano nell'ordine dei 5 minuti su circa 25.000 righe,

    invece per la sub stiamo sotto il 1/2 minuto.

    Ringraziandoti per la tua disponibilità e il tempo impiegato,

    Ti saluto e alla prossima.

    A.

    La risposta è stata utile?

    0 commenti Nessun commento