Trennung von Evens und Odds (Microsoft Excel)
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.