Tom ha un foglio di lavoro che contiene circa 20.000 celle piene di dati testuali. Dall’interno di queste celle deve estrarre uno specifico modello di testo. Il modello è # dove ogni # è una cifra. Questo modello non appare in una posizione prestabilita in ogni cella. Tom si chiede se c’è un modo per estrarre le informazioni desiderate.

Esistono diversi modi per affrontare questo problema e la soluzione corretta per le tue esigenze dipenderà dalle caratteristiche dei dati con cui stai lavorando. Se sai che l’unico punto nei tuoi dati in cui avrai un trattino è all’interno del tuo schema, puoi eliminare la presenza del trattino usando una formula come la seguente:

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

Questo trova il trattino e quindi afferra i due caratteri a sinistra del trattino. Questo ovviamente non funzionerà se ci sono trattini in altri punti del testo o se è possibile avere “modelli” che includono cifre non numeriche (come 12-34B32) e vuoi escluderli. In tal caso avrai bisogno di una formula molto più complessa:

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

Ciò include un componente di controllo degli errori che rileva se i caratteri appena prima del trattino e subito dopo il trattino contengono qualcosa di diverso dalle cifre. Se lo fanno, non viene restituito nulla.

L’unica cosa che questi approcci formulari non fanno è gestire quelle situazioni in cui potrebbe esserci più di un’occorrenza del pattern all’interno della stessa cella. In tal caso, una macro è l’approccio migliore. Quanto segue estrarrà i modelli validi e li inserirà in un nuovo foglio di lavoro chiamato “Risultati”.

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

Notare che la macro utilizza la funzione Like in due posizioni. La prima istanza determina se il modello si trova in un punto qualsiasi della cella e la seconda istanza viene utilizzata per determinare se i caratteri estratti corrispondono esattamente al modello desiderato.

_Nota: _

Se desideri sapere come utilizzare le macro descritte in questa pagina (o in qualsiasi altra pagina dei siti ExcelTips), ho preparato una pagina speciale che include informazioni utili.

ExcelTips è la tua fonte di formazione economica su Microsoft Excel.

Questo suggerimento (12332) si applica a Microsoft Excel 2007, 2010, 2013 e 2016.

Puoi trovare una versione di questo suggerimento per la vecchia interfaccia del menu di Excel qui: