Dimitris tiene una serie de valores enteros en la columna A. Le gustaría una forma de mostrar los valores impares en la columna B y los valores pares en la columna C. Quiere que los valores estén en celdas contiguas, sin espacios, y también en orden ascendente. Dimitris se pregunta si necesitaría una macro para procesar sus datos de esta manera.

La respuesta corta es que, de hecho, puede hacer esto sin recurrir a una macro. Sin embargo, si necesita realizar mucho este tipo de procesamiento, puede que le resulte más beneficioso utilizar una macro.

Primero, veamos los enfoques no macro. Si lo desea, puede escribir fórmulas simples en las columnas B y C que simplemente verifiquen si el valor en la columna A es par o impar y, si es apropiado para la columna, copiar el valor. Por ejemplo, podría tener lo siguiente en la columna B:

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

En la columna C, todo lo que necesita hacer es reemplazar ISODD con ISEVEN. Cuando copia estas fórmulas, la columna B contiene solo valores impares y la columna C contiene solo valores pares. El problema, por supuesto, es que el resultado no coincide con lo que busca Dimitris: quiere los valores en celdas contiguas (sin espacios en blanco) y los quiere en orden ascendente.

Por supuesto, puede tomar pasos adicionales para obtener los resultados deseados; por ejemplo, puede copiar los resultados en las columnas B y C y pegar los valores (para que las fórmulas se eliminen) y luego ordenar los resultados. Esto agrega pasos adicionales a su trabajo.

Hay una manera de obtener un resultado mucho más «más limpio» simplemente usando una fórmula de matriz. Supongamos que sus valores están en las celdas A1: A100. Con las celdas B1: B100 seleccionadas, ingrese lo siguiente en la barra de fórmulas:

=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()),"")

Recuerde que todo esto es una sola fórmula. Dado que está diseñado para ser una fórmula de matriz, ciérrelo ingresando Ctrl + Shift + Enter. El resultado es que tiene los valores impares en la columna B, en celdas contiguas, en orden ascendente. Para obtener los valores pares en la columna C, primero copie B1: B100 a C1: C100. Luego, seleccione el rango C1: C100. Presione F2 para ingresar al modo de edición y cambie el «= 1» en el medio de la fórmula a «= 0».

Nuevamente, termine la fórmula presionando Ctrl + Shift + Enter.

Debe tener en cuenta que esta fórmula no funcionará correctamente si hay espacios en blanco en el rango A1: A100 o si hay valores de texto en el rango. La razón por la que los espacios en blanco no funcionan es porque se tratan como un 0 de manera formulada, y un 0 se considera par, por lo que aparece en la columna C.Una fórmula alternativa para determinar valores impares (columna B) es usar la siguiente fórmula de matriz en la celda B1:

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

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

Para solucionar el problema potencial de la «celda en blanco», puede utilizar la siguiente fórmula de matriz en la celda C1:

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

Copie B1: C1 tantas celdas como sea necesario para obtener sus resultados.

Anteriormente mencioné que puede resultarle más beneficioso utilizar una macro para procesar sus valores. La razón es simple: puede deshacerse fácilmente de los valores duplicados (si es necesario) y puede ignorar los espacios en blanco y los valores de texto. Hay varias formas de desarrollar una macro de este tipo; Elegí un enfoque que requiere que seleccione las celdas que desea procesar, borre las dos columnas a la derecha de esas celdas y luego coloque probabilidades e pares en esas columnas.

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

La macro hace su trabajo rellenando los valores de las celdas seleccionadas en cualquiera de las dos matrices (iEvens e iOdds). Esto se hace para que la macro pueda verificar fácilmente si hay duplicados en los valores. Solo si la celda no está vacía, contiene un número, y ese número no es un duplicado, el valor se agregará a la matriz correspondiente. Luego, los valores se vuelven a colocar en las dos columnas y esos valores se ordenan.

ExcelTips es su fuente de formación rentable en Microsoft Excel.

Este consejo (6767) se aplica a Microsoft Excel 2007, 2010, 2013 y 2016.