Separare i pari e le probabilità (Microsoft Excel)
Dimitris ha una serie di valori interi nella colonna A. Vorrebbe un modo per mostrare i valori dispari nella colonna B e i valori pari nella colonna C.Vuole che i valori siano in celle contigue, senza spazi, e anche in ordine crescente. Dimitris si chiede se avrebbe bisogno di una macro per elaborare i suoi dati in questo modo.
La risposta breve è che puoi, in effetti, farlo senza ricorrere a una macro. Tuttavia, se è necessario eseguire molto questo tipo di elaborazione, potrebbe essere più vantaggioso utilizzare effettivamente una macro.
Per prima cosa, diamo un’occhiata agli approcci non macro. Potresti, se lo desideri, scrivere semplici formule nelle colonne B e C che controllano semplicemente se il valore nella colonna A è pari o dispari e, se è appropriato alla colonna, copia il valore sopra. Ad esempio, potresti avere quanto segue nella colonna B:
=IF(ISODD(A1),A1,"")
Nella colonna C, tutto ciò che dovresti fare è sostituire ISODD con ISEVEN. Quando si copiano queste formule, la colonna B contiene solo valori dispari e la colonna C contiene solo valori pari. Il problema, ovviamente, è che il risultato non corrisponde a quello che cerca Dimitris: vuole i valori in celle contigue (senza spazi) e li vuole in ordine crescente.
Certo, puoi eseguire ulteriori passaggi per ottenere i risultati desiderati, ad esempio puoi copiare i risultati nelle colonne B e C e incollare i valori (in modo che le formule vengano rimosse) e quindi ordinare i risultati. Questo aggiunge ulteriori passaggi al tuo lavoro.
C’è un modo per ottenere un risultato molto “più pulito” semplicemente utilizzando una formula di matrice. Supponiamo che i tuoi valori siano nelle celle A1: A100. Con le celle B1: B100 selezionate, immettere quanto segue nella barra della formula:
=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()),"")
Ricorda che questa è tutta un’unica formula. Poiché è progettato per essere una formula di matrice, terminala inserendo Ctrl + Maiusc + Invio. Il risultato è che hai i valori dispari nella colonna B, in celle contigue, in ordine crescente. Per ottenere i valori pari nella colonna C, prima copia B1: B100 in C1: C100. Quindi selezionare l’intervallo C1: C100. Premere F2 per accedere alla modalità di modifica e cambiare “= 1” al centro della formula in “= 0”.
Di nuovo, termina la formula premendo Ctrl + Maiusc + Invio.
Si noti che questa formula non funzionerà correttamente se sono presenti spazi vuoti nell’intervallo A1: A100 o se sono presenti valori di testo nell’intervallo. Il motivo per cui gli spazi non funzionano è perché sono trattati come 0 in modo formale e uno 0 è considerato pari, quindi viene visualizzato nella colonna C.Una formula alternativa per determinare i valori dispari (colonna B) consiste nell’utilizzare la seguente formula di matrice nella cella B1:
=IFERROR(SMALL(IF(MOD($A$1:$A$100,2)>0,$A$1: $A$100,"x"),ROW()),"")
Per affrontare il potenziale problema della “cella vuota”, puoi quindi utilizzare la seguente formula di matrice nella cella C1:
=IFERROR(SMALL(IF((MOD($A$1:$A$100,2)=0)*NOT( ISBLANK($A$1:$A$100)),$A$1:$A$100,"x"),ROW()),"")
Copia B1: C1 verso il basso del numero di celle necessario per ottenere i risultati.
In precedenza ho detto che potresti trovare più vantaggioso utilizzare una macro per elaborare i tuoi valori. Il motivo è semplice: puoi sbarazzarti facilmente dei valori duplicati (se necessario) e puoi ignorare gli spazi e i valori di testo. Ci sono molti modi in cui una tale macro potrebbe essere sviluppata; Ho scelto un approccio che richiede di selezionare le celle che si desidera elaborare, cancella le due colonne a destra di quelle celle e quindi inserisce quote e pari in quelle colonne.
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 fa il suo lavoro inserendo i valori delle celle selezionate in uno dei due array (iEvens e iOdds). Questo viene fatto in modo che la macro possa facilmente verificare la presenza di duplicati nei valori. Solo se la cella non è vuota, contiene un numero e quel numero non è un duplicato il valore verrà aggiunto all’array appropriato. I valori vengono quindi reinseriti nelle due colonne e tali valori vengono ordinati.
ExcelTips è la tua fonte di formazione economica su Microsoft Excel.
Questo suggerimento (6767) si applica a Microsoft Excel 2007, 2010, 2013 e 2016.