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.