Risultati da 1 a 8 di 8

Discussione: Quiz di Santo Stefano (VBA)



  1. #1

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

    Quiz di Santo Stefano (VBA)

    Versione del quiz per gli amanti del VBA .....

    scrivere una UDF (Function) che inserita in F1 restituisca la (prima) parola più lunga tra quelle della colonna A
    La UDF, copiata con Ctrl-C Ctrl-V in G1, H1, I1 riporterà le parole più lunghe, rispettivamente, delle colonne B, C e D.


    A
    B
    C
    D
    E
    F
    G
    H
    I
    1
    Nel Ahi Tanto per ritrovai selvaggia trattar etterno
    2
    mezzo quanto è me
    3
    del a amara si
    4
    cammin dir che va
    5
    di qual poco ne
    6
    nostra era è lo
    7
    vita è più etterno
    8
    mi cosa morte dolore
    9
    ritrovai dura ma per
    10
    per esta per me
    11
    una selva trattar si
    12
    selva selvaggia del va
    13
    oscura e ben tra
    14
    ché aspra chi la
    15
    la e vi perduta
    16
    diritta forte trovai gente
    17
    via che dirò
    18
    era nel de
    19
    smarrita pensier le

    P.S.: ispirato da una domanda posta in altro forum da un utente che chiedeva una soluzione VBA.

    BUONE FESTE!
    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)

  2. #2
    L'avatar di Marius44
    Clicca e Apri
    Data Registrazione
    Sep 2015
    Località
    Catania
    Età
    73
    Messaggi
    3207
    Versione Office
    Excel2010
    Likes ricevuti
    625
    Likes dati
    155
    Ciao scossa
    Penso che la sottostante macro possa andare per lo schema proposto.
    Codice: 
    Option Explicit
    
    
    Function parola(parol As String) As String
    Dim uRg As Long, cln As Integer, i As Long
    Dim par As String, temp As String
        cln = ActiveCell.Column - 5
        uRg = ActiveSheet.Cells(Rows.Count, cln).End(xlUp).Row
        For i = 1 To uRg
            par = Cells(i, cln)
            If Len(Trim(par)) > Len(Trim(parol)) Then
                temp = par
                par = parol
                parol = temp
            End If
        Next i
        parola = parol
    End Function
    Basta mettere =parola(A1) in F1 e poi copiare a destra.
    In effetti ho detto "per lo schema proposto" perché non riesco a generalizzare il numero evidenziato in rosso.

    Ciao,
    Mario

  3. #3

    L'avatar di cromagno
    Clicca e Apri
    Data Registrazione
    Aug 2015
    Località
    Sardegna
    Età
    37
    Messaggi
    4016
    Versione Office
    2013
    Likes ricevuti
    1225
    Likes dati
    923
    Ciao a tutti,
    mi era sfuggito questo quiz :288:

    Proporrei questa:

    Codice: 
    Option Explicit
    
    Public Function parolone(Campo As Range) As String
    Dim x As Integer, Parola As Range
    
    x = 0
    For Each Parola In Campo
        If Len(Parola.Value) > x Then
            x = Len(Parola.Value)
            parolone = Parola.Value
        End If
    Next
    If x = 0 Then
        parolone = "#ERROR#"
    End If
    End Function
    [EDIT]
    Nella cella F1 si scriverà:
    =parolone(A1:A19)

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

  4. #4

    L'avatar di scossa
    Clicca e Apri
    Data Registrazione
    Jul 2015
    Località
    Verona Provincia
    Età
    57
    Messaggi
    1011
    Versione Office
    .
    Likes ricevuti
    365
    Likes dati
    0
    Citazione Originariamente Scritto da Marius44 Visualizza Messaggio
    Ciao scossa
    Penso che la sottostante macro possa andare per lo schema proposto.
    ....
    Basta mettere =parola(A1) in F1 e poi copiare a destra.
    In effetti ho detto "per lo schema proposto" perché non riesco a generalizzare il numero evidenziato in rosso.
    Ciao Mario,

    una UDF dovrebbe rispettare i canoni delle funzioni native di Excel. Prendiamo per esempio la funzione Somma(). Se la dobbiamo usare in una formula scriveremmo, ad esempio:
    =SOMMA(A1:A19)
    e non
    =SOMMA(A1)
    delegando alla funzione il compito di stabilire il range su cui agire.

    Ecco, la nostra UDF dovrebbe ricevere come argomento il range da valutare, nel nostro caso =Parola(A1:A19), il che risolverebbbe anche il problema che hai trovato nel generalizzare la tua formula.
    Resto in attesa del nuovo codice.

    Edit: ops, non avevo letto l'intervento di cromagno.
    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 scossa
    Clicca e Apri
    Data Registrazione
    Jul 2015
    Località
    Verona Provincia
    Età
    57
    Messaggi
    1011
    Versione Office
    .
    Likes ricevuti
    365
    Likes dati
    0
    Citazione Originariamente Scritto da cromagno Visualizza Messaggio
    Proporrei questa:
    ...
    Nella cella F1 si scriverà:
    =parolone(A1:A19)
    Ottima.

    Solo una annotazione, visto che nella tua udf vuoi gestire il caso di range senza valori, anziché una stringa ("#ERROR#") secondo me sarebbe più corretto farle restituire un valore di errore, usando la funzione CvErr() del VBA:

    Codice: 
    Public Function parolone(Campo As Range) As Variant
    Dim x As Integer, Parola As Range
    x = 0
    For Each Parola In Campo
        If Len(Parola.Value) > x Then
            x = Len(Parola.Value)
            parolone = Parola.Value
        End If
    Next
    If x = 0 Then
        parolone = CVErr(xlErrNA)
    End If
    End Function
    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)

  6. #6

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

    Solo una annotazione, visto che nella tua udf vuoi gestire il caso di range senza valori, anziché una stringa ("#ERROR#") secondo me sarebbe più corretto farle restituire un valore di errore, usando la funzione CvErr() del VBA:

    Codice: 
    Public Function parolone(Campo As Range) As Variant
    Dim x As Integer, Parola As Range
    x = 0
    For Each Parola In Campo
        If Len(Parola.Value) > x Then
            x = Len(Parola.Value)
            parolone = Parola.Value
        End If
    Next
    If x = 0 Then
        parolone = CVErr(Excel.xlErrNA)
    End If
    End Function
    Perfetto scossa :246:

    Aspettavo appunto questa tua correzione perchè non ricordavo il metodo per far restituire un errore.

    Grazie :167:

    "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
    1011
    Versione Office
    .
    Likes ricevuti
    365
    Likes dati
    0
    Ovviamente c'è sempre la possibilità di evitare il ciclo For ... Next:

    Codice: 
    Public Function uPiuLunga(ByRef rng As Range) As Variant
      Dim sStrMax As String
      
      sStrMax = Evaluate("=INDEX(" & rng.Address & ",MATCH(MAX(LEN(" & rng.Address & _
            ")),LEN(" & rng.Address & "),0))")
      
      uPiuLunga = IIf(sStrMax = "", CVErr(xlErrNA), sStrMax)
    End Function
    Volendo escludere eventuali celle con uno o più spazi:

    Codice: 
    Public Function uPiuLunga(ByRef rng As Range) As Variant
      Dim sStrMax As String
      
      sStrMax = Trim(Evaluate("=INDEX(" & rng.Address & ",MATCH(MAX(LEN(" & rng.Address & _
            ")),LEN(" & rng.Address & "),0))"))
      
      uPiuLunga = IIf(sStrMax = "", CVErr(xlErrNA), sStrMax)
    End Function
    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. I seguenti utenti hanno dato un "Like"


  9. #8
    L'avatar di Marius44
    Clicca e Apri
    Data Registrazione
    Sep 2015
    Località
    Catania
    Età
    73
    Messaggi
    3207
    Versione Office
    Excel2010
    Likes ricevuti
    625
    Likes dati
    155
    OK. Recepito.

    Ciao,
    Mario

Discussioni Simili

  1. [Risolto] Quiz
    Di Anthony nel forum Domande su Excel in generale
    Risposte: 35
    Ultimo Messaggio: 22/11/16, 15:02
  2. Quiz
    Di Anthony nel forum Domande su Excel VBA e MACRO
    Risposte: 0
    Ultimo Messaggio: 19/11/16, 14:16
  3. Quiz
    Di Anthony nel forum Domande su Excel in generale
    Risposte: 59
    Ultimo Messaggio: 08/11/16, 02:18
  4. Quiz di Santo Stefano
    Di scossa nel forum Domande su Excel in generale
    Risposte: 14
    Ultimo Messaggio: 21/12/15, 20:26
  5. Quiz Natalizio
    Di Marius44 nel forum Domande su Excel VBA e MACRO
    Risposte: 12
    Ultimo Messaggio: 19/12/15, 02:24

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
  •