Sequentielle Werte in einer einzelnen Zeile komprimieren (Microsoft Excel)
Rusty hat eine Liste mit Postleitzahlen in einer Spalte eines Arbeitsblatts. Er möchte eine Möglichkeit, die Codes so zu „komprimieren“, dass sich aufeinanderfolgende Wertebereiche in einer einzelnen Zeile befinden. Anstatt beispielsweise 35013, 35014 und 35015 drei Zeilen einzunehmen, werden sie in einer einzelnen Zeile als 35013-35015 angezeigt.
Es gibt verschiedene Möglichkeiten, dies zu tun – mit oder ohne Makros. Auf der Seite „ohne Makros“ des Zauns gibt es verschiedene Ansätze, und alle beinhalten die Verwendung zusätzlicher Spalten, um Zwischenergebnisse zu speichern.
Angenommen, Sie haben Ihre Daten in Spalte A, beginnend in Zelle A2, und die Zelle A1 ist leer (sie enthält nicht einmal Kopfzeilentext). In diesem Fall können Sie die folgende Formel in Zelle B2 eingeben:
=IF(NOT(A2-A1=1),A2,IF(A3-A2=1,B1,A2))
Geben Sie dann in Zelle C2 die folgende lange Formel ein:
=IF(NOT(A3-A2=1),IF(A2-A1=1,TEXT(B1,"00000") &" - "&TEXT(B2,"00000"),TEXT(A2,"00000")),"")
Jetzt können Sie die Formeln in den Zellen B2: C2 in die entsprechenden Spalten kopieren. Was Sie in Spalte C finden, ist die komprimierte Reihe von Postleitzahlen. Sie können diese Werte mit Paste Special kopieren, um leere Zellen zu ignorieren, an einen beliebigen anderen Ort.
Wenn Sie einen Makroansatz verwenden möchten, sind keine Zwischenspalten erforderlich. Es kann ein Makro geschrieben werden, das die Liste der vorhandenen Postleitzahlen im Wesentlichen reduziert. Das folgende Makro durchläuft den von Ihnen ausgewählten Zellenbereich und erstellt die komprimierte Liste:
Sub CombineValues() Dim rng As Range Dim rCell As Range Dim sNewArray() As String Dim x As Long Dim y As Long Dim sStart As String Dim sEnd As String Set rng = Selection sStart = rng.Cells(1) sEnd = sStart y = 1 For x = 1 To rng.Count - 1 If rng.Cells(x + 1) - _ rng.Cells(x) > 1 Then 'End ReDim Preserve sNewArray(1 To y) If sStart = sEnd Then sNewArray(y) = sStart Else sNewArray(y) = sStart & "-" & sEnd End If sStart = rng.Cells(x + 1) y = y + 1 End If sEnd = rng.Cells(x + 1) ReDim Preserve sNewArray(1 To y) If sStart = sEnd Then sNewArray(y) = sStart Else sNewArray(y) = sStart & "-" & sEnd End If Next rng.ClearContents For x = 1 To y rng.Cells(x) = "'" & sNewArray(x) Next Set rng = Nothing Set rCell = Nothing End Sub
_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 (3853) 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: