Pagina 1 di 3 123 UltimaUltima
Risultati da 1 a 30 di 86

Discussione: QUIZ (difficilino) del ConcaSomma (concatena e/o somma)



  1. #1

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

    QUIZ (difficilino) del ConcaSomma (concatena e/o somma)

    La MicLoSoft ltd (clone cinese della MS) vuole inserire nella nuova versione di ECCEL (clone cinese di Excel) la funzione ConcaSomma che concatena/somma il range/matrice passato come argomento.

    Il problema è che non conoscono molto bene il VBA e chiedono a noi di scrivere una UDF che faccia quanto richiesto: concatenare tra loro le stringhe, sommare i numeri, concatenare stringhe con la somma dei numeri, sommare giorni a date, contare giorni tra coppie di date e sommarli, etc ... ignorando le celle vuote (vedi tabella sotto).


    A
    B
    C
    D
    E
    F
    1
    numeri
    lettere
    date
    *
    2
    1
    alfa
    01/01/2016
    3
    2
    beta
    11/01/2016
    10
    4
    3
    gamma
    20/01/2016
    5
    4
    delta
    25/01/2016
    5
    6
    5
    epsilon
    01/04/2016
    7
    6
    zeta
    01/05/2016
    30
    8
    9
    10
    21
    alfa beta gamma delta epsilon zeta
    45
    45
    11
    =concaSomma(A2:A9;" ") =concaSomma(B2:B9;" ") =concaSomma(C2:C9;" ")
    12
    13
    14
    15
    num. + lett.
    num. + lett. + date
    *
    16
    1
    a
    17
    2
    b
    18
    alfa
    12/05/1980
    +
    19
    beta
    365
    =
    12/05/1981
    20
    3
    epsilon
    21
    4
    zeta
    22
    23
    24
    3 alfa beta 7 a b 12/05/1981 epsilon zeta
    25
    =concaSomma(A16:A23;" ") =concaSomma(B16:B23;" ")
    26
    27
    6 alfa beta 66
    28
    =concaSomma({1.5."alfa"."beta".21.45};" ")


    E allora coraggio datevi da fare!

    P.S.: sembra difficile, ma in realtà non è "così" difficile ...
    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 dracoscrigno
    Clicca e Apri
    Data Registrazione
    May 2016
    Località
    ferrara
    Età
    40
    Messaggi
    1257
    Versione Office
    office pro 2010
    Utile ricevuti
    315
    Utile dati
    160

    Re: QUIZ (difficilino) del ConcaSomma (concatena e/o somma)

    e si. ciao... io sono ancora quì che cerco una funzione matematica per definire la successione frattale 12345689...
    E poi, ma sti cinesi non me la raccontano giusta. Siamo sicuri che non sia un Excel commissionato da Willi Wonka per i suoi Umpa Lumpa

  3. #3
    L'avatar di Anthony
    Clicca e Apri
    Data Registrazione
    Sep 2016
    Località
    Ivrea (TO)
    Messaggi
    365
    Versione Office
    2003-2010-2016
    Utile ricevuti
    253
    Utile dati
    36

    Re: QUIZ (difficilino) del ConcaSomma (concatena e/o somma)

    Mi cimento:
    Codice: 
    Function ConcaSomma(ByRef myRan As Range) As Variant
    Dim mySp As String, myNp As Double, myDayp As Long, myDatep As Date, myOut
    '
    For i = 1 To myRan.Rows.Count
        mycct = TypeName(myRan.Cells(i, 1).Value)
        If mycct = "Double" Then
            If Len(mySp) > 0 Then myOut = Tlim(myOut & " " & mySp): mySp = ""
            If myDayp > 0 Then myOut = Tlim(myOut & " " & myDayp): myDayp = 0
            If myDatep > 0 Then myOut = Tlim(myOut & " " & Format(myDatep, "dd-mm-yyyy")): myDatep = 0
            myNp = myNp + myRan.Cells(i, 1)
        ElseIf mycct = "Date" Then
        
            If Len(mySp) > 0 Then myOut = Tlim(myOut & " " & mySp): mySp = ""
            If myNp > 0 Then myOut = Tlim(myOut & " " & myNp): myNp = 0
            If myDatep > 0 Then myOut = Tlim(myOut & " " & myDatep): myDatep = 0
        
            If TypeName(myRan.Cells(i + 1, 1).Value) = "Date" Then
                If myDatep > 0 Then myOut = Tlim(myOut & " " & Format(myDatep, "dd-mm-yyyy")): myDatep = 0
                myDayp = myDayp + Int(myRan.Cells(i + 1, 1)) - Int(myRan.Cells(i, 1))
                i = i + 1
            ElseIf TypeName(myRan.Cells(i + 1, 1).Value) = "Double" Then
                If myDayp > 0 Then myOut = Tlim(myOut & " " & myDayp): myDayp = 0
                myDatep = myRan.Cells(i, 1) + myRan.Cells(i + 1, 1)
                i = i + 1
            End If
        ElseIf mycct = "String" Then
            If myDayp > 0 Then myOut = Tlim(myOut & " " & myDayp): myDayp = 0
            If myNp > 0 Then myOut = Tlim(myOut & " " & myNp): myNp = 0
            If myDatep > 0 Then myOut = Tlim(myOut & " " & myDatep): myDatep = 0
            mySp = Tlim(mySp & " " & myRan.Cells(i, 1))
        End If
    Next i
    If Len(myOut) > 0 And myNp > 0 Then myOut = Tlim(myOut & " " & myNp)
    If Len(myOut) > 0 And myDayp > 0 Then myOut = Tlim(myOut & " " & myDayp)
    If Len(myOut) > 0 And myDatep > 0 Then myOut = Tlim(myOut & " " & myDayp)
    If Len(myOut) = 0 And myNp > 0 Then myOut = myNp
    If Len(myOut) = 0 And myDatep > 0 Then myOut = myDatep
    If Len(myOut) = 0 And myDayp > 0 Then myOut = myDayp
    '
    ConcaSomma = myOut
    End Function
    
    Function Tlim(ByVal myInp As String) As String
    Dim Rep As Boolean
    myStr = myInp
    Do
        Rep = False
        If Left(myStr, 1) = " " Then myStr = Mid(myStr, 2, 9999): Rep = True
        If Right(myStr, 1) = " " Then myStr = (Left(myStr, Len(myStr) - 1)): Rep = True
        If Not Rep Then Exit Do
    Loop
    Tlim = myStr
    End Function
    Noterete che in realta' si tratta di due Udf; infatti quando sono arrivato al collaudo della Function ConcaSomma ho scopelto che pultloppo quella versione di Eccel non contiene la funzione Tlim, quindi ho dovuto inserire pure quella.

    Attenzione: funziona (forse) solo con un intervallo di celle, non inserendo i dati direttamente nella formula.

    Ciao

  4. I seguenti utenti hanno dato un "Utile"


  5. #4
    L'avatar di alfrimpa
    Clicca e Apri
    Data Registrazione
    Dec 2015
    Località
    Napoli
    Età
    63
    Messaggi
    3255
    Versione Office
    2007 - 2013
    Utile ricevuti
    435
    Utile dati
    69

    Re: QUIZ (difficilino) del ConcaSomma (concatena e/o somma)

    Citazione Originariamente Scritto da Anthony Visualizza Messaggio
    Mi cimento:
    Codice: 
    Function ConcaSomma(ByRef myRan As Range) As Variant
    Dim mySp As String, myNp As Double, myDayp As Long, myDatep As Date, myOut
    '
    For i = 1 To myRan.Rows.Count
        mycct = TypeName(myRan.Cells(i, 1).Value)
        If mycct = "Double" Then
            If Len(mySp) > 0 Then myOut = Tlim(myOut & " " & mySp): mySp = ""
            If myDayp > 0 Then myOut = Tlim(myOut & " " & myDayp): myDayp = 0
            If myDatep > 0 Then myOut = Tlim(myOut & " " & Format(myDatep, "dd-mm-yyyy")): myDatep = 0
            myNp = myNp + myRan.Cells(i, 1)
        ElseIf mycct = "Date" Then
        
            If Len(mySp) > 0 Then myOut = Tlim(myOut & " " & mySp): mySp = ""
            If myNp > 0 Then myOut = Tlim(myOut & " " & myNp): myNp = 0
            If myDatep > 0 Then myOut = Tlim(myOut & " " & myDatep): myDatep = 0
        
            If TypeName(myRan.Cells(i + 1, 1).Value) = "Date" Then
                If myDatep > 0 Then myOut = Tlim(myOut & " " & Format(myDatep, "dd-mm-yyyy")): myDatep = 0
                myDayp = myDayp + Int(myRan.Cells(i + 1, 1)) - Int(myRan.Cells(i, 1))
                i = i + 1
            ElseIf TypeName(myRan.Cells(i + 1, 1).Value) = "Double" Then
                If myDayp > 0 Then myOut = Tlim(myOut & " " & myDayp): myDayp = 0
                myDatep = myRan.Cells(i, 1) + myRan.Cells(i + 1, 1)
                i = i + 1
            End If
        ElseIf mycct = "String" Then
            If myDayp > 0 Then myOut = Tlim(myOut & " " & myDayp): myDayp = 0
            If myNp > 0 Then myOut = Tlim(myOut & " " & myNp): myNp = 0
            If myDatep > 0 Then myOut = Tlim(myOut & " " & myDatep): myDatep = 0
            mySp = Tlim(mySp & " " & myRan.Cells(i, 1))
        End If
    Next i
    If Len(myOut) > 0 And myNp > 0 Then myOut = Tlim(myOut & " " & myNp)
    If Len(myOut) > 0 And myDayp > 0 Then myOut = Tlim(myOut & " " & myDayp)
    If Len(myOut) > 0 And myDatep > 0 Then myOut = Tlim(myOut & " " & myDayp)
    If Len(myOut) = 0 And myNp > 0 Then myOut = myNp
    If Len(myOut) = 0 And myDatep > 0 Then myOut = myDatep
    If Len(myOut) = 0 And myDayp > 0 Then myOut = myDayp
    '
    ConcaSomma = myOut
    End Function
    
    Function Tlim(ByVal myInp As String) As String
    Dim Rep As Boolean
    myStr = myInp
    Do
        Rep = False
        If Left(myStr, 1) = " " Then myStr = Mid(myStr, 2, 9999): Rep = True
        If Right(myStr, 1) = " " Then myStr = (Left(myStr, Len(myStr) - 1)): Rep = True
        If Not Rep Then Exit Do
    Loop
    Tlim = myStr
    End Function
    Noterete che in realta' si tratta di due Udf; infatti quando sono arrivato al collaudo della Function ConcaSomma ho scopelto che pultloppo quella versione di Eccel non contiene la funzione Tlim, quindi ho dovuto inserire pure quella.

    Attenzione: funziona (forse) solo con un intervallo di celle, non inserendo i dati direttamente nella formula.

    Ciao
    Anthony tu forse non lo sai ma quando vengono proposti dei quiz si richiede ai "mostri" di pazientare prima di dare le risposte per dar modo agli "umili mortali" di provarci
    Alfredo

    "Non esistono cose facili o difficili; esistono cose che si sanno e cose che non si sanno"

    "Solo due cose sono infinite: l'universo e la stupidità umana; riguardo l'universo ho ancora dei dubbi" (Albert Einstein)

  6. #5
    L'avatar di dracoscrigno
    Clicca e Apri
    Data Registrazione
    May 2016
    Località
    ferrara
    Età
    40
    Messaggi
    1257
    Versione Office
    office pro 2010
    Utile ricevuti
    315
    Utile dati
    160

    Re: QUIZ (difficilino) del ConcaSomma (concatena e/o somma)

    questa sera sono impegnato ma ho gia un idea. balorda naturalmente

  7. #6

    L'avatar di cromagno
    Clicca e Apri
    Data Registrazione
    Aug 2015
    Località
    Sardegna
    Età
    37
    Messaggi
    3126
    Versione Office
    2013
    Utile ricevuti
    932
    Utile dati
    753

    Re: QUIZ (difficilino) del ConcaSomma (concatena e/o somma)

    Ciao a tutti,
    difficilmente stasera riuscirò a mettere le mani su un pc per "provare" qualcosa, ma non mi è chiara una "condizione"...

    @scossa
    la parte "num. + lett. + date": perchè sommi il valore in C19 (365) alla data in C18 ottendo 12/05/1981?
    Essendo diversi i "tipi" di valori, non sarebbe più corretto che la UDF restituisse questo risultato:

    a b 12/05/1980 365 epsilon zeta

    ???
    Ripeto, è solo per capire prima di cimentarmi ;)

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

  8. #7

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

    Re: QUIZ (difficilino) del ConcaSomma (concatena e/o somma)

    Citazione Originariamente Scritto da cromagno Visualizza Messaggio
    @scossa
    la parte "num. + lett. + date": perchè sommi il valore in C19 (365) alla data in C18 ottendo 12/05/1981?
    .....
    Ripeto, è solo per capire prima di cimentarmi ;)
    Perché i cinesi vogliono che se nella cella sotto ad una data c'è un numero, questo venga considerato come numero di giorni da aggiungere ad una data; mentre se sotto ad una data c'è un'altra data venga calcolato il numero di giorni.

    Comunque, per semplificare, intanto affrontiamo solo il caso di stringhe e numeri, senza celle vuote:

    A
    B
    C
    D
    E
    1
    numeri
    lettere
    num. + lett.
    2
    1
    alfa
    1
    3
    2
    beta
    2
    4
    3
    gamma alfa
    5
    4
    delta
    5
    6
    5
    epsilon beta
    7
    6
    zeta gamma
    8
    21
    alfa beta gamma delta epsilon zeta 3 alfa 5 beta gamma
    9
    =concaSomma(A2:A7;" ") =concaSomma(B2:B7;" ") =concaSomma(E2:E7;" ")
    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. #8

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

    Re: QUIZ (difficilino) del ConcaSomma (concatena e/o somma)

    Ciao Anthony,

    mi sembra che con le stringhe e stringhe+numeri non funzioni:


    C
    D
    E
    1
    lettere
    num. + lett.
    2
    alfa
    1
    3
    beta
    2
    4
    gamma alfa
    5
    delta
    5
    6
    epsilon beta
    7
    zeta gamma
    8
    0
    3 alfa 5
    9
    =concaSomma(B2:B7) =concaSomma(E2:E7;" ")


    P.S.: non ho capito perché hai scritto la udf Tlim, visto che esiste VBA.Trim() ...

    P.P.S.: mancherebbe il secondo argomento di ConcaSomma che è il carattere separatore (default " ").
    In pratica la dichiarazione dovrebbe essere:
    Codice: 
    Public Function ConcaSomma(ByRef vItems As Variant, Optional ByVal sSep As String = " ") As Variant
    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)

  10. #9
    L'avatar di Anthony
    Clicca e Apri
    Data Registrazione
    Sep 2016
    Località
    Ivrea (TO)
    Messaggi
    365
    Versione Office
    2003-2010-2016
    Utile ricevuti
    253
    Utile dati
    36

    Re: QUIZ (difficilino) del ConcaSomma (concatena e/o somma)

    Citazione Originariamente Scritto da scossa Visualizza Messaggio
    Ciao Anthony,

    mi sembra che con le stringhe e stringhe+numeri non funzioni:


    C
    D
    E
    1
    lettere
    num. + lett.
    2
    alfa
    1
    3
    beta
    2
    4
    gamma alfa
    5
    delta
    5
    6
    epsilon beta
    7
    zeta gamma
    8
    0
    3 alfa 5
    9
    =concaSomma(B2:B7) =concaSomma(E2:E7;" ")


    P.S.: non ho capito perché hai scritto la udf Tlim, visto che esiste VBA.Trim() ...

    P.P.S.: mancherebbe il secondo argomento di ConcaSomma che è il carattere separatore (default " ").
    In pratica la dichiarazione dovrebbe essere:
    Codice: 
    Public Function ConcaSomma(ByRef vItems As Variant, Optional ByVal sSep As String = " ") As Variant
    Mi ero chiesto che cosa era il secondo parametro, ma non ci ero arrivato...

    Non funziona perche' la parte di chiusura della udf non prevedeva i giusti casi; ho modificato:
    Codice: 
    Next I
    If Len(myOut) > 0 And myNp > 0 Then myOut = Tlim(myOut & " " & myNp)
    If Len(myOut) > 0 And myDayp > 0 Then myOut = Tlim(myOut & " " & myDayp)
    If Len(myOut) > 0 And myDatep > 0 Then myOut = Tlim(myOut & " " & myDatep)
    If Len(myOut) > 0 And mySp <> "" Then myOut = Tlim(myOut & " " & mySp)
    
    If Len(myOut) = 0 And myNp > 0 Then myOut = myNp
    If Len(myOut) = 0 And myDatep > 0 Then myOut = myDatep
    If Len(myOut) = 0 And myDayp > 0 Then myOut = myDayp
    If Len(myOut) = 0 And mySp <> "" Then myOut = mySp
    '
    ConcaSomma = myOut
    End Function
    Non so se e' meglio ripubblicare tutto, ma poi viene una discussione lunghissima da leggere; al prossimo intervento metto il link al file di prova.

    So che nel VBA esiste la funzione Trim, ma nell' Eccel della Miclosoft questa manca; per questo ho dovuto anche inserire la nuova Tlim...

    Ciao

  11. #10

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

    Re: QUIZ (difficilino) del ConcaSomma (concatena e/o somma)

    Ciao,
    Citazione Originariamente Scritto da Anthony Visualizza Messaggio
    Mi ero chiesto che cosa era il secondo parametro, ma non ci ero arrivato...

    Non funziona perche' la parte di chiusura della udf non prevedeva i giusti casi; ho modificato ...
    Ok, adesso dovresti modificarla per usare il parametro sSep,
    Giusta l'idea di Tlim(), quindi devi modificare anche lei per gestire il separatore:

    Codice: 
    Function Tlim(ByVal sString As String, Optional ByVal sSep As String = " ") As String
    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. #11
    L'avatar di dracoscrigno
    Clicca e Apri
    Data Registrazione
    May 2016
    Località
    ferrara
    Età
    40
    Messaggi
    1257
    Versione Office
    office pro 2010
    Utile ricevuti
    315
    Utile dati
    160

    Re: QUIZ (difficilino) del ConcaSomma (concatena e/o somma)

    scossa. solo una cosa relativa alle date:
    manca un esempio se sono in numero disperi.
    dagli esempi, a meno che me ne sia perso uno per strada sembrano conteggiati come somma della differenza tra coppie.
    cioè:
    vengon prese le celle a due a due, valutate le differenze e queste sommate fra loro a dare il risultato.

  13. #12

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

    Re: QUIZ (difficilino) del ConcaSomma (concatena e/o somma)

    Citazione Originariamente Scritto da dracoscrigno Visualizza Messaggio
    scossa. solo una cosa relativa alle date:
    manca un esempio se sono in numero disperi.
    dagli esempi, a meno che me ne sia perso uno per strada sembrano conteggiati come somma della differenza tra coppie.
    cioè:
    vengon prese le celle a due a due, valutate le differenze e queste sommate fra loro a dare il risultato.
    Praticamente sottrae all'ultima data (quella dispari) la somma dei giorni differenza tra le coppe (la cella del risultato andrebbe formattata manualmente come data):


    E
    F
    1
    date
    *
    2
    01/01/2016
    3
    11/01/2016
    10
    4
    20/01/2016
    5
    25/01/2016
    5
    6
    01/04/2016
    7
    01/05/2016
    30
    8
    10/05/2016
    9
    10
    26/03/2016
    45
    11
    =concaSomma(C2:C9;" ")


    Ma ribadisco che, come primo step, basta risolvere il caso di una range verticale di celle con soli testo o numeri senza celle vuote.
    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)

  14. #13
    L'avatar di Anthony
    Clicca e Apri
    Data Registrazione
    Sep 2016
    Località
    Ivrea (TO)
    Messaggi
    365
    Versione Office
    2003-2010-2016
    Utile ricevuti
    253
    Utile dati
    36

    Re: QUIZ (difficilino) del ConcaSomma (concatena e/o somma)

    Ho aggiornato la mia ConcaSomma (e la necessaria Tlim ) per inserire il parametro "Separatore" opzionale (valore di default: spazio).
    Ne ho anche approfittato per inserire un eventuale "Days marker", che sara' appeso ai calcoli di "differenza di gg tra due date" in modo da visualizzare ad es. 4gg invece che solo 4; anche questo e' opzionale, cioe' sara' inserito nel risultato solo se indicato nella formula.
    Esempi di formule valide:
    Codice: 
    =ConcaSomma(F2:F12)
    =ConcaSomma(B2:B12;" ")
    =ConcaSomma(B2:B12;"+")
    =ConcaSomma(H2:H12;;"gg")
    Il codice aggiornato:
    Codice: 
    Function ConcaSomma(ByRef myRan As Range, Optional ByVal mySep As String = " ", Optional ByVal myDM As String = "") As Variant
    'Vedi http://www.forumexcel.it/forum/7-domande-su-excel-vba-e-macro/5196-quiz-difficilino-del-concasomma-concatena-e-o-somma
    'Vers by Anthony, Agg. B60922
    ' USO:
    '   =ConcaSomma(Intervallo;[Separatore opzionale; default=Spazio];[Marker di giorni, opzionale])
    '   esempio: =ConcaSomma(H2:H12;;"gg")
    '
    Dim mySp As String, myNp As Double, myDayp As Long, myDatep As Date, myOut
    '
    For I = 1 To myRan.Rows.Count
        mycct = TypeName(myRan.Cells(I, 1).Value)
        If mycct = "Double" Then
            If Len(mySp) > 0 Then myOut = Tlim(myOut & mySep & mySp, mySep): mySp = ""
            If myDayp > 0 Then myOut = Tlim(myOut & mySep & myDayp & myDM, mySep): myDayp = 0
            If myDatep > 0 Then myOut = Tlim(myOut & mySep & Format(myDatep, "dd-mm-yyyy"), mySep): myDatep = 0
            myNp = myNp + myRan.Cells(I, 1)
       
        ElseIf mycct = "Date" Then
            If Len(mySp) > 0 Then myOut = Tlim(myOut & mySep & mySp, mySep): mySp = ""
            If myNp > 0 Then myOut = Tlim(myOut & mySep & myNp, mySep): myNp = 0
            If myDatep > 0 Then myOut = Tlim(myOut & mySep & myDatep, mySep): myDatep = 0
    'sottocasi:
            If TypeName(myRan.Cells(I + 1, 1).Value) = "Date" Then
                If myDatep > 0 Then myOut = Tlim(myOut & mySep & Format(myDatep, "dd-mm-yyyy"), mySep): myDatep = 0
                myDayp = myDayp + Int(myRan.Cells(I + 1, 1)) - Int(myRan.Cells(I, 1))
                I = I + 1
            ElseIf TypeName(myRan.Cells(I + 1, 1).Value) = "Double" Then
                If myDayp > 0 Then myOut = Tlim(myOut & mySep & myDayp & myDM, mySep): myDayp = 0
                myDatep = myRan.Cells(I, 1) + myRan.Cells(I + 1, 1)
                I = I + 1
            End If
       
        ElseIf mycct = "String" Then
            If myDayp > 0 Then myOut = Tlim(myOut & mySep & myDayp & myDM, mySep): myDayp = 0
            If myNp > 0 Then myOut = Tlim(myOut & mySep & myNp, mySep): myNp = 0
            If myDatep > 0 Then myOut = Tlim(myOut & mySep & myDatep, mySep): myDatep = 0
            mySp = Tlim(mySp & mySep & myRan.Cells(I, 1), mySep)
        End If
    Next I
    If Len(myOut) > 0 And myNp > 0 Then myOut = Tlim(myOut & mySep & myNp, mySep)
    If Len(myOut) > 0 And myDayp > 0 Then myOut = Tlim(myOut & mySep & myDayp & myDM, mySep)
    If Len(myOut) > 0 And myDatep > 0 Then myOut = Tlim(myOut & mySep & myDatep, mySep)
    If Len(myOut) > 0 And mySp <> "" Then myOut = Tlim(myOut & mySep & mySp, mySep)
     
    If Len(myOut) = 0 And myNp > 0 Then myOut = myNp
    If Len(myOut) = 0 And myDatep > 0 Then myOut = myDatep
    If Len(myOut) = 0 And myDayp > 0 Then myOut = myDayp & myDM
    If Len(myOut) = 0 And mySp <> "" Then myOut = mySp
    '
    ConcaSomma = myOut
    End Function
     
    Function Tlim(ByVal myInp As String, mySpace As String) As String
    'Copylight Anthony 9-2016
    Dim Rep As Boolean
    mystr = myInp
    Do
        Rep = False
        If Left(mystr, 1) = mySpace Then mystr = Mid(mystr, 2, 9999): Rep = True
        If Right(mystr, 1) = mySpace Then mystr = (Left(mystr, Len(mystr) - 1)): Rep = True
        If Not Rep Then Exit Do
    Loop
    Tlim = mystr
    End Function
    Il file di prova, col codice della ConcaSomma (e la necessaria Tlim), e' disponibile qui: https://www.dropbox.com/s/1k3ae9expu...0921.xlsm?dl=0

    Ciao

  15. #14

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

    Re: QUIZ (difficilino) del ConcaSomma (concatena e/o somma)

    Citazione Originariamente Scritto da Anthony Visualizza Messaggio
    Il file di prova, col codice della ConcaSomma (e la necessaria Tlim), e' disponibile qui: https://www.dropbox.com/s/1k3ae9expu...0921.xlsm?dl=0
    Ottimo Anthony, mi permetto solo di ripostare il codice senza righe multi-istruzione (:) per facilitare la lettura:
    Codice: 
    Option Explicit
    
    Function ConcaSomma(ByRef myRan As Range, Optional ByVal mySep As String = " ", Optional ByVal myDM As String = "") As Variant
    'Vedi http://www.forumexcel.it/forum/7-domande-su-excel-vba-e-macro/5196-quiz-difficilino-del-concasomma-concatena-e-o-somma
    'Vers by Anthony, Agg. B60922
    ' USO:
    '   =ConcaSomma(Intervallo;[Separatore opzionale; default=Spazio];[Marker di giorni, opzionale])
    '   esempio: =ConcaSomma(H2:H12;;"gg")
    '
      Dim mySp As String, myNp As Double, myDayp As Long, myDatep As Date
      Dim myOut As String, i As Long, mycct As String
      '
      For i = 1 To myRan.Rows.Count
          mycct = TypeName(myRan.Cells(i, 1).Value)
          If mycct = "Double" Then
              If Len(mySp) > 0 Then
                myOut = Tlim(myOut & mySep & mySp, mySep)
                mySp = ""
              End If
              If myDayp > 0 Then
                myOut = Tlim(myOut & mySep & myDayp & myDM, mySep)
                myDayp = 0
              End If
              If myDatep > 0 Then
                myOut = Tlim(myOut & mySep & Format(myDatep, "dd-mm-yyyy"), mySep)
                myDatep = 0
              End If
              myNp = myNp + myRan.Cells(i, 1)
          ElseIf mycct = "Date" Then
              If Len(mySp) > 0 Then
                myOut = Tlim(myOut & mySep & mySp, mySep)
                mySp = ""
              End If
              If myNp > 0 Then
                myOut = Tlim(myOut & mySep & myNp, mySep)
                myNp = 0
              End If
              If myDatep > 0 Then
                myOut = Tlim(myOut & mySep & myDatep, mySep)
                myDatep = 0
              End If
        'sottocasi:
              If TypeName(myRan.Cells(i + 1, 1).Value) = "Date" Then
                  If myDatep > 0 Then
                    myOut = Tlim(myOut & mySep & Format(myDatep, "dd-mm-yyyy"), mySep)
                    myDatep = 0
                  End If
                  myDayp = myDayp + Int(myRan.Cells(i + 1, 1)) - Int(myRan.Cells(i, 1))
                  i = i + 1
              ElseIf TypeName(myRan.Cells(i + 1, 1).Value) = "Double" Then
                  If myDayp > 0 Then
                    myOut = Tlim(myOut & mySep & myDayp & myDM, mySep)
                    myDayp = 0
                  End If
                  myDatep = myRan.Cells(i, 1) + myRan.Cells(i + 1, 1)
                  i = i + 1
              End If
          ElseIf mycct = "String" Then
              If myDayp > 0 Then
                myOut = Tlim(myOut & mySep & myDayp & myDM, mySep)
                myDayp = 0
              End If
              If myNp > 0 Then
                myOut = Tlim(myOut & mySep & myNp, mySep)
                myNp = 0
              End If
              If myDatep > 0 Then
                myOut = Tlim(myOut & mySep & myDatep, mySep)
                myDatep = 0
              End If
              mySp = Tlim(mySp & mySep & myRan.Cells(i, 1), mySep)
          End If
      Next i
      If Len(myOut) > 0 And myNp > 0 Then myOut = Tlim(myOut & mySep & myNp, mySep)
      If Len(myOut) > 0 And myDayp > 0 Then myOut = Tlim(myOut & mySep & myDayp & myDM, mySep)
      If Len(myOut) > 0 And myDatep > 0 Then myOut = Tlim(myOut & mySep & myDatep, mySep)
      If Len(myOut) > 0 And mySp <> "" Then myOut = Tlim(myOut & mySep & mySp, mySep)
      If Len(myOut) = 0 And myNp > 0 Then myOut = myNp
      If Len(myOut) = 0 And myDatep > 0 Then myOut = myDatep
      If Len(myOut) = 0 And myDayp > 0 Then myOut = myDayp & myDM
      If Len(myOut) = 0 And mySp <> "" Then myOut = mySp
      '
      ConcaSomma = myOut
    End Function
     
    Function Tlim(ByVal myInp As String, mySpace As String) As String
    'Copylight Anthony 9-2016
      Dim Rep As Boolean, mystr
      mystr = myInp
      Do
          Rep = False
          If Left(mystr, 1) = mySpace Then
            mystr = Mid(mystr, 2, 9999)
            Rep = True
          End If
          If Right(mystr, 1) = mySpace Then
            mystr = (Left(mystr, Len(mystr) - 1))
            Rep = True
          End If
          If Not Rep Then Exit Do
      Loop
      Tlim = mystr
    End Function
    N.B.: ho aggiunto anche un paio di dichiarazioni di variabili che non avevi messo.

    N.B.2: ci srebbe da apportare un'ultima "correzione": in caso il risultato fosse un numero, ConcaSomma dovrebbe essere un numero non una stringa (vedi A10:: 21).

    Spero ci sia qualche altra proposta (dracoscrigno? cromagno? Marius? Cucu^_^? ....), poi sabato pubblico le mie due udf.
    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)

  16. I seguenti utenti hanno dato un "Utile"

    ges

  17. #15
    L'avatar di Marius44
    Clicca e Apri
    Data Registrazione
    Sep 2015
    Località
    Catania
    Età
    73
    Messaggi
    1828
    Versione Office
    Excel2010
    Utile ricevuti
    453
    Utile dati
    110

    Re: QUIZ (difficilino) del ConcaSomma (concatena e/o somma)

    @scossa
    come detto da alfrimpa (ciao Alfredo), da "umile mortale" ci stavo provando poi ho visto la soluzione di Anthony (ciao) e mi sono arreso

    Ho ancora tanto da studiare!!!

    Ciao a tutti,
    Mario

  18. #16
    L'avatar di Anthony
    Clicca e Apri
    Data Registrazione
    Sep 2016
    Località
    Ivrea (TO)
    Messaggi
    365
    Versione Office
    2003-2010-2016
    Utile ricevuti
    253
    Utile dati
    36

    Re: QUIZ (difficilino) del ConcaSomma (concatena e/o somma)

    Per quanto riguarda il formato, la udf restituisce un valore "potenzialmente errato" quando ci sono solo coppie di date; in questo caso, anche nel caso che il Days marker sia omesso, la udf restituisce una stringa.
    Ho corretto questa situazione modificando nella parte finale:
    If Len(myOut) = 0 And myDayp > 0 Then myOut = myDayp & myDM
    in
    Codice: 
    If Len(myOut) = 0 And myDayp > 0 Then myOut = myDayp: If myDM <> "" Then myOut = myOut & myDM
    Se la udf gestisce solo numeri il restituito e' gia' un numero.

    Rimane un caso che non ho afferrato come si puo' gestire:
    -se la Udf restituisce una data (es 15-sett-2016 seguito da 10; risultato 25-set-2016), anche in presenza di cella formattata "Generale", la visualizzazione in cella e' numerica (42638, nell'esempio); come e' noto pero' la udf non puo' applicare formattazioni, e allora come si puo' fare (ovviamente evitando di trasformare la data in una stringa)? Mi sa che quelli di Miclosoft devono inventarsi qualcos'altro...

    Per verificare il tipo di dati restituito dall'udf ho aggiunto, prima di End Function, una Debug.Print:
    Codice: 
    ConcaSomma = myOut
    Debug.Print Application.Caller.Address & Format(Timer / 24 / 3600, "_hh:mm:ss_") & TypeName(ConcaSomma)
    End Function
    Il file su Dropbox e' ora aggiornato con queste modifiche.

    Spero anche io in altri contributi, anche come variazione di quanto proposto; solo confrontandosi si puo' migliorare... e scoprire piccole travi che non vedevi mentre cercavi la pagliuzza.

    Hai detto che pubblicherai le tue due udf: hai anche tu una TLIM? Guarda che anche se ho messo il Copylight puoi riciclare quanto gia' fatto, eh eh.

    INFINE: la prossima volta che avvii un contest, suggerisco di inserirlo come discussione bloccata per N giorni; cosi' credo che piu' persone aguzzeranno l'ingegno senza essere disturbati da quanto gia' pubblicato.

    Ciao

  19. #17
    L'avatar di Marius44
    Clicca e Apri
    Data Registrazione
    Sep 2015
    Località
    Catania
    Età
    73
    Messaggi
    1828
    Versione Office
    Excel2010
    Utile ricevuti
    453
    Utile dati
    110

    Re: QUIZ (difficilino) del ConcaSomma (concatena e/o somma)

    Salve gente
    Non finirò mai di complimentarmi con scossa per aver "ideato" il quiz e con Anthony per aver dato la soluzione (al momento, unica).
    Vorrei, se possibile, avere un chiarimento: nel quiz proposto da scossa nella cella A28 vi è una formula particolare (all'interno della formula, mi sembra, vi è una matriciale). Nell'elaborato di Anthony non vedo un risultato con quella formula oppure la ... senilità mi porta qualche defaillance.
    Grazie in aticipo e ciao,
    Mario

  20. #18

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

    Re: QUIZ (difficilino) del ConcaSomma (concatena e/o somma)

    @Anthony: 1) ho seguito il tuo suggerimento e messo "in rilievo" il thread. 2) sì, ho creato anch'io l'udf Tlim() con copyleft in tutti i paesi Occidentali, Orientali e Lunari :-)

    @Marius: Anthony aveva precisato "Attenzione: funziona (forse) solo con un intervallo di celle, non inserendo i dati direttamente nella formula."
    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)

  21. #19
    L'avatar di alfrimpa
    Clicca e Apri
    Data Registrazione
    Dec 2015
    Località
    Napoli
    Età
    63
    Messaggi
    3255
    Versione Office
    2007 - 2013
    Utile ricevuti
    435
    Utile dati
    69

    Re: QUIZ (difficilino) del ConcaSomma (concatena e/o somma)

    Citazione Originariamente Scritto da Marius44 Visualizza Messaggio
    Salve gente
    .......Anthony per aver dato la soluzione (al momento, unica)

    E credo che tale rimarrà

    Aver definito "difficilino il quiz" mi sembra un bell'esempio di "understatement"

    E quelli difficili/ difficilissimi o complicati/complicatissimi che saranno?........
    Alfredo

    "Non esistono cose facili o difficili; esistono cose che si sanno e cose che non si sanno"

    "Solo due cose sono infinite: l'universo e la stupidità umana; riguardo l'universo ho ancora dei dubbi" (Albert Einstein)

  22. #20

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

    Re: QUIZ (difficilino) del ConcaSomma (concatena e/o somma)

    Citazione Originariamente Scritto da alfrimpa Visualizza Messaggio
    E credo che tale rimarrà
    Aver definito "difficilino il quiz" mi sembra un bell'esempio di "understatement"
    Ma poi l'ho semplificato, dicendo di considerare solo numeri e testo (vedi post #7)
    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)

  23. #21
    L'avatar di Anthony
    Clicca e Apri
    Data Registrazione
    Sep 2016
    Località
    Ivrea (TO)
    Messaggi
    365
    Versione Office
    2003-2010-2016
    Utile ricevuti
    253
    Utile dati
    36

    Re: QUIZ (difficilino) del ConcaSomma (concatena e/o somma)

    Citazione Originariamente Scritto da Marius44 Visualizza Messaggio
    Salve gente
    Non finirò mai di complimentarmi con scossa per aver "ideato" il quiz e con Anthony per aver dato la soluzione (al momento, unica).
    Vorrei, se possibile, avere un chiarimento: nel quiz proposto da scossa nella cella A28 vi è una formula particolare (all'interno della formula, mi sembra, vi è una matriciale). Nell'elaborato di Anthony non vedo un risultato con quella formula oppure la ... senilità mi porta qualche defaillance.
    Grazie in aticipo e ciao,
    Mario
    Permettimi di correggere: non "la soluzione" ma "una possibile soluzione"

    Quanto al tuo dubbio:
    Citazione Originariamente Scritto da Anthony, mettendo le mani avanti
    Attenzione: funziona (forse) solo con un intervallo di celle, non inserendo i dati direttamente nella formula.
    Quindi la soluzione proposta ha questo limite. E' che non sono ancora riuscito a quadrare l'uso di ParamArray, necessario per gestire sia intervalli sul foglio che dati inseriti direttamente nella formula.... Forse "stasera", forse...


    PS: ma io la semplificazione del post #7 me la sono persa??

  24. #22

    L'avatar di Rubik72
    Clicca e Apri
    Data Registrazione
    Dec 2015
    Località
    Cosenza
    Età
    45
    Messaggi
    2028
    Versione Office
    Excel 2013
    Utile ricevuti
    755
    Utile dati
    709

    Re: QUIZ (difficilino) del ConcaSomma (concatena e/o somma)

    Un saluto a tutti.
    Propongo la mia soluzione (come ho capito io):
    Codice: 
    Function ConcaSomma(mioRange As Range) As String
    'by Rubik72
    Dim Num As Long
    Dim Lett As String
    Dim i As Long
    
    
    For i = 1 To mioRange.Cells.Count
        Select Case TypeName(mioRange(i).Value)
            Case "String"
                Lett = mioRange(i)
                ConcaSomma = ConcaSomma & Lett & " "
            Case "Double"
                Num = Num + mioRange(i)
                If TypeName(mioRange(i + 1).Value) <> "Double" Then
                    ConcaSomma = ConcaSomma & Num & " "
                    Num = 0
                End If
            Case "Date"
                 If TypeName(mioRange(i + 1).Value) = "Date" Then
                    Num = mioRange(i + 1) - mioRange(i)
                    ConcaSomma = ConcaSomma & Num & " "
                    Num = 0
                    i = i + 1
                 ElseIf TypeName(mioRange(i + 1).Value) = "Double" Then
                    Num = mioRange(i + 1) + mioRange(i)
                    ConcaSomma = ConcaSomma & Format(Num, "dd/mm/yy") & " "
                    Num = 0
                    i = i + 1
                 End If
        End Select
    Next
    
    
    ConcaSomma = Trim(ConcaSomma)
    
    
    End Function
    P.S. Ho visto che anche @Anthony (che saluto) ha proposto la sua soluzione, che non ho ancora "studiato" (lo farò quanto prima) per non essere influenzato, ma sicuramente sarà più professionale della mia.

  25. I seguenti utenti hanno dato un "Utile"


  26. #23

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

    Re: QUIZ (difficilino) del ConcaSomma (concatena e/o somma)

    Citazione Originariamente Scritto da Rubik72 Visualizza Messaggio
    Un saluto a tutti.
    Propongo la mia soluzione (come ho capito io):
    Bravo Rubik!

    Se ti va di "aggiustare" due cose relativamente ai numeri:
    1 - dovrebbe gestire correttamente anche i decimali; poi se il risultato è un numero l'UDF dovrebbe restituire un numero e non una stringa;

    vedi sotto:


    A
    1
    numeri
    2
    1
    3
    2
    4
    3
    5
    4,3
    6
    5
    7
    6
    8
    9
    10
    21
    11
    =concaSomma(A2:A9)
    12
    13
    14
    15
    num. + lett.
    16
    1
    17
    2,5
    18
    alfa
    19
    20
    beta
    21
    4
    22
    23
    24
    4 alfa beta 4
    25
    =concaSomma(A16:A23)



    2 - dovresti aggiungere il parametro facoltativo sSep:
    Codice: 
    Public Function ConcaSomma(ByRef vItems As Variant, Optional ByVal sSep As String = " ") As Variant
    questo comporta scrivere la function Tlim() per eliminare eventuali caratteri separatori a inizio e fine risultato.
    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)

  27. #24

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

    Re: QUIZ (difficilino) del ConcaSomma (concatena e/o somma)

    Citazione Originariamente Scritto da scossa Visualizza Messaggio
    2 - dovresti aggiungere il parametro facoltativo sSep:
    Codice: 
    Public Function ConcaSomma(ByRef vItems As Variant, Optional ByVal sSep As String = " ") As Variant
    questo comporta scrivere la function Tlim() per eliminare eventuali caratteri separatori a inizio e fine risultato.
    Ma attento, non puoi usare un codice come quello di Anthony perché è coperto da copyright planetario , quindi devi inventarti qualcosa di originale
    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)

  28. #25

    L'avatar di Rubik72
    Clicca e Apri
    Data Registrazione
    Dec 2015
    Località
    Cosenza
    Età
    45
    Messaggi
    2028
    Versione Office
    Excel 2013
    Utile ricevuti
    755
    Utile dati
    709

    Re: QUIZ (difficilino) del ConcaSomma (concatena e/o somma)

    Se ho capito bene:
    Codice: 
    Function ConcaSomma(mioRange As Range, Optional ByVal sSep As String = " ") As Variant
    'by Rubik72
    Dim Num As Double
    Dim Lett As String
    Dim i As Long
    
    
    
    
    For i = 1 To mioRange.Cells.Count
        Select Case TypeName(mioRange(i).Value)
            Case "String"
                Lett = mioRange(i)
                ConcaSomma = ConcaSomma & Lett &  sSep
            Case "Double"
                Num = Num + mioRange(i)
                If TypeName(mioRange(i + 1).Value) <> "Double" Then
                    ConcaSomma = ConcaSomma & Num & sSep
                    Num = 0
                End If
            Case "Date"
                 If TypeName(mioRange(i + 1).Value) = "Date" Then
                    Num = mioRange(i + 1) - mioRange(i)
                    ConcaSomma = ConcaSomma & Num & sSep
                    Num = 0
                    i = i + 1
                 ElseIf TypeName(mioRange(i + 1).Value) = "Double" Then
                    Num = mioRange(i + 1) + mioRange(i)
                    ConcaSomma = ConcaSomma & Format(Num, "dd/mm/yy") & sSep
                    Num = 0
                    i = i + 1
                 End If
        End Select
    Next
    
    
    
    
    ConcaSomma = Trim(ConcaSomma)
    ConcaSomma = Left(ConcaSomma, Len(ConcaSomma) - 1)
    
    
    End Function
    Citazione Originariamente Scritto da scossa Visualizza Messaggio
    Ma attento, non puoi usare un codice come quello di Anthony perché è coperto da copyright planetario , quindi devi inventarti qualcosa di originale
    Non ho ancora avuto modo di provare la routine di Anthony, ma lo farò quanto prima.

  29. #26
    L'avatar di Anthony
    Clicca e Apri
    Data Registrazione
    Sep 2016
    Località
    Ivrea (TO)
    Messaggi
    365
    Versione Office
    2003-2010-2016
    Utile ricevuti
    253
    Utile dati
    36

    Re: QUIZ (difficilino) del ConcaSomma (concatena e/o somma)

    Citazione Originariamente Scritto da scossa
    Ma attento, non puoi usare un codice come quello di Anthony perché è coperto da copyright planetario , quindi devi inventarti qualcosa di originale
    No, non farmi dire cose che non fanno parte del mio pensiero... L'unica cosa su cui ho messo il Copiligth e' la funzione Tlim, su cui pero' ho gia' concesso il libero diritto di fruizione.
    In ogni caso il codice di Rubik contiene evidenti semplificazioni, se il risultato e' "buono come il mio" e' un ottimo risultato!
    "Piu' tardi" cerchero' di concludere il wip per l'uso anche della matrice di valori, sperando che il castello non si aggrovigli su se stesso...


    Edit: rileggendo il messaggio di scossa ho capito che lui alludeva proprio alla Tlim
    Ultima modifica fatta da:Anthony; 22/09/16 alle 21:10 Motivo: Vedi "Edit"

  30. #27

    L'avatar di cromagno
    Clicca e Apri
    Data Registrazione
    Aug 2015
    Località
    Sardegna
    Età
    37
    Messaggi
    3126
    Versione Office
    2013
    Utile ricevuti
    932
    Utile dati
    753

    Re: QUIZ (difficilino) del ConcaSomma (concatena e/o somma)

    Ciao a tutti,
    finalmente stasera ho potuto dedicarmi al "quiz difficilino" ( ) di scossa....
    Avevo visto che Anthony aveva già postato una soluzione ma non ho voluto guardarla per non farmi influenzare (certo, magari prima riuscendo a capirla ;) ), così come quella di Rubik72, che però mi sto accorgendo ora che anche lui ha usato il "Select case", ma la mia è molto più "terra terra".

    Comunque, sempre che abbia capito bene tutte le condizioni di questi cinesi :

    Codice: 
    Function ConcaSomma(Campo As Range, Sep As String) As Variant
    Dim i As Long, Somma As Variant, FinalText As Variant, Elementi As Long, j As Long
    Dim Cella As Range, X As Variant, Data As Variant, Testo As String, SommaGG As Long, Valore As Variant
    Dim Inizio As Boolean, Matr() As Variant, Piene As Long, Prima As Variant, Dopo As Variant
    Dim DopoDopo As Variant, Conta As Long
    
    
    Application.Volatile
    Elementi = Campo.Count
    Piene = Application.WorksheetFunction.CountA(Campo)
    ReDim Matr(1 To Piene)
    FinalText = ""
    Testo = ""
    Inizio = True
    j = 1
    
    
    If Campo.Columns.Count > 1 Then
        ConcaSomma = CVErr(xlErrRef)
        Exit Function
    End If
    
    
    For i = 1 To Elementi
        If Campo.Item(i) <> "" Then
            Matr(j) = Campo.Item(i)
            j = j + 1
        End If
    Next i
    
    
    Conta = 1
    For i = 1 To Piene
        X = VarType(Matr(i))
        Valore = Matr(i)
        Dopo = ""
        DopoDopo = ""
        If (i + 1) <= Piene Then Dopo = VarType(Matr(i + 1))
        If (i + 2) <= Piene Then DopoDopo = VarType(Matr(i + 2))
        If Inizio = True Then
            Somma = 0
            SommaGG = 0
            Select Case X
                Case 2 To 5 'numero
                    Somma = Somma + Valore
                    If Dopo = 7 Or Dopo = 8 Or Dopo = "" Then
                        FinalText = FinalText & Sep & Somma
                    Else
                        Inizio = False
                    End If
                Case 7  'data
                    If Dopo = X Or Dopo <= 5 Then
                        Conta = Conta + 1
                        Inizio = False
                    ElseIf Dopo = 8 Then
                        FinalText = FinalText & Sep & Valore
                    End If
                Case 8  'testo
                    Testo = Trim(Matr(i))
                    FinalText = FinalText & Sep & Testo
            End Select
        Else
            Prima = VarType(Matr(i - 1))
            Select Case X
                Case 2 To 5
                    Somma = Somma + Valore
                    If Prima = 7 Then
                        FinalText = FinalText & Sep & Matr(i - 1) + Valore
                        Inizio = True
                        ElseIf Dopo = 7 Or Dopo = 8 Or Dopo = "" Then
                        FinalText = FinalText & Sep & Somma
                        Inizio = True
                    End If
                Case 7
                    If Prima = 7 And (Conta Mod 2) = 0 Then
                        SommaGG = SommaGG + (Valore - Matr(i - 1))
                    End If
                    If Dopo > 5 And Dopo <> 7 Then
                        FinalText = FinalText & Sep & Valore - SommaGG
                        Inizio = True
                    Else
                        Conta = Conta + 1
                    End If
                Case 8
                    Testo = Matr(i)
                    FinalText = FinalText & Sep & Trim(Testo)
                    Somma = 0
            End Select
        End If
    Next i
    
    
    If IsNumeric(Trim(FinalText)) Then
        FinalText = CDbl(Trim(FinalText))
    Else
        FinalText = Trim(FinalText)
    End If
    ConcaSomma = FinalText
    End Function
    Forse ho lasciato qualche variabile inutilizzata o condizioni ripetute, ma mi stavo un pò incasinando ed ho preferito chiudere qui per oggi.

    N.B.
    Non funziona scrivendo direttamente la matrice nella formula... e sinceramente al momento non saprei come rimediare non avendo mai fatto una function che accettasse anche questo metodo (anche se ho letto poco fa da un post di Anthony che la soluzione dovrebbe essere con l'uso del ParamArray ).

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

  31. I seguenti utenti hanno dato un "Utile"


  32. #28
    L'avatar di Anthony
    Clicca e Apri
    Data Registrazione
    Sep 2016
    Località
    Ivrea (TO)
    Messaggi
    365
    Versione Office
    2003-2010-2016
    Utile ricevuti
    253
    Utile dati
    36

    Re: QUIZ (difficilino) del ConcaSomma (concatena e/o somma)

    C'E' LA PROPOSTA DI Cromagno, nel messaggio precedente a questo!

    Ho modificato il codice della mia ConcaSomma, e ora accetta sia riferimenti a Intervalli, esempio:
    Codice: 
    =ConcaSomma(D2:D12;"*";"gg")
    che a Matrici di valori; esempio:
    Codice: 
    =ConcaSomma({7\3\42\"Alfa"\"Bravo"};"*";"gg")
    Ho ottenuto questo aggiungendo un layer in testa a quanto gia' pubblicato, col compito di unificare i dati provenienti da Intervallo o da Matrice di valori.
    Il nuovo file che integra queste modifiche e' disponibile qui:
    https://www.dropbox.com/s/t9jvbewl4g...v2-0.xlsm?dl=0
    (il file precedente rimane in linea ma e' superato)

    Sul foglio c'e' un'area di test del comportamento della ConcaSomma, con varie combinazioni di dati e di formule.

    Mi sono permesso di integrare anche la Funzione di Rubik (rinominandola ConcaSommaRub), con le relative formule nell'area di test; ci sono comportamenti leggermente diversi nella gestione delle possibili sequenze di dati (al netto del fatto che non consente ancora di gestire il separatore, e non ha la gestione del suffisso per i calcoli in giorno).
    Solo Miclosoft potra' chiarire se e' piu' utile una gestione che un'altra.
    Non ho integrato anche la versione di Cromagno, che ho visto troppo tardi (che comunque e' presente rinominata ConcaSomma CRO).

    Il codice del layer aggiunto e' questo:
    Codice: 
    Function ConcaSomma(ParamArray myVals() As Variant) As Variant
    'Vedi http://www.forumexcel.it/forum/7-domande-su-excel-vba-e-macro/5196-quiz-difficilino-del-concasomma-concatena-e-o-somma
    'Vers by Anthony, Agg. B60923
    ' USO:
    '   =ConcaSomma(Intervallo;[Separatore opzionale; default=Spazio];[Marker di giorni, opzionale])
    '   esempio: =ConcaSomma(H2:H12;;"gg")
    'OPPURE
    '   =ConcaSomma({7\3\42\100};"*";"gg")
    Dim myVarr, mySep As String, myDM As String, I As Long
    '
    mySep = " "        'Lo standard
    '
    'Unifica i dati da Range o da Matrice di costanti:
    If TypeName(myVals(LBound(myVals))) = "Variant()" Then
        ReDim myVarr(LBound(myVals(LBound(myVals))) To UBound(myVals(LBound(myVals))), 1 To 2)
        For I = LBound(myVals(LBound(myVals))) To UBound(myVals(LBound(myVals)))
            myVarr(I, 1) = myVals(LBound(myVals))(I)
        Next I
    ElseIf TypeName(myVals(LBound(myVals))) = "Range" Then
        myVarr = myVals(LBound(myVals)).Value
    End If
    ' Parametri opzionali:
    If UBound(myVals) > 0 Then     'separatore
        If TypeName(myVals(LBound(myVals) + 1)) = "String" Then
            'If Len(myVals(LBound(myVals) + 1)) > 0 Then
            mySep = myVals(LBound(myVals) + 1)
        End If
        If UBound(myVals) > 1 Then    'Marker dei giorni
            If TypeName(myVals(LBound(myVals) + 2)) = "String" Then
                myDM = myVals(LBound(myVals) + 2)
            End If
        End If
    End If
    'End Layer 2.0 (versione B60923)
    Anche in questa versione gli ultimi due parametri sono opzionali, e rappresentano:
    -il separatore di campi da usare nel calcolo dei risultati; valore di default "spazio"
    -l'eventuale suffisso da aggiungere al calcolo dei giorni; valore di default, nessun suffisso
    Note:
    Nella Matrice di valori non e' possibile inserire Date; e' un limite imposto dal concetto di "matrice di valori" non della Funzione
    Se il risultato del calcolo e' una data, la Funzione restituisce correttamente una data ma la visualizzazione, con la cella formattata "Generale", sara' di tipo numerico; poiche' per definizione le Udf non possono modificare la formattazione delle celle, questa formattazione deve essere applicata manualmente (o tramite un automatismo parallelo esterno alla Udf)

    Per oggi basta cosi', come diceva Neruda "Domani e' un altro giorno, si vedrà"; o forse era Rossella?

    Ciao a tutti

  33. I seguenti utenti hanno dato un "Utile"


  34. #29
    L'avatar di dracoscrigno
    Clicca e Apri
    Data Registrazione
    May 2016
    Località
    ferrara
    Età
    40
    Messaggi
    1257
    Versione Office
    office pro 2010
    Utile ricevuti
    315
    Utile dati
    160

    Re: QUIZ (difficilino) del ConcaSomma (concatena e/o somma)

    una mezzoretta per scriverla. tre ore per non riuscire a trovare il problema.
    riferimento circolare.
    mi sono intestatdito a voler utilizzate cicli do ed una collection...
    mi sa che al posto di una risposta in questo thread, esco con un nuovo topic d' aiuto :D :D

  35. #30

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

    Re: QUIZ (difficilino) del ConcaSomma (concatena e/o somma)

    Citazione Originariamente Scritto da Anthony Visualizza Messaggio
    Edit: rileggendo il messaggio di scossa ho capito che lui alludeva proprio alla Tlim
    Infatti, mi lifelivo ploplio alla Tlim()
    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. [Risolto] Concatena
    Di Paolerrai nel forum Domande su Microsoft Access
    Risposte: 6
    Ultimo Messaggio: 20/12/16, 21:01
  2. [Risolto] Problema con Concatena
    Di sergiogranero nel forum Domande su Excel in generale
    Risposte: 3
    Ultimo Messaggio: 02/12/16, 11:18
  3. [Risolto] Problema CONCATENA
    Di saturn87 nel forum Domande su Excel in generale
    Risposte: 2
    Ultimo Messaggio: 30/07/16, 10:29
  4. somma.se testo concatena
    Di m.davide nel forum Domande su Excel in generale
    Risposte: 6
    Ultimo Messaggio: 09/11/15, 15:41
  5. Quiz #14 Somma con due criteri
    Di Gerardo Zuccalà nel forum Domande su Excel in generale
    Risposte: 9
    Ultimo Messaggio: 28/06/15, 16:34

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
  •