Rusty a une liste de codes postaux dans une colonne d’une feuille de calcul. Il aimerait un moyen de « compresser » les codes de sorte que les plages séquentielles de valeurs soient sur une seule ligne. Ainsi, par exemple, au lieu de 35013, 35014 et 35015 occupant trois lignes, ils apparaissent sur une seule ligne sous la forme 35013-35015.

Il existe plusieurs façons de procéder, avec ou sans macros. Du côté «sans macros» de la clôture, il existe un certain nombre d’approches différentes, et toutes impliquent l’utilisation de colonnes supplémentaires pour contenir des résultats intermédiaires.

Par exemple, supposons que vous avez vos données dans la colonne A, à partir de la cellule A2, et que la cellule A1 est vide (elle ne contient même pas de texte d’en-tête). Dans ce cas, vous pouvez saisir la formule suivante dans la cellule B2:

=IF(NOT(A2-A1=1),A2,IF(A3-A2=1,B1,A2))

Ensuite, dans la cellule C2, entrez la formule longue suivante:

=IF(NOT(A3-A2=1),IF(A2-A1=1,TEXT(B1,"00000")

&" - "&TEXT(B2,"00000"),TEXT(A2,"00000")),"")

Vous pouvez maintenant copier les formules des cellules B2: C2 dans leurs colonnes respectives. Ce que vous obtenez dans la colonne C est la série condensée de codes postaux. Vous pouvez copier ces valeurs – en utilisant Collage spécial pour ignorer les cellules vides – à tout autre endroit de votre choix.

Si vous souhaitez utiliser une approche macro, aucune colonne intermédiaire n’est nécessaire. Une macro peut être écrite qui réduit essentiellement la liste des codes postaux en place. La macro suivante parcourt la plage de cellules que vous avez sélectionnée et crée la liste condensée:

Sub CombineValues()

Dim rng As Range     Dim rCell As Range     Dim sNewArray() As String     Dim x As Long     Dim y As Long     Dim sStart As String     Dim sEnd As String

Set rng = Selection     sStart = rng.Cells(1)

sEnd = sStart     y = 1     For x = 1 To rng.Count - 1         If rng.Cells(x + 1) - _           rng.Cells(x) > 1 Then  'End             ReDim Preserve sNewArray(1 To y)

If sStart = sEnd Then                 sNewArray(y) = sStart             Else                 sNewArray(y) = sStart & "-" & sEnd             End If             sStart = rng.Cells(x + 1)

y = y + 1         End If         sEnd = rng.Cells(x + 1)

ReDim Preserve sNewArray(1 To y)

If sStart = sEnd Then             sNewArray(y) = sStart         Else             sNewArray(y) = sStart & "-" & sEnd          End If     Next     rng.ClearContents     For x = 1 To y         rng.Cells(x) = "'" & sNewArray(x)

Next     Set rng = Nothing     Set rCell = Nothing End Sub

_Note: _

Si vous souhaitez savoir comment utiliser les macros décrites sur cette page (ou sur toute autre page des sites ExcelTips), j’ai préparé une page spéciale qui comprend des informations utiles.

lien: / excelribbon-ExcelTipsMacros [Cliquez ici pour ouvrir cette page spéciale dans un nouvel onglet de navigateur].

ExcelTips est votre source pour une formation Microsoft Excel rentable.

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

Vous pouvez trouver une version de cette astuce pour l’ancienne interface de menu d’Excel ici:

link: / excel-Condensing_Sequential_Values_to_a_Single_Row [Condensation des valeurs séquentielles en une seule ligne].