¿Cómo perfeccionar macro de text mining en excel?

Para Dante amor:

La macro actual es esta:

https://www.dropbox.com/s/baxpsjfyqqh9ujt/Macro%20separa%20texto.txt?dl=0 

El archivo es este:

https://www.dropbox.com/s/hi63ijlwweli91v/Ejemplo%20Dante%20Amor.xlsm?dl=0 

Primero que todo, la columna "C1" no se copia a la "Hoja2", sólo el nombre de columna "C1", pero en esta columna quedan los nombre individualizados de los autores. Lo ideal es que "C1" también se copie completa a la "Hoja2" y que se cree una columna al lado de "C1" que contenga al autor individualizado. Para que quedara así tuve que agregar "C1" con BUSCARV a la "Hoja2".

Lo otro es que cuando una celda tiene más de una cadena de texto con Univ Andres Bello, sólo separa el texto de la primera cadena, no generando filas y columnas para las demás cadenas de texto. Esto sucede cuando una publicación es de varias facultades o incluso de una misma facultad, pero los autores se ponen por separado, ya que pertenecen a distintos departamento o centros asociados a la misma facultad.

Te adjunto planilla con ejemplo para que lo veas.

En "Hoja1" están los datos originales.

En "Hoja2" lo que hace la macro.

Y en "separacion" ideal está como debería quedar.

Esta publicación (WOS:000382820000056) filtrada representa bien el problema (separación de texto de la primera cadena que contiene Univ Andres Bello en celda de columna C1).

Además, si pudieras agregarle a la macro (o bien en una diferente) que marque en negrita todo el texto de cada cadena que contenga Univ Andres Bello en las celdas de la columna C1 que se copie a la Hoja2, antes del autor individualizado. De esta forma:

[Carreno, A.; Paez-Hernandez, D.; Arratia-Perez, R.] Univ Andres Bello, Ctr Appl Nanosci CENAP, Fisicoquim Mol, Republ 275, Santiago, Chile; [Carreno, A.; Paez-Hernandez, D.; Manuel Manriquez, J.; Chavez, I.; Arratia-Perez, R.] ICM, Nucleo Milenio Ingn Mol Catalisis & Biosensores M, Santiago, Chile; [Gacitua, M.] Univ Adolfo Ibanez, Ctr Appl Ecol & Sustainabil CAPES, Penalolen, Chile; [Fuentes, J. A.] Univ Andres Bello, Fac Ciencias Biol, Lab Genet & Patogenesis Bacteriana, Republ 217, Santiago, Chile; [Penaloza, J. P.; Otero, C.] Univ Andres Bello, Fac Med, CIMIS, Echaurren 183, Santiago, Chile; [Preite, M.] Pontificia Univ Catolica Chile, Fac Quim, Dept Quim Organ, Ave Vicuna Mackenna 4860, Santiago, Chile; [Molins, E.] CSIC, Inst Ciencia Mat Barcelona ICMAB, Campus UAB, Barcelona 08193, Spain; [Swords, W. B.; Meyer, G. J.] Univ N Carolina, Dept Chem, Murray Hall 2202B, Chapel Hill, NC 27599 USA; [Manuel Manriquez, J.] Univ Bernardo OHiggins, Lab Bionanotecnol, Gen Gana 1702, Santiago, Chile; [Polanco, R.] Univ Andres Bello, Ctr Biotecnol Vegetal, Republ 217, Santiago, Chile; [Chavez, I.] Pontificia Univ Catolica Chile, Fac Quim, Dept Quim Inorgan, Ave Vicuna Mackenna 4860, Macul, Chile

Y por último, ¿con qué fórmula puedo contar la cantidad de veces que aparece Univ Andres Bello en una celda de la columna C1?

1 Respuesta

Respuesta
2

Te anexo la macro actualizada

Sub SepararTexto()
'Por.Dante Amor
    Application.ScreenUpdating = False
    Set h1 = Sheets("Hoja1")
    Set h2 = Sheets("Hoja2")
    h2.Cells.Clear
    co2 = "Q"       'columna destino resto
    h1.Range("A1,J1,K1,N1,O1,X1").Copy h2.[A1]
    h1.Range("Y1,Z1,AT1,AU1,AV1,BA1,BB1,BD1").Copy h2.Range(co2 & 1)
    '
    j = 2
    univ = "Univ Andres Bello"
    For i = 2 To h1.Range("A" & Rows.Count).End(xlUp).Row
        texto = h1.Cells(i, "X")
        n = InStr(1, texto, univ)
        If n > 0 Then
            ini = InStrRev(texto, "[", n)
            If ini > 0 Then
                fin = InStrRev(texto, "]", n)
                If fin > 0 Then
                    n = fin
                End If
                autor = Mid(texto, ini + 1, fin + 1 - ini - 2)
                autores = Split(autor, ";")
                fin2 = InStr(n, texto, "[") - 1
                If fin2 > 0 Then
                    resto = Mid(texto, n + Len(univ) + 4, fin2 - (n + Len(univ) + 5))
                    restos = Split(resto, ",")
                Else
                    resto = Mid(texto, n + Len(univ) + 4)
                    restos = Split(resto, ",")
                End If
                '
                For k = LBound(autores) To UBound(autores)
                    h2.Cells(j, "A") = h1.Cells(i, "A")
                    h2.Cells(j, "B") = h1.Cells(i, "J")
                    h2.Cells(j, "C") = h1.Cells(i, "K")
                    h2.Cells(j, "D") = h1.Cells(i, "N")
                    h2.Cells(j, "E") = h1.Cells(i, "O")
                    'h2.Cells(j, "F") = h1.Cells(i, "X") 'título C1
                    h1.Cells(i, "X").Copy h2.Cells(j, "F")  'título C1
                    h2.Cells(j, "G") = Trim(autores(k)) 'La primera parte
                    m = Columns("H").Column             'el resto
                    For l = LBound(restos) To UBound(restos)
                        h2.Cells(j, m) = Trim(restos(l))
                        m = m + 1
                    Next
                    h1.Range("Y" & i & ",Z" & i & ",AT" & i & ",AU" & i & ",AV" & i & _
                             ",BA" & i & ",BB" & i & ",BD" & i).Copy h2.Range(co2 & j)
                    j = j + 1
                Next
            End If
        Else
            'No existe la univ, entonces se copian las columnas
            h1.Range("A" & i & ",J" & i & ",K" & i & ",N" & i & ",O" & i & ",X" & i).Copy h2.Range("A" & j)
            h1.Range("Y" & i & ",Z" & i & ",AT" & i & ",AU" & i & ",AV" & i & _
                     ",BA" & i & ",BB" & i & ",BD" & i).Copy h2.Range(co2 & j)
            j = j + 1
        End If
    Next
    Application.ScreenUpdating = True
    MsgBox "Fin"
End Sub

Quedan pendientes las peticiones: separar el texto cuando hay más de una univ en la misma celda, poner en negritas y la fórmula.

'S aludos. Dante Amor. Recuerda valorar la respuesta. G racias

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas