Dimitris hat eine Reihe von ganzzahligen Werten in Spalte A. Er möchte eine Möglichkeit, die ungeraden Werte in Spalte B und die geraden Werte in Spalte C anzuzeigen. Er möchte, dass sich die Werte in zusammenhängenden Zellen ohne Leerzeichen befinden und auch in aufsteigender Reihenfolge. Dimitris fragt sich, ob er ein Makro benötigen würde, um seine Daten auf diese Weise zu verarbeiten.

Die kurze Antwort lautet, dass Sie dies tatsächlich tun können, ohne auf ein Makro zurückzugreifen. Wenn Sie diese Art der Verarbeitung jedoch häufig ausführen müssen, ist es möglicherweise vorteilhafter, ein Makro tatsächlich zu verwenden.

Schauen wir uns zunächst die nicht-makroökonomischen Ansätze an. Falls gewünscht, können Sie einfache Formeln in die Spalten B und C schreiben, die einfach prüfen, ob der Wert in Spalte A ungerade oder gerade ist, und, falls dies für die Spalte angemessen ist, den Wert kopieren. In Spalte B könnten Sie beispielsweise Folgendes haben:

=IF(ISODD(A1),A1,"")

In Spalte C müssen Sie lediglich ISODD durch ISEVEN ersetzen. Wenn Sie diese Formeln nach unten kopieren, enthält Spalte B nur ungerade Werte und Spalte C enthält nur gerade Werte. Das Problem ist natürlich, dass das Ergebnis nicht dem entspricht, wonach Dimitris sucht: Er möchte die Werte in zusammenhängenden Zellen (keine Leerzeichen) und er möchte sie in aufsteigender Reihenfolge.

Zugegeben, Sie können zusätzliche Schritte ausführen, um die gewünschten Ergebnisse zu erzielen. Sie können beispielsweise die Ergebnisse in die Spalten B und C kopieren und Werte zurückfügen (damit die Formeln entfernt werden) und dann die Ergebnisse sortieren. Dies fügt Ihrer Arbeit zusätzliche Schritte hinzu.

Es gibt eine Möglichkeit, durch einfache Verwendung einer Array-Formel ein viel „saubereres“ Ergebnis zu erzielen. Nehmen wir an, Sie befinden sich in den Zellen A1: A100. Geben Sie bei ausgewählten Zellen B1: B100 Folgendes in die Formelleiste ein:

=IFERROR(SMALL(IFERROR(INDEX($A$1:$A$100,SMALL( IF(MOD($A$1:$A$100,2)=1,ROW($A$1:$A$100)),ROW( $A1:$A$100))),""),ROW()),"")

Denken Sie daran, dass dies alles eine einzige Formel ist. Da es sich um eine Array-Formel handelt, beenden Sie sie mit Strg + Umschalt + Eingabetaste. Das Ergebnis ist, dass Sie die ungeraden Werte in Spalte B in zusammenhängenden Zellen in aufsteigender Reihenfolge haben. Um die geraden Werte in Spalte C zu erhalten, kopieren Sie zuerst B1: B100 nach C1: C100. Wählen Sie dann den Bereich C1: C100. Drücken Sie F2, um den Bearbeitungsmodus aufzurufen, und ändern Sie „= 1“ in der Mitte der Formel in „= 0“.

Beenden Sie die Formel erneut, indem Sie Strg + Umschalt + Eingabetaste drücken.

Sie sollten beachten, dass diese Formel nicht richtig funktioniert, wenn Leerzeichen im Bereich A1: A100 vorhanden sind oder wenn Textwerte im Bereich vorhanden sind. Der Grund dafür, dass Leerzeichen nicht funktionieren, liegt darin, dass sie formelhaft als 0 behandelt werden und eine 0 als gerade betrachtet wird. Dies wird in Spalte C angezeigt. Eine alternative Formel zur Bestimmung ungerader Werte (Spalte B) ist die Verwendung der folgenden Array-Formel in Zelle B1:

=IFERROR(SMALL(IF(MOD($A$1:$A$100,2)>0,$A$1:

$A$100,"x"),ROW()),"")

Um das potenzielle Problem mit „leeren Zellen“ zu lösen, können Sie in Zelle C1 die folgende Array-Formel verwenden:

=IFERROR(SMALL(IF((MOD($A$1:$A$100,2)=0)*NOT( ISBLANK($A$1:$A$100)),$A$1:$A$100,"x"),ROW()),"")

Kopieren Sie B1: C1 so viele Zellen wie nötig, um Ihre Ergebnisse zu erhalten.

