Dimitris a une série de valeurs entières dans la colonne A. Il aimerait un moyen d’afficher les valeurs impaires dans la colonne B et les valeurs paires dans la colonne C. Il veut que les valeurs soient dans des cellules contiguës, sans espaces, et soient également Dans l’ordre croissant. Dimitris se demande s’il aurait besoin d’une macro pour traiter ses données de cette manière.

La réponse courte est que vous pouvez, en effet, faire cela sans recourir à une macro. Cependant, si vous devez effectuer ce type de traitement beaucoup, vous trouverez peut-être plus avantageux d’utiliser réellement une macro.

Tout d’abord, regardons les approches non macro. Vous pouvez, si vous le souhaitez, écrire des formules simples dans les colonnes B et C qui vérifient simplement si la valeur de la colonne A est paire ou impaire et, si elle convient à la colonne, recopiez la valeur. Par exemple, vous pourriez avoir ce qui suit dans la colonne B:

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

Dans la colonne C, il vous suffit de remplacer ISODD par ISEVEN. Lorsque vous copiez ces formules vers le bas, la colonne B contient uniquement des valeurs impaires et la colonne C contient uniquement des valeurs paires. Le problème, bien sûr, est que le résultat ne correspond pas à ce que Dimitris recherche: il veut les valeurs dans des cellules contiguës (pas de blancs) et il les veut dans l’ordre croissant.

Certes, vous pouvez prendre des mesures supplémentaires pour obtenir les résultats souhaités. Par exemple, vous pouvez copier les résultats dans les colonnes B et C et recoller les valeurs (afin que les formules soient supprimées), puis trier les résultats. Cela ajoute des étapes supplémentaires à votre travail.

Il existe un moyen d’obtenir un résultat beaucoup plus « propre » en utilisant simplement une formule matricielle. Supposons que vos valeurs soient dans les cellules A1: A100. Avec les cellules B1: B100 sélectionnées, entrez ce qui suit dans la barre de formule:

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

N’oubliez pas que tout cela est une seule formule. Comme il est conçu pour être une formule matricielle, terminez-le en saisissant Ctrl + Maj + Entrée. Le résultat est que vous avez les valeurs impaires dans la colonne B, dans des cellules contiguës, dans l’ordre croissant. Pour obtenir les valeurs paires dans la colonne C, copiez d’abord B1: B100 dans C1: C100. Ensuite, sélectionnez la plage C1: C100. Appuyez sur F2 pour entrer en mode d’édition et changez le « = 1 » au milieu de la formule en « = 0 ».

Encore une fois, terminez la formule en appuyant sur Ctrl + Maj + Entrée.

Vous devez noter que cette formule ne fonctionnera pas correctement s’il y a des blancs dans la plage A1: A100 ou s’il y a des valeurs de texte dans la plage. La raison pour laquelle les blancs ne fonctionnent pas est qu’ils sont traités comme un 0 selon une formule, et un 0 est considéré comme pair, apparaissant ainsi dans la colonne C. Une autre formule pour déterminer les valeurs impaires (colonne B) consiste à utiliser la formule matricielle suivante dans la cellule B1:

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

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

Pour faire face au problème potentiel de « cellule vide », vous pouvez alors utiliser la formule matricielle suivante dans la cellule C1:

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

Copiez B1: C1 autant de cellules que nécessaire pour obtenir vos résultats.

J’ai mentionné plus tôt que vous pourriez trouver plus avantageux d’utiliser une macro pour traiter vos valeurs. La raison est simple: vous pouvez facilement vous débarrasser des valeurs en double (si nécessaire) et vous pouvez ignorer les vides et les valeurs de texte. Une telle macro peut être développée de plusieurs manières; J’ai choisi une approche qui vous oblige à sélectionner les cellules que vous souhaitez traiter, efface les deux colonnes à droite de ces cellules, puis met les cotes et les égalités dans ces colonnes.

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 fait son travail en remplissant les valeurs des cellules sélectionnées dans l’un des deux tableaux (iEvens et iOdds). Ceci est fait pour que la macro puisse facilement vérifier les doublons dans les valeurs. Ce n’est que si la cellule n’est pas vide, qu’elle contient un nombre et que ce nombre n’est pas un doublon que la valeur sera ajoutée au tableau approprié. Les valeurs sont ensuite replacées dans les deux colonnes et ces valeurs sont triées.

ExcelTips est votre source pour une formation Microsoft Excel rentable.

Cette astuce (6767) s’applique à Microsoft Excel 2007, 2010, 2013 et 2016.