Funzione concatena personalizzata



  • Funzione concatena personalizzata
    di Bisettina (utente non iscritto) data: 30/09/2015 17:21:14

    Salve a tutti,
    Sono ancora alle prime armi con Excel e VBA.
    Dovrei concatenare una serie di celle, ma vorrei escludere un determinato valore dalla funzione. Ad esempio, ho una serie di parole e di numeri. Dovrei concatenarli tutti tranne tutti i valori 7. Se non seleziono la cella con il 7 è un problema, perchè può succedere che in quella cella capiti poi una parola. Mi serve proprio di escludere il valore. Per farlo devo ricorrere alla creazione di una nuova funzione in VBa? Se si, qualcuno può aiutarmi con la sintassi corretta?
    Grazie mille, chiedo scusa per l'ignoranza



  • di Cucù data: 30/09/2015 17:44:41

    Prova questa Funzione
    Cucù
     
    Option Explicit
    Function Bisettina(Rng As Range) As Variant
    Dim C As Range
    
    Application.Volatile
    For Each C In Rng
    
        If C.Value <> 7 Then
            Bisettina = Bisettina & C.Value
        End If
    
    Next C
    
    End Function



  • di Mister_x (utente non iscritto) data: 30/09/2015 17:51:15

    ciao

    quindi stando ai tuoi dati il valore 7 non deve eseere riportato ????
    non serve nessun VBA o artifizio basta includere la funzione Concatena in Sostrituisci
    ess i tuoi dati da A1 to A7
    a1
    2
    3
    a17
    17
    45
    pippo
    se usiamo =CONCATENA(A1;A2;A3;A4;A5;A6;A7) abbiamo questo valore ( a123a171745pippo )
    se includiamo concatena in sostituisci

    =SOSTITUISCI(CONCATENA(A1;A2;A3;A4;A5;A6;A7);"7";"") escludiamo i valori 7 ( a123a1145pippo )

    se e' questo che vuoi la formula e' questa, altrimenti posta un file con cosa vuoi fare e cosa ottenere

    ciao







  • di alfrimpa data: 30/09/2015 17:52:39

    Ciao Bisettina ed un saluto a Cucù e che è stato più veloce di me

    Ti propongo anche la mia anche se è pressoché uguale a quella di Cucù (la mia inserisce una virgola tra i vari valori

    Alfredo
     
    Function MioConcatena(rng As Range)
    Dim cel As Range
    Dim stringa As String
    For Each cel In rng
        If cel.Value <> 7 Then
            stringa = stringa & ", " & cel.Value
        End If
    Next cel
    MioConcatena = Mid(stringa, 2, 100)
    End Function
    






  • di mb data: 30/09/2015 19:02:14

    buonasera a tutti

    interessanti le soluzioni proposte chiedo però 2 chiarimenti

    a Cucu e alfredo nelle vostre funzioni se viene inserito ad esempio mar7io il risultato finale è il seguente

    1, 2, 3, mar7io, 5, 6, 8, 9, 10, pippo

    a Misterx invece chiedo se è semplificabile questa stringa

    =SOSTITUISCI(CONCATENA(A2&","&A3&A4&","&A5);"7";"")

    perchè come si può notare ho dovuto aggiungere n° volte la stringa &","& per poter fare una concatenazione comprensiva del simbolo virgola

    Grazie per l'attenzione





  • di alfrimpa data: 30/09/2015 19:18:12

    Ciao mb

    Io, come credo Cucù, ho risposto "alla cieca" non conoscendo la struttura dei dati.

    Se Bisettina ci fornirà un esempio le funzioni potranno essere "affinate"

    Alfredo







  • di Mister_x (utente non iscritto) data: 30/09/2015 19:38:43

    ciao mb

    apportando una piccola modifica alla funzione proposta di Alfredo si puo' risolvere questo inconveniente di inserire una virgola o uno spazio tra un valore di una cella e l'altra

    aspettando sempre una risposta da parte di Bisettina ti posto la funzione modificata che esclude a priori il numero 7

    ciao
     
    Function MioConcatena(rng As Range)
    Dim cel As Range
    Dim stringa As String
    Dim i As Long
    Dim val_s As Variant, ValS As Variant
    For Each cel In rng
    val_s = ""
      For i = 1 To Len(cel)
       ValS = Mid(cel, i, 1)
       If ValS <> "7" Then val_s = val_s & ValS
      Next i
     stringa = stringa & ", " & val_s
    Next cel
    MioConcatena = Mid(stringa, 2, 100)
    End Function
    






  • di alfrimpa data: 30/09/2015 19:59:04

    Ciao Mister_x

    Ho provato la tua function ma, a parte che vi sono un paio di doppie virgole, se in una cella c'è scritto gamma7 nel concatenamento viene riportato gamma ed il valore non viene escluso.

    Alfredo





  • di Mister_x (utente non iscritto) data: 30/09/2015 20:23:13

    ciao alfredo

    per le virgole in eccedenza e' abbastanza mettere un If di controllo
    da cosi'
    stringa = stringa & ", " & val_s
    a cosi'
    If val_s <> "" Then stringa = stringa & ", " & val_s

    se escludere tutto, da come ho capito nel post, bisogna solo escludere la lettera 7,
    comunque in questo caso apettiamo una delucidazione da parte di Bisettina per questo problema di inserimento al concatena

    ciao





  • di alfrimpa data: 30/09/2015 20:44:26

    Ho provato a modificare la mia routine come sotto ma la funzione restituisce #VALORE

    Perchè? Dove sbaglio?

    Alfredo
     
    Function MioConcatena(rng As Range)
    Dim cel As Range
    Dim stringa As String
    For Each cel In rng
        If IsError(Application.WorksheetFunction.Find("7", cel.Value)) Then
            stringa = stringa & ", " & cel.Value
        End If
    Next cel
    MioConcatena = Mid(stringa, 2, 100)
    End Function






  • di Mister_x (utente non iscritto) data: 30/09/2015 23:40:29

    ciao Alfredo

    usiamo la funzione di excel TROVA() dove vuole (cosa cercare;la stringa, la partenza)

    ciao


     
    Function MioConcatena(rng As Range)
    Dim cel As Range
    Dim stringa As String
    For Each cel In rng
        If IsError(Application.Find("7", cel.Value, 1)) Then
                stringa = stringa & ", " & cel.Value
        End If
    Next cel
    MioConcatena = Mid(stringa, 2, 100)
    End Function
    






  • di alfrimpa data: 01/10/2015 07:03:40

    Ciao Mister_x e grazie

    Lato foglio se scrivo TROVA("7";A1) funziona per cui pensavo che la posizione di partenza per default fosse 1 e non l'ho messa.

    Io non ho modo di provare ma la funzione così modificata opera correttamente almeno per quel che ne sappiamo?

    Alfredo





  • di Bisettina (utente non iscritto) data: 01/10/2015 15:34:37

    Grazie mille a tutti, le vostre proposte mi sono servite parecchio. Alla fine bastava usare insieme concatena e sostituisci, come mi ha suggerito Mister_x! però per fare più veloce, l'uso della funzione è più immediato, ora devo solo capire (e studiare) come modificare la sintassi che mi avete scritto per adattarla ai miei dati!!!così se vorrò potrò usarla. Sono proprio una principiante
    Grazie mille ancora




  • di Mister_x (utente non iscritto) data: 01/10/2015 18:09:50

    ciao

    tanto per passare il tempo ho applicato una modifica alla funzione di alfredo
    dove a questa bisogna passare 3 parametri
    MioConcatena(cosa eliminare ; lo stac che voglio inserire fra una parola e un'altra ; il Range ) ritorna una Stringa

    Utilizzo
    =MioConcatena("7";" ";A1:A3)
    lo stac puo' essere anche una stringa "" purche' si metta il Valore "", Pure quello da eliminare "" necessita di Nullo nel caso si adopera come Concatena()
    a ---------- a b-B2 c
    b7-B2
    c

    PS . Bisettina questa la puoi studiare nel suo funzionamento

    ciao
     
    Option Explicit
    Function MioConcatena(NoVal As String, Stac As String, rng As Range) As String
    Application.Volatile
    Dim cel As Range
    Dim stringa As String
    Dim i As Long
    Dim val_s As Variant, ValS As Variant
    For Each cel In rng
    val_s = ""
      For i = 1 To Len(cel)
       ValS = Mid(cel, i, 1)
       If ValS <> NoVal Then val_s = val_s & ValS
      Next i
     If val_s <> "" Then stringa = stringa & Stac & val_s
    Next cel
    If Len(Stac) = 0 Then Stac = " "
    MioConcatena = Trim(Mid(stringa, Len(Stac), 1000))
    End Function
    






  • di mb data: 02/10/2015 09:49:26

    buongiorno misterx

    complimenti per il suggerimento che ho scaricato e provveduto ad inserire nei miei manuali di autoformazione

    c'è solo un piccolo problema se ad esempio voglio inserire una , tra un numero e l'altro esce questo inconveniente sulla prima cifra, sicuramente ho sbagliato qualcosa io

    =MioConcatena3(7;",";A1:A9)

    risultato

    ,1,2,3,mario,5,6,8,9


    Grazie per l'attenzione e scusi il disturbo



  • di Mister_x (utente non iscritto) data: 02/10/2015 10:13:45

    ciao Mb

    piccola modifica alla Funzione

    ciao
     
    Function MioConcatena(NoVal As String, Stac As String, rng As Range) As String
    Application.Volatile
    Dim cel As Range
    Dim stringa As String
    Dim i As Long, St As Long  ''Qui
    Dim val_s As Variant, ValS As Variant
    For Each cel In rng
    val_s = ""
      For i = 1 To Len(cel)
       ValS = Mid(cel, i, 1)
       If ValS <> NoVal Then val_s = val_s & ValS
      Next i
     If val_s <> "" Then stringa = stringa & Stac & val_s
    Next cel
    St = Len(Stac) + 1  ''Qui
    MioConcatena = Trim(Mid(stringa, St, 1000))  ''Qui
    End Function
    






  • di mb data: 02/10/2015 10:32:55

    Grazie grazie
    alla prossima



  • di Bisettina (utente non iscritto) data: 03/10/2015 11:34:18

    Grazie mille Mister x!!!!!!!