Risultati da 1 a 13 di 13

Discussione: funzione estrai nomi



  1. #1
    L'avatar di mb63
    Clicca e Apri
    Data Registrazione
    Nov 2015
    Località
    Torino
    Età
    54
    Messaggi
    484
    Versione Office
    2007/10/13 w10
    Likes ricevuti
    18
    Likes dati
    94

    funzione estrai nomi

    Buongiorno

    in un post di prova del forum è stata inserita questa funzione


    Codice: 
    Public Function EstraiNomi(Ats As Range, Rng As Range) As String
    Dim cllNms As New Collection
    Dim ElencoNomi As String
    Dim cell As Range
    On Error Resume Next
        For Each cell In Rng
            If cell.Value = Ats Then
                cllNms.Add cell.Offset(, 1).Value, Key:=cell.Offset(, 1).Value
                ElencoNomi = ElencoNomi & cllNms.Item(cllNms.Count) & "; "
            End If
        Next
    On Error GoTo 0
    EstraiNomi = Left(ElencoNomi, Len(ElencoNomi) - 2)
    End Function
    gentilmente qualcuno potrebbe postare un file per spiegare l'impego di questa funzione mi sembra che dica:" se trovi una cella con Ats fai.... " ma ...


    Grazie
    Ultima modifica fatta da:cromagno; 01/03/16 alle 17:22 Motivo: Corretto codice...

  2. #2

    L'avatar di Rubik72
    Clicca e Apri
    Data Registrazione
    Dec 2015
    Località
    Cosenza
    Età
    45
    Messaggi
    2808
    Versione Office
    Excel 2013
    Likes ricevuti
    1020
    Likes dati
    979
    La funzione restituisce i valori della seconda colonna quando trova il valore ricercato nella prima colonna
    File Allegati File Allegati

  3. #3
    L'avatar di mb63
    Clicca e Apri
    Data Registrazione
    Nov 2015
    Località
    Torino
    Età
    54
    Messaggi
    484
    Versione Office
    2007/10/13 w10
    Likes ricevuti
    18
    Likes dati
    94
    GRazie 10000000000 rubik72

    alla prossima

  4. #4

    L'avatar di scossa
    Clicca e Apri
    Data Registrazione
    Jul 2015
    Località
    Verona Provincia
    Età
    57
    Messaggi
    1017
    Versione Office
    .
    Likes ricevuti
    366
    Likes dati
    0
    Ciao,

    quella udf, secondo me, è sbagliata: l'istruzione
    Codice: 
    cllNms.Add cell.Offset(, 1).Value, Key:=cell.Offset(, 1).Value
    se i valori di cell.Offset(, 1) fossero numeri verrebbe restituito un errore, quindi dovresti usare
    Codice: 
    cllNms.Add cell.Offset(, 1).Value, Key:=CStr(cell.Offset(, 1).Value)
    Inoltre anche correggendo la chiave, in caso di chiave duplicata non avresti il giusto risultato poiché l'istruzione
    Codice: 
    ElencoNomi = ElencoNomi & cllNms.Item(cllNms.Count) & "; "
    accoderebbe a ElencoNomi l'ultimo item della collection.

    Lascio il compito di correggere il codice a chi ha voglia di provarci.
    Bye!
    scossa
    scossa's web site
    ___
    Se tu hai una mela, e io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)

  5. #5

    L'avatar di Rubik72
    Clicca e Apri
    Data Registrazione
    Dec 2015
    Località
    Cosenza
    Età
    45
    Messaggi
    2808
    Versione Office
    Excel 2013
    Likes ricevuti
    1020
    Likes dati
    979
    provo io:
    Codice: 
    Public Function EstraiNomi(Ats As Range, Rng As Range) As String
    Dim cllNms As New Collection
    Dim ElencoNomi As String
    Dim cell As Range
    Dim Nome As Variant
    
    
    On Error Resume Next
        For Each cell In Rng
            If cell.Value = Ats Then
                cllNms.Add cell.Offset(, 1).Value, Key:=cell.Offset(, 1).Value
            End If
        Next
    On Error GoTo 0
    For Each Nome In cllNms
        ElencoNomi = ElencoNomi & Nome & "; "
    Next
    EstraiNomi = Left(ElencoNomi, Len(ElencoNomi) - 2)
    End Function

  6. #6

    L'avatar di cromagno
    Clicca e Apri
    Data Registrazione
    Aug 2015
    Località
    Sardegna
    Età
    37
    Messaggi
    4018
    Versione Office
    2013
    Likes ricevuti
    1225
    Likes dati
    923
    Ciao a tutti,
    secondo me ci sarebbe un altro "errore" nel codice...
    Mi spiego:

    Se la funzione deve confrontare un solo valore (come nell'esempio proposto da Rubik) allora tutto ok.
    Ma a questo punto non ha senso dichiarare la variabile "Ats" come range... basterebbe dichiararla come stringa, essendo un solo valore.

    Quindi mi viene da pensare che in realtà la funzione sia stata creata per trovare le corrispondenze in un elenco con un range di valori.
    In questo caso, nel file di esempio di Rubik, se utilizziamo la funzione in questo modo:

    =EstraiNomi(
    A1:A2;A1:A50)

    il risultato non sarebbe assolutamente quello che ci aspetteremmo.

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

  7. #7

    L'avatar di scossa
    Clicca e Apri
    Data Registrazione
    Jul 2015
    Località
    Verona Provincia
    Età
    57
    Messaggi
    1017
    Versione Office
    .
    Likes ricevuti
    366
    Likes dati
    0
    Ciao,

    Citazione Originariamente Scritto da Rubik72 Visualizza Messaggio
    provo io:
    quasi bene :-) hai trascurato la mia osservazione sull'istruzione
    Codice: 
    cllNms.Add cell.Offset(, 1).Value, Key:=cell.Offset(, 1).Value
    la key deve essere una stringa quindi devi scrivere:
    Codice: 
    cllNms.Add cell.Offset(, 1).Value, Key:=CStr(cell.Offset(, 1).Value)
    Poi, volendo, il codice si potrebbe semplificare ulteriormente.
    Bye!
    scossa
    scossa's web site
    ___
    Se tu hai una mela, e io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)

  8. #8

    L'avatar di scossa
    Clicca e Apri
    Data Registrazione
    Jul 2015
    Località
    Verona Provincia
    Età
    57
    Messaggi
    1017
    Versione Office
    .
    Likes ricevuti
    366
    Likes dati
    0
    Citazione Originariamente Scritto da cromagno Visualizza Messaggio
    Ciao a tutti,
    secondo me ci sarebbe un altro "errore" nel codice...
    Ciao Tore,

    non ho visto il file di Rubik, ma solo il codice proposto nel primo post.
    Secondo me l'udf viene usata ad esempio così: =EstraiNomi(D1;A1:B5)
    dove in D1 c'è un valore che si ripete in più celle del range A1:A5 e dovrebbe restituire i relativi valori di B1:B5.
    Bye!
    scossa
    scossa's web site
    ___
    Se tu hai una mela, e io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)

  9. #9

    L'avatar di cromagno
    Clicca e Apri
    Data Registrazione
    Aug 2015
    Località
    Sardegna
    Età
    37
    Messaggi
    4018
    Versione Office
    2013
    Likes ricevuti
    1225
    Likes dati
    923
    Citazione Originariamente Scritto da scossa Visualizza Messaggio
    Ciao Tore,

    non ho visto il file di Rubik, ma solo il codice proposto nel primo post.
    Secondo me l'udf viene usata ad esempio così: =EstraiNomi(D1;A1:B5)
    dove in D1 c'è un valore che si ripete in più celle del range A1:A5 e dovrebbe restituire i relativi valori di B1:B5.
    Ciao scossa,
    si, infatti anche Rubik nel suo file ha usato la funzione nello stesso modo:

    =EstraiNomi(A1;A1:A50)

    e funziona bene.
    Forse sono io che mi sono fatto sviare dalla dichiarazione della variabile "Ats" come range :92:

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

  10. #10

    L'avatar di Rubik72
    Clicca e Apri
    Data Registrazione
    Dec 2015
    Località
    Cosenza
    Età
    45
    Messaggi
    2808
    Versione Office
    Excel 2013
    Likes ricevuti
    1020
    Likes dati
    979
    Ops.
    Codice: 
    Public Function EstraiNomi(Ats As String, Rng As Range) As String
    Dim cllNms As New Collection
    Dim ElencoNomi As String
    Dim cell As Range
    Dim Nome As Variant
    
    
    On Error Resume Next
        For Each cell In Rng
            If cell.Value = Ats Then
                cllNms.Add cell.Offset(, 1).Value, Key:=CStr(cell.Offset(, 1).Value)
            End If
        Next
    On Error GoTo 0
    For Each Nome In cllNms
        ElencoNomi = ElencoNomi & Nome & "; "
    Next
    EstraiNomi = Left(ElencoNomi, Len(ElencoNomi) - 2)
    End Function
    Concordo con @Cromagno riguardo alla dichiarazione di Ats
    @Scossa non saprei semplificare ulteriormente

  11. #11

    L'avatar di scossa
    Clicca e Apri
    Data Registrazione
    Jul 2015
    Località
    Verona Provincia
    Età
    57
    Messaggi
    1017
    Versione Office
    .
    Likes ricevuti
    366
    Likes dati
    0
    Citazione Originariamente Scritto da Rubik72 Visualizza Messaggio
    @Scossa non saprei semplificare ulteriormente
    Si può evitare il secondo ciclo For ... Next:

    Codice: 
    Public Function EstraiNomi(Ats As Range, Rng As Range) As String
      Dim cllNms As Collection
      Dim ElencoNomi As String
      Dim cell As Range
      Set cllNms = New Collection
      On Error Resume Next
      For Each cell In Rng
        If cell.Value = Ats Then
          cllNms.Add cell.Offset(, 1).Value, Key:=CStr(cell.Offset(, 1).Value)
          If Err.Number = 0 Then
            ElencoNomi = ElencoNomi & cllNms.Item(cllNms.Count) & "; "
          End If
          Err.Clear
        End If
      Next
      On Error GoTo 0
      EstraiNomi = Left(ElencoNomi, Len(ElencoNomi) - 2)
      Set cllNms = Nothing
    End Function
    P.S.: personalmente preferisco evitare la dichiarazione
    Codice: 
    Dim cllNms As New Collection
    bensì usare la sintassi che vedi nel codice completo.
    Bye!
    scossa
    scossa's web site
    ___
    Se tu hai una mela, e io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)

  12. I seguenti utenti hanno dato un "Like"


  13. #12

    L'avatar di cromagno
    Clicca e Apri
    Data Registrazione
    Aug 2015
    Località
    Sardegna
    Età
    37
    Messaggi
    4018
    Versione Office
    2013
    Likes ricevuti
    1225
    Likes dati
    923
    Tanto per far capire come l'avevo intesa io.... e tendendo buone le indicazioni di scossa...
    Si dovrebbero aggiungere le righe in rosso al codice e verrebbero restituiti i valori della colonna B (se univoci) se il rispettivo valore della colonna A è uguale ad uno dei valori compresi nel range definito dalla variabile "Ats".
    Quindi, nel file di esempio (dove in colonna C ci sono i valori da confrontare) la funzione verrebbe usata in questo modo:

    =EstraiNomi(C2:C3;A2:A18)

    Codice: 
    Public Function EstraiNomi(Ats As Range, Rng As Range) As String
      Dim cllNms As Collection, i As Long
      Dim ElencoNomi As String
      Dim cell As Range, Criterio As Range
      Set cllNms = New Collection
      On Error Resume Next
      For Each cell In Rng
        For Each Criterio In Ats
            If cell.Value = Criterio Then
              cllNms.Add cell.Offset(, 1).Value, Key:=CStr(cell.Offset(, 1).Value)
              If Err.Number = 0 Then
                ElencoNomi = ElencoNomi & cllNms.Item(cllNms.Count) & "; "
              End If
              Err.Clear
            End If
        Next
      Next
      On Error GoTo 0
      EstraiNomi = Left(ElencoNomi, Len(ElencoNomi) - 2)
      Set cllNms = Nothing
    End Function
    File Allegati File Allegati

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

  14. #13

    L'avatar di scossa
    Clicca e Apri
    Data Registrazione
    Jul 2015
    Località
    Verona Provincia
    Età
    57
    Messaggi
    1017
    Versione Office
    .
    Likes ricevuti
    366
    Likes dati
    0
    Ciao,

    Personalmente preferisco che le UDF siano simili (per chiamata, passaggio parametri e modalità di restituzione del risultato) alle funzioni native di Excel, quindi il primo parametro lo limiterei ad una sola cella (altrimenti il risultato restituito dalla udf non permette di capire a quali dei vari criteri corrispondono i valori restituiti).
    Va però detto che nulla vieta di usare la tua udf passandole una sola cella come primo parametro, quindi va bene anche così.
    Bye!
    scossa
    scossa's web site
    ___
    Se tu hai una mela, e io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)

Discussioni Simili

  1. Funzione Stringa estrai+Trova
    Di Berna11 nel forum Domande su Excel in generale
    Risposte: 9
    Ultimo Messaggio: 24/02/16, 11:34
  2. STRINGA.ESTRAI, funzione a me sconosciuta, qualche consiglio?
    Di die84albe nel forum Domande su Excel in generale
    Risposte: 25
    Ultimo Messaggio: 13/02/16, 19:55
  3. estrai elenco nomi con condizioni
    Di Vincenzo Damiani nel forum Domande su Excel VBA e MACRO
    Risposte: 6
    Ultimo Messaggio: 21/01/16, 15:43
  4. Funzione CERCA.VERT e CONFRONTA (nidificata) con gestione nomi
    Di Fabio Broglia nel forum Domande su Excel in generale
    Risposte: 12
    Ultimo Messaggio: 07/10/15, 09:41
  5. Funzione CERCA.VERT e CONFRONTA (nidificata) con gestione nomi
    Di Fabio Broglia nel forum Test dei vostri post
    Risposte: 1
    Ultimo Messaggio: 23/07/15, 13:04

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
  •