Ich habe bereits erwähnt, dass es möglicherweise vorteilhafter ist, ein Makro zur Verarbeitung Ihrer Werte zu verwenden. Der Grund ist einfach: Sie können doppelte Werte leicht entfernen (falls erforderlich) und Leerzeichen und Textwerte ignorieren. Es gibt eine Reihe von Möglichkeiten, wie ein solches Makro entwickelt werden könnte. Ich habe einen Ansatz gewählt, bei dem Sie auswählen müssen, welche Zellen Sie verarbeiten möchten, die beiden Spalten rechts von diesen Zellen löschen und dann Quoten und Gleichungen in diese Spalten einfügen.

Sub OddsEvens()

Dim rSource As Range     Dim c As Range     Dim sTemp As String     Dim iVal As Integer     Dim bGo As Boolean     Dim sCols As String     Dim vMsg As Variant     Dim lOddCol As Long     Dim iOddPtr As Integer     Dim lEvenCol As Long     Dim iEvenPtr As Integer     Dim iOdds(999) As Integer     Dim iEvens(999) As Integer     Dim J As Integer

Set rSource = Selection     If rSource.Columns.Count = 1 Then         lOddCol = rSource.Column + 1         lEvenCol = rSource.Column + 2         sCols = Chr(lOddCol + 64) & ":"

sCols = sCols & Chr(lEvenCol + 64)



sTemp = "The contents of columns " & sCols         sTemp = sTemp & " will be deleted. Ok to proceed?"

vMsg = MsgBox(sTemp, vbYesNo, "Odds and Evens")

If vMsg = vbYes Then             Application.ScreenUpdating = False             Range(sCols).Clear             iOddPtr = 0             iEvenPtr = 0             For Each c In rSource                 bGo = True                 ' Is the cell empty?

If IsEmpty(c.Value) Then bGo = False                 ' Does the cell contain non-numeric value?

If Not IsNumeric(c.Value) Then bGo = False                 If bGo Then                     iVal = c.Value                     If Int(iVal / 2) * 2 = iVal Then                         ' Even number                         ' Check to see if duplicate                         For J = 1 To iEvenPtr                             If iEvens(J) = iVal Then bGo = False                         Next J                         If bGo Then                             iEvenPtr = iEvenPtr + 1                             iEvens(iEvenPtr) = iVal                         End If                     Else                         'Odd number                         ' Check to see if duplicate                         For J = 1 To iOddPtr                             If iOdds(J) = iVal Then bGo = False                         Next J                         If bGo Then                             iOddPtr = iOddPtr + 1                             iOdds(iOddPtr) = iVal                         End If                     End If                 End If             Next c

' Stuff values into proper columns             For J = 1 To iOddPtr                 Cells(rSource.Row + J - 1, lOddCol) = iOdds(J)

Next J             For J = 1 To iEvenPtr                 Cells(rSource.Row + J - 1, lEvenCol) = iEvens(J)

Next J

' Sort values in Odd column             sTemp = Chr(lOddCol + 64) & rSource.Row & ":"

sTemp = sTemp & Chr(lOddCol + 64) & rSource.Row _               + iOddPtr - 1             Range(sTemp).Select             Selection.Sort key1:=Range(Chr(lOddCol + 64) _               & rSource.Row), Order1:=xlAscending

' Sort values in Even column             sTemp = Chr(lEvenCol + 64) & rSource.Row & ":"

sTemp = sTemp & Chr(lEvenCol + 64) & rSource.Row _               + iEvenPtr - 1             Range(sTemp).Select             Selection.Sort key1:=Range(Chr(lEvenCol + 64) _               & rSource.Row), Order1:=xlAscending

rSource.Select             Application.ScreenUpdating = True         End If     End If End Sub

Das Makro erledigt seine Arbeit, indem es Werte aus den ausgewählten Zellen in eines von zwei Arrays (iEvens und iOdds) stopft. Dies geschieht, damit das Makro leicht nach Duplikaten in den Werten suchen kann. Nur wenn die Zelle nicht leer ist, enthält sie eine Zahl, und diese Zahl ist kein Duplikat. Der Wert wird dem entsprechenden Array hinzugefügt. Die Werte werden dann wieder in die beiden Spalten eingefügt und diese Werte werden sortiert.

ExcelTips ist Ihre Quelle für kostengünstige Microsoft Excel-Schulungen.

Dieser Tipp (6767) gilt für Microsoft Excel 2007, 2010, 2013 und 2016.