Estrazione di un motivo dall’interno del testo (Microsoft Excel)
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: