concatena celle macro



  • concatena celle macro
    di martyf (utente non iscritto) data: 03/08/2016 12:43:46

    vorrei sviluppare macro x concatenare elenco di celle in Excel, come devo fare?

    esempio:

    INPUT
    colonna A
    riga1
    riga2


    RISULTATO DESIDERATO
    colonna A
    riga1riga2 (è LA CONCATENAZIONE DELLE CELLE IN FORMATO STRINGA)


    grazie



  • di patel data: 03/08/2016 12:45:07

    allega un file di esempio con dati e RISULTATO DESIDERATO





  • di martyf (utente non iscritto) data: 03/08/2016 12:50:07

    vorrei concatenare tutta la colonna A :

    ('10543','10833',….=

    ho inserito il file!



  • di Vecchio Frac data: 03/08/2016 13:04:35

    @martyf
    Ti sei spiegato bene, adesso fai lo sforzo di scrivere o abbozzare il codice necessario per ottenere il risultato.
    Se non conosci VBA descrivi l'algoritmo a parole tue, poi per la sintassi corretta vedremo.

    Fermo restando che esistono anche dei limiti a quanti caratteri può ospitare una cella.





  • di martyf (utente non iscritto) data: 03/08/2016 13:17:55

    dovrebbe essere un ciclo for che concatena in un unica stringa tutte le celle, dalla prima all'ultima



  • di Vecchio Frac data: 03/08/2016 13:34:59

    Benissimo, quindi hai anche una certa padronanza tecnica perlomeno della terminologia da utilzziare.
    Adesso stendi una sub di prova e vediamo cosa salta fuori :)






  • di martyf (utente non iscritto) data: 03/08/2016 13:41:36

    Sub Macro1()
    '
    ' Macro1 Macro
    '

    '
    ActiveCell.FormulaR1C1 = _
    "=CONCATENATE(RC[-2],R[1]C[-2],R[2]C[-2],R[3]C[-2],R[4]C[-2],R[5]C[-2],R[6]C[-2],R[7]C[-2],R[8]C[-2])"
    Range("C2").Select
    End Sub



  • di Vecchio Frac data: 03/08/2016 14:10:09

    E qui mescoli codice VBA con formula Excel :)
    Inoltre non si vede traccia del ciclo For che pure citi.
    Quindi in VBA puro?





  • di martyf (utente non iscritto) data: 03/08/2016 15:01:19

    NON SO USARE LE MACRO QUINDI PER QUELLO NON VEDI INSERITO IL CICLO NELLA MACRO.

    LA MACRO CHE HO RIPORTATO E' UN ACCENNO, MA CREDO SIA SBAGLIATA COMPLETAMENTE L'IMPOSTAZIONE. IL RAGIONAMENTO PIU CORRETTO, COME TI DICEVO, DOVREBBE ESSERE QUELLO DEL FOR CHE PERO' NON SO USARE QUA :(

    grz



  • di alfrimpa data: 03/08/2016 16:12:47

    Ciao martyf

    Quello che intendeva dire VF è che oltre a proporre il quesito l'utente dovrebbe un po' "sforzarsi" e non limitarsi a dire che di macro/VBA non ne sa nulla; e poi questo forum si chiama ExcelVBA per cui chi fa le domande un minimo di conoscenza del linguaggio la dovrebbe avere e oggi gli strumenti per poter acquisire tali conoscenze certamente non mancano.

    Chiunque risponda ha dovuto impiegare tanto tempo in studio e prove per imparare.

    Comunque la macro che vedi sotto fa quello che chiedi; riesci a capirla?

    Alfredo
     
    Sub prova()
    Dim i As Long
    Dim ur As Long
    Dim risultato As String
    ur = Cells(Rows.Count, 1).End(xlUp).Row
    For i = 1 To ur
        risultato = risultato & " " & Range("a" & i).Value
    Next i
    ActiveCell.Value = risultato
    End Sub
    
    






  • di martyf (utente non iscritto) data: 03/08/2016 16:24:48

    grazie mille!!! è perfetto.. inizierò a studiare il linguaggio VBA da domani :)



  • di Vecchio Frac data: 03/08/2016 19:31:18

    @alfri
    Pensa che volevo farlo arrivare a capire una cosa come questa ^_^



     
    Sub prova()
    Dim ur As Long
        ur = Cells(Rows.Count, 1).End(xlUp).Row
        activecell = join(application.transpose(range("A1:A" & ur)), " ")
    End Sub
    






  • di alfrimpa data: 03/08/2016 19:43:05

    Questa non la capisco neanch'io

    Ma si sa che a questo mondo nessuno nasce "imparato"

    Alfredo





  • di Vecchio Frac data: 03/08/2016 21:19:35

    cit. "si sa che a questo mondo nessuno nasce "imparato" "
    ---> Tranne "Alfredo", lo so ^_^

    cit. "non la capisco neanch'io"
    ---> Ma daiii... sistema i valori contenuti nel range "A1:A..." in un vettore a una dimensione e quindi unisci i singoli elementi di tale vettore in un'unica stringa, separandoli con uno spazio vuoto. Quindi assegna il risultato alla cella attiva ^_^ (si poteva eliminare anche ur e scrivere tutto su una riga sola in effetti)





  • di alfrimpa data: 03/08/2016 21:30:22

    A dire il vero a vederla l'avevo già vista ma non avevo approfondito l'argomento.

    Domani la "provo" un po' così, sono certo, alla prima occasione me me ricorderò.

    E poi io dico sempre: "non esistono cose facili o difficili; esistono cose che si sanno e cose che non si sanno"

    Grazie Francesco.

    Alfredo





  • di Luca73 data: 04/08/2016 10:38:20

    Ciao a tutti
    mi inchino....io ero arrivato a quanto postato sotto.
    Penso che VF mi abbia già detto che non serve inizializzare le stringhe a "" e gli interi a 0 in quanto è il defoult,....però talvolta non mi fido troppo della mia memoria....

    Ciao
    Luca
     
    Sub Concatena_Luca()
    Dim Stringa As String
    Dim Indice as Long
    Indice = 0
    Stringa = ""
    Do
    Stringa = Stringa & Range("A1").Offset(Indice, 0).Text
    Indice = Indice + 1
    Loop Until Range("A1").Offset(Indice, 0).Text = ""
    Range("B1").Formula = Stringa
    End Sub






  • di Vecchio Frac data: 04/08/2016 12:07:59

    @luca73
    cit. "mi inchino"
    ---> solo se devi raccogliere il sapone, e solo se nella doccia sei da solo, altrimenti è un rischio ^_^

    cit. "non serve inizializzare le stringhe a "" e gli interi a 0 in quanto è il default"
    ---> Se imposti Option Explicit in testa al modulo, l'affermazione è garantita al limone :)






  • di alfrimpa data: 04/08/2016 12:21:41

    Cit. VF "---> solo se devi raccogliere il sapone, e solo se nella doccia sei da solo, altrimenti è un rischio ^_^"

    Questa me la segno.

    Alfredo





  • di Luca73 data: 04/08/2016 14:06:03

    Ciao VF
    due domande.
    1) A prescindere che, grazie al vostri suggerimenti, io l'Option Explicit ce l'ho sempre, pensavo che agisse solo a livello di scrittura codice non anche a livello di inizializzazioni variabili.
    2) join funziona solo con una range orizzontale non con uno verticale (tant'è che hai dovuto fate uin traspose) come mai?

    Ciao
    Luca






  • di Vecchio Frac data: 04/08/2016 15:28:42

    1) Hai ragione tu, la visibilità di una variabile non c'entra con la dichiarazione obbligatoria. Però con Option Explicit mi costringo a dichiarare per forza una variabile se la utilizzo, a meno che non sia stata dichiarata pubblica fuori dal modulo (in questo caso perdo la garanzia che se la uso sia inizializzata ai valori di default).

    2) Join funziona con vettori monodimensionali. Le celle di Excel in realtà sono bidimensionali (riga, colonna) e Transpose funziona con le colonne perchè porta i valori di riga in un vettore monodimensionale perdendo la colonna (in "A1:A10" la colonna è una sola). Il trucco non funziona per valori posti su una riga ma più colonne (come in "A1:E1") perchè la prima dimensione è 1 (una riga) ma la seconda dimensione non è pari a 1.





  • di Vecchio Frac data: 04/08/2016 15:40:24

    Al proposito di appiattire un range, allego una funzioncina che ho scritto tempo fa.
     
    Option Explicit
    
    Function flatten(ByVal r As Range, Optional delimiter As String = "", _
    Optional bycol As Boolean = False) As String
    'appiattisce un range riga per riga e restituisce una stringa
    '(solo celle non vuote) ' si può specificare un delimitatore tra i
    'diversi valori e se si specifica "bycol:=True", l'appiattimento è
    'effettuato colonna per colonna
    
    Dim vect() As Variant, v As Variant, i As Integer, s As String
    Dim col As Range
        
        If bycol Then
            If r.Rows.Count = 1 Then
                flatten = flatten(r, delimiter, False)
                Exit Function
            End If
            s = ""
            For Each col In r.Columns
                s = s & Join(Application.Transpose(col), delimiter)
            Next
            flatten = s
        Else
            ReDim vect(0 To r.Cells.Count - 1)
            For Each v In r.Cells
                vect(i) = v
                i = i + 1
            Next
        
            flatten = Join(vect, delimiter)
        End If
    End Function