Tom tiene una hoja de trabajo que contiene unas 20.000 celdas llenas de datos textuales. Desde dentro de estas celdas, necesita extraer un patrón específico de texto. El patrón es # donde cada # es un dígito. Este patrón no aparece en un lugar determinado en cada celda. Tom se pregunta si hay alguna forma de extraer la información deseada.

Hay varias formas de abordar este problema, y ​​la solución correcta a sus necesidades dependerá de las características de los datos con los que esté trabajando. Si sabe que el único lugar en sus datos en el que tendrá un guión es dentro de su patrón, puede eliminar la presencia del guión utilizando una fórmula como la siguiente:

=MID(A1,FIND("-",A1)-2,8)

Esto encuentra el tablero y luego agarra a los dos personajes a la izquierda del tablero. Obviamente, esto no funcionará si hay guiones en otros lugares del texto o si es posible tener «patrones» que incluyan no dígitos (como 12-34B32) y desea excluirlos. En ese caso, necesitará una fórmula mucho más compleja:

=IF(ISERROR(INT(MID(A1, FIND("-", A1, 1)-2, 2)) & INT(MID( A1, FIND("-", A1, 1)+1, 5))), "", MID(A1, FIND("-", A1)-2, 8))

Esto incluye un componente de verificación de errores que descubre si los caracteres justo antes del guión y justo después del guión contienen algo más que dígitos. Si lo hacen, no se devuelve nada.

Lo único que estos enfoques formulados no hacen es manejar aquellas situaciones en las que puede haber más de una ocurrencia del patrón dentro de la misma celda. En ese caso, una macro es el mejor enfoque. Lo siguiente extraerá los patrones válidos y los colocará en una nueva hoja de trabajo llamada «Resultados».

Sub ExtractPattern()

On Error Resume Next     Set SourceSheet = ActiveSheet     Set TargetSheet = ActiveWorkbook.Sheets("Results")

If Err = 0 Then         Worksheets("Results").Delete     End If     Worksheets.Add     ActiveSheet.Name = "Results"

Set TargetSheet = ActiveSheet     Cells(1, 1).Value = "Found Codes"

Cells(1, 1).Font.Bold = True     iTargetRow = 2

SourceSheet.Select     Selection.SpecialCells(xlCellTypeLastCell).Select     Range(Selection, Cells(1)).Select

For Each c In Selection.Cells         If c.Value Like "##-#####" Then             sRaw = c.Value             iPos = InStr(sRaw, "-")

Do While iPos > 0                 If iPos < 3 Then                     sRaw = "  " & sRaw                     iPos = iPos + 2                 End If                 sTemp = Mid(sRaw, iPos - 2, 8)

sRaw = Mid(sRaw, iPos + 6, Len(sRaw))

If sTemp Like "##-#####" Then                     TargetSheet.Cells(iTargetRow, 1) = sTemp                     iTargetRow = iTargetRow + 1                 Else                     sRaw = Mid(sTemp, 4, 5) & sRaw                 End If                 iPos = InStr(sRaw, "-")

Loop         End If     Next c End Sub

Tenga en cuenta que la macro utiliza la función Me gusta en dos lugares. La primera instancia determina si el patrón ocurre en cualquier lugar de la celda, y la segunda instancia se usa para determinar si los caracteres extraídos coinciden exactamente con el patrón deseado.

_Nota: _

Si desea saber cómo usar las macros descritas en esta página (o en cualquier otra página de los sitios ExcelTips), he preparado una página especial que incluye información útil.

link: / excelribbon-ExcelTipsMacros [Haga clic aquí para abrir esa página especial en una nueva pestaña del navegador].

ExcelTips es su fuente de formación rentable en Microsoft Excel.

Este consejo (12332) se aplica a Microsoft Excel 2007, 2010, 2013 y 2016.

Puede encontrar una versión de este consejo para la interfaz de menú anterior de Excel aquí:

link: / excel-Extracting_a_Pattern_from_within_Text [Extraer un patrón desde dentro del texto].