Séparer les événements et les cotes (Microsoft Excel)
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.