Separación de pares y probabilidades (Microsoft Excel)
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.