[VBA Excel]: funzione che restituisce array

Anonimo
2017-10-11T09:13:27+00:00

Ciao

vi spiego il problema (semplificando): devo cercare il contenuto di una cella (es.: "A") in un elenco (es.: "A","A+","B","NO","SI", "FORSE").

E pensavo di usare una function che facesse quanto sotto (non ho trovato soluzioni cercando tra i vecchi post) e che restituisse come risultato un array, ma ottengo un solo valore (in questo caso "A"). quello che vorrei ottenere è A (in una cella) e A+ in altra cella.

ps.: non sono vincolato agli array, ma è l'unica soluzione che sono riuscito a trovare.

Grazie!

Function Cerca_Corrispondenza_Livello1(Rng_cercare As Range, Rng_dove As Range)

Dim arrResults() As Variant

m = 0

For Each rCell2 In Rng_dove.Cells

    If InStr(1, LCase(rCell2), LCase(Rng_cercare)) <> 0 Then

        m = m + 1

        ReDim arrResults(1 To m)

    End If

Next rCell2

m = 0

For Each rCell2 In Rng_dove.Cells

    If InStr(1, LCase(rCell2), LCase(Rng_cercare)) <> 0 Then

        m = m + 1

        arrResults(m) = rCell2

    End If

Next rCell2

Cerca_Corrispondenza_Livello1 = arrResults

End Function

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

11 risposte

Ordina per: Più utili
  1. Anonimo
    2017-10-11T13:44:26+00:00

    Ciao Dario,

    Prova qualcosa del genere:

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

    Option Explicit

    Option Compare Text

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

    Public Function CercaCorrispondenza(CellaInteressata, _

                                                        rElencoDiConfronto)

        Dim arrParole As Variant

        Dim arrElenco As Variant

        Dim arrCorrspondenza() As Variant

        Dim i As Long, j As Long, iCtr As Long

        CercaCorrispondenza = CVErr(xlErrNA)

        arrParole = Split(CellaInteressata.Value, Space(1))

        arrElenco = Application.Transpose(rElencoDiConfronto.Value)

        For i = LBound(arrParole) To UBound(arrParole)

            For j = 1 To UBound(arrElenco)

                If arrElenco(j) = arrParole(i) Then

                    iCtr = iCtr + 1

                    ReDim Preserve arrCorrspondenza(1 To iCtr)

                    arrCorrspondenza(iCtr) = arrElenco(j)

                    Exit For

                End If

            Next j

        Next i

        With Application.Caller

            If .Columns.Count = 1 Then

                CercaCorrispondenza = Application.Transpose(arrCorrspondenza)

            Else

                CercaCorrispondenza = arrCorrspondenza

            End If

        End With

    End Function

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

    Nota che questa è una funzione matriciale e, quindi, per restituire più risultati, si deve confermarla con Ctrl+Maisc+Invio. La funzione può restituire i suoi risultati sia in modo orrizontale che verticale.

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2017-10-11T12:04:08+00:00

    Ciao Dario,

    Si esatto. Se la funzione trova qualcosa, vorrei avere come risultato tutto quello che ha trovato.

    Altre domande:

    • La ricerca deve restituire solo intere parole o, meglio,espressioni delimitate da caratteri di spazio; oppure deve resituire anche le espressioni comprese dentro espressioni più lunghe?
    • La ricerca deve tenere conto del maiuscolo o minuscolo (case sensitive) o meno?

    Quindi, dando un esempio pratico, nel caso che l'elenco di  ricerca comprendesse SI e NO  e la cella di interesse contenesse la frasa: NORMAN è simpatico, la funzione deve resituire:

    NO  

    NO e SI

    oppure nulla?

    I risultati devono essere restituiti in più celle una singola cella?

    ===

    Regards,

    Norman

    Ciao Norman,

    1. domanda: non ho capito bene cosa intendi, magari con gli esempi che faccio sotto riesco a spiegare meglio la mia necessità.
    2. domanda: no, non mi serve tener conto di maiuscolo o minuscolo.

    Riferendomi al tuo esempio (SI, NO, Norman è simpatico) la funzione non dovrebbe restituire nulla (questo attualmente 'sembra' funzioni grazie alla   InStr(1, LCase(rCell2), LCase(Rng_cercare))  ).

    dove trasformo tutto in minuscolo cosi sono sicuro di trovare tutto.

    Mi spiego meglio con altro esempio, se cerco "SI" in un range dove c'è

    "SI", "SI +", "NO" "Norman è simpatico" e "E' molto simpatico"

    vorrei trovare come risultato della funzione 

    "SI" (in una cella) e "SI +" (in altra cella).

    Se invece cercassi "Simpatico" vorrei ottenere

    "Norman è simpatico" (in una cella) e "E' molto simpatico" (in altra cella).

    Se invece cercassi "Simpa" non vorrei ottenere nulla.

    ps.: aggiungo anche che poi ho un altro pezzo di funzione che prende in considerazione lo 'split' come mi hai consigliato ieri! :D per andare a fare una ricerca piu di dettaglio!

    Ancora grazie mille per la disponibilità!

    Dario

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2017-10-11T11:24:47+00:00

    Ciao Dario,

    Si esatto. Se la funzione trova qualcosa, vorrei avere come risultato tutto quello che ha trovato.

    Altre domande:

    • La ricerca deve restituire solo intere parole o, meglio,espressioni delimitate da caratteri di spazio; oppure deve resituire anche le espressioni comprese dentro espressioni più lunghe?
    • La ricerca deve tenere conto del maiuscolo o minuscolo (case sensitive) o meno?

    Quindi, dando un esempio pratico, nel caso che l'elenco di  ricerca comprendesse SI e NO  e la cella di interesse contenesse la frasa: NORMAN è simpatico, la funzione deve resituire:

    NO  

    NO e SI

    oppure nulla?

    I risultati devono essere restituiti in più celle una singola cella?

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2017-10-11T10:36:44+00:00

    Si esatto. Se la funzione trova qualcosa, vorrei avere come risultato tutto quello che ha trovato.

    Grazie Norman

    La risposta è stata utile?

    0 commenti Nessun commento
  5. Anonimo
    2017-10-11T10:06:38+00:00

    Ciao Dario,

    vi spiego il problema (semplificando): devo cercare il contenuto di una cella (es.: "A") in un elenco (es.: "A","A+","B","NO","SI", "FORSE").

    [...]

    La tua intenzione non mi risulta chiara.

    Forse il compito sia quello di restituire la parola o parole che eventualmente siano comprese in un dato elenco?

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento