Dividere cella in più celle



  • Dividere cella in più celle
    di Ermes data: 19/11/2014 01:17:21

    Ciao ragazzi,

    ho bisogno di dividere le celle presenti nel file allegato, dove per ogni cella deve corrispondere un fondo. Con lo strumento "testo in colonne" non riesco perché essendo il contenuto della cella "testo a capo" e come se tutti i nomi dei fondi fossero uniti e quindi senza spazi.

    Confido nel vostro aiuto!



  • di Mister_x (utente non iscritto) data: 19/11/2014 09:41:44

    ciao

    L'allegato dov'e'????
    per allegare devi cliccare in alto a destra,se non si allega devi prima zipparlo

    ciao





  • di Ermes (utente non iscritto) data: 19/11/2014 11:14:41

    ho allegato il file, però ho dimezzato le righe (l'ultima cella è la A32936)



  • di Grograman (utente non iscritto) data: 19/11/2014 11:37:02

    Ma come va diviso?

    Ad esempio la cella A8 va divisa su 4 colonne come:
    France Innovation No 1 - France Innovation No 2 - France Innovation No 3 - Undisclosed Fund

    ?



  • di Grograman data: 19/11/2014 11:45:36

    Se così fosse ecco un idea con la funzione split:
     
    Option Explicit
    
    
    Sub splitta()
    Dim vSplit As Variant
    Dim i As Long, x As Long, k As Long
    x = Range("A" & Rows.Count).End(xlUp).Row
    For i = 2 To 100
      vSplit = Split(Cells(i, 1), Chr(10))
      If UBound(vSplit) > 0 Then
        For k = 0 To UBound(vSplit)
          Cells(i, k + 2) = vSplit(k)
        Next k
      Else
        Cells(i, 2) = vSplit(0)
      End If
    Next i
    End Sub



  • di Grograman data: 19/11/2014 11:46:26

    Ehm... ovviamente quel 1 to 100 è da intendersi 1 to x....

    Lo avevo sostituito per snellire l'esecuzione!



  • di Grograman data: 19/11/2014 11:53:48

    Oppure una UDF:



     
    Lato Cella in B2 scriverai:
    
    =Dividi_Titoli($A2;RIF.COLONNA())
    
    
    in un modulo generico:
    
    
    Option Explicit
    Public Function Dividi_Titoli(ByVal rCella As Range, ByVal iCol As Integer) As String
      Dim vSplit As Variant
      vSplit = Split(rCella, Chr(10))
      If iCol - 2 <= UBound(vSplit) Then
        Dividi_Titoli = vSplit(iCol - 2)
      Else
        Dividi_Titoli = ""
      End If
    End Function
    
    



  • di Mister_x (utente non iscritto) data: 19/11/2014 12:14:13

    ciao

    sub() costruita e poi adattata con il registratore di macro
    da inserire nel foglio in questione
    procedura
    1 crea un nuovo testo dove al posto di ritorno a capo metto un altro simbolo
    2 copio la colonna B:B modificata in C:C solo valori
    3 sulla colonna C:C eseguo il comando -- testo in colonne -- confermando quello che mi viene richiesto

    allego il tuo file modificato

    ciao
     
    Sub Macro1()
    
        Range("B1").Select
          ActiveCell.FormulaR1C1 = "=SUBSTITUTE(RC[-1],CHAR(10),"""")"
        Range("B1").Select
        Selection.Copy
        
        Range("B1:B" & Cells(Rows.Count, 1).End(xlUp).Row).Select
        ActiveSheet.Paste
        Columns("B:B").Select
        Application.CutCopyMode = False
        Selection.Copy
        Columns("C:C").Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
        Application.CutCopyMode = False
        Selection.TextToColumns Destination:=Range("C1"), DataType:=xlDelimited, _
            TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
            Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _
            :="", FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1)), _
            TrailingMinusNumbers:=True
    End Sub
    






  • di Ermes (utente non iscritto) data: 19/11/2014 12:56:46

    Vorrei suddividere tutto in un'unica colonna



  • di Grograman (utente non iscritto) data: 19/11/2014 13:03:56

    Non sono sicuro di averlo scritto bene, ma dovrebbe andare, ti riporta tutto in colonna 2.
    Occhio che se hai più di 1 milione e rotti titoli bisogna cambiare metodo.

     
    Option Explicit
    Sub splitta()
    Dim vSplit As Variant
    Dim i As Long, x As Long, k As Long, z As Long
    x = Range("A" & Rows.Count).End(xlUp).Row
    For i = 2 To x
      vSplit = Split(Cells(i, 1), Chr(10))
      If UBound(vSplit) > 0 Then
        For k = 0 To UBound(vSplit)
          z = Range("B" & Rows.Count).End(xlUp).Row + 1
          Cells(z, 2) = vSplit(k)
        Next k
      Else
        z = Range("B" & Rows.Count).End(xlUp).Row + 1
        Cells(z, 2) = vSplit(0)
      End If
    Next i
    End Sub
    
    



  • di Zer0Kelvin data: 19/11/2014 13:43:06

    Salve a tutti.
    Penso che ci saranno problemi col criterio di suddivisione; comunque, volendo utilizzare come criterio la presenza del ritorno a capo, si può anche usare questa variante
     
    Sub test()
    Dim R As Long, I As Long, S As Variant, Cella As Range
        Application.ScreenUpdating = False
        R = 2
        For Each Cella In Range("A2", Range("A2").End(xlDown))
            S = Split(Cella, vbLf)
            For I = LBound(S) To UBound(S)
                Cells(R, 2) = S(I)
                R = R + 1
            Next I
        Next Cella
        Application.ScreenUpdating = True
    End Sub
    



  • di Zer0Kelvin data: 19/11/2014 14:00:20

    PS:
    Volendo, si potrebbe facilmente suddividere l'elenco su più colonne.
    Penso che possa essere necessario un criterio particolare riguardo a "Undisclosed Fund" (eliminare?).



  • di Ermes (utente non iscritto) data: 19/11/2014 23:24:58

    Risolto!!!

    Grazie mille, gentilissimi come sempre!!!



  • di Zer0Kelvin data: 20/11/2014 07:04:57

    Ciao.
    Comunque volevo aggiungere un paio di considerazioni "accademiche":
    -la velocità di esecuzione migliora notevolmente aggiungendo
    Application.EnableEvents=False
    -l'utilizzo della condizione
    If UBound(vSplit) > 0...
    peggiora invece (impercettibilmente) le prestazioni della macro e si può eliminare.



  • di Grograman (utente non iscritto) data: 20/11/2014 08:35:23

    Ciao Zerok!

    Quindi basta un unico ciclo (quello con contatore K) che tanto farà solo uno step in caso l'array abbia un solo elemento?

    Ora che me lo dici pare ovvio in effetti
     
    Option Explicit
    
    Sub splitta()
    Dim vSplit As Variant
    Dim i As Long, x As Long, k As Long, z As Long
      x = Range("A" & Rows.Count).End(xlUp).Row
      Application.EnableEvents = False
      For i = 2 To x
        vSplit = Split(Cells(i, 1), Chr(10))
        For k = 0 To UBound(vSplit)
          z = Range("B" & Rows.Count).End(xlUp).Row + 1
          Cells(z, 2) = vSplit(k)
        Next k
      Next i
      Application.EnableEvents = True
    End Sub