分隔偶数和奇数(Microsoft Excel)
Dimitris在A列中具有一系列整数值。他想要一种方法来显示B列中的奇数和C列中的偶数。他希望这些值位于连续的单元格中,没有空格,并且也应升序排列。 Dimitris想知道他是否需要一个宏来以这种方式处理数据。
简短的答案是,您确实可以在不使用宏的情况下执行此操作。但是,如果您需要大量执行此类处理,则可能会发现实际使用宏更为有益。
首先,让我们看一下非宏观方法。如果需要,您可以在B和C列中编写简单的公式,以简单地检查A列中的值是奇数还是偶数,并且如果适合该列,则将值复制过来。例如,您可以在B列中包含以下内容:
=IF(ISODD(A1),A1,"")
在C列中,您需要做的就是用ISEVEN替换ISODD。向下复制这些公式时,列B仅包含奇数值,列C仅包含偶数值。当然,问题在于结果与Dimitris所寻找的结果不匹配:他想要连续单元格中的值(无空格),并且希望它们以升序排列。
当然,您可以采取其他步骤来获得所需的结果-例如,您可以将结果复制到B和C列中并粘贴回值(因此将公式删除),然后对结果进行排序。这将为您的工作增加其他步骤。
有一种方法可以简单地使用数组公式来获得更“干净”的结果。假设您的值位于单元格A1:A100中。选中单元格B1:B100,在编辑栏中输入以下内容:
=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()),"")
请记住,这都是一个公式。由于它被设计为数组公式,因此可以通过输入Ctrl + Shift + Enter终止它。结果是您在B列的连续单元格中具有按升序排列的奇数值。要将偶数值输入C列,请首先将B1:B100复制到C1:C100。然后,选择范围C1:C100。按F2进入编辑模式,然后将公式中间的“ = 1”更改为“ = 0”。
同样,通过按Ctrl + Shift + Enter终止公式。
您应该注意,如果A1:A100范围内有空格或该范围内有任何文本值,则此公式将无法正常工作。空白不起作用的原因是,它们在公式上被视为0,并且将0视为偶数,因此出现在C列中。确定奇数值(B列)的另一种公式是使用以下数组公式在单元格B1中:
=IFERROR(SMALL(IF(MOD($A$1:$A$100,2)>0,$A$1: $A$100,"x"),ROW()),"")
要解决潜在的“空白单元格”问题,您可以在单元格C1中使用以下数组公式:
=IFERROR(SMALL(IF((MOD($A$1:$A$100,2)=0)*NOT( ISBLANK($A$1:$A$100)),$A$1:$A$100,"x"),ROW()),"")
复制B1:C1尽可能多的单元格以获得所需的结果。
之前我提到过,使用宏处理值可能会更有益。原因很简单-您可以轻松摆脱重复的值(如果需要),并且可以忽略空格和文本值。开发宏的方法有很多种。我选择了一种方法,要求您选择要处理的单元格,清除这些单元格右侧的两列,然后在这些列中放入奇数和偶数。
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
宏通过将选定单元格中的值填充到两个数组(iEvens和iOdds)中的任意一个来完成其工作。这样做是为了使宏可以轻松检查值中的重复项。仅当单元格不为空时,它包含一个数字,并且该数字不是重复的数字,该值才会添加到适当的数组中。然后将这些值填充回两列中,并对这些值进行排序。
_ExcelTips_是您进行经济高效的Microsoft Excel培训的来源。
本技巧(6767)适用于Microsoft Excel 2007、2010、2013和2016。