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。