Extrahieren eines Musters aus Text (Microsoft Excel)
Tom hat ein Arbeitsblatt, das ungefähr 20.000 Zellen mit Textdaten enthält. Aus diesen Zellen muss er ein bestimmtes Textmuster extrahieren. Das Muster ist – #, wobei jedes # eine Ziffer ist. Dieses Muster erscheint nicht an einer festgelegten Stelle in jeder Zelle. Tom fragt sich, ob es eine Möglichkeit gibt, die gewünschten Informationen zu extrahieren.
Es gibt verschiedene Möglichkeiten, wie Sie dieses Problem angehen können. Die richtige Lösung für Ihre Anforderungen hängt von den Merkmalen der Daten ab, mit denen Sie arbeiten. Wenn Sie wissen, dass der einzige Ort in Ihren Daten, an dem Sie einen Bindestrich haben, innerhalb Ihres Musters liegt, können Sie das Vorhandensein des Bindestrichs mithilfe einer Formel wie der folgenden abtasten:
=MID(A1,FIND("-",A1)-2,8)
Dies findet den Bindestrich und greift dann nach den acht Zeichen, beginnend mit zwei Zeichen links vom Bindestrich. Dies funktioniert offensichtlich nicht, wenn an anderen Stellen im Text Bindestriche vorhanden sind oder wenn es möglich ist, „Muster“ zu haben, die nicht Ziffern enthalten (z. B. 12-34B32), und Sie diese ausschließen möchten. In diesem Fall benötigen Sie eine viel komplexere Formel:
=IF(ISERROR(INT(MID(A1, FIND("-", A1, 1)-2, 2)) & INT(MID( A1, FIND("-", A1, 1)+1, 5))), "", MID(A1, FIND("-", A1)-2, 8))
Dies beinhaltet eine Fehlerprüfungskomponente, die herausfindet, ob die Zeichen unmittelbar vor dem Bindestrich und unmittelbar nach dem Bindestrich etwas anderes als Ziffern enthalten. Wenn dies der Fall ist, wird nichts zurückgegeben.
Das einzige, was diese formelhaften Ansätze nicht tun, ist, Situationen zu behandeln, in denen das Muster in derselben Zelle mehr als einmal auftreten kann. In diesem Fall ist ein Makro der beste Ansatz. Im Folgenden werden die gültigen Muster extrahiert und in ein neues Arbeitsblatt mit dem Namen „Ergebnisse“ eingefügt.
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
Beachten Sie, dass das Makro die Like-Funktion an zwei Stellen verwendet. Die erste Instanz bestimmt, ob das Muster irgendwo in der Zelle auftritt, und die zweite Instanz wird verwendet, um zu bestimmen, ob die extrahierten Zeichen genau mit dem gewünschten Muster übereinstimmen.
_Hinweis: _
Wenn Sie wissen möchten, wie die auf dieser Seite (oder auf einer anderen Seite der ExcelTips-Websites) beschriebenen Makros verwendet werden, habe ich eine spezielle Seite vorbereitet, die hilfreiche Informationen enthält.
ExcelTips ist Ihre Quelle für kostengünstige Microsoft Excel-Schulungen.
Dieser Tipp (7348) gilt für Microsoft Excel 97, 2000, 2002 und 2003. Eine Version dieses Tipps für die Multifunktionsleistenschnittstelle von Excel (Excel 2007 und höher) finden Sie hier: